IAR中如何而将定义的数组放在指定的位置

在keil中可以使用下面的方法将数组定义到指定的位置

uint8_t g_usart_rx_buf[USART_REC_LEN] __attribute__ ((at(0X20001000)));

但是这个方法在IAR中是用不了的,通过网上查找各种资料,发现了两种可用的方法。我这里测试的单片机是stm32f103c8t6,其他单片机的操作方法是一样的。

第一种方法
先用记事本打开stm32f103xb_flash.icf 这个文件
在这里插入图片描述
里面的代码如下

/*###ICF### Section handled by ICF editor, don't touch! ****/
/*-Editor annotation file-*/
/* IcfEditorFile="$TOOLKIT_DIR$\config\ide\IcfEditor\cortex_v1_0.xml" */
/*-Specials-*/
define symbol __ICFEDIT_intvec_start__ = 0x08000000;
/*-Memory Regions-*/
define symbol __ICFEDIT_region_ROM_start__   = 0x08000000 ;
define symbol __ICFEDIT_region_ROM_end__     = 0x0801FFFF;
define symbol __ICFEDIT_region_RAM_start__   = 0x20000000;
define symbol __ICFEDIT_region_RAM_end__     = 0x20004FFF;
/*-Sizes-*/
define symbol __ICFEDIT_size_cstack__ = 0x400;
define symbol __ICFEDIT_size_heap__   = 0x200;
/**** End of ICF editor section. ###ICF###*/define memory mem with size = 4G;
define region ROM_region   = mem:[from __ICFEDIT_region_ROM_start__   to __ICFEDIT_region_ROM_end__];
define region RAM_region   = mem:[from __ICFEDIT_region_RAM_start__   to __ICFEDIT_region_RAM_end__];define block CSTACK    with alignment = 8, size = __ICFEDIT_size_cstack__   { };
define block HEAP      with alignment = 8, size = __ICFEDIT_size_heap__     { };initialize by copy { readwrite };
do not initialize  { section .noinit };place at address mem:__ICFEDIT_intvec_start__ { readonly section .intvec };place in ROM_region   { readonly };
place in RAM_region   { readwrite,block CSTACK, block HEAP };

在这个文件里面添加下面两行代码

define region RAM_D1_region  = mem:[from 0x20003000 to 0x20004000];  
place in RAM_D1_region {section .RAM_D1}; 

添加完成之后如下
在这里插入图片描述
注意添加的第一行代码中内存地址的范围要在RAM地址范围之内,否则就会出错。这个地址段的名称 “RAM_D1_region” 和“RAM_D1”自己可以随便取。添加完之后保持文件。然后在代码中按照下面这种方式定义数组:

#pragma location = ".RAM_D1"   
uint8_t buf1[10]; /* 接收缓冲, 最大USART_REC_LEN个字节. */

第一行是指定数组定义的位置,第二行是自己定义的数组。
在这里插入图片描述
下面运行代码,在观察窗口中查看数组。
在这里插入图片描述
可以看到数组的起始地址为0x20003000,和刚才设置的一样。

第二种方法
直接在代码中设置数组位置

#define DATA_ADDR 0x20002000
__root  uint8_t buf2[12] @ (DATA_ADDR);   

使用宏定义指定数组位置,当然也可以不用宏定义,直接在数组后面写地址。使用这种方法的话,就不需要修改 stm32f103xb_flash.icf 这个文件内容了,直接使用默认的内容就行。
在这里插入图片描述

直接运行程序,观察数组地址
在这里插入图片描述
可以看到buf2数组的起始地址就从0x20002000 开始了。

这里要注意一个问题,如果使用第2种方法的时候,数组大小必须是4的倍数,否则编译会报错。
比如这里将数组大小设置为10
在这里插入图片描述
这时候编译就会报错。
好了,这两种方法就分享到这,如果后面发现了其他新的方法再补充。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/63467.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

共创共建!葡萄城 SpreadJS 完成 HarmonyOS NEXT 操作系统兼容认证

最新技术资源(建议收藏) https://www.grapecity.com.cn/resources/ 近日,华为“企业工作必备应用鸿蒙化论坛”在北京圆满落幕,论坛汇聚了众多行业精英和合作伙伴,聚焦讨论企业数字化转型与原生鸿蒙生态融合等话题。葡萄…

hpe服务器更新阵列卡firmware

背景 操作系统:RHEL7.8 hpe服务器经常出现硬盘断开,阵列卡重启问题,导致系统hang住。只能手动硬重启。 I/O error,dev sda smartpqi 0000:5c:00:0: resettiong scsi 1:1:0:1 smartpqi 0000:5c:00:0: reset of scsi 1:1:0:1:…

websocket的心跳检测和断线重连

