IAR编译错误

2023-11-09

1 错误提示:

Error[e104]: Failed to fit all segments into specified ranges. Problem discovered in segment XDATA_N. Unable to place 2 block(s) (0xc02 byte(s) total) in 0xbdf byte(s) of memory. The problem occurred while processing the segment placement command "-P(XDATA)XDATA_N=_XDATA_START-_XDATA_END", where at the moment of placement the available memory ranges were "XDATA:1321-1eff"

cc2540有8K的XDATA,我们定义一些数组时可能超过可它的大小,编译器就会报错。

解决方案:减小堆的大小空间。(堆太小可能会导致有些功能缺陷,所以要找一个最适合程序的值)

修改方式:在预编译选项里面(c/c++ compiler)中的INT_HEAP_LEN,TI默认值是3072,可以修改为为1000.

参考出处:

http://www.deyisupport.com/question_answer/wireless_connectivity/f/45/t/16467.aspx


2 错误提示:

Fatal Error[e72]: Segment IMAGE_HEADER must be defined in a segment definition option (-Z, -b or -P)

查看文件的路径中是否有中文,有的话,最好改路径选项。


3 错误提示:

Error[e104]: Failed to fit all segments into specified ranges. Problem discovered in segment BANKED_CODE. Unable to place 78 block(s) (0x1e36a byte(s) total) in 0x1b408 byte(s) of memory. The problem occurred while processing the segment placement command "-P(CODE)BANKED_CODE=_CODE_BEG-_CODE_END,_BANK4_BEG-_BANK4_END,_BANK5_BEG-_BANK5_END,_BANK6_BEG-_BANK6_END,_BANK7_BEG-_BANK7_END", where at the moment of placement the available memory ranges were "CODE:30f0-3ff7,CODE:4b000-4ffff,CODE:591c2-591c3,CODE:59302-5ffff,CODE:68000-6ffff,CODE:78000-7e7ff"

说明:cc2540 XDATA内存不足


一般就需要优化代码,减少冗余数组

解决办法:

在预编译里面有一个INT_HEAP_LEN属性,默认的值为3027,将他改小到1000或者更小,这个问题就可以解决。

 

###############################################################################

为什么会这样子呢?我们可以来分析一下。

 

首先,我们得了解CC2540的存储器的情况。

 

CC2540里的四种存储空间(结构上划分的存储空间,并不是实际的存储器,是一种理论上的概念)
     
 1.  CODE   程序存储器   用处存放程序代码和一些常量
           
16根地址总线,所以CODE的寻址范围是 0000H~FFFFH64KB

    
  2.  DATA   数据存储器   用于存放程序运行过程中的数据
           
8根地址总线,所以DATA的寻址空间为 00H~FFH256 byte.128位可以直接寻址,高128位只能间接寻址。

      
3.  XDATA  外部数据存储器(只能间接寻址,访问速度比较慢) DMA是在XDATA上寻址的,这一点很重要
           
16根地址总线,所以 XDATA的寻址空间为 0000H ~ FFFFH64K

      
4.  SFR  特殊功能寄存器  就是那些T1CTL, EA, P0等配置寄存器存储的地方128K。因为CC2530的配置寄存器比较多,所以一些多余的寄存器就放到了XREG 里面。XREG的大小为1K XREG的访问速度比 SFR慢。

 


从图中可以看出,XDATA中包含了所有存储器的映射,包括256kbFLASH存储器,8KSRAM存储器,还有 SFR , XREG, INFORMATION FAGE。这里看出来,其实CC2530DATA, XDATA,都是用SRAM作为物理存储媒介的,但是它们的寻址方式不一样,所以访问DATA,比访问XDATA要快。至于SFR,XREG,INFORMATION PAGE,我不知道它们用了什么物理存储媒介,但是它们都被映射到XDATA上,可以被DMA访问。

