打印
[牛人杂谈]

CMSIS简介

[复制链接]
1555|19
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
ARM公司于2008年11月12 日发布了ARM Cortex-M微控制器软件接口标准(CMSIS:CortexMicrocontroller
SoftwareInterface Standard)。CMSIS 是独立于供应商的Cortex-M微控制器系列硬件抽象层,为芯片厂商和中间件供应商提供了连续的、简单的微控制器软件接口,简化了软件复用,降低了Cortex-M0/M3/M4上操作系统的移植难度,并缩短了新入门的微控制器开发者的学习时间和新产品的上市时间。
根据近期的调查研究,软件开发已经被嵌入式行业公认为最主要的开发成本。图4.1.1 为近年来软件开发与硬件开发成本对比图。
因此,ARM 与Atmel、IAR、Keil、hami-naryMicro、Micrium、NXP、SEGGER和ST等诸多芯片和软件厂商合作,将所有 Cortex 芯片厂商产品的软件接口标准化,制定了CMSIS标准。此举意在降低软件开发成本,尤其针对新设备项目开发,或者将已有软件移植到其他芯片厂商提供的基于 Cortex微控制器的微控制器的情况。有了该标准,芯片厂商就能够将他们的资源专注于产品外设特性的差异化,并且消除对微控制器进行编程时需要维持的不同的、互相不兼容的标准的需求,从而达到降低开发成本的目的。

沙发
玛尼玛尼哄|  楼主 | 2017-5-30 08:24 | 只看该作者
如图所示,基于CMSIS 标准的软件架构主要分为以下 4层:用户应用层、操作系统及中间件接口层、CMSIS层、硬件寄存器层。其中CMSIS层起着承上启下的作用:一方面该层对硬件寄存器层进行统一实现,屏蔽了不同厂商对Cortex-M系列微控制器核内外设寄存器的不同定义;另一方面又向上层的操作系统及中间件接口层和应用层提供接口,简化了应用程序开发难度,使开发人员能够在完全透明的情况下进行应用程序开发。也正是如此,CMSIS层的实现相对复杂。

使用特权

评论回复
板凳
玛尼玛尼哄|  楼主 | 2017-5-30 08:24 | 只看该作者
CMSIS 层主要分为3部分:
1核内外设访问层(CPAL:Core Peripheral Access Layer):由ARM负责实现。包括对寄存器地址的定义,对核寄存器、 NVIC、调试子系统的访问接口定义以及对特殊用途寄存器的访问接口(如 CONTROL和xPSR)定义。由于对特殊寄存器的访问以内联方式定义,所以 ARM 针对不同的编译器统一用__INLINE来屏蔽差异。该层定义的接口函数均是可重入的。
2中间件访问层(MWAL:Middleware Access Layer):由arm 负责实现,但芯片厂商需要针对所生产的设备特性对该层进行更新。该层主要负责定义一些中间件访问的 API函数,例如为 TCP/IP协议栈、SD/MMC、USB 协议以及实时操作系统的访问与调试提供标准软件接口。该层在1.1 标准中尚未实现。
3设备外设访问层(DPAL:Device Peripheral Acess Layer):由芯片厂商负责实现。该层的实现与 CPAL类似,负责对硬件寄存器地址以及外设访问接口进行定义。该层可调用 CPAL 层提供的接口函数,同时根据设备特性对异常向量表进行扩展,以处理相应外设的中断请求。
对一个 Cortex-M 微控制系统而言,CMSIS 通过以上三个部分实现了:
        定义了访问外设寄存器和异常向量的通用方法;
        定义了核内外设的寄存器名称和核异常向量的名称;
        为 RTOS 核定义了与设备独立的接口,包括 Debug 通道。
这样芯片厂商就能专注于对其产品的外设特性进行差异化,并且消除他们对微控制器进行编程时需要维持的不同的、互相不兼容的标准需求,以达到低成本开发的目的。

使用特权

