您的位置 首页 电子

嵌入式实时操作系统μC/OS-Ⅱ在DSP上的移植

0.引言μC/OS-Ⅱ内核是一个强占式优先级调度的系统,能管理63个任务,支持旗语、信号量、互斥信号量、队列和消息邮箱,是一个是典型的嵌入式实时操作系统。它最早由JeanJ.Labrosse创作,源码

  0. 导言

  μC/OS-Ⅱ内核是一个侵占式优先级调度的体系,能办理63个使命,支撑旗语、信号量、互斥信号量、行列和音讯邮箱,是一个是典型的嵌入式实时操作体系。它最早由Jean J. Labrosse创造,源码彻底揭露,已有很多运用典范,牢靠功用得到确保,内核小,移植性好。TI的C2000系列DSP处理器 TMS320LF2407A片内集成16路10位AD,4个通用守时器,8个16位PWM通道,4个CAP捕获单元,41路I/O通道,以及SPI、 RS232、CAN等通讯接口,丰厚的片内资源,使得操控器不需任何扩展就能满意一切的功用要求,且冗余很少。

  DSP处理器在数学运算方面的优势也为智能化进程所需的数据处理供给了支撑。TMS320LF2407A指令选用4级流水线操作,最高能以40M的体系时钟作业,再加上适宜的RTOS的调度,彻底能确保体系的实时性。其开发体系TMS320C2XX Code Composer Studio满意μC/OS-Ⅱ的移植条件,因而,它是嵌入式核算机操控体系主操控芯片的一个较好挑选。笔者在规划根据CAN的工程机械嵌入式智能显现仪时,选用2407A做主操控芯片,软件方面,将实时内核μC/OS-Ⅱ移植到该DSP 操控器TMS320LF2407A上,而运用程序是在μC/OS-Ⅱ内核根底上的一系列使命。

  1. μC/OS-Ⅱ的移植

  由于μC/OS-Ⅱ在规划时就现已充分考虑了可移植性,所以μC/OS-Ⅱ的移植相对来说比较简略。移植作业包括以下几个内容:(1)用#define设置一个常量的值(OS_CPU.H)(2)声明10个数据类型(OS_CPU.H)(3)用#define声明三个宏 (OS_CPU.H)(4)用C言语编写六个简略的函数(OS_CPU_C.C)(5)编写四个汇编言语函数(OS_CPU_A.ASM);即μC/OS-Ⅱ的移植要修正3个文件OS_CPU.H、OS_CPU_C.C和OS_CPU_A.ASM。其间汇编言语文件OS_CPU_A.ASM是可挑选的,由于某些C编译器答运用户在C言语中刺进汇编言语,所以用户能够将所需的汇编言语代码直接放到OS_CPU_C.C中。CCS的C编译器答应在 C言语中嵌入汇编言语,可是由于这种办法破坏了C言语的完好性,因而只发起在程序开端体系初始化部分少数选用。而在C言语中嵌入完结某一完好功用的多句汇编言语时,就不发起选用这种办法。所以,移植中仍是对OS_CPU_A.ASM做了修正。

  2. 编写移植代码

  移植μC/OS-Ⅱ的首要作业是声明与硬件相关的数据类型,界说与中止有关的宏界说,界说仓库增加方向宏界说,编写仓库初始化函数,HOOK接口函数,使命级上下文切换函数,中止级上下文切换函数以及体系时钟守时服务函数等。

  2.1 移植OS_CPU.H文件

  (1)一个常量值。OSInit需求知道当OS_TaskIdle() 和OS_TaskStat( ) 函数树立使命时,仓库的顶端地址在哪里;其次调用OSTaskStkChk( )时,μC/OS-Ⅱ需求知道仓库的底端地址在哪里。所以需求指明仓库的增加方向。绝大多数微处理器和微操控器的仓库是从上往下递减的,可是也有某些处理器运用的是相反的办法。TMS320LF2407A的仓库方向是从下往上增加的,所以: #define OS_STK_GROWTH 0;// 仓库方向是从下往上增加

  (2) 声明数据类型。μC/OS-Ⅱ考虑到通用性,在内核中运用了自界说数据类型,与编译器无关,这就要求移植时有必要界说微处理器的数据类型与μC/OS-Ⅱ的数据类型相一致,确保移植后的μC/OS-Ⅱ在微处理器平台上运转,在移植中应将其声明为CCS编译器可辨认的类型。这能够由OS_CPU.h头文件完结,程序如下所示。

  typedef unsigned char BOOLEAN;/*界说ucos里的boolean为unsigned char*/

  typedef unsigned char INT8U; /*界说ucos里的INT8U为unsigned char*/

  typedef signed char INT8S; /*界说ucos里的INT8S为signed char*/

  typedef unsigned int INT16U; /*界说ucos里的INT16U为unsigned int*/

  typedef signed int INT16S; /*界说ucos里的INT16S为signed int*/

  typedef unsigned long INT32U; /*界说ucos里的INT32U为unsigned long*/

  typedef signed long INT32S; /*界说ucos里的INT32S为signed long */

  typedef float FP; /*界说ucos里的FP为float*/

  #define OS_STK INT16U /*仓库进口宽度为16位*/

  由于体系没有用到OS_CPU_SR类型数据,所以没有界说此数据类型。

  (3)3个宏界说。μC/OS-Ⅱ在内核中经过制止中止来维护临界区,因而,需求在C言语中刺进制止和答应中止的汇编代码,DSP里用SETC INTM来屏蔽中止,用CLRC INTM来使能中止。所以移植代码界说了下面两条宏界说:

  #define OS_ENTER_CRITICAL() asm(” SETC INTM”)

  #define OS_EXIT_CRITICAL() asm(” CLRC INTM”)

  μC/OS-Ⅱ界说了三种维护临界区的办法,此移植版别选用的是最简略的榜首种办法。此种办法就要求中止封闭的情况下不能调用μC/OS-Ⅱ的功用函数。这关于运用来说是能够承受的,所以就挑选了此种形式。TMS320LF2407A支撑多种中止办法,包括可屏蔽硬中止INT1~INT6,不行屏蔽硬中止RESET和NMI_VECT,不行屏蔽软中止INT8~INT16和INT20~INT31以及中止圈套TRAP。因而运用INT31软中止来调用OSCtxSw()来从使命仓库中康复处理器所用的寄存器。用INT2的守时器1周期中止来调用OSTickISR()。界说仿照INT31中止的宏,来跳转到INT31

  #define OS_TASK_SW() asm(” INTR 31″)

  在中止向量表里的界说

  .include f2407regs.h

  .global _c_int0, _OSTickISR, RESET, _OSCtxSw,_GRIS5,_adint,_nothing

  .asect “vectors”,0

  ……

  INT2 B _OSTickISR ; B _c_int2

  ……

  INT31 B _OSCtxSw ; task switching service vector.

  2.2 移植OS_CPU_C.H文件

  μC/OS-Ⅱ的移植典范要求编写10个简略的C函数,可是真实必要的函数是OSTaskStkInit(),其他9个函数有必要声明,但并不一定要包括任何代码。OSTaskStkInit()首要是对使命仓库的初始化。TMS320LF2407A的仓库与一般微处理器的仓库不同,一般微处理器的仓库由编程界说一块内存作为仓库比较灵敏,而TMS320LF2407A的仓库,是在CPU内有8级深度的硬件仓库,因而使命仓库的初始化与一般微处理器的仓库初始化不同。芯片自身的仓库(以下简称US)只要8级,无法作为体系的仓库运用,所以CCS编译器将CPU内部的两个寄存器AR0和AR1保存,AR1作为仓库指针,AR0用作仓库中暂时变量指针FP。编译器将函数或中止压进US的回来地址,弹出放在SP(AR1)指向的仓库中,并保存CPU 的作业环境,不同的是函数只保存程序要用到的寄存器,中止要调用I$$SAVE子程序,保存CPU一切的寄存器,回来时调用I$$REST子程序,康复 I$$SAVE和I$$REST两个函数是μC/OS-Ⅱ操作体系移植到TMS320LF2407A上的根底,一定要很清楚后才能够成功移植 OSTaskStkInit()函数。

  2.3 移植OS_CPU_C.H文件

  需求在该文件中编写4个汇编言语函数:(1)OSStartHighRdy():这是体系完结初始化后发动多使命运转时要调用的函数,首要功用是:将OSRunning标志置为TRUE,然后获取已树立的优先级最高使命的仓库指针,并从其仓库中康复处理器寄存器,最终履行回来指令回来上述使命中运转该使命。(2)OSCtxSw():在本移植中,使命级使命切换用软中止intr31完结,OSCtxSw()即为该中止的中止服务程序。它先要将当时处理器寄存器压入当时使命的仓库中,将当时仓库指针保存到当时使命的使命操控块中;然后用与OSStartHighRdy()相类似的办法运转当时处于安排妥当态中优先级最高的使命。(3)OSIntCtxSw():该函数被OSIntExit()函数调用,用于在ISR中进行使命切换。它与OSCtxSw() 的差异在于无需对当时使命的作业现场进行保存,由于这一作业在进入ISR之时现已做了。(4)OSTickISR():用守时器发生一个周期为稳定值的时钟源供给给μC/OS-Ⅱ,这是μC/OS-Ⅱ时刻延迟和超时功用的时刻基准。OSTickISR()是该守时器周期中止的中止服务程序。它首要有两个功用:一个是调用OSTimeTick()函数,核算自体系上电以来所阅历的时钟节拍数,并将每个处于延时等候状况使命的OSTCBDIy项减1;另一个是调用OSIntExit()函数检查是否有更高优先级的使命因时钟节拍到来而延迟时刻到并进入安排妥当态,如果有,则进行中止级的使命切换。别的,在该函数的进口处要将OSIntNesting加1;在出口处将OSIntNesting减1。其间仓库的结构,选用了体系库函数I$$SAVE和I$$RSET函数来维护/康复现场、维护/康复使命栈。时钟节拍TICK中止由实时时钟完结,可是2407A中没有此守时器,移植是选用T1的周期中止来完结的,时钟频率为10M,4倍频后CPU时钟为40M。体系初始化代码如下。

  ldp #00e0h ;指向第224页(0x7000~0x707F)

  splk #00e8h,WDCR ;不使能看门狗

s

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/qiche/dianzi/226938.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部