曙海教育集团论坛DSP专区DSP6000系统开发 → DSP/BIOS在TMS32OC6000编程中自举引导方法


  共有6492人关注过本帖树形打印

主题:DSP/BIOS在TMS32OC6000编程中自举引导方法

美女呀,离线,留言给我吧!
wangxinxin
  1楼 个性首页 | 博客 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:青蜂侠 帖子:1393 积分:14038 威望:0 精华:0 注册:2010-11-12 11:08:23
DSP/BIOS在TMS32OC6000编程中自举引导方法  发帖心情 Post By:2010-11-22 14:26:20

1 DSP/BIOS的优点


DSP/BIOS 是一个用户可剪裁的实时操作系统,主要由3部分组成:多线程实时内核;实时分析工具;芯片支持库。利用实时操作系统开发程序,可以方便快速地开发复杂的DSP程序。操作系统维护调度多线程的运行,只需将定制的数字信号处理算法作为一个线程嵌入系统即可;芯片支持库帮助管理外设资源,复杂的外设寄存器初始化可以利用直接图形工具配置;实时分析工具可以帮助分析算法实时运行情况。


DSP/BIOS实时操作系统的图形配置界面包括:

(1)全局设置(system)— 包括内存配置、芯片支持库设置、endian模式设置等;

(2)操作系统调度工具(scheduling)— 包括定时器、周期器、硬件中断管理、软件中断管理、任务调度、系统空载任务函数等;

(3)同步机制(synchronization)一一提供一般操作系统都具有的信号灯、邮箱、队列、锁4个工具;

(4)芯片支持库(chip support library)— 针对不同的DSP芯片帮助配置DSP的外设资源,最常用的有DMA,MCBSPEMIF,TIMER等的配置;

(5)主机交互接口(input/output)— 提供DSP实时运行时与主机通过仿真口和CCS(集成开发系统)交互数据的机制;

(6)调试工具(instrumentation)— 记录器(LOG)可以提供调试信息,但是特别针对实时操作优化;统计工具(STS)可以统计调试过程中的各种事件。


通过使用 DSP/BIOS,我们可以:

(1)使用多线程技术高效地管理DSP的运行,以提高运行效率;

(2)使用标准接口的I/O和中断;

(3)高效地定义和配置系统资源,如系统内存和中断向量表;

(4)通过实时分析工具对用户应用程序的运行状况实时查看;

(5)向用户的目标应用程序添加数据结构并围绕一组相关线程来加以组织:

(6)几乎所有的初始化都可以通过图形化配置来完成,而不必详细了解各个寄存器的每一位所代表的意义;


(7)通过调用DSP/BIOS或CSL(芯片支持库)的API库函数,使代码效率更高、程序可读性和可移植性更强,从而使得向新的TMS320DSP移植更加容易。例如:开全局中断可以用HWI_enable(),启动DMA可以用DMA_start(hDMA0),这样比直接通过寄存器配置来完成具有更强的可读性和可移植性,而且不会出错,也不必查阅相应的寄存器信息。

2 DSP/BIOS的资源优化


由于 DSP/BIOS的很多功能只有在调试时使用或者根本不用,如果不需要用到的部分都使用默认的配置将会占用较大的内存资源,如果用户程序较大就会造成DSP内存资源紧张或不足。由于DSP/BIOS是一个可剪裁的操作系统,可以很方便地将不需要用到的功能关闭,以节省空间。表1列出了减少DSP/BIOS所占资源的几种措施以及在C62x中可以减少的存储空间大小。


表中减少的空间大小只作为参考,随着CCS的版本不一样可能会有一定差别。笔者在CCS2.20.18上编写了一个简单的程序,DSP采用的是TMS320C6203,主程序采用C语言编写。优化前的.out文件大小为78.6KB,转化成二进制文件为28.3KB;优化后的.out文件为29.4KB,转化成二进制文件为4.4KB。

3 程序的自举引导方法


TMS320C6000器件可以设置成3种自举方式,其加载过程分别叙述如下:


①不加载 。CPU直接从存储器的0地址处开始执行指令。如果系统中使用的是SDRAM,那么CPU 会先挂起,直到SDRAM的初始化完成。TMS320C6x1x 不具有这类方式。


