您的位置:首页 > 理论基础 > 计算机网络

uCosii的OSInit();函数分析 转自匿名http://m.blog.csdn.net/blog/songhengli/19939469

2015-08-31 20:44 281 查看
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

}

整个OSInit的流程是:

1、用户钩子函数begin

2、初始化各种变量,主要是各种计数器

3、初始化就绪列表

4、初始化任务控制块列表

5、初始化时间控制块列表

6、初始化时间标志组

7、初始化内存管理

8、初始化消息队列

9、建立空闲任务,空闲任务计数器加1

10、建立统计任务

11、初始化定时器管理任务

12、钩子函数end

13、防止debug中warn消息
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息