这里要搞清楚一个概念,映射到XDATA上,不代表就只能用XDATA的寻址方式访问。比如SFR,它虽然被映射到了XDATA上,只能说明,DMA可以通过访问XDATA来操作SFR,但是CPU还是可以通过单周期访问SRF.打个比方,我们平时坐的公交车上都有一把逃生应急锤,在紧急情况下可以敲破窗子逃生。我们平时不会使用锤子敲碎窗子进出车厢,我们平时有车门可以走。但是在特殊情况下(比如DMA要操作某个存储器中的数据时),我们可以用特殊的方法(从XDATA上的映射来得到我们想要的数据)。

*************************************************************************

虽然上面说了这么多,其实我们只需要了解到:DATAXDATA存在SRAM上,而CODE存在Flash上就可以了。哪一段的代码溢出我们就处理哪一段。CC2540256KBFlash8KBSRAM

 

我们在Output文件夹的.map文件中的最后可以看到

166 159 bytes of CODE  memory

      26 bytes of DATA  memory (+ 81 absolute )

   6 396 bytes of XDATA memory

     192 bytes of IDATA memory

       8 bits  of BIT   memory

   4 478 bytes of CONST memory

也就是我们比较关心的DATA+XDATA所占的内存不能SRAM8KB,这就是我们处理问题的关键。那么,我们知道DATA是用于存放程序运行过程中的数据。XDATA中包括堆的定义,也就是堆数组包括在XDATA

**********************************************************************

那么我们把INT_HEAP_LEN的值改小以后,程序有什么影响呢?

正如前面所说的INT_HEAP_LEN位于XDATA,它是一个堆,是为了动态内存分配的,BLE协议栈使用动态分配了几个功能,主要用于执行加密和存储安全密钥。如果你减少INT_HEAP_LEN的值太多,加密就会失败。现在设想一个主机可以可以用加密的方式同时连接到三个从机。这里的堆大小就需要特别大,如果没有充足的空间,程序将无法执行。但是如果INT_HEAP_LEN值改的太大,又影响了运行中的数据处理。所以一个合适的INT_HEAP_LEN值,是比较难找的。

Heap size is reserved for dynamic memory allocation in the stack. Reduced

heap size may reduce the performance and may reject packets in the heavily

loaded system especially for Coordinator. 1K heap would be enough for some

small demo i.e. LIGHT – SWITCH demo, it depends on the application and how

much data to send.

 

*************************************************************************

那么为什么我们把INT_HEAP_LEN的值改小以后,程序就能正常执行了呢?

OSAL_Memory.c中我们找到了

{

static __no_init osalMemHdr_t theHeap[MAXMEMHEAP / OSALMEM_HDRSZ];

}

其中MAXMEMHEAP的定义,我们在Onboard.h中可以找到

{

// Memory Allocation Heap

#if defined( EXTERNAL_RAM )

  #define MAXMEMHEAP EXT_RAM_LEN   // Typically, 32K

#else

  #define MAXMEMHEAP INT_HEAP_LEN  // Typically, 0.70-1.50K

#endif

}

 

上面的代码就是定义了一个堆,大小为(MAXMEMHEAP / OSALMEM_HDRSZ)

 

所以,INT_HEAP_LEN的大小就决定了整个堆的大小,我们可以适当的减小INT_HEAP_LEN的值来达到减少程序大小的目的。


参考:

Referencehttp://e2e.ti.com/support/low_power_rf/f/538/t/95098.aspx

http://blog.sina.com.cn/s/blog_4c8287230100d5hx.html

http://e2e.ti.com/support/low_power_rf/f/538/t/163680.aspx

http://www.deyisupport.com/question_answer/analog/wireless_connectivity/f/45/t/16467.aspx

http://blog.csdn.net/bailyzheng/article/details/7541422






本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

