多数嵌入式应用程序最初都是在原型环境下开发的。无论什么样的原型仿真环境与最终产品环境都是有差异的。因此,考虑如何将嵌入式应用程序从其所依赖的开发工具或调试环境中移植到在目标硬件上独立运行是非常重要的。
在汇编代码中访问C全局变量,只能通过地址间接访问全局变量。要访问全局变量,必须在汇编中使用 IMPORT 伪操作输入全局变量,然后将地址载入寄存器。可以根据变量的类型使用载入和存储指令访问该变量。
本节描述如何在C++代码中使用C头文件。从C++调用C头文件之前,C头文件必须包含在extern "C"命令中。本节包含以下两部分内容:
本节提供一些示例,显示如何从C++调用C和汇编语言代码,以及从C和汇编语言调用 C++ 代码。其中包括调用约定和数据类型。主要包括下面内容:
本章主要介绍嵌入式应用程序的设计方法。本章中的一些实例程序是以ARM公司的Realview2.2为开发平台。由于目前嵌入式应用环境相差非常大,这里主要是通过这些实例程序来更直接地介绍嵌入式应用系统的开发方法,具体的代码因具体的嵌入式环境不同而有所差异。
默认情况下,C库利用semihosting机制来提供设备驱动级的功能,使得主机能够用作输入和输出设备。这种机制对于嵌入式开发十分有用,因为用于开发的硬件系统通常没有最终系统的输入和输出设备。
任何运行在实际硬件上的嵌入式应用程序,都必须在启动时实现一些基本的系统初始化。本节将对此予以详细讨论。
在创建多任务嵌入式系统时,最好有一个简单的方式来编写、装载及运行各自独立的任务。目前大多数的嵌入式系统不再使用自己定制的控制系统,而使用操作系统来简化这个过程。较高级的操作系统采用基于硬件的存储管理单元MMU来实现上述操作。
本章主要讲解C编译器在代码优化时遇到的一些问题。要编写高效的C语言源代码,必须了解C编译器对什么形式的代码有所改动,编译器涉及的处理器结构的限制,以及一些特殊的C编译器的限制。
因为ARM体系结构本身并不包含除法运算硬件,所以在ARM上实现除法是十分耗时的。ARM指令集中没有直接提供除法汇编指令,当代码中出现除法运算时,ARM编译器会调用C库函数(有符合除法调用_rt_sdiv,无符合除法调用_rt_udiv),来实现除法操作。根据除数和被除数的不同,32bit的除法运算一般要占有20-140个指令周期。
ARM指令都是可以条件执行的。在代码中使用条件执行指令可以减小代码密度并提高程序执行效率。典型的条件执行语句用在比较指令之后,形成程序的分支跳转结构。下面的例子显示了条件执行指令的典型用法。
通常,布尔表达式被用来检测某个数值是否在特定的范围内。例如,在图形窗口处理程序中,常使用布尔表达式判断屏幕中一个点是否在当前活动窗口范围内。
循环体是程序设计与优化的重点考虑对象。本节将着重讲解在ARM上处理for和while循环最有效的方法。
ARM处理器支持16个协处理器。在程序执行过程中,每个协处理器忽略属于ARM处理器和其他协处理器的指令。当一个协处理器硬件不能执行属于它的协处理器指令时,将产生一个未定义指令异常中断,在该异常中断处理程序中,可以通过软件模拟该硬件操作。比如,如果系统不包含向量浮点运算器,则可以选择浮点运算软件模拟包来支持向量浮点运算。
当第一代RISC微处理器刚出现时,标准存储器元件的速度比当时微处理器的速度快。很快,半导体工艺技术的进展被用来提高微处理器的速度。标准DRAM部件虽然也快了一些,但其发展的主要精力则放在提高存储容量上。
学吧
夜是打火机
18713271819cxy
贾仁明
bu一样的烟火
mikeniu
chris527
LBSEric
21CI2133
洛奇ing
SIASGUOJIe
逮到一只程序猿
zx66
zhaoyuan
建志的智
sdwfywl
cgyyds
云城a
shaolw
ti-funs
刘剑君
带偷子
shaoniany
陈震伟
2334599288
helloyyll
怪打野题
liqinglong1023
cxk1998