TMS320F28x上RTOS移植关键技术研究

发布者:breakthrough3最新更新时间:2008-01-15 来源: www.esic.cn关键字:移植  向量表  代码  中断源  置位  main函数  BootROM  中断方式  定点DSP  RTOS 手机看文章 扫描二维码
随时随地手机看文章

  TMS320F28x上RTOS移植关键技术研究

  摘要详细分析TT公司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及其运行

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

  

  

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

  2 从上电复位到用户代码

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

  

  

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

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

  

  

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

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

  以上是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_intOO,启动函数。下面列出了C运行环境的初始化程序部分代码:

  

  

  

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

  3 中断代码的执行

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

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

  ①外设发出中断请求。

  ②DSP看中断请求是否被允许。没计PIEIER、PIEACK、IER、INTM等寄存器和标志位的设置,具体参见参考文献。

  ③如果中断允许,则先执行完进入解码的二阶段之后的指令,将其他指令冲出流水线。系统将自动保存ST0、T、AL、AH、PL、PH、AR0、ARl、DP、STl、DBG-STAT、PC、IER,然后获取中断向量.加载到PC。

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

  ④执行中断服务子程序。

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

  4 从RAM中执行代码

  通常情况下,程序是保存在Flash里面的,CPU从Flash中取指运行;但是,有时会要求将程序调到RAM中来执行。一方面是为追求更高的速度;另一方面是为了让Flash有最好的运行性能,需要修改Flash的等待状态周期,使能Flash Pipeline,而对F1ash的操作必须在RAM里面执行,这些操作函数就必然要从F1ash中调到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);

  ◇声明lO个数据类型(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的中断使能和禁止命令来实现OS_ENTER_CRITICALO、OS_EXIT_CRITICAL()两个宏。

  以下是移植时OS_CPU_A.ASM文件里任务切换的代码。任务切换时,须时刻注意自己设计的堆栈结构。

  

  

  

  结语

   本文详细说明了从上电复位开始,DSP中程序运行的过程;分析了固化在片上ROM的程序以及由编译器自动生成的程序。另外,通过对DSP/BIOS启动、中断执行,从RAM中执行代码等问题的探讨,了解DSP的运行机制,掌握移植实时操作系统的关键技术知识。笔者成功地将实时操作系统μC/OS-Ⅱ移植到了TMS320LF2812数字信号处理器上。

  

关键字:移植  向量表  代码  中断源  置位  main函数  BootROM  中断方式  定点DSP  RTOS 引用地址:TMS320F28x上RTOS移植关键技术研究

上一篇:如何利用可编程器件设计车用显示系统
下一篇:TMS320F28x上RTOS移植关键技术研究

推荐阅读最新更新时间:2024-05-02 20:39

IAR 源代码拷贝到 MDK 乱码问题的解决办法
1. 现象:IAR 的源代码中的中文注释拷贝到 MDK 后会变成乱码 2. 原因分析: IAR 软件默认使用 utf-8 编码,MDK 软件默认使用 ANSI 编码 3. 解决办法: 将 IAR 中代码先拷贝到 notepad++ 中,按如下方法转换为 GB2312 编码 然后,再将转换完的代码拷贝到 MDK 中即可
[单片机]
IAR 源<font color='red'>代码</font>拷贝到 MDK 乱码问题的解决办法
基于S3C2410开发板的U-BOOT移植解决方案
引言 随着嵌入式系统的日趋复杂,它对大容量数据存储的需求越来越紧迫。而嵌入式设备低功耗、小体积以及低成本的要求,使硬盘无法得到广泛的应用。NAND闪存设备就是为了满足这种需求而迅速发展起来的。目前关于U-BOOT的移植解决方案主要面向的是微处理器中的NOR 闪存,如果能在微处理器上的NAND 闪存中实现U-BOOT的启动,则会给实际应用带来极大的方便。 U-BOOT简介 U-BOOT 支持ARM、 PowerPC等多种架构的处理器,也支持Linux、NetBSD和VxWorks等多种操作系统,主要用来开发嵌入式系统初始化代码bootloader。bootloader是芯片复位后进入操作系统之前执行的一段代码,完成由硬件启动到操
[单片机]
基于S3C2410开发板的U-BOOT<font color='red'>移植</font>解决方案
单片机——ds1302代码
#include #include ./lcd/lcd.h #define ds1302_sec_add 0x80 #define ds1302_min_add 0x82 #define ds1302_hr_add 0x84 #define ds1302_date_add 0x86 #define ds1302_month_add 0x88 #define ds1302_day_add 0x8a #define ds1302_year_add 0x8c #define ds1302_control_add 0x8e #d
[单片机]
uCOS51移植心得[社区]
前一段时间,我参与了一个SNMP网管板的项目,我负责硬件设计和单板软件开发。该板的硬件由MCS51+RTL8019AS组成,有64K FLASH 和64K SRAM。软件部分有操作系统和TCPIP协议栈。硬件比较简单,用了一个月就搞定了,协议栈我参考了老古开发板的部分程序又上网找了SNMP源代码也很快完成了,但是测试时发现当使用较低时钟频率的CPU时(为了降低成本),由于ASN.1编解码部分过于庞大,而我的程序又是一个大循环,AGENT的响应速度受到严重影响,用户界面也反应迟钝。更坏的消息是公司为了适应市场需求,还要在上面跑PPP和HTTP。那样的话,我就得用40MHz的AT89C51RD2或者人为的把程序断成几部分然后用状态机的方
[应用]
STM32CubeMX生成基于Eclipse的GCC工程(二)移植FreeRTOS操作系统
通过Freertos操作系统是小灯闪烁: 进入STM32Cube工程中,使能FREERTOS 接下来对FreeRTOS配置,首先是参数配置: 接下来配置任务:名字为Task_Sled1,优先级为正常就可以,进入函数为Func_LED0。 生成代码,并拷贝到eclipse工程中,添加库路径: 在Func_LED0函数中加上小灯闪烁的程序,编译一下,会出现如下问题: 只要在freertos.c加一个#include stm32f2xx_hal_def.h 的头文件就好了,这回再编译并调试,全速跑,小灯会闪烁
[单片机]
STM32CubeMX生成基于Eclipse的GCC工程(二)<font color='red'>移植</font>FreeRTOS操作系统
51单片机-代码参考
前面的篇章我们都是在普及知识,真正使用好定时器还是需要重新拟定新的书写方案的,我们参考了宋老师的书写方式,在他的代码基础上我们进行小修改成就实用的工程代码。 1.代码解析 void ConfigTimer0(unsigned int ms) { unsigned long tmp; //临时变量 tmp = 11059200 / 12; //定时器计数频率 tmp = (tmp * ms) / 1000; //计算所需的计数值 tmp = 65536 - tmp; //计算定时器重载值 tmp = tmp + 13; //补偿中断响应延时造
[单片机]
基于AVR单片机的MP3(完整原理图+代码
之前介绍的DIY作品都相对简单,这次来个复杂点的。一次看懂肯定是不可能,大家可以慢慢研究。 这次的作品是基于AVR mega64的MP3播放器,具有SD读取、U盘读取、诺基亚5110屏幕歌词显示的功能。先说一下大致的原理: 以单片机读取SD卡里面的数据为例,SD卡是可以用SPI接口通信的。单片机通过SPI口读取里面的歌曲信息,定时发送到VS1003B这个芯片里面。该芯片是一个音频解码的芯片,可以解码MP3\WMV\MIDI等等音频文件。同时,歌词信息同步显示到nokia5110上,这是一块液晶屏,可以通过字库显示各种文字,也是SPI口通信。 外接几个按键,做为功能选择。上一首、下一首、音量+、音量-等等。 难点
[单片机]
基于AVR单片机的MP3(完整原理图+<font color='red'>代码</font>)
μC/OS-II在凌阳单片机SPCE061A上的移植
摘要:以凌阳单片机为例详细介绍μC/OS-II的移植方法;重点讲解在系统移植过程中一些难以理解的概念,并首次实现了μC/OS-II在凌阳SPCE061A单片机上的移植。 关键词:μC/OS-II 凌阳单片机 嵌入式系统   目前,实时操作系统已广泛应用于工业控制的各个领域。μC/OS-II作为一个实时内核,由于其源码公开、代码规范,广受开发人员的喜爱。SPCE061A是凌阳公司继μ’nSPTM系列产品SPCE500A等之后新推出的一款16位单片机,内部集成A/D、D/A等多种接口电路,能很方便地嵌入工业控制的各种场合。更重要的是,其内嵌2K字的SRAM和32K的Flash ROM,因此,在不需要扩展外部存储器的情况下就可以实现
[应用]
小广播
最新嵌入式文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved