
出版社: 清华大学
原售价: 128.00
折扣价: 98.56
折扣购买: ARM Cortex-M0与Cortex-M0+权威指南(第2版)/清华开发者书库
ISBN: 9787302473312
Joseph Yiu 英国ARM公司资深专家,12年半导体行业从业经历(在ARM公司工作15年以上)。曾参与多个处理器设计项目,包括ARM Cortex-M3和Cortex-M0,并参与了多种ARM IP(知识产权)产品的开发。Joseph Yiu为微控制器系统级设计专家,并涉猎了诸多相关领域,包括ARM Cortex-M系列微控制器软件开发、微控制器市场以及片上系统设计技术。其他代表性著作有《The Definitive Guide to the ARM Cortex-M3, 2nd Edition》、《The Definitive Guide to ARM Cortex-M3 and Cortex-M4 Processors, 3rd Edition》(中文翻译版均由清华大学出版社出版发行)。
第3章嵌入式软件开发介绍 3.1欢迎进入嵌入式系统编程 如果以前从未进行过微控制器编程,不用担心,做起来也不是很困难。事实上,ARM CortexM处理器使用起来非常容易,尽管本书涉及的处理器架构细节非常多,读者也不必了解全部内容或者成为应用设计专家。只要对C编程语言有基本的了解,很快就能在CortexM0和CortexM0+处理器上开发简单的应用。 如果使用过其他的微控制器,读者会发现在基于CortexM的微控制器上编程是非常容易的,由于多数寄存器(如外设)都已经进行了存储器映射,基本上整个程序都可以用C/C++实现,甚至中断处理也可以全部用C/C++编写。另外,和其他一些处理器架构不同,对于大多数的一般应用,无须使用编译器相关的语言扩展。 如果只有计算机软件的开发经验,读者会发现微控制器软件的开发有很大的不同。很多嵌入式系统中不存在任何操作系统(这些系统有时被称作裸机)并且没有计算机上的用户接口。 3.2基本概念 如果是第一次使用微控制器,那么请继续阅读; 如果已经进行过微控制器编程,则可以跳过本部分,直接进入3.3节。 首先介绍一些基本概念。 3.2.1复位 程序执行前,微控制器需要被复位到一种已知状态,复位一般由外部的硬件信号产生,例如开发板上的复位按钮(见图3.1),多数微控制器设备都有一个用于复位的输入引脚。 图3.1低成本微控制器板的复位连接示例(假定复位引脚为低有效) 对于基于ARM的微控制器,复位还可由连接到微控制器板的调试器产生,软件开发人员可以通过IDE(集成开发环境)对微控制器进行复位。有些调试适配器还可以利用调试接头上的特定引脚产生一次复位,对于ARM CortexM处理器,调试器可以通过调试连接产生复位请求。 复位信号无效后,微控制器硬件内部可能还需要等待一定的时间(如等待时钟振荡器稳定),之后处理器才会开始执行程序。这个延迟通常非常小,用户一般察觉不出来。 3.2.2时钟 几乎所有的处理器和数字电路都需要时钟信号才能运行,微控制器一般利用外部晶振来产生参考时钟。有些微控制器还具有内部振荡器(但是RC震荡等方式产生的输出频率不是很准确)。 对于许多现代微控制器,可以利用软件控制所使用的时钟源,并且通过编程锁相环(PLL)和时钟分频器来产生所需的各种频率。因此,微控制器电路可能具有12MHz的外部晶振,而处理器系统运行的时钟频率可能会高得多(如超过100MHz),同时有些外设运行的速度可能是分频后的数值。 为了降低功耗,许多微控制器都允许软件开/关每个振荡器和PLL,并且可以关掉每个外设的时钟信号。 3.2.3电压 所有的微控制器都需要电源才能运行,因此可以在微控制器上找到供电引脚。多数现代微控制器所需的电压都非常低,例如3V等,而有些则需要1.5V以下的电压。 如果要设计自己的微控制器开发板或者原型电路,需要确认正在使用的微控制器的数据手册以及微控制器连接部件的电压。例如,中继开关等一些外部接口可能需要5V的信号,若是接到3V微控制器产生的3V输出信号上则会无法工作。 如果是设计自己的开发板,还应该确保供电电压是校准过的,从电网供电到DC适配器的电压可能都是不准的,随时都可能会升高或降低,因此在未加稳压器的情况下,是不适合微控制器使用的。 3.2.4输入和输出 和个人计算机不同,多数嵌入式系统并不具备显示器、键盘和鼠标。可用的输入和输出可能仅限于简单的电子接口,例如数字和模拟输入输出(I/O)、UART、I2C以及SPI等。许多微控制器还提供USB、以太网、CAN、图形LCD以及SD卡接口,这些接口由微控制器内的外设控制。 对于基于ARM的微控制器,外设由经过了存储器映射的寄存器控制(访问寄存器的实例在本章的3.3.2节中介绍)。有些外设要比8位和16位微控制器中的外设更加复杂,在设置外设时会涉及更多的寄存器。 一般来说,外设的初始化过程由以下步骤组成: 编程时钟控制回路以使能连接到外设的时钟信号,如果需要还要设置相应的I/O引脚。对于许多低功耗微控制器,为了降低功耗,用于芯片中不同部分的时钟信号可以单独打开或关闭。多数时钟信号默认是关着的,在设置外设前需要对其进行使能。有些情况下,还需要使能总线系统的时钟信号。 进行I/O配置,多数微控制器会复用I/O引脚以实现更多的用途,为使外设接口正常工作,需要对I/O引脚进行设置(如复用器的配置寄存器)。另外,有些微控制器I/O引脚的电气特性也可以配置,这时需要在I/O配置时加入一些步骤。 外设配置,多数接口外设中存在多个用于行为控制的可编程寄存器,为使外设正常工作,通常需要遵循一定的编程顺序。 中断配置,若外设操作需要中断处理,则需要加入设置中断控制器(如CortexM处理器中的NVIC)的步骤。 为便于软件开发,多数微控制器厂商提供了外设/设备驱动库。虽然有设备驱动库,仍然有由应用决定的一定量的底层工作,例如,若需要用户接口,为了实现用户友好以及优秀的嵌入式系统,可能需要开发自己的用户接口函数(注: 还有用于创建GUI的商业版中间件)。但是,微控制器厂商提供的设备驱动库确实给嵌入式应用开发带来了方便。 对于大多数深度嵌入式系统的开发,丰富的用户接口是没有必要的。但是,LED、DIP开关以及按键等简单接口虽然只能传递一些基本的信息,为有助于软件调试,一个简单的文字输入/输出控制台程序还是非常有用的,可以通过微控制器上的UART接口,利用简单的RS232连接连到计算机上的UART接口(或者通过USB适配器)来实现。根据这种设计,我们可以利用终端应用实现微控制器上文字消息的显示以及用户输入(见图3.2)。要了解创建这种消息通信的细节,可以参考第17章和18章的内容。 图3.2利用UART接口实现用户输入和输出 3.2.5嵌入式软件程序流程介绍 应用处理流程有多种结构,这里只介绍一些基本概念,请注意,和计算机编程不同,多数嵌入式应用的程序流程都没有结束。 1) 轮询 对于简单的应用,轮询(见图3.3,有时也被称作超级循环)实现起来非常容易而且特别适合简单任务。 但是,当应用变得复杂且需要更高的处理性能时,轮询就不合适了。例如,如果某个进程需要花费较长的时间,则其他的进程可能在一段时间内无法得到服务。使用轮询的另外一个弊端在于,即使没有要处理的任务,处理器也必须一直执行轮询程序,这样降低了能耗效率。 图3.3简单应用处理的轮询方式 2) 中断驱动 对于有低功耗要求的应用,可以在中断服务程序中执行处理任务,在没有任务执行时,处理器就可以进入休眠模式。中断一般是外部或片上外设产生的,会将处理器唤醒。 在中断驱动的应用中(见图3.4),来自不同设备的中断可被设置为不同的优先级。即便是在低优先级的中断服务正在执行时,高优先级的中断也可以得到执行,而低优先级的中断则会暂时停止,因此高优先级中断的等待时间就变短了。 图3.4中断驱动应用 许多情况下,应用可以组合使用轮询和中断这两种方式,中断服务程序和应用进程可以利用软件变量进行信息传递(见图3.5)。 将外设处理任务分成中断服务程序和运行在主程序中的进程后,可以降低中断服务的持续时间,使得更低优先级的中断服务也能得到更多执行的机会。同时,系统仍然可以在没有任务需要执行时进入休眠模式。如图3.5所示,应用被分为进程A、进程B和进程C,但是有些情况下将应用分成单独的部分是不太容易的,可能需要写成一个较大的进程。尽管如此,外设中断也是可以执行的。 图3.5轮询和中断驱动应用的组合 3) 处理并发进程 有些情况下,应用进程需要花费相当长的时间才能结束,因此无法在如图3.5所示的一个大循环中处理。若进程A占用太长的时间,进程B和进程C就无法快速响应外设请求,这样可能会导致系统失败。常见的解决方案如下: (1) 将长的处理任务划分为多个状态,每次进程需要运行时,只执行一个状态。 (2) 利用实时操作系统(RTOS)管理多任务。 对于第一种方法(见图3.6),进程被分为了多个部分和跟踪进程状态的软件变量,进程每次执行时,都会更新状态信息,这样进程再执行时,就可以继续之前的处理了。 图3.6在应用循环内将进程分为多个部分 由于进程的执行路径变短,主循环中的其他进程就可以得到更多执行的机会。尽管处理所需的总时间不变(或者由于状态保存和恢复的开销而导致时间稍微增加),但系统的响应速度却提高了。然而,在应用变得更复杂时,拆分应用任务是不现实的。 对于更加复杂的应用,可能就会用到RTOS(见图3.7),RTOS在执行多个任务时将处理器执行时间分为多个时间片,并给每个任务分配相应的时间片。在每个时间片结束时,定时器会产生中断并触发确定是否应该执行上下文切换的RTOS任务调度器。如果需要执行上下文切换,任务调度器会暂停当前任务的执行,并切换到下一个准备就绪的任务。 因为可以保证所有任务在一定时间内执行,RTOS的使用提高了系统的响应速度,第20章中有使用RTOS的示例。 本书是系统论述ARM Cortex-M0与Cortex-M0+处理器及其编程的图书,作者Joseph Yiu是英国ARM公司的主管工程师,著有久负盛名的畅销图书《ARM Cortex-M3与Cortex-M4权威指南(第3版)》(清华大学出版社)。本书适合的读者对象包括:嵌入式产品设计工程师、嵌入式软件开发人员、电子爱好者以及学习嵌入式系统课程(ARM Cortex-M0与Cortex-M0+)的高年级本科生及研究生等。作者提供了详实的配书工程源文件(见封面下载地址)。 l 深度剖析系统模型、指令集以及中断处理,以利于理解ARM Cortex-M0与Cortex-M0+的工作方式; l 综合运用汇编语言和C语言实现的丰富的ARM Cortex-M0与Cortex-M0+编程案例,有助于快速动手实践; l 系统论述软件的开发流程,并以常用软件开发工具为例,介绍程序设计的实例及如何定位程序代码问题和软件移植等方面的知识; l 全面揭秘从其他架构处理器进行软件移植的方法,包括ARM7TDMI、ARM Cortex-M3以及8051微控制器移植的实例; l 深入解析Cortex-M0和Cortex-M0+处理器架构特性的差异(如非特权执行等级、向量表重定位); l 细致分析了Cortex-M0+处理器的优势,比如新的单周期I/O接口、更优的能耗效率、更高的性能以及微跟踪缓冲(MTB)特性; l 详尽介绍了软件开发工具方面的新内容,如Keil MDK版本5、IAR Embedded Workbench for ARM、ARM gcc、CooCox及mbed使用示例; l 提供了基于CMSIS-RTOS API的Keil RTX实时操作系统的新实例; l 提供了Cortex-M0和Cortex-M0+微控制器使用实例,包括Freescale Freedom板(FRDM-KL25Z)、STM32F0 Discovery、STM32L0 Discovery和NXP LPC1114(DIP封装)面包板等。