IAR编译错误 的相关文章

  • Python3中常用模块-sys模块

    目录 1 获取模块文档 1 1 使用sys doc 查看方法说明 1 2 使用dir函数获取模块中的所有属性和方法 1 3 使用help函数查看某个函数 2 模块常用方法 3 解析命令行参数 sys模块和os模块是Python系统相关工具集
  • git分支管理

    Create the branch on your local machine and switch in this branch git checkout b name of your new branch Push the branch
  • python 把数字写入文件

    初学python 还不是很了解 其实只要用str 将数字包住即可 如下 file write str 12
  • Apache CXF 在 WebLogic 9.2 上的问题定位分析及权宜之计

    Apache CXF 在 WebLogic 9 2 上的问题定位分析及权宜之计 本文关键词 技术 WebLogic Apache 中间件 http yulimin javaeye com blog 129015 同样的程序在 Tomcat
  • Ubuntu 安装配置Samba服务器

    一 描述 Samba文件服务器可以在网络上实现不同操作系统的文件共享 它可以让你从笔记本电脑访问你的桌面文件 并与Windows和macOS用户共享文件 Samba是通过Network LAN 局域网来实现的 二 安装 要安装Samba 我
  • 架构是什么

    是什么 架构是什么 众说纷纭 架构 Architecture 一词最早源自建筑学术语 后来才被计算机科学领域借用 以下是其在维基百科 Wikipedia 中的定义 架构是规划 设计和构建建筑及其物理结构的过程与产物 在计算机工程中 架构是描
  • 苏嵌嵌入式Linux实训 第2天

    今天是嵌入式学习的第二天 也是正式教学开始的第一天 全程由梁老师为我们讲解 由于仅仅是新手的接触 不懂的地方还有很多 有时甚至跟不上老师的节奏 当然这也需要我们课后的复习和总结 不断积累才能不断收获 1 课程内容 今天的课程主要是对嵌入式开
  • 删除当前目录下所有.py[cdo]文件的命令

    rm f py 命令会删除当前目录下所有的 py 文件 但不会删除包含这些文件的目录 这个命令并没有错误 但是如果你只希望删除当前目录下的 py 文件而不包括子目录中的文件 你可以使用 rm f py cdo 在解释这个命令之前 首先来了解
  • Ubuntu 下安装 QQ

    安装流程 一 QQ Linux版本下载 二 安装 一 QQ Linux版本下载 1 使用以下指令查看自己的 Ubuntu 版本的类型 uname a 可查看到我的 Ubuntu 版本为 x86 64的版本 因此可以点击此处链接前往 QQ 官
  • Springboot + MySQL+ JPA II save方法详解

    JPA没有专门的update接口 save接口同时支持update操作 一 save 单条添加 Service层中添加save方法 save是三方件自带接口不需要再dao层中添加 Transactional public User save
  • Java:继承和多态

    继承 什么是继承以及为什么需要继承 继承机制 是面向对象程序设计是代码实现复用中至关重要的一步 它允许程序在保持原有类的特性的基础上来进行扩充 增加新功能等 总的来说 继承就是将不同类之间的共性进行抽取 抽取出来的这些共同的特性就可以单独写
  • Jupyter Notebook工具中ndarry数组的使用(一)

    今天学习了jupyter notebook工具中ndarray数组的使用 具体包括 第一步 导入numpy包 import numpy as np 第二步 创建ndarray数组 通过numpy模块中的常用的几个函数进行创建ndarray多
  • 月薪过万的Java面试

    写了一个月 篇幅太长了 都写不下了 被逼无奈 只能拆分 面试题 HashMap底层实现原理 红黑树 B 树 B树的结构原理 volatile关键字 CAS 比较与交换 实现原理 答案 理论 第一章 HashMap底层实现原理 红黑树 B 树
  • JAVA图片压缩

    图片压缩代码操作 需要压缩的原图片路径为 src 压缩后存放的路径为 dist 需要压缩的宽度为 width 需要压缩的后的高度为 height File srcfile new File src 原图片是否存在 if srcfile ex
  • python几个轻量级web框架

    我最近发表了一篇名为 7 Minimal Node js Web Frameworks for 2014 and Beyond 的博文 目前它是我博客访问量最高的文章 超过10000人浏览 分享和评论了这些我总结到一起的web框架 这教会了
  • 金晟富:4.17黄金冲高遇阻急需调整!后市黄金原油操作建议

    前言导读 各位投资朋友 转眼间又到周末了 祝大家周末愉快 此刻的你还在到处看文章找策略吗 不知晟富每日及时给到你的现价单你关注了多少呢 每天的多空是否让你犹豫再犹豫 一单损完又害怕下一单 如果你还在迷茫犹豫的道路上 不妨可留意下金晟富的文章
  • simulink中PID控制器搭建

    Simulink 是一个用于仿真 建模和仿真的软件工具 您可以在其中搭建 PID 控制器 以下是如何搭建一个简单的 PID 控制器的步骤 启动 Simulink 打开一个新模型 在模型窗口中插入一个 PID 控制器 模块 可以在 Simul
  • STM32 电机教程 1 - 用ST Motor Profiler 测量无刷电机参数

    前言 在对电机进行控制前 往往需要先知道电机的一些参数 但是在实际应用过程中 经常会出现在控制一个电机参 但对电机的参数如相电阻电感的参数不够了解的情况 本节给大家演示基本ST Motor Profiler测量电机参数的操作过程 让大家在以
  • Spring Cloud 与 Dubbo 区别

    1 定位点不同 SpringCloud SpirngCloud 定位为微服务架构下的一站式解决方案 Dubbo 关注点主要在于服务的调用 流量分发 流量监控和熔断 2 dubbo基于rpc 底层netty SpirngCloud基于http

