利用c语言和gel语言的flash编程新方法
以tms320vc5402为例,探讨一种综合运用c语言、数据文件及gel语言的flash编程新方法。该方法完全采用c语言编写烧写程序,解决了指针不能访问高端flash的问题;把引导表作成数据文件,可实现大引导表的分批次加载;通过gel程序控制c程序执行,较好地体现了flash编程的流程。
关键词 tms320vc5402 flash 引导表 通用扩展语言 gel
引言
在dsp应用系统开发的后期,一般需要将用户程序写进flash等非易失性存储器,以便采用并行引导的方法实现用户程序的自举加载。这一步骤称为“烧写”;针对flash的烧写又称为flash编程。以往的编程方法大多采用汇编语言编写程序,可读性较差,并将引导表的制作也放在程序中实现;用户程序一变,烧写程序就得重新编写,不具有通用性。参考文献[1]采用c语言完成flash读写,较清晰地体现了flash编程的思想,但是它采用指针访问flash空间,不能对高端flash(64 k字存储空间以外)进行访问,且将引导表作成数组的方法仍显机械。
这里提出的flash编程方法完全采用c语言编写烧写程序,运用函数地址访问高端flash,借助数据文件将引导表加载到数据空间。gel(general extension language,通用扩展语言)作为一种程序扩展语言,被广泛用于调试及程序运行环境的定制。这里将gel语言运用于flash编程,可以控制c程序在数据加载完成后执行烧写过程,从而实现大引导表的烧写。
1 dsp开发板及flash存储器
笔者使用的dsp开发板上有1片tms320vc5402通用dsp芯片、1片sst39vf400a存储芯片(flash)、键盘和液晶显示器等。其中flash容量为256 k字(1字=16位),组织为128个扇区或8个块。为充分发挥flash容量大的特点,本系统在硬件上将flash空间的映射设计为:在上电自举过程中,flash空间的0x04000~0x0ffff映射到数据空间的0x4000~0xffff;上电自举完成后,整个flash空间0x00000~0x3ffff映射到程序空间的0x80000~0xbffff,即映射到了tms320vc5402的扩展程序空间,处于高地址,因此称为“高端flash”。由此可知,对系统进行应用开发时,flash总是表现为高端flash。
图1 flash编程流程
2 flash编程流程
用户程序一般以可执行coff(公共目标文件格式)文件格式存在(后缀名为.out),flash编程所要完成的就是将此可执行文件转换成特定的ascii码引导表的格式,并按此格式顺序写进flash。flash编程流程如图1所示。下面仅以一个动画显示程序qq.out为例,介绍如何将其烧写进flash。
2.1 生成引导表
通过hex转换工具,将用户程序qq.out文件转换成十六进制形式的ascii码流文件(asciihex格式文件[2])qq.asc。首先编写一个convert.cmd命令文件。部分内容如下:
qq.out/*用户程序*/
-a/*转换成asciihex格式文件*/
-map qq.mxp/*包含引导表的长度等信息*/
-o qq.asc/*转换成qq.asc*/
执行命令行“hex500 convert.cmd”将产生qq.mxp和qq.asc文件。其中qq.mxp文件有这样的信息:“contents: 00000000…0000433b”。表示qq.asc中的引导表长度为0x433c字,内容大致为:“10 aa 7f ff 00 02 00 00…”。
2.2 转换成数据文件
编程将asciihex格式文件qq.asc转换成ccs(code composer studio,代码集成开发环境)支持的数据文件(后缀名为.dat)。例中的引导表已属较大的表,这里将其转换为两个数据文件qq_dat1.dat和qq_dat2.dat,以在同一缓冲区分两次装载,避免因缓冲区太小而容纳不了引导表的情况发生。
ccs支持的数据文件的第一行为文件头信息,格式为:
幻数数据格式起始地址页类型数据块大小
其后是文件内容,每行表示一个数据。其中幻数固定为“1651”,数据格式可以选择“1”(十六进制整型)、“2”(十进制整型)、“3”(十进制长整型)、“4”(十进制浮点型)。
利用vc6.0编写该转换程序是简单的,程序运行后产生的qq_dat1.dat文件将是:“1651 1 4000 1 2000 0x10aa…”。从文件头信息可知,加载该文件可将引导表装载到数据空间0x4000起始的长度为0x2000的缓冲区中。
2.3 flash烧写
利用gel程序将引导表形成的数据文件qq_dat1.dat和qq_dat2.dat逐次装载到数据空间,调用c程序执行烧写过程。
由于flash空间映射到tms320vc5402程序空间的0x80000~0xbffff,故实际编写程序时使用的flash空间的地址均需偏移0x80000。例如,flash空间的0x5555地址单元实际上为0x85555。
正如前面所介绍的,虽然高端flash囊括了整个flash空间,但是对于c54x系列芯片,其c语言指针的宽度为16位,只能访问64 k字范围(0x0000~0xffff)之内的存储空间,而不能访问高端flash(0x80000~0xbffff)。
参考文献[3]讨论了用c语言指针不能访问c54x系列dsp扩展程序空间的问题,提出了用函数名代替指针来访问扩展程序空间的方法,并给出了可供c程序调用的pfunc_ext.lib库。这一方法本质上是将函数名代表的程序空间地址(20位)传送到40位的累加器,进行累加器寻址,因此使用该库恰好可以解决指针不能访问高端flash的问题。库中以下两个函数是有用的:
int pfunc_wordread(pfunc addrprog);
//读取(扩展)程序空间地址addrprog处的一个字
void pfunc_wordwrite(pfunc addrprog,int wdata);
//将字wdata写到(扩展)程序空间地址addrprog处
为应用pfunc_ext.lib库,需定义一些函数,并在命令文件中为这些函数所在的自定义代码段分配段地址,以使这些函数的函数名指向flash特定的地址单元。例如,可以编写一个c程序源文件,定义一个空函数flash_5555以指向0x85555:
#pragma code_section(flash_5555,bigpointer)
void flash_5555(void){}
flash的其他地址可依此方法得到, pfunc_ext.lib库的具体说明见参考文献[3]。
下面应用pfunc_ext.lib库编写了flash擦除和编程的3个基本函数flash_erase()、flash_word_write()、flash_serial_write(),分别完成flash擦除、字编程和连续编程。其中连续编程只是循环调用了字编程函数。擦除和字编程的流程分别如图2和图3所示。擦除函数的代码如下:
//实现片擦除、块擦除或扇区擦除,type定义擦除方式,addr给出扇区起始地址或块起始地址
unsigned int flash_erase(pfunc addr,unsigned type){
//执行sst39vf400a的擦除命令序列
pfunc_wordwrite(flash_5555,flash_cmd1);
//0xaa﹥*(0x85555)
…
pfunc_wordwrite(addr,type);//擦除类型命令
…
}
图2 擦除流程
图3 字编程流程
有了这些基本函数,就可以在主函数中完成flash的烧写。下面的主函数实现将引导表烧写进flash。
void main(){
…
asm(erase:);//擦除0x80000~0x97fff,块擦除
for(i=0;i<3;i++)
flag=flash_erase((pfunc)i,flash_block_erase);
asm(program1:);//连续编程
flag=flash_serial_write(flash_base,mem_base,usercode_length1);//flash_base指向0x84000
asm(program2:);//连续编程
…
asm(program_bootaddr:);//字编程
flag=flash_write_word(flash_ffff,0x4000);
}
例中采用了块擦除的方式。mem_base是多次加载引导表的缓冲区起始地址,为与数据文件qq_dat1.dat中文件头对应,应保证mem_base指向0x4000。其方法类似于上述函数名的地址分配(使用#pragma data_section伪指令)。最后完成字编程,使bootloader上电时得以在数据空间的0xffff处读取引导表在数据空间的起始地址,例中为0x4000。
为使主函数正确执行,需借gel语言的运行调试功能,由此设计的gel程序真正体现了flash烧写的流程。gel程序流程如图4所示,部分代码如下:
menuitem programming;
hotmenu flashfiring(){…
gel_load(programflash.out);//加载c烧写程序
…
if(flag){
gel_load(qq_dat1.dat);//加载数据文件
gel_go(program1); //执行连续编程
…
gel_load(qq_dat2.dat);//加载数据文件
gel_go(program2); //执行连续编程…
}
}
图4 gel程序流程
gel程序在c程序每次执行前设定正确的环境变量并初始化缓冲区。例如,数据文件的长度usercode_length1就是需要根据实际的数据文件长度进行设定的环境变量;而在进行连续编程之前,需要gel程序重新加载mem_base缓冲区。
3 运行结果
在ccs环境下选择file/load gel,装载以上gel程序,选择gel/ programming/flashfiring,即可实现flash烧写。拔掉仿真器,给系统重新上电,可以看到液晶显示器上qq企鹅的动画。
4 结论
通过函数地址可以进行flash的全空间访问;采用c语言编写flash擦除和编程函数,增强了程序的可读性;将引导表作成多个数据文件,一方面适于大引导表的加载,另一方面使flash编程算法与编程数据完全分离,提高了算法的通用性;仅在gel程序中修改参数即可实现另一用户程序的烧写,体现了方法的灵活性。
冲水实验装置简介
集成480Mbps高速USB2.0协议的接口芯片CH348简介
可二次开发网关BL301应用于数字化工厂
美光1αDRAM芯片工艺可提升密度40%
再提发展传感器,未来6年是关键机遇期!权威期刊最新分析
利用C语言和GEL语言的Flash编程新方法
华星光电t3产值破百亿,积极布局蓝海市场
大众车联网Car-Net让智能设备可控制汽车
PCB布线技术:一个布线工程师谈PCB设计的经验
单片机8x8矩阵键盘原理说明
华为或向高通购5000万个处理器_任正非回应总部深圳搬迁的传闻
生物识别技术第一代和二代的区别
Gosund于推出中规智能插座,加速国内市场的布局
无线充电技术受追捧 优势显现前景广阔
云服务器怎么才便宜?
基于FPGA+DSP结构嵌入式系统的FPGA被动并行配置方式设计
Mentor系列IC设计工具获得台积电最新N5和N6制程技术认证
江森将以130亿至140亿美元的价格出售汽车电池业务
用勤哲Excel服务器做企业全面绩效管理系统
一文详解三相异步电动机的顺序控制电路