【STM32CubeIDE】将变量定义到指定地址
使用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】将变量定义到指定地址相关推荐
- STM32H743+Keil-将变量定义到指定内存
文章目录 一.前言 二.Keil 2.1.Target 2.2.Linker 三.代码 四.DEBUG 一.前言 在STM32CubeIDE实现了将变量定义到指定内存,当使用Keil时,方法又不一样了 ...
- STM32H743+CubeIDE-将变量定义到指定的内存
文章目录 一.前言 二.将变量定义到指定的内存 2.1.将变量定义到DTCM内存 2.2.将变量定义到RAM_D1内存 三.STM32CubeIDE实用技巧之ld链接文件解读 3.1.内存(MEMOR ...
- RISC-V MCU将常量定义到指定的Flash地址 -- 以CH32V103为例
Keil MDK开发ARM 内核的MCU时,将常量定义到指定的Flash地址中,使用 _attribute_( at(绝对地址) )即可,如: const u32 myConstVariable_1[ ...
- 51单片机如何用c语言位定义,嵌入式编程(一):51单片机如何将函数 定义到指定程序地址...
在单片机编程使用中,会涉及到将某些函数定义到指定的code区.此时需要对工程文件进行配置修改才可完成.本期针对单片机平台做出说明介绍 1.测试目标 将函数testaddr定义到0x6000地址 2.测 ...
- keil运行c语言输入函数,keil 编译器V6 定义函数在ram中运行-和在指定地址定义常量,keil编译器...
keil 编译器V6 定义函数在ram中运行-和在指定地址定义常量,keil编译器 之前一直是用v5编译,编译速度慢,换成V6编译速度差不多快50% ,而且arm后期只维护v5编译器不在更新v5编译器 ...
- 嵌入式编程(二):ARM单片机如何将函数 定义到指定程序地址
在单片机编程使用中,会涉及到将某些函数定义到指定的code区.此时需要对工程文件进行配置修改才可完成.本期针对ARM平台单片机做出说明介绍 1.测试目标 将函数Communication_Test定义 ...
- 嵌入式编程(一):51单片机如何将函数 定义到指定程序地址
在单片机编程使用中,会涉及到将某些函数定义到指定的code区.此时需要对工程文件进行配置修改才可完成.本期针对单片机平台做出说明介绍 1.测试目标 将函数testaddr定义到0x6000地址 2.测 ...
- VS插件开发——格式化变量定义语句块
插件介绍 代码地址:https://github.com/sun2043430/vs2008_format_variable_define_plugin/ 在vs里,对选中的变量定义块进行格式化,效果 ...
- 在c语言中函数的定义变量的值为,变量定义(C语言中变量的声明和定义)
变量定义(C语言中变量的声明和定义),哪吒游戏网给大家带来详细的变量定义(C语言中变量的声明和定义)介绍,大家可以阅读一下,希望这篇变量定义(C语言中变量的声明和定义)可以给你带来参考价值. 3.函数 ...
最新文章
- 对数组中的数字从小到大排序
- 赠书:聊聊「分布式架构」那些事儿
- Nginx+tomcat负载均衡session问题解决
- Android SharedPreferences 见解
- 博为峰Java技术题 ——JavaSE 类加载器Ⅰ
- Android ViewPager实现多个图片水平滚动
- Linux备份压缩命令
- 痞子衡嵌入式:ARM Cortex-M内核那些事(2)- 第一款微控制器
- Linux 多学习过程
- 零信任技术进阶篇(关键技术及挑战、BeyondCorp安全模型)
- 什么样的程序猿,最容易被鄙视?
- js 设置password placeholder样式_150+ 个优质的 Node.js 包和资源
- .NET应用架构设计—表模块模式与事务脚本模式的代码编写
- JiBX 入门级使用
- 安全模式:天猫 App 启动保护实践
- python基础-软件目录开发规范
- 关于公众号文章搜索,有两个小技巧
- 什么是传感器?不同类型的传感器及其应用
- 初学者安装mysql5.7_CentOS7入门_安装并配置mysql5.7.18
- Java黑皮书课后题第6章:*6.7(金融应用:计算未来投资回报率)编写一个方法,计算按照给定的年数和利率计算未来投资回报值,未来投资回报值是用编程练习题2.21中的公式得到的,使用下面方法头
热门文章
- 终于看清了黑洞!然而黑洞究竟是什么?
- 弘辽科技:淘宝新店运营推广的几大技巧
- elasticsearch7.X x-pack破解使用权限和告警等功能
- Java统计数组中各个数字出现的个数和字符串中各个字符出现的个数
- ESP8266-NodeMCU项目(二):ESP8266-NodeMCU+Blinker+DHT11+小爱同学
- linux 安装redis以及配置redis开机自启
- 百度UEditor编辑器,合入PHP网站
- 无线射频专题《射频单位,功率单位与相对单位,瓦特,毫瓦,分贝,dBi,dBd,dBm》
- Stack Overflow 的 HTTPS 化:漫漫长路的终点
- 打印系统开发(39)——检查打印机状态