📄 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 + -