心跳检测和断线重连可以通过WebSocket的事件和属性来实现。以下是一个简单的JavaScript示例,使用WebSocket API实现心跳检测和断线重连的功能: let ws;function connectWebSocket() {ws new WebSocket(ws://your-websocket-server-url);ws.onopen fun…

ES6学习Symbol(五)

这里写目录标题 一、概述二、代码 一、概述 ES6引入了一种新的原始数据类型Symbol,表示独一无二的值。 它是 JavaScript 语言的第七种数据类型,前六种是: undefined 、 null 、布尔值(Boolean)、字符串(St…

Spark-Streaming容错语义

一、背景 为了理解Spark Streaming提供的语义,我们先回顾西Spark RDD的基本容错语义学。 RDD是一个不可变的、确定性可重新计算的分布式数据集。每个RDD都记住在容错输入数据集上用于创建它的确定性操作的沿袭。如果RDD的任何分区由于工作节点故障而丢失&#xff…

AmpliconSuite-pipeline

AmpliconSuite-pipeline: 多线程支持的端到端工具,用于从配对端全基因组测序数据分析局部拷贝数扩增(如ecDNA或BFB) AmpliconSuite-pipeline 是一个多线程支持的端到端工具,用于 AmpliconArchitect 和 AmpliconClassifier,以支持从配对端全基因组测序数据分析局部拷贝数扩…

QNX通过pfctl工具查看socket通信状态

通过pfctl -si && pfctl -ss可以查看当前主机IP和外域IP之间的所有socket通信状态,显示的格式是 传输层协议 | 主机IP | 外域IP | 主机端状态:外域状态 ------------------------------------------------------------------------…

Windows安全中心(病毒和威胁防护)的注册

文章目录 Windows安全中心(病毒和威胁防护)的注册1. 简介2. WSC注册初探3. WSC注册原理分析4. 关于AMPPL5. 参考 Windows安全中心(病毒和威胁防护)的注册 本文我们来分析一下Windows安全中心(Windows Security Center…

JSX和vue模版哪个更好?

JSX和Vue模板各有优缺点,选择哪种取决于具体需求和个人偏好。‌ JSX的优点 ‌灵活性‌:JSX允许在JavaScript代码中直接插入任意表达式,这使得它在处理复杂逻辑时更加灵活。例如,条件渲染和循环渲染可以通过JavaScript的标准语法…

[代码随想录21回溯]组合问题,电话号码的字母组合问题

前言 回溯的提出是解决循环问题,回溯的提出就是为了解决排列和组合问题,以及多层遍历问题,因为如果遍历的层数越多我们的效率就会越低,回溯加上剪枝能很好解决这个问题。 题目链接 77. 组合 - 力扣(LeetCode&#xff…

智能工厂的设计软件 三种处理单元(NPU/GPU/CPU)及其在深度学习框架中的作用 之2

本文要点 分类学 利用NPU、GPU和CPU的分工协作,实现 一个信息系统架构中的灵活的模块化框架,该框架使用一个类似元素周期表的分类法,将 该元素周期表 左边的行矢(时间关系,由应用规格 约束) 、顶上的列簇…

几款主流的超声波流量计应用场景梳理

清水应用 这款 声乐 在含有最少固体或曝气(≤ 1-2%)的清洁水的情况下表现出色。该仪表融合了卓越的性能和经济性,使其成为需要外夹式超声波流量计的应用的理想选择。它在市政水处理设施中特别有效,其精度和成本效益确保了最佳运行…

Flag 验证器

Flag 验证器使用教程 Flag 验证器 是一种常用工具,用来验证命令行参数或配置文件中的标志(flag)是否符合预期规则。这些工具可以帮助开发者确保传入的参数满足一定的条件,避免因参数错误而导致程序运行失败。以下是对各个验证器功…

二进制分析的新兴趋势:塑造安全的移动应用

在当今快速发展的数字世界中,保障移动应用的安全性变得尤为重要。随着移动技术的广泛应用,安全性需求也日益增强。二进制分析作为确保移动应用安全和合规性的重要手段,通过对已编译的应用进行深入分析,能够发现源代码中难以察觉的…

Python:动态粒子爱心

预览 代码结构概述 这段代码使用了 pygame 库来创建一个动态的图形窗口,绘制一个心形图案,并在其中显示闪烁的文本。代码主要分为以下几个部分: 初始化和设置心形曲线的计算粒子类的定义生成粒子文本设置主循环 1. 初始化和设置 import p…

React源码02 - 基础知识 React API 一览

1. JSX到JavaScript的转换 <div id"div" key"key"><span>1</span><span>2</span> </div>React.createElement("div", // 大写开头会当做原生dom标签的字符串&#xff0c;而组件使用大写开头时&#xff0c;这…

使用DynadotAPI购买域名清仓列表中的过期域名

前言 Dynadot是通过ICANN认证的域名注册商&#xff0c;自2002年成立以来&#xff0c;服务于全球108个国家和地区的客户&#xff0c;为数以万计的客户提供简洁&#xff0c;优惠&#xff0c;安全的域名注册以及管理服务。 Dynadot平台操作教程索引&#xff08;包括域名邮箱&…

js分页功能

先声明些全局变量方便我们在下面的代码中使用 //一页有多少条数据 let num 10; //页码 let k 0; //总页数 let divide; // 用来判断显示哪几页的页数 let page_num 0; // 声明一个用于接数据的变量 let datas; // 声明一个用于接数据的变量 let data; //一页有多少条数据 l…

CMake Do‘s and Don‘ts (行为准则)

CMake Dos and Donts {行为准则} 1. General2. Modules3. ProjectsReferences Effective Modern CMake https://gist.github.com/mbinna/c61dbb39bca0e4fb7d1f73b0d66a4fd1 Do’s and Don’ts https://cliutils.gitlab.io/modern-cmake/chapters/intro/dodonot.html dos and …

验证的分类及相关工具

目录 1.验证方法的分类1.1动态验证1.2.静态验证 2.动态验证及相关工具2.1.电路级仿真工具2.2.逻辑仿真工具 3.静态验证及相关工具3.1 形式验证工具3.2 静态时序分析工具 SOC设计中验证包含以下几个方面&#xff1a; 验证原始描述的正确性验证设计的逻辑功能是否符合设计规范的要…