实时操作系统(RTOS)是一种软件系统。它在当外界事件或数据产生时,能够接受并以足够快的速度予以处理,其处理的结果又能在规定的时间之内来控制生产过程或对处理系统做出快速响应,并控制所有实时任务协调一致运行的操作系统。提供及时响应和高可靠性是其主要特点。(这些基本概念在此不做过多介绍,当学会移植之后更能进一步理解)
目前DSP芯片中广泛应用的操作系统是 μC/OS-II。μC/OS-II 由Micrium公司提供(可在其官网www.micrium.com下载 μC/OS-II 操作系统源代码),是一个可移植、可固化的、可裁剪的、抢先式多任务实时内核,它适用于多种微处理器、微控制器和数字处理芯片(已经移植到超过100种以上的微处理器应用中)。同时,该系统源代码开放、整洁、一致,注释详尽,适合系统开发。严格地说 μC/OS-II 只是一个实时操作系统内核,它仅仅包括了任务调度,任务管理,时间管理,内存管理和任务间通信和同步等基本功能。
在 Jean J.Labrosse 著的 μC/OS-II (第二版) 中,有对该操作系统中每个函数进行详细解释。
μC/OS-II 的任务状态可简要概括,如下图所示
参考 张卿杰等编著的 手把手教你学DSP——基于TMS320F28335,能更好理解。 而且能找到裁剪好的 μC/OS-II操作系统内核文件。
此段落主要是对书上一些知识的总结与扩展,有时间再更...
介绍7个主要函数
– 标记任务堆栈空间(由标记可计算堆栈剩余空间);//编辑CMD文件为堆栈分配RAM空间
– 初始化任务控制块;//定义任务数量
– 初始化操作系统相关参数。
2. OSTaskCreate(void (*task)(void), INTOS stksize, INTOS prio)函数
– 分配任务堆栈空间;
– 初始化堆栈序列值:
– CPU与指令集参考手册:28x系列DSP在响应中断时,硬件会按ST0、T、AL、AH、PL、PH、AR0、AR1、ST1、DP、IER、DBGSTAT、RPC顺序自动保存相应寄存器的内容。剩下的寄存器,interrupt关键字会根据中断函数需要,生成相应的寄存器保护代码,然而这种出入栈是不能人为确定的,所以OS不采用interrupt关键字方式。
– 故堆栈堆栈序列初始化分为两部分,第一部分严格按照硬件自动保存顺序初始化对应寄存器值;第二部分必须与任务切换寄存器压入/弹出堆栈顺序一致。
3. OSTimerStart(prio,cnt,period)函数
– 配置任务执行周期与初始计数值。
4. OSStart()函数
– 所有任务创建完成,开始执行高优先级就绪任务;
– OSFindHighPrio()函数;
– OSStartHighRdy()函数
- MOVW DP,#_OSTCBCur ;数据页指针
- MOVL XAR6,@_OSTCBCur
- MOVL ACC,*XAR6
- MOV SP,AL ;堆栈指针
- POP XXX ;手工弹出堆栈
- IRET ;中断返回,恢复自保存寄存器并通过RPC返回程序计数器
5. OSEventPend()函数
– 任务有事件标志位便清除事件标志位并执行任务,无便清除任务就绪标志并切换任务;
– OSSched()函数
– 查找高优先级就绪任务并执行;
– OS_TASK_SW()函数
#define OS_TASK_SW() asm(" TRAP #31") ;为实现自动保存部分寄存器,调用自定义中断
PieVectTable.USER12_INT = &OSCtxSw ; ;自定义中断入口
- _OSCtxSw:
- ASP ;定位偶地址堆栈指针
- PUSH XXX ;手工弹入堆栈
- MOVW DP,#_OSTCBCur
- MOVL XAR6,@_OSTCBCur
- MOV AL,SP
- MOVL *XAR6,ACC ;保存当前任务堆栈指针
- MOVW DP,#_OSTCBHighRdy
- MOVL XAR7,@_OSTCBHighRdy
- MOVL ACC,*XAR7
- MOV SP,AL ;获取高优先级任务堆栈指针
- MOVL ACC,@_OSTCBHighRdy
- MOVL @_OSTCBCur,ACC ;当前任务为高优先级任务
- POP XXX ;手工弹出堆栈
- NASP ;撤销ASP操作
- IRET ;中断返回,恢复自保存寄存器并通过RPC返回程序计数器
6. OSTickISR()函数
– 采用定时器2作为OS的计时器
PieVectTable.TIMER2_INT = &OSTickISR ;
- _OSTickISR:
- ASP ;定位偶地址堆栈指针
- PUSH XXX ;手工弹入堆栈
- LCR _OSTimerTick ;长调用,函数跳转。增加各任务时间计数,置位任务周期事件。
- LCR _OSIntExit ;高优先级任务就绪,直接在此进行任务切换。
- POP XXX ;手工弹出堆栈
- NASP ;撤销ASP操作
- IRET ;中断返回,恢复自保存寄存器并通过RPC返回程序计数器
7. OSEventSend(INTOS prio , INTOS EventId)函数
– 置位任务事件标志,置位任务就绪标志。
以上只是对移植最简单的概述,可能许多地方仍未讲清楚,会继续更新的!
欢迎交流讨论
联系客服