首页
论坛
电子技术基础
模拟技术
可编程器件
嵌入式系统与MCU
工程师职场
最新帖子
问答
版主申请
每月抽奖
商城免费换礼
社区有奖活动
博客
下载
评测
视频
文库
芯语
资源
2025泰克杭州测试论坛
2025中国低空经济产业创新发展大会
【直播】芯片设计工艺仿真全解析
西门子数字化工业软件资源中心
嵌入式设计资源库
智能楼宇/家电控制应用全解析
在线研讨会
EE直播间
小测验
白皮书
行业及技术活动
杂志免费订阅
免费在线工具
厂商资源中心
论坛
博文
电子工程专辑
电子技术设计
国际电子商情
资料
白皮书
研讨会
芯语
文库
登录|注册
登录
用户478850
修改
文章:
8
阅读:
32054
评论:
4
赞:
33
好友
私信
个人主页
文章
8
原创
0
阅读
32054
评论
4
赞
33
原创
使用ADS1.2进行嵌入式软件开发(上)(来自ARM公司)
2006-12-7 15:02
3662
4
5
分类:
MCU/ 嵌入式
使用ADS1.2进行嵌入式软件开发(上)
作者:ARM公司 来源:eepw.com.cn
概述
嵌入式应用程序通常都是在样机环境下调试与开发的,这种环境与最终产品之间并不完全相同。因此,在系统调试阶段就考虑应用程序在最终目标硬件中的运行情况是非常重要的。
本文旨在讨论如何将一个开发/调试环境下的嵌入式应用程序转移到最终独立运行的目标系统中去,并提到了ARM ADS1.2开发工具包的一些功能特性及其在这个过程中所起到的作用。
使用ADS开发嵌入式程序时,需要着重考虑以下几个问题:
1.与硬件相关的C语言库函数的使用;
2.某些C语言库函数使用了调试环境中的资源,要把这些使用的资源重定向到目标系统中的硬件上来;
3.可执行映象文件的存储器映射必须根据目标硬件的存储器分布进行裁剪;
4.在主程序执行前,嵌入式应用程序必须先完成系统的初始化。一个完整的初始化包括用户的启动执行代码和ADS中C库函数的初始化过程。
图1 Semihosting的实现举例
图2 C语言库函数结构
图3 缺省的存储器映射
图4 连接器布局规则
缺省的工程项目设置
刚开始一个嵌入式应用软件开发时,ADS用户可能并不完全清楚目标硬件的一些参数指标。比如有关外设、存储器地址分布,甚至处理器类型等一些细节,可能还没有最终确定。为了在所有这些细节全部就绪前就能进行软件开发,ADS工具有一套程序构建和调试的缺省设置。了解这套缺省的工程项目设置方法,对于掌握最终的移植步骤非常有好处。
ADS1.2C语言函数库
Semihosting
在ADS的C语言函数库中,某些ANSIC的功能是由主机的调试环境来提供的,这套机制有一个专门术语叫Semihosting。Semihosting通过一组软件中断(SWI)指令来实现。如图1所示,当一个Semihosting软中断被执行时,调试系统先识别这个SWI请求,然后挂起正在运行的程序,调用Semihosting的服务,完成后再恢复原来的程序执行。因此,主机执行的任务对于程序来说是透明的。
C语言库函数结构
从概念上来讲,C语言库函数可以被分成两部分,一是ANSIC语言规范本身的一部分,一是只受某一特定ANSIC层次支持的函数,如图2所示。
其中一些ANSIC的功能是由主机调试环境调用驱动程序级的函数完成的。例如,ADS的库函数printf()把输出信息输出到调试器的控制台窗口,这个功能通过调用__sys_write()实现,__sys_write()执行了一个把字符串输出到主机控制台的Semihosting软中断服务程序。
缺省的存储器映射
如果用户在程序编译时没有指定映象的存储器映射分布,ADS将为生成的目标代码和数据分配一个缺省的存储器映射图,如图3所示。
目标印象被连接至地址0x8000,存储和执行区域都位于该地址开始的空间。RO(只读)部分放在前面,接着是RW(读写)部分,最后是ZI(零初始化)部分。
在ZI部分之上紧跟着HEAP,所以HEAP的确切地址要在连接时才能确定。
STACK的基地址是在应用程序启动时由一个Semihosting操作提供。这项Semihosting操作返回的地址值视不同调试环境而定:
ARMulator返回配置文件peripherals.ami中的设置值;缺省为0x08000000。
Multi-ICE返回的是调试器内部变量$top_of_memory的值;缺省为0x00080000。
连接器布局规则
连接器对代码和数据在存储器系统中的分配,遵循一套规则,如图4所示。
映象首先按照属性以RO-RW-ZI的次序进行排列,在同一种属性里面代码先于数据。然后连接器将输入段根据名字的字母顺序进行排列,输入段的名字与汇编代码里面的块名字指示一致(在汇编程序中用AREA关键字)。在输入段中,来自不同对象的代码和数据放置次序与在连接器命令行中指定的对象文件次序一致。
在需要灵活分配代码和数据放置位置的情况下,建议用户不要简单地依靠这些规则。后面会介绍一种如何控制代码和数据布局的机制Scatterloading。
图5 缺省的ADS初始化过程
图6 C库函数重定向
图7 scatter文件语法
图8 分散加载的简单样例
启动应用程序
大多数嵌入式系统在进入应用主程序之前有一个初始化的过程,该过程完成系统的启动和初始化功能。缺省的ADS初始化过程如图5所示。
总体上,初始化过程可以分成两部分来看:
_main负责设置运行映像存储器映射;
_rt_entry负责库函数的初始化。
_main完成代码和数据的复制,并把ZI数据区清零。这一步只有当代码和数据区在存储和运行时处于不同的存储器位置时才有意义。接着_main跳进_rt_entry,进行STACK和HEAP等的初始化。最后_rt_entry跳进应用程序的入口main()。当应用程序执行完时,_rt_entry又将控制权交还给调试器。
函数main()在ADS中有特殊的意义。当一个程序工程项目中存在main()时,连接器会把_main和_rt_entry中的初始化代码连接进来;如果没有main()函数,初始化过程就不会被连接,结果就会导致一些标准的C库函数无效。
根据目标环境裁减C库函数
缺省状态下C库函数利用Semihotsting机制来实现设备驱动的功能。但一个真正的嵌入式系统,要使用到具体的外设或硬件独立于主机环境运行。
C库函数重定向
用户可以定义自己的C语言库函数,连接器在连接时自动使用这些新的功能函数。这个过程叫做重定向C语言库函数,如图6所示。
举例来说,用户有一个I/O设备(如UART)。本来库函数fputc()是把字符输出到调试器控制窗口中去的,但用户把输出设备改成了UART端口,这样一来,所有基于fputc()函数的printf()系列函数输出都被重定向到UART端口上去了。
下面是实现fputc()重定向的一个例子:
externvoidsendchar(char*ch);
intfputc(intch,FILE*f)
{/*e.g.writeacharactertoanUART*/
chartempch=ch;
sendchar(&tempch);
returnch;
}
这个例子简单地将输入字符重新定向到另一个函数sendchar(),sendchar()假定是一个另外定义的串口输出函数。在这里,fputc()就好像目标硬件和标准C库函数之间的一个抽象层。
在C语言库函数中禁用Semihosting
在一个独立的嵌入式应用程序中,应该不存在SemihostingSWI操作。因此,用户必须确定在所有调用到的库函数中没有使用Semihosting。为了保证这一点,在程序中可以引进一个符号关键字_use_no_semihosting:
在C代码中,使用#prgrama #pragmaimport〈_use_no_semihosting_swi〉
在汇编程序中,使用IMPORT
IMPORT_use_no_semihosting_swi
这样,当有使用SWI机制的库函数被连接时,连接器会进行报错:
Error:Symbol_semihosting_swi_guardmultiplydefined
为了确定具体是哪一个函数,连接时打开-verbose选项。这样在结果信息输出时,该库函数上将有一个_I_use_semihosting_swi的标记。
Loadingmembersys_wxit.ofromc_a_un.1.
Definition:_sys_exit
Reference:_I_use_semihosting_swi
用户必须要把这些函数定义成自己的执行内容。
有一点需要注意,连接器只能报告库函数中被调用的Semihosting,对用户自定义函数中使用的Semihosting则不会报错。
根据目标硬件定制存储器映射
分散装载(Scatlerloading)
在实际的嵌入式系统中,ADS提供的缺省存储器映射是不能满足要求的。用户的目标硬件通常有多个存储器设备位于不同的位置,并且这些存储器设备在程序装载和运行时可能还有不同的配置。
Scattertoading可以通过一个文本文件来指定一段代码或数据在加载和运行时在存储器中的不同位置。这个文本文件scatterfile在命令行中由-scatter开关指定,例如:
armlink_scatterscat.scffilel.ofile2.0
在scatterfile中可以为每一个代码或数据区在装载和执行时指定不同的存储区域地址,Scatlertoading的存储区块可以分成二种类型:
装载区:当系统启动或加载时应用程序的存放区。
执行区:系统启动后,应用程序进行执行和数据访问的存储器区域,系统在实时运行时可以有一个或多个执行块。
映像中所有的代码和数据都有一个装载地址和运行地址(二者可能相同也可能不同,视具体情况而定)。在系统启动时,C函数库中的__main初始化代码会执行必要的复制及清零操作,使应用程序的相应代码和数据段从装载状态转入执行状态。
1.scatter文件语法
scatter文件是一个简单的文本文件,包含一些简单的语法。
My_Region0x00000x1000
{
thecontextofregion
}
每个块由一个头标题开始定义,头中至少包含块的名字和起始地址,另外还有最大长度和其他一些属性选项。块定义的内容包括在紧接的一对花括号内,依赖于具体的系统情况。
一个加载块必须至少含有一个执行块;实践中通常有多个执行块。
一个执行块必须至少含有一个代码或数据段;这些通常来自源文件或库函数等的目标文件;通配符号*可以匹配指定属性项中所有没有在文件中定义的余下部分。
2.简单分散加载样例
图8所示样例中,只有一个加载块,包含了所有的代码和数据,起始地址为0。这个加载块一共对应两个执行块。一个包含所有的RO代码和数据,执行地址与装载地址相同;同时另一个起始地址为0x10000的执行块,包含所有的RW和ZI数据。这样当系统开始启动时,从第一个执行块开始运行(执行地址等于装载地址),在执行过程中,有一段初始化代码会把装载块中的一部分代码转移到另外的执行块中。
下面是这个scatter描述文件,该文件描述了上述存储器映射方式。
LOAD_ROM0x4000
{
EXE_ROM0x00000x4000;Rootregion
{
*〈+RO〉;Allcodeandconstantdata
}
RAM0x100000x8000
{
*〈+RW,+ZI〉;Allnon-constantdata
}
}
3.在分散文件中放置对象
在大多数应用中,并不是像前例那样,简单地把所有属性都放在一起,用户需要控制特定代码和数据段的放置位置。这可以通过在scatter文件中对单个目标文件进行定义实现,而不是只简单地依靠通配符。
为了覆盖标准的连接器布局规则,我们可以使用+FIRST和+LAST分散加载指令。典型的例子是在执行块的开始处放置中断向量表格:
LOAD_ROM0x00000x4000
{
EXEC_ROM0x00000x4000
{
vectors.o〈Vect,+FIRST〉
*〈+RO〉
}
;moreexecregions...
}
在这个scatter文件中,保证了vextors.o中的Vect域被放置于地址0x0000。
4.RootRegion(根区)
根区是一个执行块,它的加载地址与执行地址是一致的。每个scatter文件至少有一个根区。分散加载有一个限制:创建执行块的代码和数据(即完成复制和清零的代码和数据)无法自行复制到另一个位置。因此,在根区中必须含有下面的部分:
_main.o,包含复制代码/数据的代码;
连接器输出变量$$Table和ZISection$$Table,包含被复制代码/数据的地址。
由于上面两个部分的属性是只读的,因此他们被*〈+RO〉通配符语法匹配。如果*〈+RO〉被用在了非根区中,则在根区中必须显式地指明另一个RO区域。
下面是一个例子:
LOAD_ROM0x00000x4000
{
EXE_ROM0x00000x4000;rootregion
{
_main.o〈+RO〉;copyingcode
*〈Region$$Tabl0e〉;RO/RWaddressestocopy
*〈ZISection$$Table〉;ZIaddressestozero
}
RAM0x100000x8000
{
*〈+RO〉;allotherROsections
*〈+RW,+ZI〉;allRWandZIsections
}
}
(待续) 在下期中将更详细介绍利用scatter文件进行存储器配置的方法,以及系统启动和初始化的过程和存储器映射变化关系。
写原创有奖励!2025面包板原创奖励正在进行中
最新发表
推荐阅读
明星博主
原创博文
年度排行
博文排行
博文评论
FPGA/CPLD
MCU/ 嵌入式
模拟
电源/新能源
测试测量
通信
智能手机
处理器与DSP
PCB
汽车电子
消费电子
智能硬件
物联网
软件与OS
采购与分销
供应链管理
工程师职场
EDA/ IP/ 设计与制造
无人机
机器人/ AI
医疗电子
工业电子
管理
写博文
点赞(
4
)
收藏
分享到:
上一篇:
C++中extern“C”含义深层探索(zz)
下一篇:
使用ADS1.2进行嵌入式软件开发(下)(来自ARM公司)
PARTNER CONTENT
换一换>
更多>
文章评论
(
1
条评论)
登录
后参与讨论
您需要登录后才可以评论
登录
|
立即注册
发布
用户17154
2006-12-19 09:52
ding!
回复
查看更多评论
相关推荐阅读
用户478850
2007-01-23 18:15
ZT:未来的手机什么样?超前卫概念手机赏析!
从世界上第一台手机摩托罗拉DynaTAC 8000X开始,手机发展至今已有20多个年头。这20多年间,手机作为通讯终端产品经历了从最初的“砖头”到今天的小如火柴盒的蜕变,其外形也经历了直板到折叠、滑...
用户478850
2006-12-30 13:55
超强!另类的灭蚊显卡!
超强!另类的灭蚊显卡! 以下是一哥们改造的超强灭蚊显卡!真NB!从此电脑又多了一项功能:灭蚊!电脑灭蚊的意义是很大的~~~比...
用户478850
2006-12-30 11:17
自行打造紫外线擦除器
自行打造紫外线擦除器 众所周知,EPROM芯片需要用紫外线才能把其中的内容擦除掉,而如果不凑巧,一台紫外线擦除器还真难以找到,其实,紫外线擦除器的工作原理并不复杂,如果你有一定的电子基础,自己打造一...
用户478850
2006-12-30 10:55
摘自:侯捷网站_谈电脑课程与书籍,原载于《程序员》,2002-12
摘自:侯捷网站_谈电脑课程与书籍,原载于《程序员》,2002-12 侯捷,台湾最具影响力的软件技术作家,著述、译作涵盖C、VC、Java、delphi、DOS、Windows等几乎所有的软...
用户478850
2006-12-30 10:42
ROMEPROMEEPROM
mask ROM(掩模型只读存储器)<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />...
用户478850
2006-12-07 15:05
使用ADS1.2进行嵌入式软件开发(下)(来自ARM公司)
上期主要介绍了基于ARM的嵌入式系统软件开发中,怎样来对必要的C库函数进行移植和重定向,以及如何根据不同的目标存储器系统进行程序编译和连接设置。本期介绍程序中的存储器分配和如何根据设置正确初始化系统。...
用户478850
修改
文章:
8
阅读:
32054
评论:
4
赞:
33
好友
私信
个人主页
文章
8
原创
0
阅读
32054
评论
4
赞
33
最新评论
更多
再看看,再说说,这插座还在继续使用着
自做自受 ...
评论博文
2025-6-23
【创客】创客看创客 其道和其名 ...
再看看,再说说。 质量不论好坏,论合格。 好坏没标准,合格有标准。
自做自受 ...
评论博文
2025-6-23
读后感,华为没标准
再阅读,再说说。再看看。 垃圾是制造出来的,不是分类出来的。 打开收纳盒,小家伙还在,带着历史的记忆 ...
自做自受 ...
评论博文
2025-6-23
关于小度WiFi的1st使用,呵~我不需要 ...
最新
博文
LuatOS二次开发避坑指南:三大关键常 ...
平流层之眼:晨穹石英谐振压力传感器 ...
电磁铁损坏常见原因
资料下载
本周热帖
干货权威!混合信号PCB布局设计的基本 ...
权威资料!如何为半导体测试仪选择__ ...
milkv温湿度计代码
户外定位:RTK和GPS有多大区别?.pdf ...
干货!ESD静电防护设计的前因后果.pdf ...
【资料下载-第三季】电路考试冲刺、30 ...
电子电路大全收藏
晶振起振靠的是什么呢
晶体管光耦的工作原理
【凌鸥创芯LKS32MC034DOF6Q8】+ 电机 ...
最新资讯
芯语最新
利润销量双降,沃尔沃全球“降本”, ...
Cadence收购VLAB Works,强化汽车半导 ...
国产6nm GPU跑分与RTX 4060差距巨大? ...
2026 QS世界大学排名发布:MIT蝉联榜 ...
Wolfspeed出台一揽子财务救市措施,为 ...
安泰高压功率放大器如何研究磁悬浮实 ...
合洁电子净化工程:万级与十万级半导 ...
重磅逆转!合力泰成功摘帽,6月24日王 ...
以量化方法优化“固收+”投资:易方达 ...
“什么叫固收+?固收+产品风险高吗? ...
EE直播间
更多
Keysight World Tech Day 线上直播-AI 驱动的超高速传输测试分论坛
直播时间: 06月26日 13:30
材料介电常数的精确表征和测试
直播时间: 07月03日 10:00
在线研讨会
更多
Mercury基于展频技术的医疗时钟EMI抑制方案
AI 巨型芯片,性能越强,测试越难,如何破局?
利用先进精密仪器仪表解决方案,优化研发并加快产品上市
ST 在大功率热管理系统中的电机控制系统方案(AI 数据中心/暖通空调/电池储能系统/变频制冷)
热门
推荐
低成本、高效率,轻松搞定AI驱动的超高速传输测试!
解密汽车ADAS 半导体图谱
未来科技大揭秘:物联网、电动汽车、人工智能,谁将引领下一个十年?
从PC到车用,一“芯”多用的电源方案
我要评论
1
4
分享到微信
分享到微博
分享到QQ
点击右上角,分享到朋友圈
我知道啦
请使用浏览器分享功能
我知道啦
关闭
站长推荐
/4
2025第1期拆解活动:赢示波器、运动相机、热像仪等!
示波器、影石运动全景相机、大疆无人机、高清红外热成像仪;树莓派5等等
【下载】电源设计工程师指南(共542页)
本书共542页,深受设计工程师欢迎,作为硅基与第三代半导体的实用工具书,本手册将成为专业技术人员实现优化功率和小信号开关、电源转换和管理的必备指南。
【2025面包板社区内容狂欢节】发帖/回帖赢25万E币!
活动时间:即日起——2025年全年(发完20万E币为止!)
社区内容发布、审核与管理!
严厉打击刷流量发广告等行为
首页
论坛
电子技术基础
模拟技术
可编程器件
嵌入式系统与MCU
工程师职场
最新帖子
问答
版主申请
每月抽奖
商城免费换礼
社区有奖活动
博客
下载
评测
视频
文库
芯语
资源
2025泰克杭州测试论坛
2025中国低空经济产业创新发展大会
【直播】芯片设计工艺仿真全解析
西门子数字化工业软件资源中心
嵌入式设计资源库
智能楼宇/家电控制应用全解析
在线研讨会
EE直播间
小测验
白皮书
行业及技术活动
杂志免费订阅
免费在线工具
厂商资源中心
帖子
博文
返回顶部
×
用户17154 2006-12-19 09:52