资源描述
,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,单击此处编辑母版标题样式,设备驱动,使用任何外部设备时都需要有相应驱动程序的支持。驱动程序为上层软件提供设备的操作接口。对于上层软件而言,只需要调用驱动程序提供的接口,而不用理会设备具体的内部操作。对于驱动程序而言,不仅要实现设备的基本功能函数,如初始化、中断响应、发送、接收等,使设备的基本功能得以实现,而且针对设备使用过程中可能出现的各种差错,还应提供完备的错误处理函数。,驱动层软件有两个重要的概念:硬件抽象层,(Hardware Abstraction Layer,,,HAL),和板级支持包,(Board Support Package,,,BSP),。可以简单地理解为硬件抽象层与硬件具有更加紧密的相关性,而板级支持包与操作系统具有更加紧密的相关性。具体地讲,硬件抽象层的目的是为了将硬件抽象化,即通过程序来控制诸如,CPU,、,I/O,、存储器等硬件的操作,从而使得系统的设备驱动程序与硬件无关。,设计板级支持包的目的主要是为驱动程序提供访问硬件设备寄存器的函数包,从而实现对操作系统的支持。为保证与操作系统保持正确的接口,以便良好地支持操作系统,不同的操作系统应对应不同定义形式的板级支持包。在功能上,板级支持包大体需要实现以下两方面的内容:,(1),在系统启动时,完成对硬件的初始化。,(2),为驱动程序提供访问硬件的手段。,在为驱动程序提供访问硬件的手段时,,BSP,一般应完成以下工作:,1),将驱动程序提供的,ISR(,中断服务程序,),挂载到中断向量表上。,2),创建驱动程序初始化所需要的设备对象。,BSP,将硬件设备描述为一个数据结构。这个数据结构中包含这个硬件设备的一些重要参数,上层软件就可以直接访问这个数据结构。,3),为驱动程序提供访问硬件设备寄存器的函数。,4),为驱动程序提供可重用性措施,比如将与硬件关系紧密的处理部分在,BSP,中完成,驱动程序直接调用,BSP,提供的接口,这样驱动程序就与硬件无关。只要不同的硬件系统的,BSP,提供的接口相同,驱动程序就可在不同的硬件系统上运行。,4.3.3 A/D,转换功能驱动实例,ARM S3C440BX,芯片自带一个路模拟信号输入的,10,位,A/D,转换器,,1.ADC(A/D Conversion),的引脚设置,S3C440BX,芯片与,A/D,功能有关的引脚如表,4-6,所示,,在电路中,对上述引脚需要按照图所示加上电容。,2.ADC,转换时间的计算,A/D,转换时间即完成一次,A/D,转换所需要的时间。如果系统时钟为,66 MHz,且,ADC,时钟源的预分频值为,9,,则,10,位数字量的转换时间为,3.ADC,相关寄存器及其设置,与,A/D,转换相关的寄存器主要有如下三个:,(1)ADCPSR,:采样预分频寄存器。,(2)ADCCON,:采样控制寄存器。,4.ADC,驱动程序参考代码,(1),定义与,ADC,相关的控制位。,#define ADCCON_FLAG0 x40#define ADCCON_SLEEP0 x20#define ADCCON_ADIN0(0 x02)#define ADCCON_ADIN1(0 x12)#define ADCCON_ADIN2(0 x22)#define ADCCON_ADIN3(0 x32)#define ADCCON_ADIN4(0 x42)#define ADCCON_ADIN5(0 x52)#define ADCCON_ADIN6(0 x62)#define ADCCON_ADIN7(0 x72)#define ADCCON_READ_START0 x2#define ADCCON_ENABLE_START0 x1,嵌入式操作系统概述,嵌入式实时操作系统大多数嵌入式系统应用在实时环境中,并且随着嵌入式系统的广泛应用,实时系统和嵌入式系统已经密切联系在一起了。一般地,嵌入式操作系统是指支持嵌入式系统工作的操作系统,它在知识体系和技术结构上与通用操作系统没有太大区别。通用操作系统只注重平均性能,如对于整个系统来说,所有任务的平均响应时间是关键,并不关心单个任务的响应时间;而实时系统强调的是实时性,即系统的正确性不仅依赖于计算结果,也依赖于结果产生的时间。因此,实时系统是指一个能够在指定的或者确定的时间内,实现系统功能和对外部或内部、同步或异步事件作出响应的系统。,典型的嵌入式操作系统,嵌入式,LinuxLinux,是一种免费的、源代码完全开放的、符合,POSIX,标准规范的操作系统。随着,Linux,的迅速发展,嵌入式,Linux,现在已经有许多版本,包括硬实时的嵌入式,Linux(,如新墨西哥工学院的,RT-Linux,、堪萨斯大学的,KURT-Linux),和一般的嵌入式,Linux,版本,(,如,CLinux,、,PocketLinux,等,),。,RT-Linux,把,Linux,任务优先级设为最低,使得所有实时任务的优先级都高于它,从而达到既兼容通常的,Linux,任务又保证强实时性能的目的。,C/OS-,C/OS-,是一个完整的,源码公开的,可移植、固化、裁剪的占先式实时多任务内核,主要面向中小型嵌入式系统,具有执行效率高、占用空间小、可移植性强、实时性能优良和可扩展性强等特点。,5.3,操作系统的基本概念,5.3.1,多进程和多线程,许多嵌入式系统并不是单纯地完成一种功能。这些不同的任务构成了应答机系统功能的各个部分,为了完成多个任务而组织程序结构的需要,引入了进程的概念。,5.3.2,任务,在实时应用程序的设计过程中,要考虑如何将应用功能合理地划分为多个任务,让每个任务完成一定的功能,成为整个应用的一部分。每个任务都被赋予一定的优先级,有自己的一套,CPU,寄存器和栈空间,一般地,每一个任务都是一个无限的循环,可以处在以下五种状态之一:,(1),休眠态,(Dormant),:是指任务驻留在内存的程序空间中,并未被多任务内核所调度。,(2),就绪态,(Ready),:是指任务已经准备好,可以运行,但是由于该任务的优先级比正在运行的任务的优先级低,还暂时不能运行。,(3),运行态,(Running),:是指任务获得了,CPU,的控制权,正在运行中。基于优先级调度的实时内核总是让处于就绪态的优先级最高的任务运行。,(4),挂起态,(Pending),:也叫做等待事件态,(waiting),,是指任务在等待某一事件的发生,(,如等待某外设的,I/O,操作、等待定时脉冲的到来、等待超时信号的到来以结束目前的等待,等等,),。正在运行的任务由于调用了延时函数或等待某事件发生而将自身挂起,就处于挂起态。,(5),被中断态,(Interrupt),:是指发生中断时,,CPU,提供相应的中断服务,原来正在运行的任务暂不能运行,而进入了被中断状态。,5.3.3,任务切换任务切换,(Context Switch),是指,CPU,寄存器内容切换。当多任务内核决定运行另外的任务时,它保存正在运行的任务的当前状态,即当前,CPU,寄存器中的全部内容;内核将这些内容保存在该任务的当前状态保存区,也就是该任务自己的栈区之中,(,这个过程称为“入栈”,),。入栈工作完成后,把将要运行的任务的当前状态从该任务的栈中装入,CPU,寄存器,(,这个过程称为“出栈”,),,并开始这个任务的运行。这样,就完成了一次任务切换。,5.3.4,内核多任务系统中,内核负责管理各个任务,为每个任务分配,CPU,的使用时间,并且负责任务间的通信。内核提供的基本服务是任务切换,通过提供必不可少的系统服务,诸如信号量管理、邮箱、消息队列及时间延时等,使得对,CPU,的利用更为有效。此外,实时内核允许将应用程序划分成若干个任务并对它们进行管理,(,如任务切换、调度、任务间的同步和通信,等等,),,因而使用实时内核可以大大简化应用系统的设计。,5.3.5,任务调度,调度,(Schedulers),是内核的主要职责之一,就是决定该轮到哪个任务运行。任务调度器从当前就绪的所有任务中依照任务调度算法选择一个最符合算法要求的任务,使该任务获得,CPU,的使用权,从就绪态进入运行态。大多数实时内核都是基于优先级调度法的,即,CPU,总是让处于就绪态的、优先级最高的任务先运行。但是,高优先级任务何时掌握,CPU,的使用权由使用的内核来决定。通常,基于优先级调度法的内核有两种:占先式内核和非占先式内核。,任务间的通信与同步,1,任务间的通信多任务实时系统中,任务间或中断服务与任务间常常需要交换信息,这种信息传递称为任务间的通信,(inter task communication),。任务间的通信有两个途径:共享数据结构和消息机制。,1),共享数据结构实现任务间通信的最简单方法是使用共享数据结构,尤其是多个任务在同一地址空间下的情形。共享数据结构的类型可以是全局变量、指针、缓冲区等。,2),消息机制任务间另一种通信方式是使用消息机制。任务可以通过内核提供的系统服务向另一个任务发送消息。消息机制包括消息邮箱和消息队列。,
展开阅读全文