在STM32中将变量或代码设定在指定内存地址的方法

gcc编译环境下为变量指定绝对地址 gcc,变量指定绝对地址 阅读详情
AI摘要

本文详细介绍了如何使用ARM编译器如arm_none_eabi_gcc和IAR为特定存储区分配变量和函数,包括在链接脚本中声明内存块及在不同编译器下的语法差异。通过实例展示了如何将数据和代码放置于SMT32的高速CCRAM区域以提升执行效率。

各个编译器有自己不同的语法

对于arm_none_eabi_gcc:

// Sampling variables
#define ADC_SAMPLE_MAX_LEN		2000
__attribute__((section(".ram4"))) static volatile int16_t m_curr0_samples[ADC_SAMPLE_MAX_LEN];
__attribute__((section(".ram4"))) static volatile int16_t m_curr1_samples[ADC_SAMPLE_MAX_LEN];
__attribute__((section(".ram4"))) static volatile int16_t m_ph1_samples[ADC_SAMPLE_MAX_LEN];
__attribute__((section(".ram4"))) static volatile int16_t m_ph2_samples[ADC_SAMPLE_MAX_LEN];
__attribute__((section(".ram4"))) static volatile int16_t m_ph3_samples[ADC_SAMPLE_MAX_LEN];
__attribute__((section(".ram4"))) static volatile int16_t m_vzero_samples[ADC_SAMPLE_MAX_LEN];
__attribute__((section(".ram4"))) static volatile uint8_t m_status_samples[ADC_SAMPLE_MAX_LEN];
__attribute__((section(".ram4"))) static volatile int16_t m_curr_fir_samples[ADC_SAMPLE_MAX_LEN];
__attribute__((section(".ram4"))) static volatile int16_t m_f_sw_samples[ADC_SAMPLE_MAX_LEN];
__attribute__((section(".ram4"))) static volatile int8_t m_phase_samples[ADC_SAMPLE_MAX_LEN];

在连接脚本中需声明该内存块

MEMORY
{
    flash : org = 0x08000000, len = 16k
    flash2 : org = 0x0800C000, len = 393216 - 16	/* NEW_APP_MAX_SIZE - CRC_INFO */
	crcinfo : org = 0x0805FFF0, len = 8		/* CRC info */
    ram0  : org = 0x20000000, len = 128k    /* SRAM1 + SRAM2 */
    ram1  : org = 0x20000000, len = 112k    /* SRAM1 */
    ram2  : org = 0x2001C000, len = 16k     /* SRAM2 */
    ram3  : org = 0x00000000, len = 0
    ram4  : org = 0x10000000, len = 64k     /* CCM SRAM */
    ram5  : org = 0x40024000, len = 4k      /* BCKP SRAM */
    ram6  : org = 0x00000000, len = 0
    ram7  : org = 0x00000000, len = 0
}

并在连接脚本后面要有添加数据的操作

    .ram4 (NOLOAD) : ALIGN(4)
    {
        . = ALIGN(4);
        *(.ram4)
        *(.ram4.*)
        . = ALIGN(4);
        __ram4_free__ = .;
    } > ram4

针对IAR:


#if defined (CCMRAM)
#if defined (__ICCARM__)
#pragma location = ".ccmram"     //这里是针对IAR的语法
#elif defined (__CC_ARM) || defined(__GNUC__)
__attribute__( ( section ( "ccmram" ) ) )    //这里是针对GCC等编译器的语法
#endif
#endif
/**
  * @brief  It return the Vqd componets fed in input plus the feed forward
  *         action and store the last Vqd values in the internal variable.
  * @param  pHandle Feed forward  strutcture.
  * @param  Vqd Initial value of Vqd to be manipulated by FF .
  * @retval Volt_Components Vqd conditioned values.
  */
Volt_Components FF_VqdConditioning( FF_Handle_t * pHandle, Volt_Components Vqd )
{
  int32_t wtemp;

  pHandle->VqdPIout = Vqd;

  wtemp = ( int32_t )( Vqd.qV_Component1 ) + pHandle->Vqdff.qV_Component1;

  SATURATION_TO_S16( wtemp )

  Vqd.qV_Component1 = ( int16_t )wtemp;

  wtemp = ( int32_t )( Vqd.qV_Component2 ) + pHandle->Vqdff.qV_Component2;

  SATURATION_TO_S16( wtemp )

  Vqd.qV_Component2 = ( int16_t )wtemp;

  return ( Vqd );
}

