编程:绝对定位-__attribute__

attribute

attribute((at(0X68000000)))
这里其实就是要搞懂2个C语言关键字就可以了.
首先,attribute,这个是 用来指定变量或结构位域的特殊属性,该关键字后的双括弧中的内容是属性说明。
然后是at关键字,该关键字可以用来设置变量的绝对地址,也就是你可以通过这个关键字,指定某个变量处于内存里面的某个给定的地址.

综合起来,就是设置变量处于0X68000000这个地址.
attribute ((packed)) 的作用就是告诉编译器取消结构在编译过程中的优化对齐,按照实际占用字节数进行对齐,是GCC特有的语法。

学习STM32也会遇到这样的绝对定位的问题如下:
uint8_t UART_RX_BUF[1024] attribute ((at(0X20001000))); //就是将串口接收的数据定位到RAM中起始地址为0X20001000;

绝对定位要么定位到flash、要么定位到RAM,这里我们将定位在flash进行说明。
MDK如何实现将数据存储到FLASH指定地址?
我们在烧录数据的时候,一般是从0x08000000开始按照顺序烧录到flash里面的,如何让数据能够定义到绝对地址如0800F000,就必须保证文件内数据也是存储在该地址,为了实现这个目的,MDK在生成文件时会填充0x00字段,从而确保能够将数据定义到
编程:绝对定位-__attribute___第1张图片
从实际情况也能验证这个原理,我以我的测试代码为例:

const u16 gFlashDefValue4[512] __attribute__((at(0x0800F000))) =  {0x1111, 0x1111, 0x1111, 0x0111, 0x0111,0x0111};

编程:绝对定位-__attribute___第2张图片
可以看到Code+ReadOnly= 15236+47228 = 62464
而gFlashDefValue4占绝对地址F000+512*2 = 62464

从生成的BIN文件也可以证实该观点:
编程:绝对定位-__attribute___第3张图片
编程:绝对定位-__attribute___第4张图片
如果你自己查看生成文件也可以发现中间填充了大量的0x00.但有一点要注意, FLASH定义绝对地址时要考虑ZI-Data的长度,否则可能会导致FLASH溢出。
来自 http://blog.csdn.net/sinat_23338865/article/details/51960362

你可能感兴趣的:(C编程,__attribute__,绝对定位)