?? functionforucos.txt
字號:
第一章:OS的主函數
μC/OS /sherlock_lai 發表于2008-01-04, 19:06
//"..." 表示未知內容,根據系統不同的需要而定
#include "..." //包含一些頭文件
#define TASK_STACK_SIZE ... //定義堆棧大小
OS_STK Main_Stack[TASK_STACK_SIZE]= {0, }; //定義堆棧
void Main_Task(void *...); //定義主任務
#define Main_PRIO ...
void Main_Task(void *Id)
{
...
}
void Main(void)
{
... //系統的一些初始化
OSInit(); //OS初始化
//Create the Main Task
OSTaskCreate(Main_Task, (void *)0, (OS_STK *)&Main_Stack[TASK_STACK_SIZE-1], Main_PRIO);
//建立主任務
OSStart(); //任務開始
}
第二章:OSInit() (初始化函數)
μC/OS /sherlock_lai 發表于2008-01-04, 19:30
void OSInit (void)
{
INT16U i;
OSTime = 0L;
OSIntNesting = 0;
OSLockNesting = 0; //系統的一些參數清0
#if OS_TASK_CREATE_EN || OS_TASK_CREATE_EXT_EN || OS_TASK_DEL_EN
OSTaskCtr = 0; //任務記數器清0
#endif
OSRunning = FALSE; //操作系統未運行
OSIdleCtr = 0L; //空閑任務記數清0
#if OS_TASK_STAT_EN && OS_TASK_CREATE_EXT_EN
OSIdleCtrRun = 0L;
OSIdleCtrMax = 0L; //系統利用率
OSStatRdy = FALSE; //統計任務未就緒
#endif
OSCtxSwCtr = 0; //任務切換次數清0
OSRdyGrp = 0; //就緒任務列表
for (i = 0; i < OS_RDY_TBL_SIZE; i++) {
OSRdyTbl[i] = 0;
}
OSPrioCur = 0; //當前任務優先級
OSPrioHighRdy = 0; //將要運行任務優先級
OSTCBHighRdy = (OS_TCB *)0; //將要運行任務的控制塊(TCB)
OSTCBCur = (OS_TCB *)0; //當前任務控制塊
OSTCBList = (OS_TCB *)0;
for (i = 0; i < (OS_LOWEST_PRIO + 1); i++) {
OSTCBPrioTbl[i] = (OS_TCB *)0;
}
for (i = 0; i < (OS_MAX_TASKS + OS_N_SYS_TASKS - 1); i++) {
OSTCBTbl[i].OSTCBNext = &OSTCBTbl[i + 1];
}
OSTCBTbl[OS_MAX_TASKS + OS_N_SYS_TASKS - 1].OSTCBNext = (OS_TCB *)0;
OSTCBFreeList = &OSTCBTbl[0];
#if OS_MAX_EVENTS >= 2
for (i = 0; i < (OS_MAX_EVENTS - 1); i++) {
OSEventTbl[i].OSEventPtr = (OS_EVENT *)&OSEventTbl[i + 1];
}
OSEventTbl[OS_MAX_EVENTS - 1].OSEventPtr = (OS_EVENT *)0;
OSEventFreeList = &OSEventTbl[0];
#endif
#if OS_Q_EN && (OS_MAX_QS >= 2)
OSQInit();
#endif
#if OS_MEM_EN && OS_MAX_MEM_PART >= 2
OSMemInit();
#endif
#if OS_STK_GROWTH == 1
#if OS_TASK_CREATE_EXT_EN
OSTaskCreateExt(OSTaskIdle,
(void *)0, //建立空閑任務
&OSTaskIdleStk[OS_TASK_IDLE_STK_SIZE - 1], //
OS_IDLE_PRIO, //
OS_TASK_IDLE_ID,
&OSTaskIdleStk[0], //
OS_TASK_IDLE_STK_SIZE,
(void *)0, //
OS_TASK_OPT_STK_CHK | OS_TASK_OPT_STK_CLR);//
#else
OSTaskCreate(OSTaskIdle, (void *)0, &OSTaskIdleStk[OS_TASK_IDLE_STK_SIZE - 1], OS_IDLE_PRIO);
#endif
#else
#if OS_TASK_CREATE_EXT_EN
OSTaskCreateExt(OSTaskIdle,
(void *)0, //
&OSTaskIdleStk[0], //
OS_IDLE_PRIO, //
OS_TASK_IDLE_ID,
&OSTaskIdleStk[OS_TASK_IDLE_STK_SIZE - 1], // OS_TASK_IDLE_STK_SIZE,
(void *)0, //
OS_TASK_OPT_STK_CHK | OS_TASK_OPT_STK_CLR);//
#else
OSTaskCreate(OSTaskIdle, (void *)0, &OSTaskIdleStk[0], OS_IDLE_PRIO);
#endif
#endif
#if OS_TASK_STAT_EN
#if OS_TASK_CREATE_EXT_EN
#if OS_STK_GROWTH == 1
OSTaskCreateExt(OSTaskStat,
(void *)0, //建立統計任務
&OSTaskStatStk[OS_TASK_STAT_STK_SIZE - 1], //
OS_STAT_PRIO, //
OS_TASK_STAT_ID,
&OSTaskStatStk[0], //
OS_TASK_STAT_STK_SIZE,
(void *)0, //
OS_TASK_OPT_STK_CHK | OS_TASK_OPT_STK_CLR); //
#else
OSTaskCreateExt(OSTaskStat,
(void *)0, //
&OSTaskStatStk[0], //
OS_STAT_PRIO, //
OS_TASK_STAT_ID,
&OSTaskStatStk[OS_TASK_STAT_STK_SIZE - 1],//
OS_TASK_STAT_STK_SIZE,
(void *)0, //
OS_TASK_OPT_STK_CHK | OS_TASK_OPT_STK_CLR); //
#endif
#else
#if OS_STK_GROWTH == 1
OSTaskCreate(OSTaskStat,
(void *)0, //
&OSTaskStatStk[OS_TASK_STAT_STK_SIZE - 1], //
OS_STAT_PRIO); //
#else
OSTaskCreate(OSTaskStat,
(void *)0, //
&OSTaskStatStk[0], //
OS_STAT_PRIO); //
#endif
#endif
#endif
}
第三章:OSTaskCreate()
μC/OS /sherlock_lai 發表于2008-01-04, 19:43
這是OS里創建任務的一種函數,另外一種是OSTaskCreateExt,創建擴展的任務.
INT8U OSTaskCreate (void (*task)(void *pd), void *pdata, OS_STK *ptos, INT8U prio) //這里有4個參數,第一個:要創建的任務函數,第二個:傳遞給任務的指針,第三個:任務堆棧的棧頂個只是,第四個:任務的優先級. 這四個參數是創建普通任務所必須的.
{
void *psp;
INT8U err;
if (prio > OS_LOWEST_PRIO) { //任務的優先級必須小于最低任務的優先級,因為OS的任務優先級是從低到高的.
return (OS_PRIO_INVALID);
}
OS_ENTER_CRITICAL();
if (OSTCBPrioTbl[prio] == (OS_TCB *)0) { //
OSTCBPrioTbl[prio] = (OS_TCB *)1; //
OS_EXIT_CRITICAL();
psp = (void *)OSTaskStkInit(task, pdata, ptos, 0); //堆棧初始化函數,從這里獲得任務堆棧的物理棧頂
err = OSTCBInit(prio, psp, (void *)0, 0, 0, (void *)0, 0); //初始化一個任務控制塊
if (err == OS_NO_ERR) {
OS_ENTER_CRITICAL();
OSTaskCtr++; //
OSTaskCreateHook(OSTCBPrioTbl[prio]); //
OS_EXIT_CRITICAL();
if (OSRunning) { //如果OS已經運行,則進行一次任務調度
OSSched();
}
} else {
OS_ENTER_CRITICAL();
OSTCBPrioTbl[prio] = (OS_TCB *)0;//任務創建失敗,則列表中重新寫為0
OS_EXIT_CRITICAL();
}
return (err);
} else {
OS_EXIT_CRITICAL();
return (OS_PRIO_EXIST);
}
}
第四章:OSStart()
μC/OS /sherlock_lai 發表于2008-01-04, 20:04
void OSStart (void) //任務的開始
{
INT8U y;
INT8U x;
if (OSRunning == FALSE) //如果操作系統未運行,則進行一次調度,既運行優先級最高的任務
{
y = OSUnMapTbl[OSRdyGrp]; //
x = OSUnMapTbl[OSRdyTbl[y]];
OSPrioHighRdy = (INT8U)((y << 3) + x);
OSPrioCur = OSPrioHighRdy;
OSTCBHighRdy = OSTCBPrioTbl[OSPrioHighRdy];//
OSTCBCur = OSTCBHighRdy;
OSStartHighRdy(); //開始運行優先級最高的任務,這個函數涉及到CPU寄存器的操作,所以針對具體不同環境會有所不同
}
}
第五章:任務控制塊 os_tcb
μC/OS /sherlock_lai 發表于2008-01-06, 22:15
任務控制塊里保存任務的一些參數,只有擁有任務控制塊的任務才有運行的可能,當然運行還需要一些其他條件
typedef struct os_tcb {
OS_STK *OSTCBStkPtr; //任務堆棧棧頂指針
#if OS_TASK_CREATE_EXT_EN
void *OSTCBExtPtr; //
OS_STK *OSTCBStkBottom; //棧底指針
INT32U OSTCBStkSize; //堆棧單元數量
INT16U OSTCBOpt; //
INT16U OSTCBId; //
#endif
struct os_tcb *OSTCBNext; //下一個任務控制塊
struct os_tcb *OSTCBPrev; //上一個任務控制塊,這兩個參數將任務控制塊連成一個雙向鏈表,在時鐘節拍函數OSTimeTick()里會用到
#if (OS_Q_EN && (OS_MAX_QS >= 2)) || OS_MBOX_EN || OS_SEM_EN
OS_EVENT *OSTCBEventPtr; //
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -