【转】CMSIS标准 (Cortex Microcontroller Software Interface Standard)

来源:互联网 发布:用友加密狗提取数据 编辑:程序博客网 时间:2024/06/03 17:31

4.1 CMSIS标准

ARM公司于2008年11月12日发布了ARMCortex微控制器软件接口标准CMSIS1.0。CMSIS是独立于供应商的Cortex-M处理器系列硬件抽象层,为芯片厂商和中间件供应商提供了简单的处理器软件接口,简化了软件复用工作,降低了Cortex-M上操作系统的移植难度,并减少了新入门的微控制器开发者的学习曲线和新产品的上市时间。
根据近期的调查研究,软件开发已经被嵌入式行业公认为最主要的开发成本,图4-1为近年来软件开发与硬件开发花费对比图。因此,ARM与Atmel、IAR、KEIL、LuminaryMicro、Micrium、NXP、SEGGER和ST等诸多芯片和软件工具厂商合作,将所有Cortex芯片厂商的产品的软件接口标准化,制定了CMSIS标准。此举意在降低软件开发成本,尤其针对进行新设备项目开发或将已有的软件移植到其他芯片厂商提供的基于Cortex处理器的微控制器的情况。有了该标准,芯片厂商就能够将他们的资源专注于对其产品的外设特性进行差异化,并且能够消除对微控制器进行编程时需要维持的不同的、互相不兼容的标准的需求,从而达到降低开发成本的目的。
这里写图片描述
CMSIS的现有标准是CMSIS2.0,与之前的版本有了一些新的变化。CMSIS2.0标准包含Cortex-M0、Cortex-M3、Cortex-M4以及SVD(SystemViewDescription)这四部分。目前,各芯片厂商也还没有都推出各自基于CMSIS标准的完整BSP包。但未来的Cortex-M处理器应用将统一在CMSIS的标准之下是一个不可避免的趋势。本节将以STM32F10x处理器为对象,介绍CMSIS2.0标准的Cortex-M3部分。

4.1.1 基于CMSIS标准的软件架构

基于CMSIS2.0标准的软件架构如图4-2所示。与CMSIS1.x版本相比,CMSIS2.0去除了中间层,增加了一个可选的外设访问函数(Access Functionsfor Peripherals)。
基于CMSIS标准的软件架构
从图4-2可以看到,基于CMSIS标准的软件架构主要分为以下四层:用户应用层,操作系统层,CMSIS层以及硬件寄存器层。其中CMSIS层起着承上启下的作用,一方面该层对硬件寄存器层进行了统一的实现,屏蔽了不同厂商对Cortex-M系列微处理器核内外设寄存器的不同定义,另一方面又向上层的操作系统和应用层提供接口,简化了应用程序开发的难度,使开发人员能够在完全透明的情况下进行一些应用程序的开发。也正是如此,CMSIS层的实现也相对复杂,下面将对CMSIS层次结构进行剖析。
CMSIS层主要分为以下3个部分:

  • 核内外设访问层(CPAL,Core Peripheral Access Layer):

    该层由ARM负责实现。包括对寄存器名称、地址的定义,内核寄存器、NVIC、调试子系统的访问接口定义以及对特殊用途寄存器的访问接口(例如:CONTROL,xPSR)定义。由于对特殊寄存器的访问以内联方式定义,所以针对不同的编译器ARM统一用__INLINE来屏蔽差异。该层定义的接口函数均是可重入的。

  • 片上外设访问层(DPAL,Device Peripheral Access Layer):

    该层由芯片厂商负责实现。该层的实现与CPAL类似,负责对硬件寄存器地址以及外设访问接口进行定义。该层可调用CPAL层提供的接口函数同时根据设备特性对异常向量表进行扩展,以处理相应外设的中断请求。

  • 外设访问函数(AFP,Access Functionsfor Peripherals):

    该层也由芯片厂商负责实现,主要是提供访问片上外设的访问函数,这一部分是可选的。
    对一个Cortex-M微控制系统而言,CMSIS通过以上三个部分实现了:

    • 定义了访问外设寄存器和异常向量的通用方法;
    • 定义了核内外设的寄存器名称和核异常向量的名称;
    • 为RTOS核定义了与设备独立的接口,包括Debug通道。

    这样芯片厂商就能专注于对其产品的外设特性进行差异化,并且消除他们对微控制器进行编程时需要维持的不同的、互相不兼容的标准需求,以达到低成本开发的目的。

4.1.2 CMSIS代码规范

基本规范

 1. CMSIS的C代码遵照MISRA2004规则。 2. 使用标准ANSIC头文件<stdint.h>中定义的标准数据类型。 3. 由#define定义的包含表达式的常数必须用括号括起来。 4. 变量和参数必须有完全的数据类型。 5. CPAL层的函数必须是可重入的。 6. CPAL层的函数不能有阻塞代码,也就是说等待、查询等循环必须在其他的软件层中。 7. 定义每个异常/中断的:          每个异常处理函数的后缀是_Handler,每个中断处理器函数的后缀是_IRQHandler。          默认的异常中断处理器函数(弱定义)包含一个无限循环。          用#define将中断号定义为后缀为_IRQn的名称。

