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数据 ...
随机推荐
- 电路中GND和GROUND、VCC,VDD,VEE,VSS
电路解析:GND和GROUND.VCC,VDD,VEE,VSS 参考: http://www.elecfans.com/dianzichangshi/20160822432514.html 一.解释版 ...
- Oracle 数据库自动备份方案
1.新建 backup.bat脚本 @echo off echo ================================================ echo Windows环境下Ora ...
- Spring Boot入门程序
创建第一个Spring Boot的入门程序. 带你一步一步的,搭建第一个Spring Boot 的入门程序,并成功运行,通过实践过程,初步认识和了解如何使用Spring Boot 创建应用程序. 一. ...
- Spark job执行流程消息图
Spark job执行流程消息图 1.介绍
- 如何将centos7自带的firewall防火墙更换为iptables防火墙
用惯了centos6的iptables防火墙,对firewall太无感了,那么如何改回原来熟悉的iptables防火墙呢? 1.关闭firewall防火墙 [root@centos7 html]# s ...
- 洛谷 P1849 [USACO12MAR]拖拉机Tractor
题目描述 After a long day of work, Farmer John completely forgot that he left his tractor in the middle ...
- 如何在 ubuntu linux 一行中执行多条指令
cd /my_folder rm *.jar svn co path to repo mvn compile package install 使用&& 运算符连接指令 cd /my_f ...
- Vim-命令合集
命令历史 以:和/开头的命令都有历史纪录,可以首先键入:或/然后按上下箭头来选择某个历史命令. 启动vim 在命令行窗口中输入以下命令即可 vim 直接启动vim vim filename 打开vim ...
- 谷歌浏览器模拟手机浏览器且指定IP运行
1.背景 因为现在项目是要做分布式,而以前使用谷歌浏览器模拟手机运行做的分布式,是指定在某台机器运行是通过Jenkins配置,来指定服务器,但是这样有一个问题,如果大家都同时配置到某台电脑,那台服务器 ...
- POJ-2151 Check the difficulty of problems---概率DP好题
题目链接: https://vjudge.net/problem/POJ-2151 题目大意: ACM比赛中,共M道题,T个队,pij表示第i队解出第j题的概率 问 每队至少解出一题且冠军队至少解出N ...