打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
基于28x系列 DSP 的 uC/OS

1 嵌入式实时操作系统的基本概念

    实时操作系统(RTOS)是一种软件系统。它在当外界事件或数据产生时,能够接受并以足够快的速度予以处理,其处理的结果又能在规定的时间之内来控制生产过程或对处理系统做出快速响应,并控制所有实时任务协调一致运行的操作系统。提供及时响应和高可靠性是其主要特点。(这些基本概念在此不做过多介绍,当学会移植之后更能进一步理解)

2 UC/OS-II概述

    目前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 的任务状态可简要概括,如下图所示

3 μC/OS-II 在 28x 系列上移植及应用

    参考 张卿杰等编著的 手把手教你学DSP——基于TMS320F28335,能更好理解。 而且能找到裁剪好的 μC/OS-II操作系统内核文件。

    此段落主要是对书上一些知识的总结与扩展,有时间再更...

    介绍7个主要函数

  1. OSInit()函数

       – 标记任务堆栈空间(由标记可计算堆栈剩余空间);//编辑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()函数

  1. MOVW    DP,#_OSTCBCur ;数据页指针
  2.       MOVL    XAR6,@_OSTCBCur
  3.       MOVL    ACC,*XAR6
  4.       MOV     SP,AL ;堆栈指针
  5.       POP     XXX ;手工弹出堆栈
  6.       IRET ;中断返回,恢复自保存寄存器并通过RPC返回程序计数器

     5. OSEventPend()函数

       – 任务有事件标志位便清除事件标志位并执行任务,无便清除任务就绪标志并切换任务;

       – OSSched()函数

       – 查找高优先级就绪任务并执行;

       – OS_TASK_SW()函数

#define   OS_TASK_SW()   asm("   TRAP   #31") ;为实现自动保存部分寄存器,调用自定义中断
PieVectTable.USER12_INT  =  &OSCtxSw  ; ;自定义中断入口
  1. _OSCtxSw:
  2.             ASP ;定位偶地址堆栈指针
  3.             PUSH     XXX ;手工弹入堆栈
  4.             MOVW   DP,#_OSTCBCur
  5.             MOVL    XAR6,@_OSTCBCur
  6.             MOV     AL,SP
  7.             MOVL    *XAR6,ACC ;保存当前任务堆栈指针
  8.             MOVW   DP,#_OSTCBHighRdy
  9.             MOVL    XAR7,@_OSTCBHighRdy
  10.             MOVL    ACC,*XAR7
  11.             MOV     SP,AL ;获取高优先级任务堆栈指针
  12.             MOVL    ACC,@_OSTCBHighRdy
  13.             MOVL    @_OSTCBCur,ACC ;当前任务为高优先级任务
  14.             POP      XXX ;手工弹出堆栈
  15.             NASP ;撤销ASP操作
  16.             IRET ;中断返回,恢复自保存寄存器并通过RPC返回程序计数器

     6. OSTickISR()函数

       – 采用定时器2作为OS的计时器

 PieVectTable.TIMER2_INT  =  &OSTickISR  ;
  1. _OSTickISR:
  2.             ASP ;定位偶地址堆栈指针
  3.             PUSH     XXX ;手工弹入堆栈
  4.             LCR      _OSTimerTick ;长调用,函数跳转。增加各任务时间计数,置位任务周期事件。
  5.             LCR      _OSIntExit ;高优先级任务就绪,直接在此进行任务切换。
  6.             POP      XXX ;手工弹出堆栈
  7.             NASP ;撤销ASP操作
  8.             IRET ;中断返回,恢复自保存寄存器并通过RPC返回程序计数器

     7. OSEventSend(INTOS prio , INTOS EventId)函数

       – 置位任务事件标志,置位任务就绪标志。

4 总结

    以上只是对移植最简单的概述,可能许多地方仍未讲清楚,会继续更新的!

    欢迎交流讨论 

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
我的ucos学习分析
uCOS II内核调度分析
μCOSII在Cortex-M3核ARM处理器上的移植
uC/OS-II的任务切换机理及中断调度优化
在PROTEUS中使用ARM处理器及uC/OS-II移植理解
uC/OS-II的任务切换总结
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服