STM32使用__attribute__((at(0x????????)))将变量定义到绝对地址

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;

变量可能定位在绝对内存地址,直接对绝对内存地址访问

 

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
__attribute__是GCC编译器提供的一种扩展语,用于向编译器提供特定的指示或者属性。它可以用于函数、变量、类型等各种声明上,以实现一些特定的功能或者优化。 __attribute__的作用有以下几个方面: 1. 优化控制:通过使用不同的属性,可以告诉编译器如何对代码进行优化。例如,使用__attribute__((hot))属性可以告诉编译器将频繁执行的函数放在热代码区域,以提高执行效率。 2.告和错误控制:通过使用__attribute__((warn_unused_result))可以告诉编译器对函数返回值未使用给出警告。类似地,使用__attribute__((deprecated))属性可以标记已经过时的函数或者变量,以便编译器给出相应的警告。 3. 对齐控制:通过使用__attribute__((aligned(n)))属性可以指定变量或者结构体的对齐方式。这对于某些特定的硬件平台或者数据结构要求是非常有用的。 4. 函数属性:通过使用__attribute__((constructor))和__attribute__((destructor))属性可以指定在程序启动和结束时自动执行的函数。这在一些需要进行初始化和清理工作的场景下非常有用。 5. 扩展语法:__attribute__还可以用于扩展语法,实现一些特定的功能。例如,使用__attribute__((format))属性可以指定函数参数的格式化方式,以便编译器进行检查。 总之,__attribute__是GCC编译器提供的一种扩展语法,通过使用不同的属性可以对代码进行优化、警告控制、对齐控制等。它在一些特定的场景下非常有用,但需要注意的是,__attribute__是GCC特有的语法,不具有跨平台性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值