,硬件设计和软件设计相辅相成。嵌入式系统中的驱动程序是直接工作在各种硬件设备上的软件,是硬件和高层软件之间的桥梁。正是通过驱动程序,各种硬件设备才能正常运行,达到既定的工作效果。(ponent,ESC)是实现一定嵌入式系统功能的一组封装的、规范的、可重用的、具有嵌入特性的软件单元,是组织嵌入式系统的功能单位。。IO)。由图1-6可看出,底层外设构件可以调用底层内部构件,如LCD构件可以调用GPIO构件、PCF8563构件(时钟构件)可以调用I2C构件等。而高层构件可以调用底层外设构件和底层内部构件中的功能构件,而不能直接调用GPIO构件。另外,考虑到几乎所有的底层内部构件都涉及到MCU各种寄存器的使用,因此将MCU的所有寄存器定义组织在一起,形成MCU头文件,以便其它构件头文件中包含该头文件。,由头文件和源程序文件两部分组成。头文件中的内容主要有:包含下层构件头文件的#include语句、用以描述构件属性的宏定义语句以及对外接口函数原型说明。在头文件中使用函数原型,对于建立代码模块和外部接口的规范,便于他人使用,都是很有帮助的。使用这些函数的用户,不需要查找源代码去了解参数的具体类型,直接查看函数原型即可。源程序文件中存放构件的内部函数和外部函数的定义,即函数的实现代码,以完成函数所要实现的功能。在对底层构件进行设计时,最关键的工作是要对构件的共性和个性进行分析,抽取出构件的属性和对外接口函数。尽量做到:的头文件,对于构件的源程序文件则不必修改或改动很小。例如,串行通信模块SCI是大多数MCUMCU串行通信程序发现:在查询方式下,各种MCU接收到数据和数据是否发送完毕,这就是SCI,该状态寄存器的名称可能不同,这两个标志位的位号也有可能不同。此外,和个性之后,就可以抽取出SCI内容参见第五章。(1(2(3)对MCUMCU时,只要修改重定(4作用域仅限于定义该函数的文件。外部在定义外部函数时,应该对函数名、函数功能、必须借助于该构件提供的接口操作函数来实现。(5这样做不但使得接口简洁,更加避免了全局变量可能引发的安全隐患。,同一构件可被重复使用多次。移植是指将一个系统中使用到的构件应用到另外一个系统中。,当用硬件构件“组装”硬件系统时,核心构件(即最小系统)有且只有一个,而中间构件和终端构件可有多个,并且相同类型的构件可出现多次。下面以终端构件LCD为例,介绍硬件构件的移植方法。(aLCD构件在系统A中的应用B图1-7LCD在应用系统A中,若LCD的数据线(LCD-D0~LCD-D78位MCU)芯片的通用IO口的B口相连,C口作为LCD寄存器选择信号LCD-RS与C口第0引脚连接,读写信号LCD-RWC口第LCD_E与C口第2引脚连接,则LCD1-7(a虚线框左边的文字(如PTC0、PTC1等)为接口网标,虚线框右边的文字、等)为接口注释。在应用系统B中,若LCD的数据线((32位MCU)芯片的通用IO口的AN口相连,、2LCD-RS、读写信号LCD-RW、使能信号LCD_ELCD1-7(b所示。2其头文件和程序文件是否MCU型号改变)。#include―‖//包含GPIO构件头文件//显示数据传送口//控制信号传送口//寄存器选择信号//读写信号//使能信号//液晶显示初始化//填充LCD,可实现清屏//画线#defineLCD_DataGPIO_PORTB#defineLCD_CtrlGPIO_PORTC#defineLCD_RS0#defineLCD_RW1#defineLCD_E2voidLCD_Init(void;voidLCD_Fill(INT8Ua;voidLCD_PutDot(INT8Ux,INT8Uy;//画点voidLCD_PutLine(INT8Ux1,INT8Uy1,INT8Ux2,INT8Uy2;voidLCD_PutChar(INT8Ua;//显示一个字符voidLCD_PutString(INT8Ustr[];//显示一串字符当LCD硬件构件发生如图1-7(b所示的移植时,显示数据传送口和控制信号传送口发生了改变,此时,只要将上面的第1和第2条宏定义语句修改成:#defineLCD_DataGPIO_PORTAN//显示数据传送口#defineLCD_CtrlGPIO_PO
ARMCortexM4嵌入式系统开发实践2 来自淘豆网m.daumloan.com转载请标明出处.