• STM32学习笔记之__attribute__ ((at())绝对定位分析


    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溢出。

  • 相关阅读:
    异常
    C++中的mutable,volatile,explicit关键字
    Vi配置文件--Vimrc
    结构体和类的区别
    [转]恢复视力的方法(500度以下)
    与struct相关的宏定义 ---今Tencent笔试用到的
    如何在C++中调用C的代码
    C中如何调用C++函数?
    技术博走起
    Shell常见命令实践
  • 原文地址:https://www.cnblogs.com/jiangzhaowei/p/9264365.html
Copyright © 2020-2023  润新知