关于#pragma-DATA-SECTION的解释

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

关于#pragmaDATA_SECTION的解释自定义段(C语言)#pragmaDATA_SECTION(函数名或全局变量名,用户自定义在数据空间的段名);#pragmaCODE_SECTION(函数名或全局变量名,用户自定义在程序空间的段名);不能在函数体内声明。必须在定义和使用前声明#pragma可以阻止对未调用的函数的优化3.连接命令文件(CMD)1MEMORY指定存储空间MEMORY9}8eIg5y*kOGuest{oo)w?(lm9NRGuestPAGE0:$HH7Tu2A+eH%K3xr}Guestname0[attr]:origin=constant,length=constantPAGEn:EETOP专业博客---电子工程师自己的家园2o:b1G5?c$Zz5WOnamen[attr]:origin=constant,length=constant}PAGEn:标示存储空间,n255;PAGE0为程序存储空间;PAGE1为data存储空间name:存储空间名称attr:存储空间属性:只读R,只写W,可包含可执行代码X,可以被初始化I。orgin:用来定义存储空间的起始地址Lenth:用来定义存储空间的长度2SECTIONS分配段SECTIONS{name:[property,property,……]}name:输出段的名称property:输出段的属性:load=allocation(强制地址或存储空间名称)同allocation:定义输出段将会被装载到哪里。run=allocation(强制地址或存储空间名称)同allocation:定义输出段将会在哪里运行。注:CMD文件中只出现一个关键字load或run时,表示两者的地址时表示两者的地址时重合的。PAGE=n,段位于那个存储页面空间。例:ramfuncs:LOAD=FLASHD,RUN=RAML0,LOAD_START(_RamfuncsLoadStart),LOAD_END(_RamfuncsLoadEnd),RUN_START(_RamfuncsRunStart),PAGE=03直接写编译命令-lrts2800_ml.lib连接系统文件rts2800_ml.lib-ofilename.out最终生成的二进制文件命名为filename.out-mfilename.map生成映射文件filename.map-stack0x200堆栈为512字4..const段:由关键字const限定的全局变量(const限定的局部变量不产生)初始化值,和出现在表达式(做指针使用,而用来初始化字符串数组变量不产生)中的字符串常数,另外数组和结构体是局部变量时,其初始值会产生.const段,而全局时不产生。例子在结合硬件的编程中,有些变量需要特定地址.一般可以采用指针变量.例如:unsignedint*LedReg=(unsignedint*)0x5f00;//发光二极管地址*LedReg=0xFF;但有些时候感觉不是太好时,可以像Keil那样unsignedintLedRegat0x5f00;//发光二极管地址LedReg=0xFF;这样看着比较顺眼~~~但在TIDSP的CCS环境下,不能采用at或__at等来定位地址.不过CCS也提供了类似的手段,不过有些麻烦.具体实现:1.在CMD文件中MEMORY{PAGE0:/*ProgramMemory*/PAGE1:/*DataMemory*/LED_REG:origin=0x005f00,length=0x00001/*发光二极管地址*/LCD_ComL:origin=0x005100,length=0x00001LCD_ComH:origin=0x005200,length=0x00001LCD_DatL:origin=0x005300,length=0x00001LCD_DatH:origin=0x005400,length=0x00001EINT_REG:origin=0x005c00,length=0x00001KEY_REG:origin=0x005b00,length=0x00001RCLK_REG:origin=0x005500,length=0x00001/*数码管锁存地址*/}SECTIONS{LedDataRegsFile:LED_REG,PAGE=1LcdComlRegsFile:LCD_ComL,PAGE=1LcdComhRegsFile:LCD_ComH,PAGE=1LcdDatlRegsFile:LCD_DatL,PAGE=1LcdDathRegsFile:LCD_DatH,PAGE=1KeyRegsFile:KEY_REG,PAGE=1EintRegsFile:EINT_REG,PAGE=1RclkRegsFile:RCLK_REG,PAGE=1}2.在C/C++文件中#ifdef__cplusplus#pragmaDATA_SECTION(LedDataRegsFile)/*C++语言格式*/#else#pragmaDATA_SECTION(LedRegs,LedDataRegsFile);/*C语言格式*/#endifvolatileunsignedintLedRegs;/*以下为C++语言格式*/#pragmaDATA_SECTION(LcdComlRegsFile)volatileunsignedintLcdComL;#pragmaDATA_SECTION(LcdComhRegsFile)volatileunsignedintLcdComH;#pragmaDATA_SECTION(LcdDatlRegsFile)volatileunsignedintLcdDatL;#pragmaDATA_SECTION(LcdDathRegsFile)volatileunsignedintLcdDatH;#pragmaDATA_SECTION(EintRegsFile)volatileunsignedintEintRegs;#pragmaDATA_SECTION(KeyRegsFile)volatileunsignedcharKeyRegs;#pragmaDATA_SECTION(RclkRegsFile)volatileboolSpiRclkRegs;3.在应用程序中externunsignedintLedRegs;externvolatileunsignedintEintRegs;externvolatileunsignedcharKeyRegs;externvolatileboolSpiRclkRegs;//............LedRegs=0xff;//这样就不需要指针变量的写法了//..................

1 / 5
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功