写在前面:
由于时间的不足与学习的碎片化,写博客变得有些奢侈。
但是对于记录学习(忘了以后能快速复习)的渴望一天天变得强烈。
既然如此
不如以天为单位,以时间为顺序,仅仅将博客当做一个知识学习的目录,记录笔者认为最通俗、最有帮助的资料,并尽量总结几句话指明本质,以便于日后搜索起来更加容易。
标题的结构如下:“类型”:“知识点”——“简短的解释”
部分内容由于保密协议无法上传。
点击此处进入学习日记的总目录
2024.03.26:UCOSIII第二十三节:系统启动流程概览(持续更新)
- 三十七、UCOSIII:系统启动流程概览
- 1、运行启动文件
- 2、系统初始化
- 1. 初始化钩子函数相关的代码
- 2. 把中断嵌套计数器设为0
- 3. 设置多任务处理器的状态
- 4. 将锁定计数器、当前任务指针、最高优先级任务指针、当前优先级数值、最高优先级数值、优先级记录数值设为0
- 5. 初始化优先级列表
- 6. 初始化就绪列表
- 7. 初始化任务管理器
- 8. 初始化空闲任务
- 9. 初始化时钟节拍任务
- 10. 操作系统配置初始化
- 3、定义启动任务
- 1. 板级硬件进行初始化
- 2. CPU初始化
- 3. 时钟初始化
- 4. 内存初始化
- 5. 创建各种任务
- 6. 删除启动任务自身
- 3、启动任务调度器
三十七、UCOSIII:系统启动流程概览
本章是糅杂了笔者自己的感悟,从debug调试的视角来粗略一览系统启动流程,特点是快速上手、快速回忆,需要对之前各个函数都有一定的了解。
1、运行启动文件
在系统上电的时候第一个执行的是启动文件里面由汇编编写的复位函数Reset_Handler
复位函数的最后会调用C库函数__main
,__main
函数的主要工作是初始化系统的堆和栈,最后调用C中的main()
函数,从而去到C的世界。
2、系统初始化
进入系统初始化函数OSInit(),OSInit()声明如下:
void OSInit (OS_ERR *p_err)
系统初始化主要包括:
1. 初始化钩子函数相关的代码
OSInitHook(); /*初始化钩子函数相关的代码*/
2. 把中断嵌套计数器设为0
OSIntNestingCtr= (OS_NESTING_CTR)0; /*清除中断嵌套计数器*/
3. 设置多任务处理器的状态
OSRunning = OS_STATE_OS_STOPPED; /*未启动多任务处理*/
4. 将锁定计数器、当前任务指针、最高优先级任务指针、当前优先级数值、最高优先级数值、优先级记录数值设为0
OSSchedLockNestingCtr = (OS_NESTING_CTR)0;/*清除锁定计数器*/OSTCBCurPtr= (OS_TCB *)0; /*将OS_TCB指针初始化为已知状态 */
OSTCBHighRdyPtr = (OS_TCB *)0;OSPrioCur = (OS_PRIO)0; /*将优先级变量初始化为已知状态*/
OSPrioHighRdy = (OS_PRIO)0;
OSPrioSaved = (OS_PRIO)0;
5. 初始化优先级列表
OS_PrioInit(); /*初始化优先级位图表*/
6. 初始化就绪列表
OS_RdyListInit(); /*初始化就绪列表*/
7. 初始化任务管理器
OS_TaskInit(p_err); /*初始化任务管理器*/
8. 初始化空闲任务
OS_IdleTaskInit(p_err); /* 初始化空闲任务 */
9. 初始化时钟节拍任务
OS_TickTaskInit(p_err); /* 初始化时钟节拍任务*/
10. 操作系统配置初始化
OSCfg_Init();
3、定义启动任务
系统在启动任务里面创建各种应用任务,当所有任务都创建成功后,启动任务把自己删除。
启动任务声明如下:
static void AppTaskStart (void *p_arg)
启动任务主要包括如下内容:
1. 板级硬件进行初始化
BSP_Init();
2. CPU初始化
CPU_Init();
在CPU初始化中,需要初始化时间戳、最大关中断时间测量 和 CPU 名字
3. 时钟初始化
cpu_clk_freq = BSP_CPU_ClkFreq();/* Determine SysTick reference freq. */
cnts = cpu_clk_freq / (CPU_INT32U)OSCfg_TickRate_Hz;
OS_CPU_SysTickInit(cnts); /*Init μC/OS periodic time src (SysTick).*/
4. 内存初始化
Mem_Init();
5. 创建各种任务
使用OSTaskCreate()函数来创建各个任务
OSTaskCreate()在之前的章节已介绍,声明如下:
void OSTaskCreate (OS_TCB *p_tcb,CPU_CHAR *p_name,OS_TASK_PTR p_task,void *p_arg,OS_PRIO prio,CPU_STK *p_stk_base,CPU_STK_SIZE stk_limit,CPU_STK_SIZE stk_size,OS_MSG_QTY q_size,OS_TICK time_quanta,void *p_ext,OS_OPT opt,OS_ERR *p_err)
6. 删除启动任务自身
使用OSTaskDel()函数来删除,声明如下:
void OSTaskDel (OS_TCB *p_tcb,OS_ERR *p_err)
3、启动任务调度器
OSStart函数声明如下:
OSStart(&err);
之前章节已解释,此处不再概述
该函数思路就一个,把 最高优先级任务指针 赋值给 当前任务指针 ,然后将 最高优先级任务指针 指向下一个最高优先级任务