②ROM 加载。位于外部存储空间的ROM中的程序首先通过DMA/EDMA搬入地址。处。尽管加载过程是在芯片外部被复位信号释放以后才开始的,但是当芯片仍处于内部复位保持时,就开始了上述的传输过程了。用户可以指定外部ROM 的存储宽度,EMIF会自动将相邻的8bit或16bit数据合并成32bit。ROM中的程序必须以little endian的格式存储。用DMA/EDMA进行的这一加载过程是一个单帧的数据.tk传输。传输过程完成
之后,CPU退出复位状态,开始执行地址0处的指令。对于 TMS320C6x0x,DMA使用默认的ROM时序从CEl空间中拷贝64KB数据到地址0处。

对于 TMS320C6x1x,EDMA使用默认的ROM时序从CE1空间(C64x从EMIFB CE1空间)拷贝1KB数据到地址0处。

图片点击可在新窗口打开查看
③主机 (HPI)引导。CPU停留在保持状态,其余硬件部分均保持正常状态。在这期间,外部主机通过主机口或PCI口(如6205或64x)初始化CPU的存储空间。主机完成所有的初始化工作后,将主机口控制寄存器中的DSPINT位设置为1,结束引导过程。此时CPU退出复位状态,开始执行地址0处的指令。在主机引导过程中,主机可以对DSP所有的存储空间进行读和写。

其中,用得最多的是ROM加载。为了生成可以从ROM中自举的代码,就要注意DSP/BIOS中的存储器设置。对于TMS320C6x0x,一般而言,64KB的代码就足够了,那样就只需选择好各个代码段的Load Address和Run Address就可以了。DSP/BIOS将自动生成cmd文件,而不需用户自己编写。如果64KB不够,则需自己编写boot程序。而对于TMS320C6x1x ,1KB的程序一般是不够用的,所以要自己编写boot程序。下面以TMS320C6711为例介绍DSP/BIOS中程序空间的配置以及boot程序的编写方法。

TMS320C6711内部含有64KB的RAM,既可以配置为L2Cache,也可以配置成SRAM。一般而言,在系统上电复位时配置为SRAM,将1KB的引导程序从ROM中拷贝到SRAM中,而在引导程序中将用户的程序从ROM中拷贝到SBSRAM中或SDRAM中去执行。在主程序的初始化部分将内部RAM配置为高速缓存,这样可以提高程序的运行速度。当然,也可以把内部RAM用作SRAM,把全部的用户程序都引导到其中来执行,
这样可以不用外接SBSRAM或SDRAM 。

首先在 DSP/BIOS的存储器段管理器(Memory Section Manager)中指定如下几段:
FLASH_BOOT:or igin=000000000,le ngth=0x400;(存储自举代码)
FLASH_REST:or igin=0x90000400,le ngth=Ox1fc00;(存储主程序代码等)
IRAM :or igin= 000000000,length= 0x10000;(内部RAM)
SDRAM 或SBSRAM:origin=Ox80000000(CEO),length与外接存储器大小有关,如果没有则可省略。


上电复位时,FLASHesBOOT中的数据被复制到IRAM 中从地址0开始的一段,然后从地址0开始执行程序。因此,在这段代码中要把其它相应的段从加载地址复制到运行地址。在DSP/BIOS程序中,所用到的段及其相应的加载地址和运行地址建议按表2、表3安排。

图片点击可在新窗口打开查看

图片点击可在新窗口打开查看

在 BOOT 程序中,首先要初始化EMIF的相关寄存器,特别是有外接存储器时(如SDRAM或SBSRAM),一定要先初始化相关寄存器,主要是EMIF全局控制寄存器和CE空间控制寄存器。然后将加载地址位于ROM中而运行地址位于RAM中的段从ROM中复制到RAM中。具体的加载地址和运行地址可以在map文件中查到。最后,将程序指针跳转到主程序入口(c_int00)开始执行。BOOT程序如下:

.sect " .myBootCode "
.global myBootCode


.ref _c_int00


;====myBootCode ===


myBootCode :

;***************

;Configure EMIF


;***************

...... ......

;***************


;CopySections


;***************

...... ......

;***************

;StartProgram


;***************


mvkl .S 2 _c_int00, B0


mvkh .S 2 _c_int00, B0


B . S2 B0


; jump to _c_int00


nop 5

编写完 boot程序后,在cmd文件中加上一句:.my_boot_code: {} load=FLASH_BOOT,run=IRAM


支持(0中立(0反对(0单帖管理 | 引用 | 回复 回到顶部

返回版面帖子列表

DSP/BIOS在TMS32OC6000编程中自举引导方法








签名