https://blog.csdn.net/sinat_23338865/article/details/51960362
站在巨人的肩膀上学习
学习STM32也会遇到这样的绝对定位的问题如下:
uint8_t UART_RX_BUF[1024] __attribute__ ((at(0X20001000))); //就是将串口接收的数据定位到RAM中起始地址为0X20001000;
绝对定位要么定位到flash、要么定位到RAM,这里我们将定位在flash进行说明。
MDK如何实现将数据存储到FLASH指定地址?
我们在烧录数据的时候,一般是从0x08000000开始按照顺序烧录到flash里面的,如何让数据能够定义到绝对地址如0800F000,就必须保证文件内数据也是存储在该地址,为了实现这个目的,MDK在生成文件时会填充0x00字段,从而确保能够将数据定义到
从实际情况也能验证这个原理,我以我的测试代码为例:
const u16 gFlashDefValue4[512] __attribute__((at(0x0800F000))) = {0x1111, 0x1111, 0x1111, 0x0111, 0x0111,0x0111};
可以看到Code+ReadOnly= 15236+47228 = 62464
而gFlashDefValue4占绝对地址F000+512*2 = 62464
从生成的BIN文件也可以证实该观点:
如果你自己查看生成文件也可以发现中间填充了大量的0x00.但有一点要注意, FLASH定义绝对地址时要考虑ZI-Data的长度,否则可能会导致FLASH溢出。
————————————————
版权声明:本文为CSDN博主「偏执灬」的原创文章,遵循CC 4.0 by-sa版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/sinat_23338865/article/details/51960362
https://blog.csdn.net/u010947832/article/details/90582253
之前在学习51的时候,遇到使用byte xdata SendBuffer[5] _at_ 0x8000,表明把数组SendBuffer放到外部RAM的0x8300的位置。STM32是怎么定义的呢?
查了一下STM32使用uint32_t SendBuffer[5] __attribute__((at(0X20000000))),注意attribute的前后都是两个下划线"_"组成,此外,at后面的地址要保证是可用的RAM地址。如果要定义在ROM的绝对地址上时,注意要在变量类型前加上const修饰uint8_t test[5] __attribute__((at(0X08000100))) = {0x12,0x34,0x56,0x78,0x90},否则编译器会报警告。
————————————————
版权声明:本文为CSDN博主「晨曦的烟雨」的原创文章,遵循CC 4.0 by-sa版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/u010947832/article/details/90582253
https://zhidao.baidu.com/question/228358395.html
unsigned char xdata CTRL _at_ 0x2FFF; 请问各位高手,这句话定义的是外部数据无符号字符什么呀?
用-at-定义在xdata区,地址为Ox2FFF的无符号字符变量CTRL;