Dialog BLE 学习之 修改分散加载文件 (2)
最近搞Dialog的BLE SDK,发现空间不够了,询问原厂,得知可以通过调整分散加载文件而增加空间,一方面是有42KB+8KB的硬件基础,另一方面是原有的程序限制为38KB+8KB。故顺便学习了下把一个程序存放在不同的存储空间的问题。
简单的单片机是不用了解程序分散加载机制的,至少我搞了四五年(加上大学三年哈)没有碰到要特别需要了解的,空间不够换更大容量的单片机嘛。期间仅仅是听说过而已。还听说过搞能够跑Linux的开发板裸奔的时候需要了解下,因为程序比较大,为了兼顾性能,需要把程序分别存放在NAND Flash、NOR Flash、SDRAM等。
1、知识普及,怎么解读分散加载文件
分散加载,当然是把一个整体分成几个部分,放在不同的位置。怎么分割呢?可以按照RO、RW、ZI属性区分,还可以自定义代码属性,然后根据自定义属性划分。这个在后面介绍怎么自定义代码属性。
我可以按照代码属性随便放几个位置就可以嘛?有什么放置依据嘛?如果空间够大,CPU取指令速度差不多或没要求,可以随便放。当然,怎么放也是有一些规则的。比如RO属性的代码,放在ROM里,CPU只是读出来而已,比如RW和ZI属性的CPU要频繁的读写,可以放在RAM里,甚至是CPU的寄存器里,可以提高CPU的处理速度。对!这些规则的目的只有一个:怎么提高CPU的效率!
分散加载文件的语法规则:
(加载取名称) (基地址) (属性) (大小)
{
(执行区名称) (基地址) (属性) (大小)
{
;放置某种属性的代码
;放置某种属性的代码
;。。。。。。
}
。。。。。。
}
。。。。。。
其中(属性)是可选的,加载区的基地址跟第一个执行区的基地址必须是相同的。
2、抛砖引玉,DA14580的程序空间划分
LR_IROM5 (0x20000440) (0x8BE0) ;定义了名称为LR_IROM5的加载域,起始地址为0x20000440,大小为0x8BE0,接近35KB
{ ;
ER_IROM5 (0x20000440) (0x8BC0) ;定义了名称为ER_IROM5的执行域,此域为LR_IROM5的第一个执行域,起始地址跟
{ ;LR_IROM5的起始地址一样,大小为0x8BC0
*(InRoot$$Sections) ;*为通配符,放置位于根区的所有库的部分如__main.o、__scatter*.o等
boot_vectors.o (+RO) ;放置boot_vectors.o中的RO属性代码
system_ARMCM0.o (+RO) ;
.ANY (+RO) ;放置所有的RO属性的代码
} ;
RW_IRAM52 (0x20009000) EMPTY 0x20 {} ;RMPTY为属性字段,这里表示空0x20这么多空间
} LR_IROM7 (0x20009020) (0x17E0) ;
{ ;
ER_IROM7 (0x20009020)(0x11E0-NON_RET_HEAP_SIZE) ;
{ ;
.ANY(+RW) ;放置所有的RW属性的代码
} ;
RW_IRAM72 (0x2000A200 - NON_RET_HEAP_SIZE) UNINIT NON_RET_HEAP_SIZE ;
{ ;
jump_table.o (heap_mem_area_not_ret) ;放置jump_table.o中的heap_mem_area_not_ret属性的代码
} ;
RW_IRAM73 (0x2000A200) UNINIT 0x600 ;未初始化的0x600空间
{ ;
.ANY (STACK) ;作为栈使用
}
}
3、追根溯源,遇到的问题以及原因分析
先贴张编译失败的图片:
no space in execution regions with .ANY selector matching ****
还有那种 ****(执行域名称) 缺少多少字节的编译错误
以上都是某个执行域分配的空间不够的问题,解决的关键是,先找到是哪个执行域空间不够,再想办法扩大,或者把这个执行域内的某个属性的代码放到其他执行域内。
这个是程序编译没问题,但是调试运行,根本进不了main(),就进入硬件中断了。其堆栈信息如上图。说明是初始化变量时,空间不够,解决办法一样,扩大那个执行域,或把那个执行域内一个或几个属性的代码放到其他执行域内。
4、码随心动,自由安排代码位置
根据以上学习,是否学会了自己编写分散加载文件了呢?
Dialog BLE 学习之 修改分散加载文件 (2)的更多相关文章
- KEIL下分散加载文件的使用(zt)
KEIL下分散加载文件的使用 对于分散加载的概念,在<ARM体系结构与编程>书中第11章有明确介绍. 分散加载文件(即scatter file 后缀为.scf)是一个文本文件,通过编写 ...
- 未能加载文件或程序集“MySql.Web.v20, Version=6.9.4.0, Culture=neutral, PublicKeyToken=c5687fc88969c44d”或它的某一个依赖项。系统找不到指定的文件
未能加载文件或程序集“MySql.Web.v20, Version=6.9.4.0, Culture=neutral, PublicKeyToken=c5687fc88969c44d”或它的某一个依赖 ...
- WebService未能加载文件或程序集“ESRI.ArcGIS.XXX”或它的某一个依赖项
开发环境:Windows7旗舰版64bit.VisualStudio2008 With SP1.ArcEngine10.0.NetFrameWork4.0.IIS7和C#开发语言. 编写ArcEngi ...
- asp.net程序集冲突解决笔记(未能加载文件或程序集"XXXXXXXXX")
先来看张截图.(未能加载文件或程序集”System.Web.Razor“) 先说一下我的情况.(扯蛋的,解决方法还在下面 —> _ < ) 这是 ASP.NET MVC 的东西.老大写了一 ...
- membership 启用 roleManager 抛出异常:未能加载文件或程序集MySql.Web
在vs2013中新建一个ASP.NET MVC 4 WEB 应用程序,使用“基本”模板.web.config中默认使用forms认证方式,并添加了membership的配置. <roleMana ...
- 未能加载文件或程序集“DeveloperKit10.1/DotNet/ESRI.ArcGIS.ADF.Local.或它的某一个依赖项
使用VS2010进行ArcGIS Engine 10.1进行开发过程中,出现: 错误 1 未能加载文件或程序集“file:///D:/ArcGIS/DeveloperKit10.0/DotNet/ES ...
- 未能加载文件或程序集“Oracle.Web, Version=2.112.1.0, Culture=neutral, PublicKeyToken=89b483f429c47342”或它的某一个依赖项
当前系统环境描述: Win7x64+VS2012+IIS7 当前情况描述: 发布Web服务,在浏览的时候出现以下问题:未能加载文件或程序集“Oracle.Web, Version=2.112.1.0, ...
- 未能加载文件或程序集“XXXXXX”或它的某一个依赖项。试图加载格式不正确的程序。
在本机WIN7机器上的WebService部署到Win2008R2上发现错误 “/”应用程序中的服务器错误. 未能加载文件或程序集“XXXXXX”或它的某一个依赖项.试图加载格式不正确的程序. 说明: ...
- 未能加载文件或程序集“Oracle.DataAccess, Version=2.112.1.0, Culture=neutral, PublicKeyToken=89b483f429c47342"
转载自原文 未能加载文件或程序集"Oracle.DataAccess, Version=2.112.1.0,..." 若本机的Oracle版本是32位系统,则在调用Oracle数据 ...
随机推荐
- BZOJ4245: [ONTAK2015]OR-XOR(前缀和)
题意 题目链接 Sol 又是一道非常interesting的题目 很显然要按位考虑 因为最终答案是xor之后or,所以分开之后之后这样位上1的数量是一定是偶数,否则直接加到答案里面 同时,这里面有些部 ...
- Smile with face. Smile with mind.
Smile with face. Smile with mind.微笑不仅是挂在脸上的,更是发自心底的.
- 使用跨平台图表控件TeeChart如何从DAT或TEXT文件中导入数据
大多数开发人员在使用TeeChart进行开发的时候,都需要访问包含在文本文档中的一些数据,本次教程将详细讲解如何去实现这一步骤. 文本文件通常包含使用空格键或者是TAB键分隔开的数字和文字: TeeC ...
- 2017年10月31日结束Outlook 2007与Office 365的连接
2017 年10月31日 ,微软即将推出 Office 365中Exchange Online邮箱将需要Outlook for Windows的连接,即通过HTTP Over MAPI方式,传统使用R ...
- Spring Cloud入门程序
本文手把手教你,做出第一个Spring Cloud程序,Eureka的简单入门使用 1.创建Spring Starter Project工程 点击next,添加项目名 2.引入Spring Cloud ...
- 动软代码生成器,主子表增加的时候子表的parentID无法插入问题解决方案
StringBuilder strSql=new StringBuilder(); strSql.Append("insert into HT_XunJiaMain("); str ...
- JavaScript 闭包的详细分享(三种创建方式)(附小实例)
JavaScript闭包的详细理解 一.原理:闭包函数--指有权访问私有函数里面的变量和对象还有方法等:通俗的讲就是突破私有函数的作用域,让函数外面能够使用函数里面的变量及方法. 1.第一种创建方式 ...
- windows server 安装之后需要做的操作
一.运行windows update安装更新 提示: 若一直停留在“正在检查更新”,请参考https://answers.microsoft.com/zh-hans/windows/forum/win ...
- php session小节
1.为什么要用session? 在人们访问网站的时候,有很多个网页,由于http自身的特点,用户每执行一个脚本都需要和web服务器重新建立连接.由于他们之间是无状态的,这次的连接无法得到上次连接的状态 ...
- java运行顺序-JVM之九
简化顺序版本是: 父类的静态成员赋值和静态块,代码排版先后顺序执行,只运行一次 子类的静态成员赋值和静态块,代码排版先后顺序执行,只运行一次 父类代码块 父类构造方法 子类初始化块 子类构造方法 再次 ...