jxCLinux,FreeRTOS等。eCOS是真正的GPL实时嵌入式OS,大概比gC/OS-II大一倍,它是为解决Linux的实时性不好而开发的,很有前途。RC/OS-II是赫赫有名的开源嵌入式.OS,但如果用于商业目的则需要授权。它的内核简单清晰,是学习嵌入式实时操作系统极好的入门材料。近来增加了pC/GUI图形界面,ixC/FS文件系统,pC/TCP网络功能。它对一般的项目开发是一个不错的选择。它已被广泛地使用在8位的51系列单片机应用系统中,同时它也支持16位、32位的系统。2.为什么要用操作系统在8位或16位嵌入式系统应用中,由于CPU的资源量比较少,任务比较简单,程序员可以在应用程序中管理CPU资源,而不一定要专用的系统软件。如果嵌入式系统比较复杂并且采用32位CPU时,情况就完全不同了。32位CPU的资源量非常大,处理能力也非常强大,如果还是采用手工编制CPU的管理程序,面对复杂的应用,很难发挥出32位CPU的处理能力,并且程序也不一定可靠。举个例子:我们平时用的计算机,有比较丰富的外设资源,如果不使用操作系统,我们自已用开发工具从底层开始写程序,搞个一年半载的,或许也可以让计算机跑起来,在显示器上搞个类似的Windows界面。然而,如此的“裸系统”根本无法让PC发挥出强大的处理能力,并且要想在已有的程序上增加应用功能,必须要熟悉全部程序的流程,或许还要去熟悉硬件知识,看硬件的datasheet。如果想移植到另外一台配置不同的计算机上,估计大部分程序都得推倒重来!在嵌入式上使用操作系统有两个方面的好处:(1)操作系统的一个强项就是它可以使应用程序编码在很大程度上与目标板的硬件和结构无关,使程序员可以将尽可能多的精力放在应用程序本身,而不必去花更多的精力去关注系统资源的管理。(2)使系统开发变得简单,缩短了开发周期:而且使应用系统更加健壮、高效、可靠。3.基于操作系统的程序开发模式就是程序的开发建立在系统嵌入操作系统的基础上,通过操作系统的API接口函数完成系统的程序开发。这种模式至少有两个基本步骤。第一步:首先选择和使用合适的操作系统并将操作系统裁减后嵌入系统。第二步:基于操作系统的API接口函数,完成系统所需功能的程序开发。4.该模式的特点从理论上讲,基于操作系统的开发模式,具有快捷、高效的特点,开发的软件移植性、后期维护性、程序稳健性等都比较好。但是,不是所有系统都要基于操作系统,因为这神模式要求开发者对操作系统的原理有比较深透的掌握,一般功能比较简单的系统,不建议使用操作系统,毕竞操作系统也占用系统资源:也不是所有系统都能使用操作系统,因为操作系统对系统的硬件有一定的要求。因此,在通常情况下,虽然STM32单片机是32位系统,但不主张嵌入操作系统。122
122 jxCLinux, FreeRTOS等。eCOS是真正的GPL实时嵌入式OS,大概比gC/OS-II大一倍,它是为解 决Linux的实时性不好而开发的,很有前途。RC/0S-II是赫赫有名的开源嵌入式. 0S,但如果 用于商业目的则需要授权。它的内核简单清晰,是学习嵌入式实时操作系统极 好的入门材 料。近来增加了 pC/GUI图形界面,ixC/FS文件系统,pC/TCP网络功能。它对一般的项目开 发是一个不错的选择。它已被广泛地使用在8位的51系列单片机应用系统中,同时它也支持 16位、32位的系统。 2.为什么要用操作系统 在8位或16位嵌入式系统应用中,由于CPU的资源量比较少,任务比较简单,程序员可 以在应用程序中管理CPU资源,而不一定要专用的系统软件。如果嵌入式系统比较复杂并且 采用32位CPU时,情况就完全不同了。32位CPU的资源量非常大,处理能力也非常强大,如 果还是采用手工编制CPU的管理程序,面对复杂的应用,很难发挥出32位CPU的处理能力, 并且程序也不一定可靠。 举个例子:我们平时用的计算机,有比较丰富的外设资源,如果不使用操作系统,我 们自己用开发工具从底层开始写程序,搞个一年半载的,或许也可以让计算机跑起来,在 显示器上搞个类似的Windows界面。然而,如此的“裸系统”根本无法让PC发挥出强大的处 理能力,并且要想在己有的程序上增加应用功能,必须要熟悉全部程序的流程,或许还要 去熟悉硬件知识,看硬件的datasheet。如果想移植到另外一台配置不同的计算机上,估计 大部分程序都得推倒重来! 在嵌入式上使用操作系统有两个方面的好处: (1)操作系统的一个强项就是它可以使应用程序编码在很大程度上与目标板的硬件和 结构无关,使程序员可以将尽可能多的精力放在应用程序本身,而不必去花更多的精力去 关 注系统资源的管理。 (2)使系统开发变得简单,缩短了开发周期;而且使应用系统更加健壮、高效、可靠。 3.基于操作系统的程序开发模式 就是程序的开发建立在系统嵌入操作系统的基础上,通过操作系统的API接口函数完成 系统的程序开发。 这种模式至少有两个基本步骤。 第一步:首先选择和使用合适的操作系统并将操作系统裁减后嵌入系统。 第二步:基于操作系统的API接口函数,完成系统所需功能的程序开发。 4.该模式的特点 从理论上讲,基于操作系统的开发模式,具有快捷、高效的特点,开发的软件移植性 、后期维护性、程序稳健性等都比较好。但是,不是所有系统都要基于操作系统,因为这 神模式要求开发者对操作系统的原理有比较深透的掌握,一般功能比较简单的系统,不建 议使用操作系统,毕竟操作系统也占用系统资源;也不是所有系统都能使用操作系统,因 为操作系统对系统的硬件有一定的要求。因此,在通常情况下,虽然STM32单片机是32位系 统,但不主张嵌入操作系统
4.3.43种开发模式的选用建议基于操作系统的开发模式,对于初学者不是很合适,因为它对操作系统、多任务等理论把握的要求较高。建议学习者在对嵌入式系统的开发达到一定的阶段后,再开始尝试这种开发模式。从高效开发的角度,从学习容易上手的角度,建议使用基于固件库函数的开发模式毕竞这种模式把底层比较复杂的一些原理和概念封装起来了,更容易理解。这种模式开发的程序更容易维护、移植,开发周期更短,程序出错的概宇更小。当然,也可以采用基于寄存器和基于固件库混合的方式。4.3.5库函数与寄存器开发的关系很多用户都是从学51单片机开发转而想进一步学习STM32开发,他们习惯了51单片机的寄存器开发方式,突然一个STM32固件库摆在面前会一头雾水,不知道从何下手。下面我们将通过一个简单的例子来告诉STM32固件库到底是什么,和寄存器开发有什么关系?其买一句话就可以概括:固件库就是函数的集合,固件库函数的作用是向负责与寄存器直接打交道,向上提供用户函数调用的接口(API)。在51的开发中我们常常的作法是直接操作寄存器,比如要控制某些10口的状态,我们直接操作寄存器:PO=OX11;而在STM32的开发中,我们同样可以操作寄存器:GPI0F->BSRR=0x00000001://这里是针对STM32F4系列这种方法当然可以,但是这种方法的劣势是你需要去掌握每个寄存器的用法,你才能正确使用STM32,而对于STM32这种级别的MCU,数百个寄存器记起来又是谈何容易。于是ST(意法半导体)推出了官方固件库,固件库将这些寄存器底层操作都封装起来,提供一整套接口(API)供开发者调用。大多数场合下,我们不需要去知道操作的是哪个寄存器,只需要知道调用哪些函数即可。比如上面的控制BSRRL寄存器实现电平控制,官方HAL库封装了一个函数:voidHAL_GPIO_WritePin(GPIO_TypeDef*GPIOx,uint16_tGPIO_Pin,GPIO_PinStatePinState这个时候我们不需要再直接去操作BSRRL寄存器了,只需要知道怎么使用HALGPIO_WritePin这个函数就可以了。在我们对外设的工作原理有一定的了解之后,再去看固件库函数,基本上函数名字能告诉你这个函数的功能是什么,该怎么使用,这样开发会方便很多。任何处理器,不管它有多么的高级,归根结底都是要对处理器的寄存器进行操作。但是固件库不是万能的,我们如果想要把STM32学透,光读STM32固件库是远远不够的。我们还是要了解一下STM32的原理,了解STM32各个外设的运行机制。只有了解了这些原理,在进行固件库开发过程中才可能得心应手游刃有余。只有了解了原理,才能做到“知其然知123
123 4.3.4 3种开发模式的选用建议 基于操作系统的开发模式,对于初学者不是很合适,因为它对操作系统、多任务等理 论把握的要求较高。建议学习者在对嵌入式系统的开发达到一定的阶段后,再开始尝试这 种开发模式。 从高效开发的角度,从学习容易上手的角度,建议使用基于固件库函数的开发模式, 毕竟这种模式把底层比较复杂的一些原理和概念封装起来了,更容易理解。这种模式开发 的程序更容易维护、移植,开发周期更短,程序出错的概宇更小。 当然,也可以采用基于寄存器和基于固件库混合的方式。 4.3.5 库函数与寄存器开发的关系 很多用户都是从学 51 单片机开发转而想进一步学习STM32开发,他们习惯了51单片机 的寄存器开发方式,突然一个STM32固件库摆在面前会一头雾水,不知道从何下手。下面我 们将通过一个简单的例子来告诉STM32 固件库到底是什么,和寄存器开发有什么关系?其 实一句话就可以概括:固件库就是函数的集合,固件库函数的作用是向下负责与寄存器直 接打交道,向上提供用户函数调用的接口(API)。 在51的开发中我们常常的作法是直接操作寄存器,比如要控制某些IO口的状态,我们 直接操作寄存器: P0=0X11; 而在 STM32 的开发中,我们同样可以操作寄存器: GPIOF->BSRR=0x00000001; //这里是针对 STM32F4 系列 这种方法当然可以,但是这种方法的劣势是你需要去掌握每个寄存器的用法,你才能 正确使用STM32,而对于STM32这种级别的MCU,数百个寄存器记起来又是谈何容易。于是 ST(意法半导体)推出了官方固件库,固件库将这些寄存器底层操作都封装起来,提供一整 套接口(API)供开发者调用。大多数场合下,我们不需要去知道操作的是哪个寄存器,只 需要知道调用哪些函数即可。比如上面的控制 BSRRL 寄存器实现电平控制,官方 HAL 库 封装了一个函数: void HAL_GPIO_WritePin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin, GPIO_PinState PinState) 这个时候我们不需要再直接去操作BSRRL寄存器了,只需要知道怎么使用 HAL_GPIO_WritePin 这个函数就可以了。在我们对外设的工作原理有一定的了解之后,再 去看固件库函数,基本上函数名字能告诉你这个函数的功能是什么,该怎么使用,这样开 发会方便很多。 任何处理器,不管它有多么的高级,归根结底都是要对处理器的寄存器进行操作。但 是固件库不是万能的,我们如果想要把STM32学透,光读STM32固件库是远远不够的。我们 还是要了解一下STM32的原理,了解STM32各个外设的运行机制。只有了解了这些原理,在 进行固件库开发过程中才可能得心应手游刃有余。只有了解了原理,才能做到“知其然知