嵌入式操作系统的基本概念
操作系统的功能
- 处理器的管理(中断,处理器调度)
- 存储的管理
- 设备的管理
- 文件的管理
- 网络通信的管理
- 提供用户接口
嵌入式系统和嵌入式操作系统
嵌入式系统基本要素和特点
基本要素
- 嵌入
- 专用
- 计算机系统
特点
- 专用性强
- 可裁剪性好
- 实时性与可靠性好
- 功耗低
典型结构
#
实时操作系统
- 实时系统的计算必须产生正确的结果,逻辑或功能正确
实时系统的计算必须在预定的周期内完成,成为时间正确
硬实时操作系统 软实时操作系统
需要满足三个条件
实时操作系统必须是多任务系统 任务的切换时间应与系统中的任务数无关
中断延迟的时间可预知并尽可能短 为了是应用程序的设计者可以计算出系统完成某一个任务的准确执行时间 要求作为进行任务切换的调度器的运行时间应该是固定的,即调度器进行任务切换的时间不能受应用程序中其他因素(如任务数目)的影响。
分式操作系统
ucosII
体系结构:
us/os-II的任务
任务的基本概念
任务就是一个线程,由C语言函数和相关的一些结构体构成的实体。ucosII就是一个对这些任务进行调度管理的多任务操作系统
任务存储角度来说:三个部分:
任务类型
用户任务,实现某种功能
系统任务,为应用程序提供服务
任务链表:
任务状态
用户任务代码一般结构
带有临界段的无限循环,
用户应用程序的一般结构
OSTaskCreat()为操作系统提供的用来创建任务的,OSStart为操作系统提供的启动个任务的,之后就交给操作系统进行调度管理了。
系统任务
空闲任务:系统没事可做的时候跑的。
统计任务:统计CPU的空占比
优先级别
64 最后两个已经被占用 空闲任务和统计任务
任务堆栈
每个任务有一个自己的堆栈,互不干扰。在存储器里面一段按照FIFO规则使用的空间。
创建
`#define TASK_STK_SIZE 512 //堆栈长度 9512*2)Byte
OS_STK_TaskStk[TASK_STK_SIZE]//定义数组为任务堆栈 `
创建任务时候,将任务栈顶指针传过去 OS_STK *pto
堆栈增长方向不同,创建栈的写法不一样
OSTaskCreate(MyTask, &MyTaskAgu,&MyTaskStk[0],20);
任务堆栈初始化
操作系统负责,CPU从堆栈中获得关键恢复数据(任务指针 任务堆栈指针 程序状态字)事先存放在任务的堆栈中,当任务获得CPU的使用权时候,就可以把对战中的初始数据赋值到CPU的各个寄存器中,任务顺利启动并运行。
任务的控制块与任务控制链表
OS_TCB是用来记录任务堆栈指针、任务当前状态、任务优先级别……与任务管理有关的属性。
控制链表吧系统所有任务的控制块链接为两条链表,并进行管理,控制任务快进行相关操作。
任务控制块结构
结构类型数据,创建函数时候赋值并留在RAM中
结构定义:
任务控制块链表
任务控制块的初始化
创建任务时候,任务控制块也会被赋值
任务就绪表及任务调度
调度就是通过一个算法来确定多个任务中的哪个任务来执行,调度器来做这个事情,要保证就绪状态的所有任务中优先级别最高的任务来执行,根据任务就绪表
结构
操作
任务调度
有规矩的任务切换:
找就绪任务
任务切换
获得就绪任务的TCB
被终止任务的任务控制块指针存放在全局变量OSTCBCur中,所以调度器这部分的工作主要是获得带运行任务的控制块指针。任务切换
OSCtxSw() 完成任务切换功能,实现无缝切换
任务的创建
创建任务的实质是创建任务控制块,使刚创建的任务进入就绪状态,并接着来一次任务调度。
一般来说,任务可以在函数OSStart()之前进行创建,但必须在之前已经创建了一个任务,并赋予它最高优先级别。
任务的挂起和恢复
挂起一个任务就是停止这个任务的运行
其他任务管理函数
ucosII的初始化和任务的启动