?? os_cpu_c.c
字號:
/*********************************************************************************************************
** Small RTOS
** The Real-Time Kernel For AVR-GCC
**
** (c) Copyright 2004-2005, xubaotian
** All Rights Reserved
**
** V 0.1.0
**
**
**--------------文件信息--------------------------------------------------------------------------------
**文 件 名: OS_CPU_C.c
**創 建 人: 徐寶田
**最后修改日期: 2005年5月30日
**描 述: Small RTOS 與CPU(既ATmega系列)堆棧初始化,定時器,休眠相關的C語言代碼
**
**--------------歷史版本信息----------------------------------------------------------------------------
** 創建人: 徐寶田
** 版 本: V0.10
** 日 期: 2005年5月30日
** 描 述: 原始版本
**
**--------------當前版本修訂------------------------------------------------------------------------------
** 修改人:
** 日 期:
** 描 述:
**
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
#define IN_OS_CPU_C
#include "CONFIG.h"
void OSInitHook(void) ;
void OSTickInit(void) ;
void OSStart(void) ;
void* OSTaskStackBottom[OS_MAX_TASKS + 2]; /* 任務棧底位置 */
/*********************************************************************************************************
** 函數名稱: main
** 功能描述: C代碼從這里開始執行
** 輸 入:
** 輸 出 :
** 全局變量:
** 調用模塊: OSInit,OSStart
**
** 作 者: 徐寶田
** 日 期: 2005年5月30日
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**-------------------------------------------------------------------------------------------------------
********************************************************************************************************/
int main(void)
{
OSInitHook();
OSTickInit();
OSStart();
}
/*********************************************************************************************************
** 函數名稱: OSIdle
** 功能描述: 優先級最低的任務
** 輸 入: 無
** 輸 出: 無
** 全局變量: 無
** 調用模塊: 無
**
** 作 者: 徐寶田
** 日 期: 2002年12月2日
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**-------------------------------------------------------------------------------------------------------
********************************************************************************************************/
void OSIdle(void)
{
while(1)
{
#if EN_OS_IDLE > 0 /* CPU進入休眠狀態 */
#endif
}
}
/*********************************************************************************************************
** 函數名稱: OSInitHook
** 功能描述: 在開始多任務調度之前系統初始鉤掛函數
** 輸 入: 無
** 輸 出: 無
** 全局變量: 無
** 調用模塊: 無
**
** 作 者: 徐寶田
** 日 期: 2002年12月2日
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**-------------------------------------------------------------------------------------------------------
********************************************************************************************************/
void OSInitHook(void)
{
OSCCAL = 0xff ; //內部RC震蕩校正字
}
/*********************************************************************************************************
** 函數名稱: OSStart
** 功能描述: Small RTOS 初始化函數,調用此函數后多任務開始運行,首先執ID為0的任務
** 輸 入: 無
** 輸 出 : 無
** 全局變量: OSTsakStackBotton,SP
** 調用模塊: 無
**
** 作 者: 徐寶田
** 日 期: 2005年5月22日
**-------------------------------------------------------------------------------------------------------
** 修改人: 徐寶田
** 日 期: 2002年6月2日
**-------------------------------------------------------------------------------------------------------
** 修改人: 徐寶田
** 日 期: 2002年6月9日
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**-------------------------------------------------------------------------------------------------------
********************************************************************************************************/
uint8 TaskAStk[100];
uint8 TaskBStk[100];
uint8 TaskCStk[100];
uint8 TaskIdle[50];
void OSTaskCreate(void (*task)(void),void* stk,uint8 prio)
{
uint8* cp;
uint8 j;
cp = stk;
*cp-- = ((uint8*)(&task))[HIGH_BYTE];
*cp-- = ((uint8*)(&task))[LOW_BYTE];
for(j=0;j<34;j++)
{
*cp-- = 0;
}
OSTaskStackBottom[prio] = cp;
}
void OSStart(void)
{
OSTaskCreate(task0,&TaskAStk[99],0);
OSTaskCreate(task1,&TaskBStk[99],1);
OSTaskCreate(task2,&TaskCStk[99],2);
OSTaskCreate(OSIdle,&TaskIdle[49],OS_MAX_TASKS);
SP = (uint16)OSTaskStackBottom[0] ;
LoadCtx(); /* 函數返回優先級最高的任務 */
}
/*********************************************************************************************************
** 函數名稱: OSTickInit()
** 功能描述: 系統節拍定時器初始化
** 輸 入: 無
** 輸 出: 無
** 全局變量: 無
** 調用模塊:
**
** 作 者: 徐寶田
** 日 期: 2002年2月22日
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**-------------------------------------------------------------------------------------------------------
********************************************************************************************************/
void OSTickInit(void)
{
TCCR0 = 0;
TCCR0 |= (1<<CS02); /* 256預分頻 */
TIMSK |= (1<<TOIE0); /* T0溢出中斷允許 */
TCNT0 = (256-CPU_OSC/256/OS_TICKS_PER_SEC); /* 置計數起始值 */
}
/*********************************************************************************************************
** 函數名稱: OSTickISR
** 功能描述: 系統時鐘中斷服務函數
** 輸 入: 無
** 輸 出: 無
** 全局變量: 無
** 調用模塊: OS_INT_ENTER,(UserTickTimer),OSTimeTick,OSIntExit
**
** 作 者: 徐寶田
** 日 期: 2005年5月30日
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**-------------------------------------------------------------------------------------------------------
********************************************************************************************************/
SIGNAL(SIG_OVERFLOW0)
{
#if TICK_TIMER_SHARING >1
static uint8 TickSum = 0;
#endif
TCNT0+= (256-CPU_OSC/256/OS_TICKS_PER_SEC);
#if EN_USER_TICK_TIMER > 0
#endif
#if TICK_TIMER_SHARING >1
TickSum = (TickSum + 1) % TICK_TIMER_SHARING;
if (TickSum != 0)
{
return;
}
#endif
#if EN_OS_INT_ENTER > 0
OS_INT_ENTER(); /* 中斷開始處理 */
#endif
#if EN_TIMER_SHARING > 0
OSTimeTick(); /* 調用系統時鐘處理函數 */
#else
OSIntSendSignal(TIME_ISR_TASK_ID); /* 喚醒ID為TIME_ISR_TASK_ID的任務 */
#endif
OSIntExit(); /* 中斷結束處理 */
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -