2_嵌入式软件开发简介

  • Post author:
  • Post category:其他




嵌入式软件开发简介



常用软件流程



轮询方式

对于简单的应用,处理器可以等待数据准备好后进行处理,再继续等待,这种方式容易实现且适用于简单任务,如下图所示:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gXP0A12i-1616487841652)(en-resource://database/2041:1)]

轮询方式非常适合简单应用,但是当应用程序变得复杂时,轮询的设计和维护会非常困难,会导致反应缓慢。



中断驱动方式

轮询还有一种缺点,能耗效率差,因此为了解决这个问题,微控制器会提供休眠模式以降低功耗,休眠模式下,外设在需要服务时,可以将处理器唤醒,这通常称为中断驱动的应用程序。如下图所示:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-EiyoRovD-1616487841655)(en-resource://database/2043:1)]

在中断驱动的应用中,不同外设的中断可以被指定为不同的中断优先级,如重要的外设可以设定为较高的优先级,这样若中断发生时,处理器正在处理低优先级的中断,低优先级中断会被暂停,更高优先级的中断服务程序会立刻执行,这样就有较快的响应。

多数情况下,外设服务的数据处理可以分为两部分:第一部分需要快速处理,另一部分可以处理的慢一点。这种时候,需要将中断驱动和轮询结合起来,当外设需要服务时,像中断驱动的应用一样触发一个中断请求,这个中断服务执行后,通过更新某些变量,使第二部分在轮询的应用中执行。这样可以减小高优先级中断的持续时间,从而让低优先级的中断服务也可以更快的执行,同时不需要处理时,处理器还可以进入休眠状态以降低功耗。如下图所示:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-CJAELdQ6-1616487841657)(en-resource://database/2045:1)]



多任务系统

当应用更加复杂时,轮询和中断驱动的架构未必能满足需求,如有些执行时间长的任务需要同步处理的时候。这个时候就可以使用RTOS实时操作系统来处理任务调度。RTOS可以将处理器时间分为多个时间片并将时间片分给所需的进程,以实现多个进程同时执行。需要一个定时器来记录RTOS的时间,而且在每个时间片的最后,定时器会产生定时中断,它会触发任务调度其且确定是否要执行上下文切换。若需要执行,则当前正在执行的任务会被暂停,处理器转去执行另一个任务。如下图所示:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ftX7ZP8a-1616487841661)(en-resource://database/2047:1)]



C程序中的数据类型

C编程语言支持多种标准数据类型,不过数据在不同的硬件中的表示方式取决于处理器架构和C编译器。对于不同的处理器架构,数据类型的大小可能时不一样的。如整数在8位或者16位的微控制器上一般是16位,在ARM架构上则总是32位。下图列出了ARM架构中常见的数据类型。在ARM变成中,还可以用

byte、half word、word、double word

来表示

单字节、双字节、四字节、八字节

。[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-32689abM-1616487841665)(en-resource://database/2049:1)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-VNU1gPhF-1616487841670)(en-resource://database/2051:1)]



Cortex微控制器软件接口标准(CMSIS)



CMSIS简介

CMSIS由ARM开发,它使得微控制器和软件供应商可以使用一致的软件结构来开发Cortex微控制器软件。

CMSIS的目标包括:

  • 提高软件重用性,在不同的Cortex-M工程间重用软件代码更加容易。
  • 提高软件兼容性,由于有统一的软件架构,不同的来源的软件可以配合工作,降低了集成的风险。
  • 易于学习,CMSIS允许使用C语言访问处理器的内核特性,另外如果了解了一种Cortex-M微控制器产品,由于软件编写的一致性,使用另一种产品也会非常容易。
  • 独立于工具链,符合CMSIS的设备驱动可用于多种编译工具。
  • 开放性,任何任都可以下载和查看CMSIS的核心文件的源代码。

随着CMSIS的不断更新,现在已经成为了

CMSIS-Core

,其他的CMSIS项目也已经启动:

  • CMSIS-Core。应用程序或中间件开发者用的一组API,可以访问Cortex-M的处理器特性,无需考虑使用的是什么微控制器设备或工具链。目前

    CMSIS-Core

    支持

    Cortex-M0、Cortex-M0+、Cortex-M3、Cortex-M4

    等产品,由于架构相同,

    Cortex-M1

    也可以使用

    Cortex-M0

    版本的CMSIS。
  • CMSIS-DSP库。用于创建Cortex-M 微控制器上的DSP应用。
  • CMSIS-SVD。CMSIS系统试图描述,基于XML语言格式,用于描述微控制器产品的外设集。调试工具可以根据SVD文件来快速构建外设试图。
  • CMSIS-RTOS。专门为运行在Cortex-M微控制器上的嵌入式OS的API,可以使开发出来的中间件和软件用于多个嵌入式OS平台。
  • CMSIS-DAP。 调试访问端口,为调试接口适配器的参考设计,支持USB到JTAG/串行协议的转换。



CMSIS-Core所做的标准化

从软件开发角度来讲,CMSIS-Core做了很多方面的规范。



处理器外设的标准化定义

包括嵌套向量中断控制器

NVIC

的寄存器、处理器中的系统节拍定时器

SysTick

、可选的存储器保护单元

MPU

、系统控制块

SCB

中的多个可编程寄存器以及一些和调试特性相关的软件可编程寄存器。

注意:有些Cortex-M4的寄存器在Cortex-M3中是不可用的,同理,Cortex-M3 和Cortex-M4中的一些寄存器在Cortex-M0中也是不可用的。



访问处理器特性的标准化函数

包括使用

NVIC

进行中断控制的多个函数和访问处理器中特殊寄存器的函数。如果需要的话,也可以直接访问寄存器,而使用这些函数进行编程有助于提高软件的可移植性。



操作特殊指令的标准化函数

Cortex-M处理器支持几个用于特殊目的的指令,如等待中断

WFI

用于进入休眠模式,这些指令无法使用普通的

IEC/ISO C

生成。

CMSIS提供了一组函数,C程序代码可以用这些函数实现特殊指令,如果没有这些函数,用户必须使用工具链相关的解决方案,如用内在函数或内联汇编,才能将特殊指令插入应用程序中,这会降低软件的可用性。



系统异常处理的标准化命名

多个系统异常类型在Cortex-M处理器架构中有所体现,通过赋予这些系统异常处理标准化的命名,开发适用于多种Cortex-M产品的软件会更加容易。对于嵌入式OS开发者尤为重要,因为嵌入式OS需要使用一些系统异常。



系统初始化的标准函数

对于多数具有丰富特性的微控制器产品,在应用程序开始前都要配置时钟电路和电源管理寄存器。在符合CMSIS的设备驱动库中,这些配置过程由SystemInit()实现。很显然,该函数的实现是设备相关的,需要适应多种工程需求。不过由于有了标准的函数名、函数的标准使用方式以及函数的标准位置,设计者可以很容易的开始使用Cortex-M微控制器。



时钟频率的标准化的变量

有时应用程序代码需要直到系统当前的时钟频率,CMSIS-Core中定义了一个软件变量

SystemCoreClock

(用于CMSIS的1.3或者更新的版本,之前为

SystemFreq

)。



CMSIS-Core的组织结构

一般来说,可以将CMSIS定义为以下几层:

  • 内核外设访问层。名称定义,地址定义及访问内核寄存器和内核外设的辅助函数,这是处理器相关的,由ARM提供。
  • 设备外设访问层。名称定义,外设寄存器的地址定义及包括中断分配、异常向量定义等的系统设计,这是设备相关的,一般由设备供应商提供。
  • 外设犯我跟函数。访问外设的驱动代码。供应商相关,并且是可选的。再开发应用程序时,可以选择使用微控制器供应商提供的外设驱动代码。

各层的角色如下图所示:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3lpGRTh5-1616487841672)(en-resource://database/2053:1)]



如何使用CMSIS-Core

CMSIS文件位于微控制器供应商提供的设备驱动软件包中,因此再使用微控制器供应商提供的设备驱动库时,就已经在使用CMSISl了。

一般来说,需要做到下面几点:

一、 将源文件添加到工程中。

  • 设备相关、工具链相关的启动代码,C或者汇编。
  • 设备相关的设备初始化代码,如

    system_<device>.c

  • 用于外设访问功能的其他供应商相关的源文件,这是可选的。

二、将头文件添加到搜索路径中。

  • 用于外设寄存器定义和中断分破诶定义的设备相关的头文件,如

    <device>.h

  • 用于设备初始化代码的设备相关的头文件,如

    system_<device>.h

  • 多个处理器相关的头文件,如

    core_cm3.h、core_cm4.h

    ,这对于所有的微控制器供应商是相同的。
  • 其他可选的用于外设访问的供应商相关的头文件。

下图为使用CMSIS的驱动库的典型的工程设置:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0gTq0DwD-1616487841675)(en-resource://database/2055:1)]



CMSIS源代码包获取


https://developer.arm.com/tools-and-software/embedded/cmsis