教学文库网 - 权威文档分享云平台
您的当前位置:首页 > 文库大全 > 实用文档 >

ARM嵌入式系统C语言编程

来源:网络收集 时间:2026-05-28
导读: ARM嵌入式系统C语言编程 ARM嵌入式系统C语言编程 姜换新 (惠普中国软件研发中心 上海201206) 摘 要 无操作系统支持的嵌入式系统软件,包括系统引导(BOOT)、驱动程序、动态内存管理、IΠO、通信以及应用软件等方面。本文详细介绍了嵌入式平台上用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字,全部文档内容请下载后查看。喜欢就下载吧 ……

ARM嵌入式系统C语言编程.doc 将本文的Word文档下载到电脑,方便复制、编辑、收藏和打印
本文链接:https://www.jiaowen.net/wenku/1110631.html(转载请注明文章来源)
Copyright © 2020-2025 教文网 版权所有
声明 :本网站尊重并保护知识产权,根据《信息网络传播权保护条例》,如果我们转载的作品侵犯了您的权利,请在一个月内通知我们,我们会及时删除。
客服QQ:78024566 邮箱:78024566@qq.com
苏ICP备19068818号-2
Top
× 游客快捷下载通道(下载后可以自由复制和排版)
VIP包月下载
特价:29 元/月 原价:99元
低至 0.3 元/份 每月下载150
全站内容免费自由复制
VIP包月下载
特价:29 元/月 原价:99元
低至 0.3 元/份 每月下载150
全站内容免费自由复制
注:下载文档有可能出现无法下载或内容有问题,请联系客服协助您处理。
× 常见问题(客服时间:周一到周五 9:30-18:00)