电子文章 | 电子资料下载 | 家电维修 | 维修资料下载 | 加入收藏 | 全站地图
您现在所在位置:电子爱好者电子文章电子基础知识TMS320F28x上RTOS移植关键技术分析

TMS320F28x上RTOS移植关键技术分析

08-09 23:01:49 | http://www.5idzw.com | 电子基础知识 | 人气:884
标签:电子基础,电子基础知识应用,电工电子技术基础,http://www.5idzw.com TMS320F28x上RTOS移植关键技术分析,http://www.5idzw.com

TMS320F28x上RTOS移植关键技术分析

详细分析TI公司TMS320F28x系列DSP的启动过程;说明BootROM中程序的运行过程,介绍C编译器和DSP/BIOS的工作细节;探讨DSP的中断处理及从RAM中执行代码等问题。最后分析如何在TMS320F28x系列DSP上移植实时操作系统。

关键词 数字信号处理器 TMS320F28x BootROM 实时操作系统

  TMS320F28x(简称“F28x”)数字信号处理器是TI公司推出的32位定点DSP控制器,其频率高达150 MHz,大大提高了控制系统的精度和芯片的处理能力。在F28x系列DSP上移植实时操作系统,需要对编译器、系统启动过程、中断处理过程以及整体代码执行流程有一个全面的深入理解。对系统的整个运行过程有清晰的概念是移植实时操作系统的前提条件。本文将对从DSP上电复位到其系统功能实现的整个运行过程进行深入介绍,并在此基础上进一步分析在F28x系列DSP上移植实时操作系统一般原理,详细说明μC/OSⅡ的移植。

1  BootROM及其运行

  在F281x、C281x、R281x器件中都有一块4K×16位的BootROM。当引脚MP/nMC的状态反映到XINTCNF2中为0时,BootROM被映射到地址空间0x3FF000~0x3FFFC0上。片上ROM在出厂前就已经烧写好了一个启动程序以及一些其他数据和表格(版本信息、复位向量、中断向量表、IQmath表等)。其空间分配如图1所示。

按此在新窗口浏览图片
图1  片上BootROM分配

  其中,中断向量表在VMAP=1、ENPIE=0(PIE未使能向量表)、MPNMC=0时有效。另外,当VMAP=1、ENPIE=0时,系统将从BootROM的0x3FFFC0复位。虽然复位后ENPIE为零,但大部分系统都是需要使能外部中断扩展模块的,即用户程序中需要将ENPIE置1。由此可见,BootROM唯一常用的向量只有复位向量;而其他的中断向量是指向M0SRAM用于芯片测试的,通常用不到。状态位和向量表映射关系如表1所列。

2  从上电复位到用户代码

  当系统重启(上电或热启动)时,引脚XMPNMC的信号将被锁存到XINTF的配置寄存器XINTCNF2中。重启之后,XMPNMC的状态不再反映到XINTCNF2,这时,可以用软件来修改它的状态,从而确定程序要访问的是内部地址还是外部地址。但是,像F2810这样的器件,没有XINTF。它的XMPNMC在芯片内部被拉低,也就是说,当器件重启后,它总是自动从内部的BootROM启动。如果XMPNMC为高电平,则表示系统将从XINTF zone7中获取复位向量。即从外部获取中断向量(地址见表1)时,必须确保复位向量所指向正确的地址。这一般在希望自己编写启动程序时使用。本文对此不作具体讨论。

  当XMPNMC为低电平时,系统从内部获取复位向量。这个复位向量指的就是上文中提到的BootROM中位于0x3FFFC0的向量。此向量指向固化在BootROM中的InitBoot函数。所以上电复位后,程序将跳转到InitBoot函数。

  InitBoot函数首先对器件初始化,F281x器件将被配置为F28x工作模式。如果希望执行C2xLP兼容程序,则需要用户自己写程序配置。PLL配置将保持不变。PIE使用缺省状态,即不使能。另外要注意,M1的前80个字将用做BootROM的堆栈, 用户应避免使用。初始化完成后,程序转向执行SelectBootMode函数。此函数将扫描通用I/O口(GPIO),以确定启动模式,如表2所列,包括跳转到Flash、跳转到H0 SARAM、跳转到OTP等模式。

表1  状态位和向量表映射关系向量
按此在新窗口浏览图片

表2  启动模式
按此在新窗口浏览图片

  不同的模式有不同的程序起点(entrypoint)。对于Flash、H0 SARAM、OTP模式,有一个固定的跳转地址(见表2);而对于从SCI、SPI启动时,程序起点将调用bootloader按一定的格式(具体格式见参考文献[3])从外部获取。

  最后,BootROM执行exitboot函数。执行这个函数包括: 置CPU状态为缺省,将SP指向0x400,跳转到程序起点等工作。exitboot执行后CPU状态为:ACC=0, RPC=0, P=0, XT=0, ST=0, XAR0=XAR7=0, SP=0x400, ST1=0x0A0B。

  以上是BootROM完成的工作。从entrypoint开始,就进入用户程序区了。对于汇编程序,可以在程序起点处写一条跳转到Start(如果程序起点是Start)的指令。汇编情况比较简单,跳转到Start后,各项初始化代码工作都由自己完成。对于C语言程序,通常的做法是在程序起点处放置一条跳转指令,转到_c_init0。然后程序的执行分为使用或不使用BIOS两种情况。

  从rts.src中提取boot28.inc文件,其中包括对于不使用BIOS的情况下,启动后从_c_init0到main函数中间所做的工作。因为这段代码是由C编译器自动运行的,因而常被初学者忽视,以致对其后自己编写的C代码的运行环境不清楚。这一段程序主要完成以下工作:

  ◇ 分配C堆栈;
  ◇ 建立C运行环境(CPU寄存器和模式寄存器的配置);
  ◇ 复制cinit、pinit表、.const、.econst常量到工作区;
  ◇ 跳转到main函数。

  这段代码声明了2个全局变量:__stack,系统堆栈栈底;_c_int00,启动函数。下面列出了C运行环境的初始化程序部分代码:

  C28OBJ;选择C28x对象模式
  C28ADDR;清除地址模式位
  C28MAP;设置M0M1模式
  CLRCPAGE0;使用堆栈寻址模式
  MOVWDP,#0;初始化DP指向低64K地址
  CLRCOVM;关闭溢出模式
  ASP;确保SP对齐

  这些代码设置了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中之后,才能调用这些函数,顺序不能乱。

[1] [2]  下一页

,TMS320F28x上RTOS移植关键技术分析