ARM嵌入式系统C语言编程
ARM嵌入式系统C语言编程
ARM嵌入式系统C语言编程
姜换新
(惠普中国软件研发中心 上海201206)
摘 要 无操作系统支持的嵌入式系统软件,包括系统引导(BOOT)、驱动程序、动态内存管理、IΠO、通信以及应用软件等方面。本文详细介绍了嵌入式平台上用C语言编写系统软件和应用软件的方法。虽然是针对ARM平台介绍的,但基本经验和算法也适合于其他嵌入式平台的软件设计。
关键词 嵌入式系统 软件 C语言 ARM
PROGRAMMINGCONARMD(ChinaSoH,Shanghai201206)
Abstract isacomplicatedproject.Modulesincludingsystemboot,drivers,dynamicmemorymanage2ment,IΠOinterfaceshouldbeconsideredcarefully.WithanexcellentexperienceonARMembeddedsystem,theau2thorgivesadetailedinthispaperonthemethodsandalgorithmsaboutprogrammingARM.ThoughARMistheonlydiscusseditem,thispaperisusefulforprogrammingonanyotherembeddedplatforms.
Keywords Embeddedsystem Software Cprogramminglanguage ARM
是没有意义的(如果返回,表明系统出现严重错误)。另外,为
1 引 言
无操作系统支持的嵌入式软件包括系统引导(BOOT)、外围驱动程序、存储管理、系统IΠO、通信、应用程序等方面,需要结合采用汇编语言(约占10%)和C语言(约占90%)。本文结合作者实践,详细介绍ARM嵌入式平台的C编程方法。考虑到通信软件涉及范围较大,本文不进行讨论。
了避免产生混淆,我们还必须给main函数另外取一个名字,比如Main。否则,编译器将会给main函数生成一大堆初始化代码,导致C程序的主入口与系统引导模块的接口错误。
系统引导模块完成各种初始化工作后,用一条跳转指令进入C的主入口Main,控制权从此移交给了C应用程序。
3 存储管理
存储管理是一个复杂的课题。从广义的角度来说,磁盘文件系统、内存、片内高速Cache等都属于这个范畴。嵌入式系统中,较有意义的是内存的动态分配与释放及Flash存储器管理两方面。本文要介绍的是我们在嵌入式系统中实现的动态内存管理。
C语言中动态内存分配与释放主要由malloc和free两个标
2 系统引导与main函数
通常C语言是从main函数开始的。main函数的原型是:
intmain(intargc,char33argv)
其中argc是参数的个数,argv是指向各参数的指针的数组。
main函数由操作系统内核启动,操作系统内核完成函数所需的
变量初始化工作,并在调用结束后检查main函数的返回值,若返回值为0,表明程序运行正常,否则表明程序运行出错。在嵌入式系统中,由于没有操作系统内核存在,对main函数的初始化工作只能由系统引导(BOOT)模块完成。
系统引导(BOOT)部分完成系统初始化工作,用汇编语言实现。它的工作包括硬件初始化、栈寄存器的设置、全局变量的初始化或清0、RAM中运行的模块的加载、堆参数的初始化等。完成这些工作后,再把控制权交给C的main函数。显然,对嵌入式系统的main而言,argc和argv这两个参数及返回值都
准库函数实现。malloc从系统空闲内存中分配合适的内存块,
free函数完成内存块的回收。这两个函数一般需要操作系统内
核的支持,在ARM裸平台上
,不能直接调用。为此,我们编写了malloc和mfree两个函数,实现动态存储管理的功能。
典型应用程序内存映象分成代码区、数据区和栈区,三个区从低地址到高地址依次分布。代码区从最低地址开始,栈区
收稿日期:2002-05-10。姜换新,硕士,主研领域:数字通信、嵌入式及网络编程。
15
ARM嵌入式系统C语言编程
则占据最高地址。代码区和数据区可以相连,也可以分开。嵌入式系统里,代码区位于只读存储器(如Flash)中,数据区和栈区则位于RAM中,因此代码区和数据区一般并不相连1。数据区和栈区是分开的,它们之间的空隙称作堆。
堆作为一个连续的可利用空间,是系统的初始可分配块。每次应用程序申请内存,malloc便从堆中分割出一块(从低地址开始)给它。随着申请次数的增加,原来一个完整的内存块便被分割为多个独立的块分配给应用程序。由于内存释放的先后顺序是随机的,因此一定时间后,系统中将存在多个互不相连的内存块。这就使得整个内存区呈现出占用块和空闲块犬牙交错的状态,如图1所示。图中灰色部分表示内存被占用,白色部分表示未被占用
。
)
效率高,且容易形成很多内存碎片。
4 LCD终端(系统IΠO)
LCD终端软件是系统I/O范畴的重要内容,主要包括LCD
字符显示(英文8×16点阵,汉字16×16点阵),LCD绘图(点、线、圆、面、位图、图形旋转等)。320×240象素的LCD显示器,能显示15行×40列英文字符,或15行×20列汉字字符,并基本实现有较好分辨率的图形/图像的显示。
LCD显示的最基本程序是画点程序,其原型如下:
voidLCDPixel(intx,inty,charcolor)
其中,x和y是点的坐标,坐标原点在左上角,color是点的灰度。
字符和位图的显示利用了点阵方式。线、圆和面则利用相应的算法实现。图形旋转需要使用坐标变换函数。
这里要详细介绍的是把LCD英文)字符型终端时的。把LCD,一个关键点是定义
图1 动态存储管理过程中的内存状态
:
olumn
为了进行内存动态管理,需要维护两张全局表,一张是可利用空间表(avail
list),管理空闲内存块的信息,和CurrentColumn分别定义了光标的横坐(坐标原点在左上角),取值范围分别是(0~39)和
(0~14),对应于横行40个字符和纵列15个字符。
分配空间表(usedlist),管理占用内存块循环链表实现。个空闲块存在,?[1]分配策略,,各有优缺点。。
可利用空间表和已分配空间表采用相同的“表元”数据结构,定义如下:
structmblock{
定义好光标后,每次向屏幕输出字符时,总是从光标处开始,这样就保证了输出的有序性和连贯性。
向屏幕输出字符串的基本函数是Printf,其原型如下:
)voidPrintf(constchar3fmt,…
这是一个可变参数函数,功能上与printf标准库函数完全相似。为了实现可变参数的处理,要使用stdarg.h中定义一些宏。
Printf分析每个格式字符,并对各转义字符(如\n,\t,\b,\r,\v等)进行相应处理。在屏幕的合适位置打印格式化后的字
structmblock3next;
structmblock3prev;sizetsize;char3space;
};
符串。Printf还调用一个滚屏函数ScreenScroll,当光标位于末行时让屏幕向上滚动若干行。
Printf函数不仅为LCD作为字符型终端提供了一个好的手
在系统初始化时,整个可分配内存块是一个连续的存储区,可利用空间表的元素只有一个。malloc函数每次分配内存时,先检查size(malloc的参数)是否合法(如是否超出堆的范围),若合法,再将其与32-bit字对齐,然后从avail
list中搜
段,同时也为程序的调试提供了便利。我们可以在程序可能出错的地方用Printf函数打印一些信息,这为我们对程序的跟踪提供了相当大的方便。Printf函数在嵌入式系统编程中使用是十分明显的。
索合适的内存块,并将其分配给应用程序。如果内存块的大小比size大得较多,则对内存块进行分裂,低地址的一块分配给应用程序,高地址的一块仍然放入availlist中。如果搜索不到合适的空闲块,malloc返回(void3)0。
mfree函数释放内存时,根据参数addr给定的地址,在usedlist中搜索相应的表元,找到后,将它标 …… 此处隐藏:5150字,全部文档内容请下载后查看。喜欢就下载吧 ……
相关推荐:
- [实用文档]李践-有效提升销售的12大黄金法则8-大
- [实用文档]党支部换届工作方案
- [实用文档]2013年下期电子商务专业部宣传工作计划
- [实用文档]方庄一矿通风、钻探绩效工资考核管理办
- [实用文档]项目一 认识企业物流认识企业物流
- [实用文档]MBI_Display_产品蓝图规画
- [实用文档]北京市建筑业劳务作业人员普法维权培训
- [实用文档]锅炉燃烧调整与运行优化
- [实用文档]4支付结算业务的核算
- [实用文档]米什金_货币金融学_第9版各章学习指导
- [实用文档]水泥混凝土路面硬化工程施工组织设计
- [实用文档]钢筋工程安全技术交底书
- [实用文档]关于公布华中师范大学本科毕业论文
- [实用文档]太原市园林绿化施工合同范本 2
- [实用文档]周日辅导 初中英语分类复习单项选择题(
- [实用文档]第四章 文化经纪人的管理形式 第二节
- [实用文档]学宪法讲宪法竞赛题库
- [实用文档]《数值计算方法》期末考试模拟试题二
- [实用文档]爱词霸学英语:每日一句( 十月)
- [实用文档]2014年国家公务员面试:无领导小组讨论
- 新课程主要理念和教学案例分析汇编(24
- 英国人的快乐源于幸福的家庭生活
- 七年级上册第一次月考模拟数学试卷
- 真丝及仿真丝的种类有哪些?
- 【最新】华师大版八年级数学下册第十六
- 高中英语3500个必背单词
- 我可以接受失败,但我不能接受放弃!
- 最近更新沪科版八年级物理上册期末试卷
- 绿化工作先进乡镇事迹材料
- 鲁教版九年级上册思想品德教学计划
- 英语音标的分类
- 地下室底板无梁楼盖与普通梁板结构形式
- 美容师黄金销售话术
- 雅思写作满分作文备考方法
- 血清甲状腺激素测定与高频彩色多普勒超
- 1度浅析装修对室内空气品质的影响
- 2017-2022年中国汞矿行业深度分析与投
- 计算机二级VB公共基础知识
- (何勇)秸秆禁烧_重在寻找出路
- 内外墙抹灰工程分包施工合同1




