| 网站首页 | 技术文章 | 软件下载 | 图片中心 | 留言 | 电子商城 | 【技术交流论坛】 | 
最新公告:

  没有公告

您现在的位置: [航科电子][嵌入式系统开发技术交流] >> 技术文章 >> 嵌入式系统开发 >> DSP专栏 >> 正文
专题栏目
更多内容
最新推荐 更多内容
相关文章
没有相关文章
更多内容
[图文]分页烧写Flash的多页程序并行自举方法           ★★★
分页烧写Flash的多页程序并行自举方法
分页烧写Flash的多页程序并行自举方法
作者:佚名 文章来源:本站原创 点击数: 更新时间:2008-6-11 21:21:11

分页烧写Flash的多页程序并行自举方法

[日期:2006-9-22]

来源:单片机及嵌入式系统应用  作者:兵器工业第58研究所 左颢睿 李焱 马艳

[字体: ]

 

  : 以TMS320VC5410为例,介绍对Am29LV200B Flash存储器进行程序分页烧写以及上电后多页用户程序并行自举的方法。对多页Flash存储器的烧写,须在烧写过程中对已烧写的数据长度进行动态判 断,当达到预定烧写长度后对Flash进行换页,然后继续烧写,重复上述换页过程,直到程序烧写完为止。对多页程序的并行自举,在系统上电后,利用TI提 供的自举程序,将一个用户自己编写的前导程序载入DSP,利用该前导程序将多页程序载入DSP来实现程序的自举。此方法适用于多种FIash芯片和 C5000系列DSP
关键词TMS320VC5410 Am29LV200B DSP 多页并行自举

    TI公司的DSP芯片TMS320Vc5410(简称5410)是性能卓越的低功耗定点DSP,在嵌入式系统中有着广泛的应用。5410没有自带的片上非 易失性存储器,因此需要外部的非易失性存储介质,如EPROMFlash,来存储程序和数据。5410片内有64 KRAM,由于在片内RAM运行程序比片外运行有高速度低功耗等显著优点,通常上电后都需要从片外EPROMFlash上加载程序到片内RAM,但是 芯片自带的自举程序(简称Bootloader)只支持32 K字以内的外部程序加载,因此程序设计往往局限于32 K字空间内,限制了编程的灵活性,不能充分发挥5410的性能。当程序空问大于32 K字时,就需要自己编写程序来实现自举。下面首先介绍使用5410Am29LV200BFlash存储器进行程序分页烧写的方法,然后重点介绍利用 Bootloader来编程实现多页并行自举引导的方法。

1 Am29LV200B Flash 存储器的分页烧写
1.1 FIash
存储器简介

    Am29LV200B(
简称Flash)AMD公司生产的Flash存储器,主要特点有:3 V单电源供电,可内部产生高电压进行编程和擦除操作;支持JEDEC单电源Flash存储器标准;只需向其命令寄存器写人标准的微处理器指令,具体编程、 擦除操作由内部嵌入的算法实现,并且可以通过查询特定的引脚或数据线监控操作是否完成;可以对任一扇区进行读、写或擦除操作,而不影响其他部分的数据。文中128K×16Am29LV200B Flash映射为5410的片外数据存储空间,地址为:0x80000xFFFF,数据总线16位,用于16位方式的并行引导装载。128K Flash被分为7页进行访问。本文通过DSPIO端口向FPGA写控制字,由FPGA控制Flash的换页引脚对各个分页进行访问;以烧写2个页面 为例,使用Flash的第12页,初始化时选中第l页。

1.2 Flash
存储器的分页烧写
    Flash
的页面分配和相应的引脚控制如表1所列。关于Am29LV200B的擦除、写、校验等详细操作,请见参考文献[1][2]

    从表1可以看到,通过对A16A15等地址引脚的控制,可以实现Flash的页面切换。在烧写过程中,只要在指定页面烧写完预定空间后就对Flash进 行换页,然后将烧写指针指向新的一页的首地址,就可以继续进行烧写,当程序烧写完成后需要将页面换回到第1页,在第1页的FFFFH地址写入8000H, 这样Bootloader可以从这一页开始自举。整个烧写程序流程如图1所示。

    这里会出现一个问题:程序烧写好后,虽然Bootloader可以自动加载程序,但是Bootloader怎样在加载过程中自动换页?下面详细介绍利用片上Bootloader编程实现多页程序并行加载的方法。

2 多页并行加载的实现
   
实现多页加载,关键问题是要让Bootloader知道什么时候可以换页;但是Bootloader是固化在5410片上ROM内的,无法对其进行编程。解决的方法是通过自己编写一段前导加载程序(简称Loader)来实现加载中的换页:首先将Loader和用户程序都烧写到Flash中,当系统上电 后,BootloaderLoader加载到片上并运行,然后LoaderFlash中的用户程序加载到目标RAM空间。这个加载过程是用户编程可控 的,因此在需要换页时,可以控制Flash进行换页,加载完成后,Loader跳转到用户程序的人口地址处运行用户程序。

2.1 Bootloader
的并行自举表结构和编程后的自举表结构
    5410
