找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 6526|回复: 0
打印 上一主题 下一主题
收起左侧

uC/OS-II学习笔记—操作系统初始化

[复制链接]
跳转到指定楼层
楼主
操作系统初始化函数OS_Init是操作系统在开始运行时,对全局变量、任务控制块、就绪表、事件及消息队列等重要数据结构进行的初始化操作,并创建空闲任务、统计任务等系统任务。该函数必须在创建用户对象及调用OSStart()启动实时任务调度之前运行。
内核初始化函数采用模块化编程,该函数又分为若干子块,每个子块实现一定的功能。操作系统初始化函数OS_Init声明代码如下所示:

如上面的程序所示,OS_InitMisc实现对操作系统一些混杂的全局变量的初始化(Misc是单词miscellaneous的前4个字母,是杂项的意思),这些混杂的全局变量是初始化过程或运行过程中需要使用的,因此在第一步完成,非常重要。

这些全局变量在ucos_ii.h中声明,在这里进行了初始化。接下来的OS_InitRdyList对就绪表进行初始化的工作,程序代码如下所示:

可见,该函数首先对就绪表和就绪组全部清零,然后对4个重要的任务相关的全局变量进行了初始化。前两个是当前任务的优先级和最高任务的优先级,后两个是对应的两个任务控制块的指针。
下面该轮到任务控制块了,由于没有任务,任务控制块的两个链表应该初始化为什么样子呢?
在有用户任务运行之前,因为没有用户任务就绪,就绪链表该是个空链表。而空闲链表这个时候应该是最长的,它的长度是操作系统能容纳的任务数。代码如下所示:


到这里,全局变量、就绪表、就绪组、任务优先级指针表、空闲链表、就绪链表等重要数据结构都已经完成了初始化的操作。
接下来OS_InitEventList对时间所用数据结构进行初始化,OS_FlagInit对事件标志数据结构进行初始化,OS_MemInit对内存进行初始化,OS_QInit对消息队列进行初始化。
OS_InitTaskIdle将创建和初始化操作系统的第一个任务——空闲任务,该部分内容个如下所示:

这部分代码主要是根据配置信息调用创建任务的函数创建空闲任务,其中,无论是OSTaskCreateExt还是OSTaskCreate的第一个参数,都是OS_TaskIdle,OS_TaskIdle是空闲任务函数的地址。该任务的优先级是OS_TASK_IDLE_PRIO,这是一个供用户配置的宏,默认值是63,是最低优先级的任务。
接着,用类似的方法调用OS_InitTaskSta创建统计任务。

那么,在创建了这两个系统任务后,那个任务运行了呢?没有任务运行,因为还没有真正启动多任务。只是为任务分配和设置了它们生存的数据结构。
如果系统配置有定时器模块,执行OSTmr_Init初始化定时器。
后面的两个空函数,可以编写合适的内容及显示一些自己需要的调试信息。
操作系统初始化是操作系统开始运行时首先执行的函数,对操作系统使用的各种全局变量和重要的数据结构如任务控制块及其链表、就绪表等进行初始化。接着创建两个系统任务——空闲任务和统计任务。对这个流程的总结如下所示:


分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏2 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表