位过程,使每个 DSP 子核在不同的时间内启动自身的BootLoader 程序来解决片外总线冲突的问题。
应采用如图2所示的 DSP 为了实现两个 DSP 子核复位过程的分离,子核复位过程控制方法。
由于TMS320VC5421中A核拥有倍频的锁相环电路,所以首先复位A核,启动A核的 BootLoader 程序,实现A核的用户程序上电自举。
然后再由A核的用户程序控制B核的复位过程,启动B核的 BootLoader 程序,实现B核的用户程序上电自举。
在A核的 BootLoader 程序执行完后,A核就会执行自身的用户程序代码。
A核的用户程序代码释放片外总线的控制权, 并且控制B核的复位管脚,促使B核启动自身的 BootLoader 程序。
如果此时A核中的用户代码又申请片外总线控制权或正在使用片外总线,就会造成片外总线冲突。
解决此冲突的办法有如下两个: 粗略估计B核的 BootLoader 程序执行时间,在A核的有效程序代码前加一个延迟程序。
在A核的有效程序代码前加入一个死循环程序,当B核BootLoader 程序执行完后,B核通知A核,A核就跳出这个死循环程序,开始执行自己的有效代码。
4 2. TMS320VC5421 的16位并行 EPROM 工作方式的 BootLoader程序的编程实现 首先设计一个简单的电路图,如图3所示。
在 DSP 的A_XF和B_XF两个管脚分别连接一个发光二极管,A核以2Hz的频率点亮发光二极管,B核以10Hz的频率点亮发光二极管。
将128K的FLASHSST39VF400A分成两页, 每页为64K。
FLASH的页的选择由TMS320VC5421的A_BDXO管脚控制。
当A_BDX0为低电平,即FLASH的A16地址线为低电平时,选中FLASH的第一页,由FLASH的A0~A15地址线选择页内地址,用于存放A核的16位并行EPROM工作方式的 Boot 表。
当A_BDX0为高电平,即FLASH的A16地址线为高电平时,选中FLASH的第二页,由FLASH的A0~A15地址线选择页内地址,用于存放B核的16位并行EPROM工作方式的 Boot 表。
CPU_A 和 CPU_B 的程序流程图分别如图4和图5所示。
1片外总线冲突的解决 估算B核执行 BootLoader 程序所需的时间后,在A核的用户有效程序之前,加一段延迟程序。
延迟的时间计算如下: TMS320VC5421DSP 的DMA通道从片外数据空间读取一个字到片内数据空间,需要7个指令周期时间。
统计用户程序大小将对应 Boot 表中的所有段的大小相加N1+N2+...=N。
延迟的时间为N×7=7N个指令周期。
由上面所述的方法可知,只需在开始执行A核的有效程序之前加一段延迟7N个指令周期的代码即可。
2生成 Boot 表 对 CPU_A 来说,以A核程序流程图建立一个项目Ati.msk。
产生Ati.out文件后,进入该目录的DOS环境,键入: hex500 Ati.out-a-e 0x4000h-Boot-BootorgPARALLEL-memwidth16-romwidth 16-o Ati.hex生成A核的16位并行EPROM工作方式的 Boot 表。
对CPU_B来说,同样以B核程序流程图建立一个项目Bti.msk。
产生Bti.out文件后,进入该目录的DOS环境,键入: hex500 Bti.out-a -e0x4000h-Boot-Bootorg PARALLEL-memwidth16-romwidth 16-o Bti.hex 生成B核的16位并行EPROM工作方式的 Boot 表。
在实现双核 DSP 的上电自举后,A核和B核的用户程序将会被存放在核内程序空间的不同页面上。
如从DMA的角度观看:A核的用户程序将被存放在A核的程序空间的第0页上; B核的用户程序将被存放在B核的程序空间的第2页上。
因此A核的 Boot 表不需要修改,而B核的 Boot 表中的所有存放页地址的表项中的内容要更改为2。
3FLASH 编程实现 根据 FLASH 芯片的控制时序,编写一个简单的 DSP 程序,用于将 将B核的 Boot 表写入 FLASH 的高64K。
A核的 Boot 表写入 FLASH 的低64K,上电试验结果 将电路上电后,A核控制的发光二极管开始闪烁,B核控制的发光二极管也开始闪烁,且A核发光二极管闪烁频率要低于B核发光二极管闪烁频率。
由此现象可得出A核与B核的 BootLoader 实现成功,未产生片外总线冲突;A核以2Hz的频率点亮发光二极管,B核以10Hz的频率点亮发光二极管。
附件:DSP Boot Loader初学 DSP 时最头疼的事就是 DSP 的 bootload 问题,以前学 51 时只要把程序写好编译通过后就可以用烧写器直接将.hex 文件烧进单片机运行。
但 DSP 内部不带 FLASH RAM,它必须在复位期间将外部的程序加载到内部 RAM 之后才能运行。
这有点像 PC 的体系结构,PC机中的引导加载程序由 BIOS其本质就是一段固件程序和位于硬盘 MBR 中的 OS BootLoader(比如,LILO 和 GRUB 等)一起组成。
BIOS 在完成硬件检测和资源分配后,将硬盘 MBR 中的 Boot Loader 读到系统的 RAM 中,然后将控制权交给 OS Boot Loader。
Boot Loader 的主要运行任务就是将内核映象从硬盘上读到 RAM 中, 然后跳转到内核的入口点去运行,也即开始启动操作系统。
我刚开始时就被这 bootload 搞的心焦如焚,仿真好的程序却不能脱机运行,最好还是老老实实看 TI 的 DSP datasheet,经过一番周折总算搞定!为此我想把我的调试心得写出来与大家共享,一方面是避免初学者走弯路,另一方面是借此抛砖引玉望方家多斧正_。
简单地说,bootloader 就是在用户程序运行之前的一段小程序,通过这段小程序初始化硬件设备、建立内存空间的映射图,最终调用用户程序。
这段小程序其实已固化在 DSP 芯片 TMS320VC33 内部 ROM 中在 TMS320C3X datasheet 中有源码及功能流程图,我们只需知道它的功能流程即可。
从流程图我们可以知道在 DSP 上电复位时只要 DSP 芯片引脚 TMS320VC33 就开始自动执行固化在内部 ROM 中的 bootloader 程序,MCBL/MP为高电平,然后根据外部中断引脚INT3~INT0判断用户程序的加载起始地址。
管脚 电平 存储空间 INT0 0 0x001000 INT1 0 0x400000 外部 FLASHINT2 0 0xfff000INT3 0 串口复位对应的管脚即会从对应空间读取用户程序执行 在我的系统应用中,我将程序存储在外部 FLASH 芯片 39VF040 中,它在系统中的起始地址为:0X400000所以只要 DSP 复位时外部中断引脚INT1为低电平,bootloader 程序就开始读取外部 FLASH 芯片 39VF040 中的用户程序并加载到 DSP 内部 RAM 中,加载完毕后就自动跳到用户程序的入口地址开始运行用户程序。
从 bootloader 的流程图还可以知道,bootloadr 加载用户程序时是有一定格式要求的,即存储在用户外部 FLASH 程序空间的数据结构的格式要求如下:WORD 0 : 用户外部 FLASH 芯片数据宽度,如 8,16,32 位等WORD 1 : 控制字,用来写入 TMS320VC33 的总线控制寄存器WORD 2 : 数据块大小WORD 3 :当前上载数据块将要装载到 DSP 内部 RAM 中的目标地址WORD 4~N :用户程序内容这个排布编译器会实现。
用户只要设置而已。
,每块 用户的程序分为多个数据块(因为 DSP 开发软件生成的目标文件是 COFF 格式)数据块起始都包含一个程序头,每个又包含两个内容:1、当前数据块大小,即 32 位格式的数据量。
2、当前数据块在 DSP 内部 RAM 存储的起始地址。
程序头之后就是用户的程序内容。
讲到这里问题的关键就出来了:怎样产生这样的程序块呢?程序内容应该为哪种格式.hex、.bin、.out?这也是我当初最头疼的问题。
用 TI 公司的 DSP 开发软件 Code Composer 建立一个项目文件后,要做的第一件事就是编写.cmd 命令文件,命令文件有两个:一个是链接命令文件,另一个是 boot 引导表格式生成命令文件。
链接命令文件作用是分配各个程序段在 DSP 内部 RAM 中的存储位置, 链接命令文件必须和项目文件名相同。
例如项目 online.mak 的链接命令文件 online.
上一篇:
gdb的调试方法
下一篇:
青青子衿,悠悠我心