的并行加载过程以及生成并行自举表的详细方法请见参考文献[1][3]Bootloader使用图2所示的并行自举表来加载程序。 Bootloader从表头开始依次读取自举表,然后将相应的程序段加载到目标RAM,最后以程序段大小为0来结束自举表的读取,跳转到用户程序入口地址 执行用户程序。从图2可以看到,Bootloader是以自举表中的程序长度为0来结束自举的,于是就可以利用这个特性,给Bootloader制造一个假象,让Bootloader在加载完Loader程序后,认为程序已经加载完毕,然后开始运行Loader程序,继续加载用户程序。按照这个思路, 可以建立图3所示的自举表。

    3中的黑体字部分,是嵌入了Loader程序的自举表,有了图3这样形式的并行自举表,系统就可以实现多页程序的并行自举。建立这样的自举表很简单,只需要将hex500格式转换工具生成的Loader的并行自举表和用户程序的并行自举表按图3给定的格式,通过简单的文件操作合并在一起就可以了。注意: Loader程序要占用一部分RAM空间,用户程序空间不能和LoaderRAM空间重叠在一起。

2.2 Loader程序的具体实现
   
下面以分布在2Flash页面的程序为例,给出5410并行自举的示例程序。程序中,当IO端口5写人数据O时,选中Flash1页;写1时选中第 2页。程序里用黑体字标出的注释部分,是Loader程序设计的重点或难点。(具体程序见本刊网站wwwmesnetcomcn——编者注)

   
示例程序中,DSP上电后,BootloaderLoader程序加载到RAM中,然后执行Loader程序:Loadelr程序从Flash1页的 8080H开始读取用户程序自举表,当Flash读取计数值超过31 K时,将Flash切换到页面2,继续加载,自举完成后,跳转到用户程序入口地址执行用户程序。在编写自举程序过程中,有这样几个问题需要注意:

    ①
在换页时,一般情况下程序段都会跨越两个页面,因此在确定需要换页时要计算出第1页和第2页分别要加载的段长度。
    ②
整个用户程序段开始时有2个字的入口信息,每一个程序段都有3个字的段信息,因此需要在Flash读取计数时给予修正,才能正确加载数据。
    ③
在确定需要换页时要将换页标志置为1,换页后要将换页标志置为0,而且换页后要将数据读取指针指向第2页的开头地址。

   
如果要使用本文的示例程序,一定要将Loader程序烧写到Flash18000H的位置,用户程序段烧写到8080H以后的位置。再次提醒, Loader程序加载到RAM中的地址,不能和用户程序段加载到RAM中的地址重叠。例如Loader使用了RAM中的7F80H8000H这段空间, 则用户程序不能使用这段空间,否则会出现错误。Loader的自举流程如图4所示。

总 结
   
要实现5410的多页程序并行自举,有如下几个步骤:
    ①
根据用户程序的需求以及实际使用Flash的分页设置,参考第2部分提供的思路和例子编写Loader程序;
    ②
使用hex500代码转化工具分别生成Loader程序和用户程序的自举表;
    ③
将两个自举表按图2的格式生成一个新的自举表,再使用第1部分介绍的方法将新的自举表分页烧写到Flash上。

   
使用本文介绍的方法,通过多次试验,系统上电后,能够很好地实现2个页面程序的并行自举。虽然是以2个页面为例介绍Flash烧写和并行自举的方法,但是 对于2页以上的程序烧写和并行自举同样适用,只需要进行一些细微的改动即可。本文提供的方法以不到128字的RAM空间代价,在5410上实现了将大于 32 K字的程序并行自举到片上RAM,大大提高了编程的自由度和程序的运行速度,降低了系统功耗。这个方法有很强的通用性,可以在很多存在类似问题的DSP芯 片(54095416)上进行应用,具有较高的实用价值。

 

 

CCS编程入门

 

[ 录入:tai-yan | 时间:2007-07-23 15:19:03 | 作者: | 来源:采集所得 | 浏览:125 ]

 

 

广告位招商QQ:407968286

上海电子元器件专业供应商:

电话:021-52857981

电话:021-52857982

qq:394985214

联系人:顾先生/谭小姐

广告位招商QQ:407968286

    TI公司提供了高效的C编译器和集成开发环境Code Composer Studio,学习C6X的编程应该从学习CCS的使用开始。
   
首先安装CCSCCS的安装有详细的说明,并配有简短的Quick Time的多媒体介绍,对于没有购买CCS的用户,可以从TI处得到30天的试用版(没有硬件仿真功能)。
   
使用CCS前需要对CCS进行设置,以Simulator为例,运行Setup CCS C6000 1.20,安装Device Driver,对于有硬件支持的仿真器,可以选择配套的CCS驱动,设置完成的画面如下图所示:用户的界面大致相同。
 
接 下来就可以运行CCS了,CCS提供了比较好的例子,对于初学者,仔细学习这些例子,会起到事半功倍的效果。在CCSHelp菜单的Tutorial子 菜单下,给出了四个教程,分别是:Code Composer Studio TutorialAdvanced DSP/BIOS TutorialCompiler TutorialRTDX Tutorial,用户可以从简单的CCS功能开始,如创建一个工程文件Project,到创建一个完善的用户程序一步一步的进行。
 
