void OSInit (void)
{
OSInitHookBegin(); /* Call port specific initialization code */ 钩子函数,实现了自定义函数的添加
OS_InitMisc(); /* Initialize miscellaneous variables */初始化各种变量,包括系统时钟计数器、中断嵌套计数器、上锁嵌套计数器、任务计数器、多任务运行标志、上下文切换计数器、空闲计数器、一秒内任务切换数、一秒内最大任务切换数、统计任务就绪标志、
OS_InitRdyList(); /* Initialize the Ready List */就绪列表初始化,清空就绪任务列表,清空当前任务优先级、清空最高优先级任务的优先级、清空当前任务控制块、清空最高优先级任务的控制块;这里的最高优先级任务的优先级和控制块是等待任务切换时,要赋值给当前任务,进而完成最高优先级任务的切换,具体在 OSStart函数中可以看出来
OS_InitTCBList(); /* Initialize the free list of OS_TCBs */ 控制块列表初始化,清空任务控制块表及任务控制块优先级表,遍历整个控制块,将下一个控制块地址赋值给上一个控制块中的OSTCBNext变量,到最后一个控制块的OSTCBNext变量赋值0,同时将每个控制块中的任务名称赋值?/0,做字符串处理,任务控制块链表指针清0,空闲任务控制块链表指针清0;一开始空闲任务控制块指向第一个任务控制块,任务控制块链表指针是0;当创建任务后,会从空闲任务控制块链表指针中申请一个任务控制块给任务控制块,任务控制块链表指针添加一个节点;空闲任务控制块链表指针后移;当删除任务时,做相反操作
OS_InitEventList(); /* Initialize the free list of OS_EVENTs */事件列表初始化,遍历整个事件控制块,赋值事件类型、事件名称及事件控制块指针;赋值空闲事件控制块链表指针
#if (OS_FLAG_EN > 0) && (OS_MAX_FLAGS > 0)
OS_FlagInit(); /* Initialize the event flag structures */;当最大事件标志数为1时,仅仅使用标志表数组元素0,等待标志的第一个任务节点指针,事件标志的标志清空,标志name赋?/0;最大事件标志大于等于2时,遍历整个表示表格,做以上内容,空闲标志链表赋值
#endif
#if (OS_MEM_EN > 0) && (OS_MAX_MEM_PART > 0)
OS_MemInit(); /* Initialize the memory manager */
#endif
#if (OS_Q_EN > 0) && (OS_MAX_QS > 0)
OS_QInit(); /* Initialize the message queue structures */
#endif
OS_InitTaskIdle(); /* Create the Idle Task */
#if OS_TASK_STAT_EN > 0
OS_InitTaskStat(); /* Create the Statistic Task */
#endif
#if OS_TMR_EN > 0
OSTmr_Init(); /* Initialize the Timer Manager */
#endif
OSInitHookEnd(); /* Call port specific init. code */
#if OS_DEBUG_EN > 0
OSDebugInit();
#endif
{
OSInitHookBegin(); /* Call port specific initialization code */ 钩子函数,实现了自定义函数的添加
OS_InitMisc(); /* Initialize miscellaneous variables */初始化各种变量,包括系统时钟计数器、中断嵌套计数器、上锁嵌套计数器、任务计数器、多任务运行标志、上下文切换计数器、空闲计数器、一秒内任务切换数、一秒内最大任务切换数、统计任务就绪标志、
OS_InitRdyList(); /* Initialize the Ready List */就绪列表初始化,清空就绪任务列表,清空当前任务优先级、清空最高优先级任务的优先级、清空当前任务控制块、清空最高优先级任务的控制块;这里的最高优先级任务的优先级和控制块是等待任务切换时,要赋值给当前任务,进而完成最高优先级任务的切换,具体在 OSStart函数中可以看出来
OS_InitTCBList(); /* Initialize the free list of OS_TCBs */ 控制块列表初始化,清空任务控制块表及任务控制块优先级表,遍历整个控制块,将下一个控制块地址赋值给上一个控制块中的OSTCBNext变量,到最后一个控制块的OSTCBNext变量赋值0,同时将每个控制块中的任务名称赋值?/0,做字符串处理,任务控制块链表指针清0,空闲任务控制块链表指针清0;一开始空闲任务控制块指向第一个任务控制块,任务控制块链表指针是0;当创建任务后,会从空闲任务控制块链表指针中申请一个任务控制块给任务控制块,任务控制块链表指针添加一个节点;空闲任务控制块链表指针后移;当删除任务时,做相反操作
OS_InitEventList(); /* Initialize the free list of OS_EVENTs */事件列表初始化,遍历整个事件控制块,赋值事件类型、事件名称及事件控制块指针;赋值空闲事件控制块链表指针
#if (OS_FLAG_EN > 0) && (OS_MAX_FLAGS > 0)
OS_FlagInit(); /* Initialize the event flag structures */;当最大事件标志数为1时,仅仅使用标志表数组元素0,等待标志的第一个任务节点指针,事件标志的标志清空,标志name赋?/0;最大事件标志大于等于2时,遍历整个表示表格,做以上内容,空闲标志链表赋值
#endif
#if (OS_MEM_EN > 0) && (OS_MAX_MEM_PART > 0)
OS_MemInit(); /* Initialize the memory manager */
#endif
#if (OS_Q_EN > 0) && (OS_MAX_QS > 0)
OS_QInit(); /* Initialize the message queue structures */
#endif
OS_InitTaskIdle(); /* Create the Idle Task */
#if OS_TASK_STAT_EN > 0
OS_InitTaskStat(); /* Create the Statistic Task */
#endif
#if OS_TMR_EN > 0
OSTmr_Init(); /* Initialize the Timer Manager */
#endif
OSInitHookEnd(); /* Call port specific init. code */
#if OS_DEBUG_EN > 0
OSDebugInit();
#endif
}
整个OSInit的流程是:
1、用户钩子函数begin
2、初始化各种变量,主要是各种计数器
3、初始化就绪列表
4、初始化任务控制块列表
5、初始化时间控制块列表
6、初始化时间标志组
7、初始化内存管理
8、初始化消息队列
9、建立空闲任务,空闲任务计数器加1
10、建立统计任务
11、初始化定时器管理任务
12、钩子函数end
13、防止debug中warn消息