static void TaskStartCreateTasks (void) {
INT8U i;
for (i = 0; i < N_TASKS; i++) { /* Create N_TASKS identical tasks */
TaskData[i] = i; /* Each task will display its own letter */
}
OSTaskCreate(Task0, (void *)&TaskData[i], &TaskStk[i][TASK_STK_SIZE - 1], 5); OSTaskCreate(Task1, (void *)&TaskData[i], &TaskStk[1][TASK_STK_SIZE - 1], 6); }
TaskStart任务完成上述操作后将自己挂起,操作系统将调度当前优先级最高的应用任务Task0运行。 应用任务
应用任务Task0运行后将自己挂起,之后操作系统就会调度处于就绪状态的优先级最高的任务,具体代码如下: void Task0 (void *pdata) {
INT8U i; INT8U err; i=*(int *)pdata;
for (;;) { ……
} }
应用任务Task1运行后将Task0唤醒,使其进入到就绪队列中: void Task1 (void *pdata) {
INT8U i;
/*此处为输出信息,显示任务运行的状态 */
err=OSTaskSuspend(5); /* suspend itself */
INT8U err; i=*(int *)pdata;
for (;;) {
OSTimeDly(150); ……
/*此处为输出信息,显示任务运行的状态 */
13
OSTimeDly(150);
err=OSTaskResume(5); /* resume task0 */
}
}
3 运行及观察应用输出信息
按照本实验手册第一部分所描述的方法建立应用项目并完成构建,当我们在LambdaTOOL调试器的控制下运行构建好的程序后,将看到在μC/OS-Ⅱ内核的调度管理下,两个应用任务不断切换执行的情形:
T1时刻的截图
14
T2时刻的截图
T3时刻的截图
15
T4时刻的截图
4 本实验中所用到的μC/OS-II相关函数
4.1 OSTaskCreate()
建立一个新任务。任务的建立可以在多任务环境启动之前,也可以在正在运行的任务中建立。中断处理程序中不能建立任务。一个任务可以为无限循环的结构。
函数原型:INT8U OSTaskCreate(void (*task)(void *pd), void *pdata, OS_STK *ptos, INT8U prio); 参数说明:task是指向任务代码首地址的指针。
Pdata指向一个数据结构,该结构用来在建立任务时向任务传递参数。
返回值:
OSTaskCreate()的返回值为下述之一: ? OS_NO_ERR:函数调用成功。
? OS_PRIO_EXIST:具有该优先级的任务已经存在。
? OS_PRIO_INVALID:参数指定的优先级大于OS_LOWEST_PRIO。 ? OS_NO_MORE_TCB:系统中没有OS_TCB可以分配给任务了。
4.2 OSTaskSuspend()
无条件挂起一个任务。调用此函数的任务也可以传递参数OS_PRIO_SELF,挂起调用任务本
16
相关推荐: