微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > TMS320F28x上RTOS移植关键技术分析

TMS320F28x上RTOS移植关键技术分析

时间:11-25 来源:互联网 点击:

  这些代码设置了C语言的运行环境。在用户程序中编写的汇编代码不应该破坏这个环境,否则C语言将无法正常运行。

3 中断代码的执行

  F28x系列的DSP支持1个不可屏蔽中断(NMI)和16个可屏蔽中断(INT1~INT14、RTOSINT、DLOGINT)。其中,INT1~INT12由PIE控制单元管理。每个INT可以对应8个外设中断,即PIE可以控制96个中断源。

  下面对可屏蔽中断响应过程作一介绍:

  ① 外设发出中断请求。
  ② DSP看中断请求是否被允许。设计PIEIER、PIEACK、IER、INTM等寄存器和标志位的设置,具体参见参考文献[4]。
  ③ 如果中断允许,则先执行完进入解码的二阶段之后的指令,将其他指令冲出流水线。系统将自动保存ST0、T、AL、AH、PL、PH、AR0、AR1、DP、ST1、DBGSTAT、PC、IER,然后获取中断向量,加载到PC。

  注意: 当中断被允许后会立即清除IFR中相应标志位;但是,如果此时中断信号仍有效(保持低电平),那么,相应IFR标志位又会被置位(不过这时此中断不会被立即响应)。这是因为CPU禁止了所有的硬件中断响应,当ISR开始执行时,它才解除禁止;并且,在执行ISR之前(此时原来的IER已保存),当前中断的IER中相应位被清零。也就是说,同一中断源的中断不会再被响应,要等到中断服务子程序中用户来使能中断(如果需要嵌套),或者等到中断返回自动恢复IER。

  ④ 执行中断服务子程序。

  由于置位了INTM、DBGM,所以可屏蔽中断默认是不被允许的。如果要嵌套,则需程序员自己动手清除禁止中断标志。另外,中断里面LOOP、EALLOW、IDLESTAT都被清零了,这样中断服务子程序有了一个全新的上下文。

4 从RAM中执行代码

  通常情况下,程序是保存在Flash里面的,CPU从Flash中取指运行;但是,有时会要求将程序调到RAM中来执行。一方面是为追求更高的速度;另一方面是为了让Flash有最好的运行性能,需要修改Flash的等待状态周期,使能Flash Pipeline,而对Flash的操作必须在RAM里面执行,这些操作函数就必然要从Flash中调到RAM中执行。对于这些程序,在启动后用户程序中需要先完成存储器拷贝工作。拷贝到RAM中之后,才能调用这些函数,顺序不能乱。

5 在DSP上移植实时操作系统

  所谓移植,就是使一个实时内核能在某个微处理器或微控制器上运行。在移植软件之前,先要正确配置处理器的运行模式,了解处理器的中断方式、中断向量地址等。这些工作在F28x系列DSP中由BootROM中固化的程序完成。另外,为了方便移植,大部分的RTOS代码都是用C语言写的;但仍需要用C语言和汇编语言混合编写一些与处理器相关的代码。这是因为在读写处理器寄存器时只能通过汇编语言来实现。

  对于同时使用汇编语言和C语言的实时操作系统移植,必须小心使用汇编语言,防止破坏C语言运行环境。一方面不可以改变相关状态位;另一方面汇编函数的编写需要遵循C编译器的调用规则。从复位到用户程序编译器做的设置工作见前文。

  中断发生时,TMS320LF28x处理器自动保存了不少寄存器,但是如果中断服务子程序中要用其他寄存器,那么开始时要自己写现场保护程序。就实时操作系统而言,进入中断和退出中断须对系统堆栈进行现场保护。维护堆栈结构时,需要注意处理器堆栈的生长方向。虽然绝大多数微处理器和微控制器的堆栈是从上往下长的,但TI公司的DSP一般为从下往上长。

  一般实时操作系统需要先禁止中断再访问代码的临界段,并且在访问完毕后重新允许中断。这就使得系统能够保护临界段代码免受多任务或中断服务例程(ISRs)的破坏。最简单的实现方法是直接调用处理器指令来禁止中断和允许中断。

  笔者选择了目前应用比较广泛的实时操作系统μC/OS-Ⅱ。要移植μC/OS-Ⅱ需要满足以下要求:

  ◇ 处理器的C编译器能产生可重入代码;
  ◇ 用C语言就可以打开和关闭中断;
  ◇ 处理器支持中断,并且能产生定时中断(通常在10~100 Hz之间);
  ◇ 处理器支持能够容纳一定量数据(可能是几千字节)的硬件堆栈;
  ◇ 处理器有将堆栈指针和其他CPU寄存器读出和存储到堆栈或内存中的指令。移植工作包括以下几个内容:
  ◇ 用#define设置一个常量的值(OS_CPU.H);
  ◇ 声明10个数据类型(OS_CPU.H);
  ◇ 用#define声明3个宏(OS_CPU.H);
  ◇ 用C语言编写6个简单的函数(OS_CPU_C.C);
  ◇ 编写4个汇编语言函数(OS_CPU_A.ASM)。

移植的难点在于实现OS_CPU_A.ASM。这个文件的实现需要十分清楚处理器启动过程和中断处理,以及代码的运行过程。由于TI公司的DSP堆栈从下往上长,所以移植时需要置OS_STK_GROWTH为0。可以简单地使用TIMS320LF28x的中断使能和禁止命令来

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

网站地图

Top