STM32学习笔记之__attribute__ ((at())绝对定位分析
2016-07-19 23:26
288 查看
学习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溢出。
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溢出。
相关文章推荐
- EJB
- Android适配
- mysql插入中文 解决方案
- Android Studio的调试技巧 (未完待续)
- 访问不了Google
- UVA 10780-Again Prime? No Time.
- Python学习-1天--基础操作
- Android Activity启动机制流程和四种启动模式
- JQuery.cookie.js操作客户端cookie
- Java运算符
- 计算机网络重点知识总结
- 无法连接主机“192.168.30.7”: 由于连接方在一段时间后没有正确答复或连接的主机没有反应,连接尝试失败。
- 我的C++回调函数的理解
- Java基本数据类型
- MyBatis日期有坑
- Android,环境搭建
- Android 关于OOM的解决方案
- CF-One Bomb(炸弹问题)
- 在宇宙间不易被风吹散 —— 月亮
- Mybatis核心类生命周期和管理