微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > 实时多任务系统µC/OS-Ⅱ在DSP上的移植

实时多任务系统µC/OS-Ⅱ在DSP上的移植

时间:03-26 来源:互联网 点击:

调用μ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 ;不使能看门狗

splk #080feh,SCSR1 ;时钟4倍频

ldp #DP_EVA ;指向第232页(0x7400~0x747F)

splk #080h,EVAIMRA ;通用定时器1 周期中断使能

splk #0ffffh,EVAIFRA ;清中断标志 ;

splk #0,GPTCONA ;无控制操作

splk #4E20h,T1PER ; 定时器计数使能 ,周期为20000

splk #0,T1CNT ; 计数初值清0

splk #080Ch,T1CON ;TMODE=01 连续增/减计数模式,计数时钟不分频

必须在最高优先级任务中开启定时器,系统在优先级为0的任务里开启T1。为提高系统的实时性,设置T1每500us(20000/40M)产生一次T1周期中断,即TICK为500us,μC/OS-Ⅱ每500us做一次任务调度。

3. 移植代码测试

CCS是一个强大的集成开发环境,带有源码级的调试工具,按照Jean J.Labrosse推荐的移植代码测试方法

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top