上面的操作是将函数代码放到指定的存储区内。需要快速执行的代码或数据,可以放在SMT32的CCRAM区里。内核访问该存储区的速度比访问FLASH快很多。

关注公众号《首飞》回复“机器人”获取精心推荐的C/C++,Python,Docker,Qt,ROS1/2,机器人学等机器人行业常用技术资料。

【STM32】STM32 变量存储在片内FLASH的指定位置 在这里以STM32L4R5为例(官方出的DEMO板),将变量存储在指定的片内FLASH地址(0x081F8000)。 一、MDK Keil软件操作 uint8_t version[12] __attribute__((section(".ARM.__AT_0x081F8000")))= {0x11,0x12,0x13,0x14,0x15,0x16}; uint8_t version1[12] __... 阅读详情

相关推荐

STM32CUBEIDE 如何将变量定义到指定内存地址

使用场景如下: 我需要将bootloader/APP的版本号和一些字段信息定义到指定FLASH地址. 在STM32CubeIDE中的方法: 截止当前STM32CubeIDE还没有提供图形化的针对FLASH划分定义的支持选项, 所以第一步我们需要手动更改 .ld文件 (链接文件). 原文件如下(部分): /* Memories definition */ MEMORY { CCMRAM (xr...

qq_20163075的博客 3207

STM32_KEIL 变量指定存储区域

定义buf在起始地址为0xC0000000的连续区域,这种方法简单高效,但是对于数量很多的变量,就麻烦不实用了。1.修改链接标本,定义一块区域取消1处勾选,自定义链接脚本,点击2处编辑定义一片区域,如上图(sdram_area)2.定义宏定义3.定义变量此时变量已经定义至指定区域。相较于方法1,无需自己严格计算绝对地址,更加便捷。

荷兰风车 2734

STM32完整内存地址空间分配详解

在STM32这类基于ARM Cortex-M的32位微控制器中,整个4GB的地址空间(从0x00000000到0xFFFFFFFF)有着非常系统化的分配方案,每个区域都有其特定的用途。

huayidw的博客 5010

将STM32 函数和常量存到Flash指定地址、 变量存到SRAM指定地址

MDK中定义 unsigned char ary[3] __attribute__((at(0x20000000))) = {0, 1, 3}; //MDK中定义变量指定SRAM地址 const unsigned char buf[2] __attribute__((at(0x08035800))) = {9, 7}; //MDK中定义常量指定Flash地址 void fun(void) __attribute__((at(0x08075800))); //MDK中定义函数指定Flash地址 GC

6356

深度剖析STM32内存地址与启动过程

STM32是意法半导体推出的低成本、高性能、低功耗的单片机,主流产品(STM32F0、STM32F1、STM32F3)、超低功耗产品(STM32L0、STM32L1、STM32L4、STM32L4+)、高性能产品(STM32F2、STM32F4、STM32F7、STM32H7)。

weixin_43405473的博客 2881

Ubuntu系统、STM32下重温全局变量、局部变量、堆、栈。

目录 一、知识点 1.1全局变量 & 局部变量 1.2 堆 & 栈 1.3stm32数据的存储位置 二、Ubuntu(x86)系统和STM32(Keil)中编程验证 2.1 代码编写 2.2 ubuntu运行 2.3 stm(keil)运行 2.3.1工程建立 2.3.2编译 2.3.2 运行结果 2.3.3 查看stm32地址的分配 三、总结 一、知识点 1.1全局变量 & 局部变量 全局变量 在所有函数外部定义的变量称为全局变量(Global...

qq_60678931的博客 1845

如何将变量存储在指定内存地址(基于Keil MDK-ARM)

关注、星标公众号,不错过精彩内容将变量、数组(例如表或函数)存储到特定地址的原因有很多。校验和可能需要位于某个地址,可能需要将函数放在特定的内存位置,根据使用的编译器,可...

strongerHuang 2万+

深入解析STM32内存地址映射:从理论到实践

本文深入解析了STM32微控制器的内存地址映射机制,从ARM Cortex-M内核的4GB地址空间规划讲起,详细拆分了代码区、SRAM区、外设区及系统区的功能与访问方式。通过介绍位带操作、链接脚本定制、MPU内存保护等实战技巧,帮助开发者优化程序性能、高效调试并实现高级功能,是掌握STM32底层编程与系统设计的核心知识。

yoga7的博客 763

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

文章目录一、前言二、将变量定义到指定的内存2.1、将变量定义到DTCM内存2.2、将变量定义到RAM_D1内存三、STM32CubeIDE实用技巧之ld链接文件解读3.1、内存(MEMORY)3.2、段(Section)四、细节补充 一、前言 在实际项目中,充分发挥STM32H7的性能,必须将频繁存取的数据存放在DTCM内存。TCM:Tightly-Coupled Memory 紧密耦合内存,特点是跟内核速度一样(480M)。但是,其他内存(SRAM1,AXI SRAM,SRAM2,SRAM3等)跟CPU的

wallace89的博客 1万+

keil中STM32F407变量地址指定

为什么非要指定iram1? 使用 STM32f4+DMA 内存地址指向iram2时会产生的transfer error问题 IRAM2选项,这块是CCM内存区。内存是在地址0x1000000映射的64KB块,只提供CPU通过数据D总线进行访问。这段内存是只能CPU访问的,一旦将数据分配至CCM内存,而同时使用了DMA访问他,那么就会出现问题。

weixin_43777852的博客 686

stm32和ros的串口通信

全网最实用的STM32和ROS机器人的串口通信方案

「小白学移动机器人」一个专注分享移动机器人相关知识的公众号! 2万+

Keil MDK如何将变量存储在指定内存地址

关注+星标公众号,不错过精彩内容作者 | strongerHuang微信公众号 | strongerHuang变量是程序中重要的一部分,产品中很多业务代码都是变量起到了关键作用。传感器采...

strongerHuang 7509

centos7安装db2 version11.1

centos7安装db2 version11.1

AKA石头 1066

【STM32CubeIDE】将变量定义到指定地址

使用Keil 在使用Keil编写程序的时候我们可以很轻松的将变量定义到指定地址 uint8_t array[1024] __attribute__((at(0x20010000))); 使用STM32CubeIDE 由于编译器不同,STM32CubeIDE中是不支持 __attribute__((at()))这一属性的,所以需要另辟蹊径。在网上查找到的资料说可以使用__attribute__((section()))属性 //将array放到地址空间0x20010000中 uint8_t array[10

GaoShang_Up的博客 1万+

实证研究之|stata清洗charls数据

stata

qq_45313933的博客 6763

基于PLC1200与CB1241的RS485从站Modbus Rtu通信实战指南

本文提供了一份详细的西门子S7-1200 PLC与CB1241 RS485通讯板实现Modbus RTU从站通信的实战指南。内容涵盖从硬件接线、博途软件组态、关键参数设置到程序调试与测试的全过程,重点解析了Modbus_Slave指令配置与数据块映射,帮助工程师快速掌握工业自动化系统中的数据采集与设备接入技术。

Apple的专栏 796

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

文章目录一、前言二、Keil2.1、Target2.2、Linker三、代码四、DEBUG 一、前言 在STM32CubeIDE实现了将变量定义到指定内存,当使用Keil时,方法又不一样了。 STM32H743+CubeIDE-将变量定义到指定的内存 RAM:0x20000000 ~ 0x20020000 ,尺寸128KB。这个就是DTCM内存。 安富莱的建议: 二、Keil 2.1、Target 让Keil只管理DTCM内存,不要管理其他内存。 2.2、Linker 从ST官方手册RM0433可以

wallace89的博客 6367

晶圆测试(Wafer Sort)的核心技术与良率提升策略

晶圆测试(Wafer Sort)是芯片制造中的关键“入学考试”,通过探针台与自动测试设备(ATE)对晶圆上的芯片进行功能与参数测试,筛选不合格芯片以控制成本。本文深入解析了其核心技术,包括自动化视觉系统对准、测试流程优化策略,并探讨如何利用测试数据驱动良率提升,展望了DFT与AI智能测试的未来趋势。

e4f5g6h的博客 519

STM32F429在SDRAM中定义变量不用指定地址方法

第一次在优快云上写博客,一是记录此词调试STM32F429外部SDRAM时遇到得问题及解决方法,二是做一个笔记以便往后复习。正题开始! -----------------------------------------------------------------------一小段废话分割线---------------------------------------------------...

YanZhiwei的博客 3055

从零做出可发布的2D冒险游戏!Unity全流程实战指南:从资源搭建到打包发布,新手也能跟着做

项目配置→资源导入→核心模块开发→关卡设计→调试→打包发布;玩家控制→敌人AI→道具系统→UI系统→游戏管理器→音效系统;新手开发重点:先实现核心玩法(移动、跳跃、攻击),再补充UI、音效、存档等辅助功能;调试是关键:每实现一个功能就测试,避免最后一堆bug难以定位。从零做一款完整的2D冒险游戏,能快速提升你的Unity综合能力——不仅能掌握C#编程、2D物理、UI系统,还能理解游戏开发的完整流程。先做出基础版,再慢慢迭代优化,你会发现游戏开发并没有想象中那么难。

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 1182

数据挖掘在人力资源分析中的实战案例

在当今竞争激烈的商业环境中,人力资源管理对于企业的成功至关重要。有效的人力资源管理能够提高员工绩效、降低员工流失率、优化人才招聘等。而数据挖掘技术为人力资源管理提供了强大的工具,通过对大量人力资源数据的分析,可以发现潜在的规律和模式,为企业的决策提供有力支持。本文的目的是通过实际案例展示数据挖掘在人力资源分析中的具体应用,涵盖员工绩效预测、人才招聘筛选、员工流失分析等多个方面。通过详细的案例分析,帮助读者理解数据挖掘技术在人力资源管理中的实际操作和应用价值。

移动开发前沿的博客 489

【ARM】MDK如何将变量存储到指定内存地址

通过MDK的工程配置,将指定的变量存储到指定的内存地址上。

Emdoor123的博客 1388

OSPF的7种状态,DR与BDR的基本概念,1、2、3、4、5、7类LSA解析,Stub、NSSA、Totally Stub、Totally NSSA的基本概念与配置

OSPF的7种状态,DR与BDR的基本概念,1、2、3、4、5、7类LSA解析,Stub、NSSA、Totally Stub、Totally NSSA的基本概念与配置

weixin_72194028的博客 3010

Keil MDK调试实战:如何验证你的STM32H743变量真的放到了指定的内存地址?

本文详细介绍了在Keil MDK环境下如何验证STM32H743变量是否被正确分配到指定内存地址。通过分析map文件、使用Memory窗口和Watch窗口等调试工具,以及高级调试技巧,确保内存配置的准确性。特别适合嵌入式开发者优化STM32H743内存管理。

weixin_30298497的博客 452

嵌入式开发工程师笔试面试指南-Linux驱动

linux驱动

weixin_43491077的博客 475

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

stm32位带操作及内存地址

位待操作及地址STM32地址基地址、总线地址、寄存器地址是什么基地址以及偏移地址寄存器地址他们之间有什么样的联系(重点)STM32位待操作What 位待操作是什么Why 为什么要使用位待操作How 位待操作是如何实现的代码代码解读基地址映射偏移地址映射例程 STM32地址 基地址、总线地址、寄存器地址是什么 基地址以及偏移地址 这是stm32的系统结构图,只需要看一下红线框出来的地方即可 从下图可以看到,总线分为 4 大块,每块都有一个起始地址,这个起始地址就是基地址,然后到下一块起始地址的时候就会和前一块

m0_51139505的博客 2517

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

上一篇: gcc的使用
下一篇: qt使用技巧收集
首飞爱玩机器人
博客等级 码龄14年 6990粉丝 120原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

首飞爱玩机器人

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值