推荐规范

  1. 定义核寄存器、外设寄存器和CPU指令名称时使用大写。
  2. 定义外设访问函数、中断函数名称时首字母大写。
  3. 对于某个外设相应的函数,一般用该外设名称作为其前缀。
  4. 按照Doxygen规范撰写函数的注释,注释使用C90风格(/* 注释*/) 或者C++风格(// 注释),函数的注释应包含以下内容:
    • 一行函数简介;
    • 参数的详细解释;
    • 返回值的详细解释;
    • 函数功能的详细描述。

数据类型及IO类型限定符

  • HAL层使用标准ANSIC头文件stdint.h定义的数据类型。
  • IO类型限定符用于指定外设寄存器的访问限制,定义如表4-1所列。
    这里写图片描述

CMSIS版本号

CMSIS标准有多个版本号,对于CortexM3处理器,在core_cm3.h中定义所用CMSIS的版本。
这里写图片描述

Cortex内核

对于CortexM3处理器,在头文件core_cm3.h中定义:
#define__CORTEX_M (0x03)
对于CortexM0处理器,在头文件core_cm0.h中定义:
#define__CORTEX_M (0x00)

工具链

CMSIS支持目前嵌入式开发的三大主流工具链,即ARM Reak View(armcc),IAR EWARM(iccarm)以及GNU工具链(gcc)。
通过在core_cm0.c中的如下定义,来屏蔽一些编译器内置关键字的差异。
这里写图片描述
这样CPAL中的功能函数就可以被定义成静态内联类型(static__INLINE),以实现编译优化。

4.1.3 CMSIS文件结构

CMSIS标准的文件结构如图4-3所示,下面将对其中各文件作简要介绍。
这里写图片描述

1. device.h

device.h由芯片厂商提供,是工程中C源程序的主要包含文件。其中“device”是指处理器型号,例如STM32F10x系列处理器对应的头文件是stm32f10x.h。它包含:

中断号的定义。

提供所有内核及处理器定义的所有中断及异常的中断号(IRQn)。例如stm32f10x处理器,中断号定义如下:
这里写图片描述

厂商实现处理器时CortexM核的配置。

CortexM处理器在具体实现时,有些部件是可选、有些参数是可以设置的,例如MPU、NVIC优先级位等。在stm32f10x.h中包含头文件core_cm0.h/core_cm3.h的预处理命令之前,需要先根据处理器的具体实现对以下参数做设置。
这里写图片描述

DPAL层。

提供所有处理器片上外设的定义,包含数据结构和片上外设的地址映射。一般数据结构的名称定义为“处理器或厂商缩写_外设缩写_TypeDef”,也有些厂家定义的数据结构名称为“外设缩写_TypeDef”。例如LPC17xx系列处理器的I2C寄存器组数据结构定义如下:
这里写图片描述
LPC17xx处理器I2C接口基地址定义如下:
这里写图片描述
访问LPC17xx处理器I2C接口的定义如下:
这里写图片描述

外设访问函数(可选)。

这些函数由芯片厂商提供,为访问片上外设提供帮助,它们可以作为内联函数,也可以在厂商提供的库中外部引用。

2. core_cm3.h和core_cm3.c

这两个文件是实现Cortex-M3处理器CMSIS标准的CPAL层。其中,头文件core_cm3.h定义Cortex-M3核内外设的数据结构及其地址映射,另外它也提供一些访问Cortex-M3核内寄存器及外设的函数,这些函数定义为静态内联。c文件core_cm3.c则定义了一些访问Cortex-M3核内寄存器的函数,例如对xPSR、MSP、PSP等寄存器的访问;另外还将一些汇编语言指令也定义为函数。

3. startup_device.s

汇编文件startup_device.s是在ARM提供的启动文件模板基础上,由各芯片厂商各自修订而成的,例如STM32F107处理器的启动代码文件就是startup_stm32f10x_c1.s,它主要有三个功能。

配置并初始化堆和栈,例如startup_stm32f10x_c1.s对堆和栈的配置如下:

这里写图片描述
这里写图片描述

定义中断向量表及相应的中断处理函数。例如,startup_stm32f10x_c1.s定义中断向量表如下:

这里写图片描述

4. system_.h和system_.c

system_.h和system_.c文件是由ARM提供模板,各芯片厂商根据自己芯片的特性来实现。一般是提供处理器的系统初始化配置函数,以及包含系统时钟频率的全局变量。按CMSIS标准的最低要求,system_.c中必须要定义SetSysClock和SystemCoreClockUpdate两个函数,和全局变量SystemCoreClock。

原创粉丝点击