为什么需要操作系统
应用程序功能层
图形用户 文件系统任务管理接口 软件层 实时操作系统(RTOS)
中间层BSP/HAL 硬件抽象层/板极支持包
D/A通用接口
嵌入式A/DROM 微处理器硬件层
I/OSDRAM 人机交互接口 嵌入式计算机系统
? 通用操作系统:Windows/NT/XP、Linux、UNIX等,用于PC机、服务器, ? 嵌入式(实时)操作系统:用于嵌入式设备的操作系统,具有通用操作系
统的基本特点,又具有系统实时性、硬件的相关依赖性、软件固态化以及应用的专用性等特点; ? 嵌入式(实时)操作系统通常包括与硬件相关的底层驱动软件、系统内核、
设备驱动接口、通信协议、图形界面、标准化浏览器Browser等;
? 嵌入式(实时)操作系统的重要指标:实时性(中断响应时间、任务切换
时间等)、尺寸(可裁剪性 )、可扩展性(内核、中间件)
?C/OS的性能特点(一)
1 公开源代码2 可移植性(Portable)3可固化(ROMable)4可裁剪(Scalable) ?C/OS的性能特点(二)
1占先式(Preemptive)2多任务:?C/OS-II可以管理64个任务,然而,目前这一版本保留8个给系统。应用程序最多可以有56个任务。3可确定性 4任务栈5系统服务6中断管理:中断可以使正在执行的任务暂时挂起,如果优先级更高的任务被该中断唤醒,则高优先级的任务在中断嵌套全部退出后立即执行,中断嵌套层数可达255层。7稳定性与可靠性 典型的任务:一个无限循环的函数 ?C/OS –II中的任务
? ?C/OS –II 2.5版本支持64个任务,每个任务一个特定的优先级。数字越
小,优先级越高
? 系统总是运行进入就绪态优先级最高的任务 ? 任务优先级号就是任务编号(ID).
? 系统占用了8个任务,保留优先级为0、1、2、3、OS_LOWEST_PRIO-3、
OS_LOWEST_PRIO-2、 OS_LOWEST_PRIO-1、 OS_LOWEST_PRIO-0 ? 即:建议不使用上述最高4个和最低4个优先级,用户任务仍可达56个 任务状态:睡眠态(task dormant),就绪态(task ready),运行态(task running),等待状态(task waiting),中断服务态(ISR running) ?C/OS-II的文件结构
?C/OS-II开关中断的方法:
1,?C/OS-II定义了两个宏调用来开关中断: OS_ENTER_CRITICAL( ) (禁止中断的宏) OS_EXIT_CRITICAL( ) (启用中断的宏) 通常成对出现
2,上述宏定义取决于使用的微处理器。在文件OS_CPU.H有相应的宏定义;在?C/OS-II中,每种微处理器都有自己的OS_CPU.H文件
?C/OS-II中采用了3种开关中断的方法: 1 OS_CRITICAL_METHOD==1 用最简单的方式来实现2个宏调用
用处理器指令关中断,完成OS_ENTER_CRITICAL() 用开中断指令完成OS_EXIT_CRITICAL() 问题:
如果调用?C/OS-II功能函数时,中断是关掉的,则从?C/OS-II函数返回时,中断就打开了
若调用?C/OS-II功能函数之前已将中断关掉,那么用户往往希望从?C/OS-II函数返回时,中断仍然是关着的。这时,这种方法就不妥当。 对特定的处理器,这种办法是唯一的选择 2 OS_CRITICAL_METHOD==2
a) 在堆栈中保存中断的开/关状态,然后再关中断 i. 实现OS_ENTER_CRITICAL()时,先在堆栈中保存中断的开/关状态,
然后再关中断
ii. 实现OS_EXIT_CRITICAL()时,从堆栈中弹出原来中断的开/关状态 b) 利用这种机制,不论用户在调用?C/OS-II功能函数之前中断是开或关,
函数的进入和返回状态都得到了保护。即:调用前中断的开/关状态,在调用之后保持不变
3 OS_CRITICAL_METHOD==3
a) 把当前处理器的状态字(PSW)保存在C函数的局部变量中(如
OS_CPU_SR)
b) 关中断时保存,开中断时恢复 Void Some_ uCOS_II_Service(arguments) {
OS_CPU_SR cpu_sr;
cpu_sr=get_processor_psw(); disable_interrupts(); /*临界段代码*/
set_processor_psw(cpu_sr); }
任务控制块 OS_TCB是一个数据结构,保存该任务的相关参数,包括任务堆栈指针、状态、优先级、任务表位置、任务链表指针等 分为:空闲链表,使用链表 μC/OS-II任务控制块: typedef struct os_tcb { OS_STK *OSTCBStkPtr(当前任务堆栈栈顶指针); #if OS_TASK_CREATE_EXT_EN>0 void *OSTCBExtPtr; (指向用户定义的任务控制块扩展) OS_STK *OSTCBStkBottom;(指向任务堆栈栈底指针) INT32U OSTCBStkSize;(存有栈中可容纳的指针元数目) INT16U OSTCBOpt; INT16U OSTCBId; (存储任务的识别码ID,备用)
相关推荐: