使用Keil

在使用Keil编写程序的时候我们可以很轻松的将变量定义到指定地址

uint8_t array[1024] __attribute__((at(0x20010000)));

使用STM32CubeIDE

由于编译器不同,STM32CubeIDE中是不支持 __attribute__((at()))这一属性的,所以需要另辟蹊径。在网上查找到的资料说可以使用__attribute__((section()))属性

//将array放到地址空间0x20010000中
uint8_t array[1024] __attribute__((section(".RAM_Array")));

配合修改链接文件stm32Fxxx_FLASH.ld

...
MEMORY
{CCMRAM    (xrw)    : ORIGIN = 0x10000000,   LENGTH = 64KRAM    (xrw)    : ORIGIN = 0x20000000,   LENGTH = 128KRAM_Array_Addr    (xrw)    : ORIGIN = 0x20010000,   LENGTH = 1KFLASH    (rx)    : ORIGIN = 0x8000000,   LENGTH = 1024K
}
...
SECTIONS
{...
....RAM_Array (NOLOAD): //注意这里的 NOLOAD !{. = ALIGN(4);*(.RAM_Array)    //这是与.c文件中声明变量时的段对应的符号. = ALIGN(4);} >RAM_Array_Addr
...
...
}

这样做确实可以将array定义到内存地址0x20010000中去,但是需要注意一个问题,这个坑也是促使我第一次写博文的重要原因:

说问题之前先普及一下知识点:

我们的源码经过GCC编译器编译链接之后会生成一个 .elf 文件和一个 .bin 文件,二者都是二进制文件,但是 elf 文件包含符号表、汇编等信息,它的执行需要有操作系统支持,例如Linux,而bin 文件是elf 文件经过压缩,仅提取了其中的代码段 .text 和数据段.data 以及一些自定义的段(如 .RAM_Array)来做成的内存镜像,所以可以直接由机器运行,也就是我们要下载到STM32的FLASH中的东西。

我们的源码编译后会默认的生成三个段 .text 代码段、.data数据段以及 .bss存放未初始化变量的段,还有一些自定义的段 .RAM_Array。这些段的地址等属性由MEMORY{...}中的内容控制。

.text:代码段,存放代码
.data:数据段,存放已经初始化的变量
.bss:存放未初始化或初始化为零的变量,在编译时会直接清空这部分内存,以压缩输出文件
同时输出的bin 文件中只包含.text段和.data段以及自定义段。

我在自定义的段中定义了一个32M的大数组,放到了SDRAM中,但是未初始化,编译时内存炸了。千辛万苦找出原因发现是.bss段是在RAM中的,尝试将.bss段放到SDRAM中,但是SDRAM需要初始化,于是又失败了。所以大数组不能放到.bss段中,于是乎初始化为1,编译通过!赶紧下载试试,咦?怎么进度条一直不动呢?千辛万苦找出原因发现输出的bin文件直接 2.9G!?没错,你没看错,我也没打错,就是2.9个G!好家伙!玩呢!我一个32M的大数组愣是给我编译出了2.9G?于是乎又宣布失败。于是乎开始学习ld链接文件的语法,终于有心人天不负,让我发现了NOLOAD这个属性,就是在链接时告诉编译器,这个段我不要加载,你也别给我输出到bin文件中去了,我的小心脏受不了!,于是乎一个40KB的bin文件出来了,烧录,成功!好家伙!

– - - - - - - - - - - - - - - - - - - - - - - - - - - - -想做就没有做不成的事 - - - - - - - - - - - - - - - - - - - - - - - - - - - -

