【VC++开源代码栏目提醒】:网学会员,鉴于大家对VC++开源代码十分关注,论文会员在此为大家搜集整理了“C8051F12X存储大量常量代码的编译技巧 - 大众科技”一文,供大家参考学习!
76 advmesnet.com.cn广告专用 C8051F12X存储大量常量代码的编译技巧回南京三宝科技集团公司 王效东 SiiconLaboratories公司的C805lFl2X是与805l兼容9采用高速流水线工作方式970指令的执行时间为l个或2个系统时钟周期的高速集成混合信号SoC微控制器G片内调试电路提供全速非侵入式的在片/在系统调试9支持断点单步观察点堆栈监视器9可以观察/修改存储器和寄存器使用内部集成PLL9时速度可达l00MIPS或50MIPS对于需要大量常量代码而又不想外扩ROM的系统设计9l28KB的Fash是个很好的选择G1 处理大量常量代码面临的困难通常带中文液晶显示的系统采用的是不带中文字库的图形液晶显示模块9需要给点阵字库分配存储空间G常用的是l6l6点阵字库9每个汉字占用32字节存储空间964KB空间可存储2048个汉字G标准5lMCU只能直接访问64KB程序空间9采用BANK技术可扩展空间9但处理编译复杂9且需要额外I/O口线作BANK选择控制G有的系统是将字库单独烧写到外部Fash中9而硬件接法上使用数据空间地址9但标准5lMCU数据空间也只有64KB9不进行分页外扩同样不能实现2048字以上的汉字存储G此外9程序运行也需要数据空间9实际字库容量更小GC805lFl2X具有完善的片上外设资源98KB的片上RAM9特别是l28KB的Fash资源9不必外扩存储器即可实现带较大容量的中文液晶显示字库的完整系统GKEILC5l是目前最流行的5l系列MCU编译器G如果程序代码与字库常量代码总和不超过64KB9则可在KEILUV2的集成开发环境下9通过安装SiiconLabora-tories公司的驱动程序直接对C805lFl2X进行编译9并通过JTAG调试仿真器实现不占用户资源的实时/断点调试G但当程序代码与字库常量代码总和超过64KB时9在KEILUV2下9只能采用BANK编译技术G常量默认设置是分配到低32KB的COMMON区9而COMMON区还要存放中断处理等代码9因此如果想将点阵字库常量分配到指定的BANK9还需要采取其他方法G2 处理大量常量代码的思路与实现如果C805lFl2X需要下载的程序代码与字库常量代码总和超过64KB9则可使用SiiconLaboratories公司的集成开发环境G在此IDE中9C805lFl2X的Fash编程是分4个BANK进行的9每个BANK对应一个HEX格式的代码文件G根据这样的特点9可以绕开KEILC5l编译器9直接把点阵字库或其他常量表格处理为标准HEX格式文件9从而实现常量代码在任意BANK的存放G假设一个点阵字库含3200个常用汉字9需要分配323200l02400字节空间G设计上可以这样分配空间SBANKl及BANK2全部使用9各32768字节9共可以存放2048个汉字的点阵G由于C805lFl2X最后l026字节为系统保留空间9所以BANK3分配990个汉字的点阵9占990323l680字节9还剩l62个汉字的点阵9需5l84字节9分配到COMMONBANK0的最高端GBANKlBANK3的起始地址都是由8000H开始的G对BANK0来说9l62个汉字的点阵字库从6BC0H开始存放9这也意味着留给程序的空间不能超过27584字节G如果程序较大9但不超过64KB9同时字库不需要很大9则可分配63KB为字库964KB为程序若程序用不完64KB9则多余空间也可分配给字库9以扩大字库容量G生成点阵字库的HEX文件9可采用ASM的DB定义方法C5l的数组定义方法或者自己编写运行于PC的程序的方法G前两种方式还需要经KEIL编译9但可灵活选择所需的汉字G从编译方面看9ASM的DB定义方式不需要额外设置编译参数9比C5l的数组定义方法要好G通常字模软件都有ASM格式和C5l格式的选择9可以利用其ASM格式输出9按上述空间分配原则9分别对每个BANK做对应的HEX文件G下面举例说明G假设使用4个ASM文件9每个都是64字节GB0.ASM内容是00H3FH9存放于BANK0从7FC0H开始的空间Bl.ASM内容是40H7FH9B2.ASM内容是80HCFH9B3.ASM内容是D0HFFH9BANKlBANK3均存放于各自BANK从 papermesnet.com.cn投稿专用 MicrocontroersEmbeddedSystems 77 8000H开始的空间9物理上分别位于C805lFl2X的8000Hl0000Hl8000H开始的区域OB0.ASM中的内容为IORG7FC0HDB000H900lH9002H9003H9004H9005H9006H9007HDB008H9009H900AH900BH900CH900DH900EH900FHDB0l0H90llH90l2H90l3H90l4H90l5H90l6H90l7HDB0l8H90l9H90lAH90lBH90lCH90lDH90lEH90lFHDB020H902lH9022H9023H9024H9025H9026H9027HDB028H9029H902AH902BH902CH902DH902EH902FHDB030H903lH9032H9033H9034H9035H9036H9037HDB038H9039H903AH903BH903CH903DH903EH903FHEND其他3个ASM文件格式一样9但ORG全部改为8000H9内容也相应替换O3 生成HEX文件方法启动UV2集成开发环境9新建一项目9由于现在仅为4个ASM的常量代码表编译HEX文件9器件可选包含32KB以上ROM的任意一型号的5lMCUO考虑到以后实际使用C805lFl2X9可以直接选择C805lFl2XO不必配置CodeBanking的选项9在Output选项卡的CreateHEXFie选项上配置9以创建HEX文件同时9注意每次修改ASM都修改NameofExecutabe右边的文件名9以免后续HEX文件覆盖前次结果9如图l所示O分别将4个ASM文件加入项目中O每次只加入一个ASM文件9然后编译生成HEX文件9改换HEX文件名后移走原ASM文件9再加入新的ASM文件O这样就完成了4个HEX文件9设为B0.HEXB3.HEXO在C805lFl2X目标板系统连接好JTAG调试器并正确配置后9启动SiiconLaboratories的IDE集成开发环境9打开Debug菜单9选择Connect菜单项9以连接目标器件与IDE然后选择该菜单下的DoWnoadObjectFie.9弹出DoWnoad对话框9对相关参数进行配置最后单击DoWnoad按钮9完成4个BANK的相关HEX文件下载O4个BANK的参数配置如图2所示OKEILUV2及SiiconLaboratoriesIDE只处理HEX描述的空间9其他空间维持原态9所以可以预先把基本不再修改的常量代码表下载到C805lFl2X内9之后只须单独处理程序代码9但要保证程序代码空间不超越预先分配给常量代码的空间O在KEILUV2的配置对话框中可以限制编译后的空间大小9如果源代码编译越界9则有错误提示9且不能创建相应的HEX文件9这有助于防止冲坏常量代码O打开原来的UV2项目文件9移出常量代码表ASM图1 创建HEX文件图2 4个BANK的参数配置文件9加入程序文件C文件或ASM文件9编译通过后就可直接调试9并可访问先前下载过的常量代码表数据O由图3可知9KEILUV2下显示的4个BANK内容确实为通过SiiconLaboratoriesIDE下载的相关HEX文件数据O如果程序代码比较大9但只要不超过64KB9那么就可直接按非BANK方式编译O留给常量代码的空间相应要减少9可以使用BANK2和BANK3BANKl中能用的常量代码空间取决于程序代码大小9地址必须高于程序代码最后字节地址O下面以C805lFl26读取含32字节的数据块函数为例9代码如下I78 advmesnet.com.cnC广告专用 图3 KEILUV2下显示的BANK内容voidReadFashCunsignedcharbnunsignedintaddrX unsignedcharcode一datapread unsignedchari SFRPAGE0x00 bnbn4 PSBANKPSBANK0xcf PSBANKPSBANKbn preadaddr forCi0i32i Fashreadbufi一Cpreadi 调用实例如下 ReadFashC00x7fc0 //取Bank0第一个32字节块 ReadFashC00x7fe0//取Bank0第二个32字节块ReadFashCl0x8000//取Bankl第一个32字节块ReadFashC20x8020//取Bank2第二个32字节块ReadFashC30x8000//取Bank3第一个32字节块大量常量代码不局限于字库应用o作者开发的UHF段RFID系统需要使用较多的C805lFl26的自带外设o其他5l核MCU不加外扩无法满足要求故选用由C805lFl26为管理控制器FPGA为信号处理器o其中C805lFl26内程序量只有l8KBFPGA的固件有98KBo为充分利用C805lFl26将FPGA的BIN数据存放到C805lFl26的4个BANK中FPGA综合软件生成的文件是BIN方式的文件所以我们自行设计了一套运行于PC的转换程序输入FPGA的固件BIN文件后自动按照配置的地址空间生成4个HEX文件然后利用SiiconLa-boratoriesIDE将这4个文件下载到C805lFl26中o程序的函数从Fash中读取代码后配置FPGAo结 语通过绕开KEILC5l对常量代码分配在COMMON区的限制将常量代码分配到任意BANK的方法解决了一些需要存储大量常量代码的固件程序员使用KEILC5l无法编译通过的问题o为许多带有中文液晶显示功能的系统提供了较好的设计参考思路o参考文献lC805lFl2Xl3X.pdf.WWW.xh.com.cn.2Anl30.pdf.WWW.siabs.com.王效东工程师主要研究方向为UHF段RFID读写器MCU/DSP等固件程序开发收稿日期:2006-09-ll4 结 论二次加载方法克服了5509固化引导加载程序的弊端可以根据不同的条件实现比较灵活的加载方式o二次引导加载程序采用汇编语言编写代码简单短小o经实际验证以上两种二次引导加载方式均能成功加载o以上介绍的二次加载方法不仅可用在5509DSP中同样也可以利用在其他类似的高速微处理器系统引导加载方案中实现灵活的程序加载o对高速DSP采集系统的设计应用有比较好的实际借鉴价值o参考文献lTI.DatasheetTMS320VC5509Fixed-PointDigitaSignaProcessor.Jan.2004.2TI.DatasheetUsingtheTMS320C5509/C5509ABootoad-er.Sep.2003.3TI.DatasheetTMS320VC5509DSPExternaMemoryIn-terfaceCEMIFReferenceGuide.Oct.2003.4TI.DatasheetTMS320VC550l/5502/5509/55l0DSPMuti-channeBufferedSeriaPortCMcBSPReferenceGuide.Jan.2004.5张小波廖新征.基于DSP的低功耗高速采集系统.电子技术应用2004Cl2.收稿日期:2006-07-3l