uCOSII的主函数问题
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
率
OSStatRdy = FALSE;
未就绪
#endif
OSCtxSwCtr = 0;
换次数清 0
OSRdyGrp
= 0;
务列表
for (i = 0; i < OS_RDY_TBL_SIZE; i++) {
OSRdyTbl[i] = 0;
}
//系统利用 //统计任务
//任务切 //就绪任
OSPrioCur = 0;
//任务堆栈栈顶指针
#if OS_TASK_CREATE_EXT_EN
void
*OSTCBExtPtr;
OS_STK
INT32U INT16U INT16U #endif
*OSTCBStkBottom;
OSTCBStkSize; OSTCBOpt; OSTCBId;
//栈底指针
//堆栈单元数量
struct os_tcb *OSTCBNext;
#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
//下一个任务控制块
struct os_tcb *OSTCBPrev;
//上一个任务控制块,
这两个参数将任务控制块连成一个双向链表,在时钟节拍函数
OSTimeTick()里会用到
#if (OS_Q_EN && (OS_MAX_QS >= 2)) || OS_MBOX_EN || OS_SEM_EN
OS_EVENT
*OSTCBEventPtr;
#endif
#if (OS_Q_EN && (OS_MAX_QS >= 2)) || OS_MBOX_EN
void
*OSTCBMsg;
#endif
INT16U
OSTCBDly;
INT8U
OSTCBStat;
OS_STAT_READY 时,任务进入就绪态
INT8U
OSTCBPrio;
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);
进行一次任务调度
OSSched(); } } else { OS_ENTER_CRITICAL();
OSTCBPrioTbl[prio] = (OS_TCB *)0;//任务创建失败,则列表
中重新写为 0
OS_EXIT_CRITICAL(); } return (err); } else { OS_EXIT_CRITICAL(); return (OS_PRIO_EXIST); } }
//定义主任务
#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_S IZE-1], Main_PRIO);
&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
(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,
#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_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);//
//
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,
OSPrioHighRdy = (INT8U)((y << 3) + x);
OSPrioCur = OSPrioHighRdy;
OSTCBHighRdy = OSTCBPrioTbl[OSPrioHighRdy];
OSTCBCur
= OSTCBHighRdy;
OSStartHighRdy(); }
//开始运行优
第一章:OS的主函数
//"..." 表示未知内容,根据系统不同的需要而定
#include "..."
//包含一些头文件
#define TASK_STACK_SIZE ... //定义堆栈大小
OS_STK Main_Stack[TASK_STACK_SIZE]= {0, };
//定义堆栈
void Main_Task(void *...);
//当
前任务优先级
OSPrioHighRdy = 0;
//将
要运行任务优先级
OSTCBHighRdy = (OS_TCB *)0;
//将要
运行任务的控制块(TCB)
OSTCBCur
= (OS_TCB *)0;
//
当前任务控制块
OSTCBList = (OS_TCB *)0;
for (i = 0; i < (OS_LOWEST_PRIO + 1); i++) {
&OSTaskIdleStk[OS_TASK_IDLE_STK_SIZE - 1], OS_IDLE_PRIO);
#endif
#else
#if OS_TASK_CREATE_EXT_EN
OSTaskCreateExt(OSTaskIdle,
(void *)0,
//
&OSTaskIdleStk[0],
//
初始化一个任务控制块
if (err == OS_NO_ERR) { OS_ENTER_CRITICAL(); OSTaskCtr++;
OSTaskCreateHook(OSTCBPrioTbl[prio]); OS_EXIT_CRITICAL();
if (OSRunning) {
//如果 OS 已经运行,则
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
先级最高的任务,这个函数涉及到 CPU 寄存器的操作,所以针对具体
不同环境会有所不同
}
第五章:任务控制块 os_tcb
任务控制块里保存任务的一些参数,只有拥有任务控制块的任务
才有运行的可能,当然运行还需要一些其他条件
typedef struct os_tcb {
OS_STK
*OSTCBStkPtr;
}
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();
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()
这是OS里创建任务的一种函数,另外一种是OSTaskCreateExt,创建扩展的任务.
INT8U OSTaskCreate (void (*task)(void *pd), void *pdata, OS_STK *ptos, INT8U prio) //这里有 4 个参数,第一个:要创建的任务函数,第二个:传递给任 务的指针,第三个:任务堆栈的栈顶个只是,第四个:任务的优先级. 这四个参数 是创建普通任务所必须的. {
*)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];
void *psp; INT8U err;
if (prio > OS_LOWEST_PRIO) {
//任务的优先级必须小于最低
任务的优先级,因为 OS 的任务优先级是从低到高的.
return (OS_PRIO_INVALID); }
OS_ENTER_CRITICAL(); if (OSTCBPrioTbl[prio] == (OS_TCB *)0) {
OSTaskCtr = 0;
//任务记数
器清 0
#endif
OSRunning = FALSE;
//操作系统未
运行
OSIdleCtr 记数清 0
= 0L;
//空闲任务
#if OS_TASK_STAT_EN && OS_TASK_CREATE_EXT_EN
OSIdleCtrRun =wenku.baidu.com0L;
OSIdleCtrMax = 0L;
//建立主任务
OSStart(); //任务开始 }
第二章:OSInit() (初始化函数)
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
第四章:OSStart()
void OSStart (void)
{
INT8U y; INT8U x;
//任务的开始
if (OSRunning == FALSE) 一次调度,既运行优先级最高的任务
{
y = OSUnMapTbl[OSRdyGrp];
//如果操作系统未运行,则进行
x = OSUnMapTbl[OSRdyTbl[y]];
//任务延时节拍
//任务状态,当它等于
//任务优先级
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,