uC/OS-II 操作系统分析
目 录
源文件体系结构 2
对内核中与处理器相关文件的修改 3
任务管理 3
OSTaskCreate() 任务创建函数 3
源代码分析 3
程序流程图 4
OSTaskStkInit() 任务堆栈初始化函数 4
源代码分析 4
堆栈增长方向 5
OSTaskDel() 5
源代码分析 5
程序流程图 6
OSTaskDelReq() 请求删除任务函数 7
源代码分析 7
程序流程图 8
任务 A 和任务 B 进行删除请求的代码分析 8
任务 A 和任务 B 的删除请求流程图 9
OSTaskChangePrio() 改变任务优先级函数 9
源代码分析 10
程序流程图 11
OSTaskSuspend() 任务挂起函数 12
源码分析 12
程序流程图 13
OSTaskResume() 任务恢复函数 14
源码分析 14
函数流程图 15
OSTaskQuery() 获得任务信息函数 15
源代码分析 15
用户获取任务信息源代码 16
/////////*********////////// 指示需要补充,尚未完全领悟
源文件体系结构
SOURCE 文件夹: 与平台无关的代码,只需进行包含即可
OS_CORE.C
OS_FLAG.C
OS_MBOX.C
OS_MEM.C
OS_MUTEX.C
OS_Q.C
OS_SEM.C
OS_TASK.C
OS_TIME.C
uCOS_II.C
uCOS_II.H
ARM_PC 文件夹 :
PC.C
PC.H
ARM 文件夹 : 与具体处理器型号相关的设置,这里是与 ARM芯片相关的
OS_CPU_C.C
OS_CPU.H
OS_CPU_A.ASM
配置文件:
OS_CFG.H
INCLUDES.H
对内核中与处理器相关文件的修改
-
#define 设置一个常量 ( 堆栈的生长方向 )
-
声明三个宏 ( 开中断、关中断和任务切换 )
-
声明 10 个与编译器相关的数据类型
-
用 C 语言编写六个简单的函数 ( 任务堆栈初始化和五个钩子函数 )
-
用汇编语言编写的四个函数 OSStartHighRdy() 、 OSCtxSw() 、 OSIntCtxSw() 、 OSIntCtxSw() 。
任务管理
OSTaskCreate() 任务创建函数
源代码分析
INT8U OSTaskCreate (void (*task)(void *pd), void *pdata, OS_STK *ptos, INT8Uprio)
task 任务代码的指针
pdata 是当任务开始执行时传递给任务的参数的指针
ptos 分配给任务的堆栈的栈顶指针
prio 分配给任务的优先级
INT8U OSTaskCreate (void (*task)(void *pd), void *pdata, OS_STK *ptos, INT8Uprio)
{
void *psp;
INT8U err;
if (prio > OS_LOWEST_PRIO) { // 如果优先级比最低的优先级还低则该优先级不可用
return (OS_PRIO_INVALID);
}
OS_ENTER_CRITICAL();
if (OSTCBPrioTbl[prio] == (OS_TCB *)0) { //(OS_TCB *)0 实际上是通知编译器,这个 0 是 OS_TCB
// 数据类型的 NULL 。
OSTCBPrioTbl[prio] = (OS_TCB *)1; (3) //(OS_TCB *)1 那就是说有一个任务存在了,不再是 Nul
OS_EXIT_CRITICAL(); // 关中断
psp = (void *)OSTaskStkInit(task, pdata, ptos, 0); // 初始化任务堆栈 并返回栈顶指针
err = OSTCBInit(prio, psp, (void *)0, 0, 0, (void *)0, 0); (6) // 初始化 TCB
if (err == OS_NO_ERR) // 如果 TCB 池中有空 TCB 提供
{
OS_ENTER_CRITICAL(); // 开中断
OSTaskCtr++; (8) // 任务总数计数器加 1
OS_EXIT_CRITICAL(); // 关中断
if (OSRunning) // 如果 cpu 被占用
{
OSSched(); // 进行任务切换 }
}
else // 否则让该优先级可被其他任务占用
{
OS_ENTER_CRITICAL();
OSTCBPrioTbl[prio] = (OS_TCB *)0; (12)
OS_EXIT_CRITICAL();
}
return (err);
} else {
OS_EXIT_CRITICAL();
return (OS_PRIO_EXIST); // 返回优先级已存在
}
}
程序流程图
图1 任务创建函数 OSTaskCreat() 流程图
注意,任务创建主要牵扯到三点:
-
优先级
-
任务堆栈
-
任务控制块 TCB
另外,若一切任务的初始化成功,还要判断 cpu是否被占用,调用任务切换函数进行任务切换。