5.1 uCOS-II操作系统
5.1.1 什么是操作系统
《1》管理软件硬件的程序集合。
《2》软硬件的沟通桥梁。
举个栗子:当你要播放音乐时,假设是电脑,装的是Window操作系统,步骤如下:
这时,你就能听到优美动听的歌曲了。但底层操作是如何操作的呢?是谁操作呢?
是操作系统帮你完成了这一切工作。当你点击播放,操作系统工作流程如下:
总结,对硬件的操作,由操作系统来完成,操作系统直接与硬件交互。用户如果想控制底层硬件,必须经过操作系统进行间接控制,操作系统提供系统调用给用户,用户就可以与硬件交互了。系统调用是封装了操作各部分硬件的API。
5.1.2 为什么要使用操作系统
《1》屏蔽硬件。使应用程序不依赖硬件,提高了程序的可移植性。
《2》多任务。因为消费者想同时聊QQ、聊、看电视剧等。早期单核CPU想完成这些功能,就需要使用操作系统,实现不同任务之间高速的切换。
5.1.3 操作系统分类
《1》分时操作系统:以时间片为基本调度原则。给每个任务分配一段固定的CPU时间,时间到就切换下一个任务,时间不到不切换任务。如:Windows—95/98,Linux内核2.6以前。
《2》实时操作系统:以优先级为基本调度原则。不是给每个任务分配一段固定的CPU时间,而是根据优先级分配CPU执行时间,谁优先级高,先执行谁,分配的CPU时间就多,如uCOS-II。
《3》半实时操作系统:部分使用分时操作系统、部分使用实时操作系统。如Windows----7/8/10,Linux内核2.6以后。
5.1.3 为何学uCOS-II
《1》代码量少,容易上手。
《2》多任务,实现复杂功能
《3》提高内外功(内功:阅读代码能力 外功:编程能力)
《4》为学习其他操作系统打下基础
5.1.4 其他补充
学操作系统的难点
《1》逻辑理解、代码运行流程
《2》术语的理解、领悟
uCOS-II理解
u---微型
C---控制器
OS—操作系统
UCOS-II代码来源
《1》官网
《2》示例代码
5.2 UCOS操作系统
5.2.1 操作系统的调度原则
《1》分时操作系统调度原则:
以时间片为基本调度原则,为每个任务分配固定的CPU执行时间,时间到,切换下一个任务,时间不到,不切换任务。
《2》实时操作系统调度原则
以优先级为基本调度原则,不是固定为每个任务分配CPU执行时间,而是根据优先级高低分配CPU时间,优先级低的分配CPU执行时间就短,优先级高的分配的CPU时间就长。
5.2.2 操作系统程序结构
《1》裸机代码
整个工程只有一个main函数,在main函数执行中只有一个真正意义上的死循环,其他死循环都是有退出条件或永远不会执行了的死循环。
《2》操作系统代码
整个工程只有一个main函数,在mian函数中,至少创建一个任务,每个任务都有一个死循环。操作系统要切换任务需要高优先级任务释放CPU使用权。
5.2.3操作系统的任务结构
《1》任务的构成:任务控制块,任务函数、任务优先级、任务栈。
《2》 任务控制块:任务先内存空间申请的一块内存空间,用于执行任务使用的,任务控制块包含、任务函数、任务优先级、任务栈。
《3》任务函数:任务的执行入口,任务的具体功能在这里实现。
《4》任务优先级:任务的能执行的唯一标识。用来规定任务的执行先后顺序。
《5》任务栈:保存任务在切换过程中的现场信息。任务在切换前,把当前执行任务的现在信息保存在栈中,该过程称为压栈,当执行完其他任务完后,又切换回来,读取栈里面保存的现场信息,继续执行任务,该过程称为弹栈。
简单理解:在栈中进入一个元素,称为压栈或入栈,出来一个元素称为弹栈或出栈。
5.2.4 操作系统的任务切换
在哪些情况下,会进行任务切换?
5.2.5 操作系统的任务中断
与裸机编程中断基本一致,但需要注意两点
裸机中断与ucos中断的深入理解
5.2.6 操作系统的任务状态
《1》停止/休眠态:任务创建之前和删除之后的状态。
《2》就绪态:任务具有了可执行条件。
《3》运行态:任务得到了CPU的使用权。
《4》等待/挂起态:任务被挂起或等待某件事情发生。
《5》中断态:正在执行的任务,被中断了。
任务状态转换关系如下图:
5.3 创建UCOS工程模板
5.3.1 获取UCOS源码
官网太卡了,所以给你准备UCOS例程,如下。
5.3.2 UCOS过程文件分析
5.3.3 新建UCOS工程
5.3.4 创建一个任务
5.3.5 补充、小结
移植Ucos-II总结:
配置基本流程:
《1》找到Ucos-II源码(来源:官网、例程、别人的代码、自己的代码)
《2》添加到过程文件中,添加对应头文件
《3》编写系统滴答定时器,开启中断模式
《4》编写滴答中断服务函数
《5》编写主函数
主函数编写流程:
关于延时OSTimeDly(100);?
一次系统滴答为5ms,所以写100,就是500ms。
关于任务函数OSTaskCreate(Task0,NULL,&stack0[TASK0_STK_SIZE-1],TASK0_PRI);?
欢迎光临 (http://www.51hei.com/bbs/) | Powered by Discuz! X3.1 |