【STM32CubeIDE】将变量定义到指定地址相关推荐

  1. STM32H743+Keil-将变量定义到指定内存

    文章目录 一.前言 二.Keil 2.1.Target 2.2.Linker 三.代码 四.DEBUG 一.前言 在STM32CubeIDE实现了将变量定义到指定内存,当使用Keil时,方法又不一样了 ...

  2. STM32H743+CubeIDE-将变量定义到指定的内存

    文章目录 一.前言 二.将变量定义到指定的内存 2.1.将变量定义到DTCM内存 2.2.将变量定义到RAM_D1内存 三.STM32CubeIDE实用技巧之ld链接文件解读 3.1.内存(MEMOR ...

  3. RISC-V MCU将常量定义到指定的Flash地址 -- 以CH32V103为例

    Keil MDK开发ARM 内核的MCU时,将常量定义到指定的Flash地址中,使用 _attribute_( at(绝对地址) )即可,如: const u32 myConstVariable_1[ ...

  4. 51单片机如何用c语言位定义,嵌入式编程(一):51单片机如何将函数 定义到指定程序地址...

    在单片机编程使用中,会涉及到将某些函数定义到指定的code区.此时需要对工程文件进行配置修改才可完成.本期针对单片机平台做出说明介绍 1.测试目标 将函数testaddr定义到0x6000地址 2.测 ...

  5. keil运行c语言输入函数,keil 编译器V6 定义函数在ram中运行-和在指定地址定义常量,keil编译器...

    keil 编译器V6 定义函数在ram中运行-和在指定地址定义常量,keil编译器 之前一直是用v5编译,编译速度慢,换成V6编译速度差不多快50% ,而且arm后期只维护v5编译器不在更新v5编译器 ...

  6. 嵌入式编程(二):ARM单片机如何将函数 定义到指定程序地址

    在单片机编程使用中,会涉及到将某些函数定义到指定的code区.此时需要对工程文件进行配置修改才可完成.本期针对ARM平台单片机做出说明介绍 1.测试目标 将函数Communication_Test定义 ...

  7. 嵌入式编程(一):51单片机如何将函数 定义到指定程序地址

    在单片机编程使用中,会涉及到将某些函数定义到指定的code区.此时需要对工程文件进行配置修改才可完成.本期针对单片机平台做出说明介绍 1.测试目标 将函数testaddr定义到0x6000地址 2.测 ...

  8. VS插件开发——格式化变量定义语句块

    插件介绍 代码地址:https://github.com/sun2043430/vs2008_format_variable_define_plugin/ 在vs里,对选中的变量定义块进行格式化,效果 ...

  9. 在c语言中函数的定义变量的值为,变量定义(C语言中变量的声明和定义)

    变量定义(C语言中变量的声明和定义),哪吒游戏网给大家带来详细的变量定义(C语言中变量的声明和定义)介绍,大家可以阅读一下,希望这篇变量定义(C语言中变量的声明和定义)可以给你带来参考价值. 3.函数 ...

最新文章

  1. 对数组中的数字从小到大排序
  2. 赠书:聊聊「分布式架构」那些事儿
  3. Nginx+tomcat负载均衡session问题解决
  4. Android SharedPreferences 见解
  5. 博为峰Java技术题 ——JavaSE 类加载器Ⅰ
  6. Android ViewPager实现多个图片水平滚动
  7. Linux备份压缩命令
  8. 痞子衡嵌入式:ARM Cortex-M内核那些事(2)- 第一款微控制器
  9. Linux 多学习过程
  10. 零信任技术进阶篇(关键技术及挑战、BeyondCorp安全模型)
  11. 什么样的程序猿,最容易被鄙视?
  12. js 设置password placeholder样式_150+ 个优质的 Node.js 包和资源
  13. .NET应用架构设计—表模块模式与事务脚本模式的代码编写
  14. JiBX 入门级使用
  15. 安全模式:天猫 App 启动保护实践
  16. python基础-软件目录开发规范
  17. 关于公众号文章搜索,有两个小技巧
  18. 什么是传感器?不同类型的传感器及其应用
  19. 初学者安装mysql5.7_CentOS7入门_安装并配置mysql5.7.18
  20. Java黑皮书课后题第6章:*6.7(金融应用:计算未来投资回报率)编写一个方法,计算按照给定的年数和利率计算未来投资回报值,未来投资回报值是用编程练习题2.21中的公式得到的,使用下面方法头

热门文章

  1. 终于看清了黑洞!然而黑洞究竟是什么?
  2. 弘辽科技:淘宝新店运营推广的几大技巧
  3. elasticsearch7.X x-pack破解使用权限和告警等功能
  4. Java统计数组中各个数字出现的个数和字符串中各个字符出现的个数
  5. ESP8266-NodeMCU项目(二):ESP8266-NodeMCU+Blinker+DHT11+小爱同学
  6. linux 安装redis以及配置redis开机自启
  7. 百度UEditor编辑器,合入PHP网站
  8. 无线射频专题《射频单位,功率单位与相对单位,瓦特,毫瓦,分贝,dBi,dBd,dBm》
  9. Stack Overflow 的 HTTPS 化:漫漫长路的终点
  10. 打印系统开发(39)——检查打印机状态