评论回复
地板
玛尼玛尼哄|  楼主 | 2017-5-30 08:25 | 只看该作者
CMSIS 文件的规范
        基本规范
        CMSIS 的 C 代码遵照 MISRA 2004 规则。
        使用标准 ANSI C 头文件<stdint.h>中定义的标准数据类型。
        由#define 定义的包含表达式的常数必须用括号括起来。
        变量和参数必须有完全的数据类型。
        CPAL 层的函数必须是可重入的。
        CPAL 层的函数不能有阻塞代码,也就是说等待、 查询等循环必须在其他的软件层中。
        定义每个异常/中断的:
        每个异常处理函数的后缀是_Handler,每个中断处理器函数的后缀是_IRQHandler。
        默认的异常中断处理器函数(弱定义)包含一个无限循环。
        用#define 将中断号定义为后缀为_IRQn 的名称。
        推荐规范
        定义通用寄存器、外设寄存器和 CPU 指令名称时使用大写。
        定义外设访问函数、中断函数名称时首字母大写。
        对于某个外设相应的函数,一般用该外设名称作为其前缀。
        按照 Doxygen 规范撰写函数的注释,注释使用 C90 风格(/* 注释 */) 或者 C++风格(// 注释),函数的注释应包含以下内容:
        一行函数简介。
        参数的详细解释。
        返回值的详细解释。
        函数功能的详细描述。

使用特权

评论回复
5
玛尼玛尼哄|  楼主 | 2017-5-30 08:26 | 只看该作者
Ø  文件结构
CMSIS 的文件结构如图所示(以NuMiroM451为例)。其中 stdint.h 包括对8位、16位、32 位等类型指示符的定义,主要用来屏蔽不同编译器之前的差异。core_cm4.h中包括Cortex-M4核的全局变量声明和定义,并定义一些静态功能函数。M451Series.h定义了与特定芯片厂商相关的寄存器以及各中断异常号,并可定制Cortex-M4核中的特殊设备,如MCU、中断优先级位数以及寄存器定义。 虽然 CMSIS提供的文件很多,但在应用程序中只需包含.h。

使用特权

评论回复
6
玛尼玛尼哄|  楼主 | 2017-5-30 08:27 | 只看该作者
Ø  数据类型及I/O 类型限定符
HAL 层使用标准 ANSIC 头文件 stdint.h定义的数据类型。 I/O类型限定符用于指定外设寄存器的访问限制
  
I/O类型限定符
  
#define
描述
__I
volatile const
只读
__O
volatile
只写
__IO
volatile
读写

使用特权

评论回复
7
捉虫天师| | 2017-5-30 14:44 | 只看该作者
这个才好统一编程。

使用特权

评论回复
8
zhuomuniao110| | 2017-6-5 18:15 | 只看该作者
如果没有这个,搞ARM会很麻烦。

使用特权

评论回复
9
huangcunxiake| | 2017-6-5 19:07 | 只看该作者
这个必须掌握,要不老费劲了。

使用特权

评论回复
10
huangcunxiake| | 2017-6-5 19:07 | 只看该作者
基于 Cortex微控制器的微控制器的情况。也方便移植到不同的硬件。

使用特权

评论回复
11
玛尼玛尼哄|  楼主 | 2017-6-6 16:59 | 只看该作者
可以找个相关手册,详细了解了解,很重要。

使用特权

评论回复
12
heisexingqisi| | 2017-6-7 17:36 | 只看该作者
受教了,这个统一了好多单片机的接口。

使用特权

评论回复
13
yyglucky| | 2017-6-14 15:22 | 只看该作者

使用特权

评论回复
14
玛尼玛尼哄|  楼主 | 2017-6-16 12:41 | 只看该作者
想掌握好库函数开发,必须了解这个。

使用特权

评论回复
15
wahahaheihei| | 2017-6-16 19:52 | 只看该作者
有了该标准,芯片厂商就能够将他们的资源专注于产品外设特性的差异化

使用特权

评论回复
16
zhuomuniao110| | 2017-6-16 21:58 | 只看该作者
漂亮,听说ARM开发了个RTOS。

使用特权

评论回复
17
yyglucky| | 2017-6-17 16:17 | 只看该作者

使用特权

评论回复
18
捉虫天师| | 2017-6-17 21:21 | 只看该作者
分层的架构,方便程序的迁移。

使用特权

评论回复
19
BTS| | 2017-7-18 14:11 | 只看该作者
软件接口标准标准化了,方便程序移植和开发

使用特权

评论回复
20
yiyigirl2014| | 2017-7-18 19:31 | 只看该作者
那个DSP库函数教程的贴谁见了?

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

157

主题

3007

帖子

2

粉丝