下面是Code Composer Studio Tutorial的例子:
 
分别从生成一个简单的“Hello World”程序,到使用DSP/BIOS功能,到程序的调试,实时分析,I/O操作等分6课来讲解,可以领略TICCS的强大功能。
下面以“Hello World”程序为例讲一下CCS的使用。
首先打开一个Project文件
 
这些文件的路径如下图所示:
 
打开hello.mak,会看到如下图所示的界面。将File View栏中的“+”号都打开,会看到整个项目工程中的所有资源。
 
    
其中*.c文件和*.h文件与普通的C语言编程中是一致的(TI编译器支持ANSI C标准)。需要指出的是三个文件:HELLO.CMDRTS6201.LIBVECTORS.ASMHELLO.CMD文件给出了程序空间和数据空 间的设置、及编译后各程序段在程序或数据空间的具体位置。RTS6201.LIB文件为DSP运行时库,VECTORS.ASM为中断向量表,都是区别于 纯软件编程的独到之处,熟悉以后会有更深的体会。
   
下图为HELLO.CMD文件的代码,MEMORY分为程序空间IPRAM和数据空间IDRAM,并分别给出了起始地址origin和长度len,各段在 MEMORY空间的分配也作了定义。对于实际的目标板硬件系统,由实际的存储器空间及DSP芯片上的存储空间决定。对于软件仿真,可以不考虑有没有 MEMORY资源。
 
直接对该工程进行编译,会得到如下结果,试一下吧!也可以试一下快捷工具条上的按钮,随便点击鼠标右键,也会有意外的收获。怎么样?没有错误吧!
 
   
自己在编写工程项目文件时,经常会遇到下面的问题,没有C语言程序的入口函数,细心比较一下会发现工程文件中缺少了一个运行时支持库RTS6201.LIB,不同的DSP芯片需要不同的运行时库来支持。
 
下面向项目工程中加上运行时库RTS6201.LIB来纠正刚才的编译错误,同样的方法可以用来向工程中添加*.c*.cmd*.asm文件。*.h文件在编译时会自己找到(当然需要在环境变量中设置好啦,一般不需要改动)。
 
运行时库在TI的缺省路径下,注意将文件类型改为*.lib
 
大家可能注意到,在HELLO.C文件中有这样的定义:
#ifdef FILEIO
int i;
char scanStr[BUFSIZE];
char fileStr[BUFSIZE];
size_t readSize;
FILE *fptr;
#endif
#ifdef FILEIO
/* clear char arrays */
for (i = 0; i < BUFSIZE; i++) {
scanStr[i] = 0 /* deliberate syntax error */
fileStr[i] = 0;
}
/* read a string from stdin */
scanf("%s", scanStr);
/* open a file on the host and write char array */
fptr = fopen("file.txt", "w");
fprintf(fptr, "%s", scanStr);
fclose(fptr);
/* open a file on the host and read char array */
fptr = fopen("file.txt", "r");
fseek(fptr, 0L, SEEK_SET);
readSize = fread(fileStr, sizeof(char), BUFSIZE, fptr);
printf("Read a %d byte char array: %s \n", readSize, fileStr);
fclose(fptr);
#endif
其中还有一些变量的定义和对文件的操作,运行编译好的程序后好象这些语句都没有执行,因为在CCS的编译环境中这个参数还没有定义。按下图进行设置:
 
 
设置完成后可以进行重新编译,会发现新的错误(如果没有出现这个错误,说明设置的不对)。双击这个错误,在HELLO.C文件中,光标会出现在出错的地方。
 
在第52行的这一句,可以看到语句的后面没有加分号
scanStr[i] = 0
加上分号后重新编译,ok?!加载hello.out运行,会出现下面的输入界面,
 
输入一串文字并确定,在“Stdout”窗口会有下面的显示,
 

小 结:在这里简单介绍了CCS的使用,包括CCS的设置、帮助文件的使用,(TI的帮助文件系统、详细地介绍了CCS的使用,强烈建议用户认真学习。)并以 “Hello World”程序为例对CCS的使用中容易出现问题的一些地方作了一般的介绍,包括运行时库的添加、预编译定义设置等,用户在使用过程中会不断发现问题, 通过使用TI的帮助文件及配套的资料会不断提高,不可急于求成,如果用户对Visual C++比较熟悉,学起来会快很多;相反,那肯定要多花一些时间来学习了,学习CCS跟学习Visual C++一样(简单/复杂?),但需要对硬件有一定的了解。

 

文章录入:admin    责任编辑:zhouwj 
  • 上一篇文章:

  • 下一篇文章: 没有了
  • 【字体: 】【发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口
      网友评论:(只显示最新10条。评论内容只代表网友观点,与本站立场无关!)

    | 设为首页 | 加入收藏 | 联系站长 | 友情链接 | 版权申明 | 管理登录 | 
    动易网络
    站长:[航科电子]
    信息产业部备案
    湘ICP备05011666号