随机推荐

  • 【点云处理之论文狂读前沿版7】—— Masked Autoencoders for Point Cloud Self-supervised Learning

    Masked Autoencoders for Point Cloud Self supervised Learning 摘要 1 引言 3 Point MAE 3 1 Point Cloud Masking and Embedding 3
  • Docker专题(八)-Docker-Docker部署SpringBoot项目

    1 手工方式 1 1 准备Springboot jar项目 将项目打包成jar 1 2 编写Dockerfile FROM java 8 VOLUME tmp ADD elk web 1 0 SNAPSHOT jar elk jar EXP
  • PhpStorm最全攻略

    本教程主要内容的是日常开发 测试 部署工作流的一些技巧和工具配置方法 并尽量将最有用的部分提取出来并结合实际场景做介绍 而并不是仅仅对PhpStorm的功能的简单罗列 如果读者有改善的建议 可以在教程下方留言或直接与作者联系 共同促进内容的
  • 工具:npm/node版本更换(Windows版本) 含报错exit status 1报错,出现乱码的解决方法

    npm版本更换 更换指定版本 npm g install npm 6 14 11 更换最新版本 npm install g npm node版本更换 方法1 下载nvm https www runoob com w3cnote nvm ma
  • 腾讯业务百万数据 6s 响应,APIJSON 性能优化背后的故事

    最近发生了一件大事儿 APIJSON 再也不用担心被人质疑性能问题了哈哈 某周三腾讯 CSIG 某项目组 已经用 APIJSON 做完一期 突然反馈了查询大量数据性能急剧下降的情况 某张表 2 3KW 记录 用 APIJSON 万能通用接口
  • 【数据库-4】clinvar

    欢迎关注公众号 oddxix 如果觉得写的不错记得点个赞哦 留步看一下这个讲解视频吧 https v qq com x page m03789y9j98 html 搭配这个pdf食用更佳哦 https www clinicalgenome
  • 动态规划的实践

    一 动态规划要解决的问题 动态规划问题的一般形式就是求最值 动态规划其实是运筹学的一种最优化方法 只不过在计算机问题上应用比较多 比如说让你求最长递增子序列 背包问题呀等 只要我们发现某一过程包含多种状态 情况 后一种状态的生成依赖于前面的
  • 七天LLVM零基础入门(Linux版本)------第四天

    作者 snsn1984 第一步 复习 第三天的时候 我们学习了LLVM的编程指引 在开始第四天的学习之前 需要复习之前学习过的两篇文档 LLVM IR的文档 http llvm org docs LangRef html 编程指引文档 ht
  • 使用spyder3调试python程序的简明教程

    说是简明教程 其实是我自己尝试用spyder调试python程序的过程的一个记录 因为spyder的调试功能是基于pdb 而我又没有pdb的基础 所以刚开始上手时感觉很不习惯 而且那时我又很懒 没去找官方文档 仅仅在百度和csdn上找了找
  • 腾讯云被ddos攻击解决方案

    腾讯云是国内仅此次阿里云的云服务商 很多创业者都使用他们家云服务器 自然被DDOS攻击的也不少 今天来介绍下使用腾讯云服务器被DDOS攻击的解决办法 一 购买腾讯高防IP 也称腾讯大禹BGP高防IP 是一个运行在腾讯云内网的高防IP服务 适
  • nginx (1):ubuntu下安装启动nginx

    1 安装依赖 sudo apt get install gcc zlib1g dev libpcre3 libpcre3 dev libssl dev 2 下载nginx wget https nginx org download ngin
  • 【vue 页面下滚到目标元素的位置,目标元素自动吸顶(自动悬浮吸附到页面顶部)】

    vue 页面下滚到目标元素的位置 目标元素自动吸顶 自动悬浮吸附到页面顶部 原文链接 https blog csdn net weixin 41192489 article details 112320596 1 监听页面滚动事件 监听页面
  • xxl-job(2.4.1)使用spring-mvc替换netty的功能

    xxl job 2 4 1 使用spring mvc替换netty的功能 1 xxl job core引入spring mvc的依赖
  • APP自动化测试-11.webview技术原理

    APP自动化测试 11 webview技术原理 文章目录 APP自动化测试 11 webview技术原理 前言 一 获取webview 二 根据webview启动chromedriver 总结 前言 根据日志 简单记录webview运行的机
  • Caffe 源码阅读笔记 [基本模块] Syncedmem & Blob

    syncedmem syncedmem管理一段大小为size的内存 这段内存可以从GPU或者主机内存分配 syncedmem负责GPU和主机内存之间的同步 如果数据是在GPU里而要从主机内存取出 syncedmem会先把数据从GPU内存me
  • 服务器怎么设置无线网络共享,无线路由器怎么设置usb网络共享管理

    众所周知 路由器长久以来一直是计算机网络的核心设备 其重要性不可低估 那么你知道无线路由器怎么设置usb网络共享管理吗 下面是学习啦小编整理的一些关于无线路由器设置usb网络共享管理的相关资料 供你参考 无线路由器设置usb网络共享管理的方
  • 实现一个简单的二叉树

    实现一个简单的二叉树 语言 Objective C 整体上还是挺简单的 所以就直接上代码了 1 二叉树 由 节点 和 枝干 组成 且每个节点最多只有两个子节点的树形数据结构 2 代码实现 2 1 节点类 创建一个简单的节点类 这个类可以保存
  • Chatopera王海良:大厂螺丝钉还是开源极客?年轻技术人如何选择?

    他因为追求创新毅然放弃了大厂稳定的工作 参与开源并成立了开源商业公司 他相信 开源可以极大地助力开发者成长 那么 对于年轻开发者而言 如何通过参与开源实现跳跃式发展 本期 开源访谈录 邀请到了Chatopera CEO王海良来分享他的见解
  • 手把手教会你用Python爬虫爬取网页数据!!

    其实在当今社会 网络上充斥着大量有用的数据 我们只需要耐心的观察 再加上一些技术手段 就可以获取到大量的有价值数据 这里的 技术手段 就是网络爬虫 今天就给大家分享一篇爬虫基础知识和入门教程 什么是爬虫 爬虫就是自动获取网页内容的程序 例如
  • IAR编译错误

    1 错误提示 Error e104 Failed to fit all segments into specified ranges Problem discovered in segment XDATA N Unable to place