打印

什么是CMSIS标准----M3学习笔记

[复制链接]
2551|8
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
sunmeat|  楼主 | 2014-9-22 21:07 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 sunmeat 于 2014-9-22 21:17 编辑

【转载自网络】
Cortex微控制器软件接口标准(Cortex Microcontroller Software Interface Standard)是ARM和一些编译器厂家以及半导体厂家共同遵循的一套标准,是由ARM提出,专门针对CORTEX-M系列的标准。在该标准的约定下,ARM和芯片厂商会提供一些通用的API接口来访问CORTEX内核以及一些专用外设,以减少更换芯片以及开发工具等移植工作所带来的金钱以及时间上的消耗。只要都是基于M3的芯片,代码均是可以复用的。
根据近期的研究调查,发现在嵌入式开发领域,软件的花费在不断提高,相反硬件的花费却逐年降低,因此嵌入式领域的公司,越来越把精力放到了软件上,但软件在更换芯片或是开发工具的更新换代中,代码的重用性不高,随着CORTEX-M3处理器大量投放市场,ARM意识到建立一套软件开发标准的重要性,因此CMSIS应运而生。
沙发
sunmeat|  楼主 | 2014-9-22 21:08 | 只看该作者
CMSIS可以分为以下3个基本功能层
核内外设访问层 Core Peripheral Access Layer (CPAL)
中间件访问层  Middleware Access Layer (MWAL)
设备访问层   Device Peripheral Access Layer (DPAL)
Core Peripheral Access Layer (CPAL)
    该层用来定义一些CORTEX-M处理器内部的一些寄存器地址以及功能函数。如对内核寄存器,NVIC,调试子系统的访问。一些对特殊用途寄存器的访问被定义成内联函数或是内嵌汇编的形式。
    该层的实现由ARM提供。
Middleware Access Layer (MWAL)
    该层定义访问中间件的一些通用API,该层也由ARM负责实现,但芯片厂商需要根据自己的设备特性进行更新。目前该层仍在开发中,还没有更进一步的消息。
Device Peripheral Access Layer (DPAL)
     该层和CPAL层类似,用来定义一些硬件寄存器的地址以及对外设的访问函数。另外芯片厂商还需要对异常向量表进行扩展,以实现对自己设备的中断处理。该层可引用CPAL层定义的地址和函数,该层由具体的芯片厂商提供。

使用特权

评论回复
板凳
sunmeat|  楼主 | 2014-9-22 21:16 | 只看该作者
CMSIS文件结构
CMSIS首先对文件名的定义给出了标准
core_cm3.h :Cortex-M3 global declarations and definitions, static function definitions
core_cm3.c :Cortex-M3 global definitions
<device>.h :Top-level header file (device specific). To be included by application code.Includes core_cm3.h and system_<device>.h
system_<device>.h: Device specific declarations
system_<device>.c :Device specific definitions, e.g. SystemInit()
应用程序只需包含<device>.h 即可。

使用特权

评论回复
地板
sunmeat|  楼主 | 2014-9-22 21:16 | 只看该作者
CMSIS支持的工具链
CMSIS目前支持三大主流的工具链,即ARM RealView (armcc), IAR EWARM (iccarm), and GNU Compiler Collection (gcc).
   在core_cm3.h中有如下定义:
    /* define compiler specific symbols */
  #if defined ( __CC_ARM )
     #define __ASM __asm /*!< asm keyword for armcc */
     #define __INLINE __inline /*!< inline keyword for armcc */
#elif defined ( __ICCARM__ )
     #define __ASM __asm /*!< asm keyword for iarcc */
     #define __INLINE inline /*!< inline keyword for iarcc. Only
                                   avaiable in High optimization mode! */
     #define __nop __no_operation /*!< no operation intrinsic in iarcc */
#elif defined ( __GNUC__ )
     #define __ASM asm /*!< asm keyword for gcc */
     #define __INLINE inline /*!< inline keyword for gcc
#endif

使用特权

评论回复
5
sunmeat|  楼主 | 2014-9-22 21:16 | 只看该作者
MISRA-C
CMSIS要求定义的API以及编码与MISRA-  C 2004规范兼容。MISRA-C是由Motor Industry Software Reliability  Association提出的,意在增加代码的安全性,该规范提出了一些标准。
如Rule 12. 不同名空间中的变量名不得相同。
Rule 13. 不得使用char, int, float, double, long等基本类型,应该用自己定义的类型显示表示类型的大小,如CHAR8, UCHAR8, INT16, INT32, FLOAT32, LONG64, ULONG64等。
Rule 37. 不得对有符号数施加位操作,例如 1 << 4 将被禁止,必须写 1UL << 4;

使用特权

评论回复
6
sunmeat|  楼主 | 2014-9-22 21:17 | 只看该作者
MISRA-C
CMSIS要求定义的API以及编码与MISRA-  C 2004规范兼容。MISRA-C是由Motor Industry Software Reliability  Association提出的,意在增加代码的安全性,该规范提出了一些标准。
如Rule 12. 不同名空间中的变量名不得相同。
Rule 13. 不得使用char, int, float, double, long等基本类型,应该用自己定义的类型显示表示类型的大小,如CHAR8, UCHAR8, INT16, INT32, FLOAT32, LONG64, ULONG64等。
Rule 37. 不得对有符号数施加位操作,例如 1 << 4 将被禁止,必须写 1UL << 4;

CMSIS中的中断定义
中断号的定义,在<device.h>中
typedef enum IRQn
{
/****** Cortex-M3 Processor Exceptions Numbers *****、
NonMaskableInt_IRQn = -14, /*!< 2 Non Maskable Interrupt */
MemoryManagement_IRQn = -12, /*!< 4 Cortex-M3 Memory Mgmt Interrupt */
BusFault_IRQn = -11, /*!< 5 Cortex-M3 Bus Fault Interrupt */
UsageFault_IRQn = -10, /*!< 6 Cortex-M3 Usage Fault Interrupt */
SVCall_IRQn = -5, /*!< 11 Cortex-M3 SV Call Interrupt */
DebugMonitor_IRQn = -4, /*!< 12 Cortex-M3 Debug Monitor Interrupt */
PendSV_IRQn = -2, /*!< 14 Cortex-M3 Pend SV Interrupt */
SysTick_IRQn = -1, /*!< 15 Cortex-M3 System Tick Interrupt */
/****** Device specific Interrupt Numbers ***************************************/
UART_IRQn = 0, /*!< Example Interrupt */
} IRQn_Type;
系统级的异常号已经确定,不能更改,且必须为负值,以和设备相关的中断区别。
中断处理函数的定义,一般在启动代码中声明,加入weak属性,因此可在其他文件中再一次实现。如下所示:
AREA    RESET, DATA, READONLY
                EXPORT  __Vectors

__Vectors       DCD     __initial_sp              ; Top of Stack
                DCD     Reset_Handler             ; Reset Handler
                DCD     NMI_Handler               ; NMI Handler
                DCD     HardFault_Handler         ; Hard Fault Handler
                DCD     MemManage_Handler         ; MPU Fault Handler
                DCD     BusFault_Handler          ; Bus Fault Handler
                DCD     UsageFault_Handler        ; Usage Fault Handler
                DCD     0                         ; Reserved
                DCD     0                         ; Reserved
                DCD     0                         ; Reserved
                DCD     0              &nb

使用特权

评论回复
7
long009| | 2014-9-23 22:55 | 只看该作者
看看

使用特权

评论回复
8
54kim| | 2014-9-25 14:16 | 只看该作者
学习

使用特权

评论回复
9
530120101| | 2014-9-25 14:42 | 只看该作者

使用特权

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

本版积分规则

208

主题

2132

帖子

13

粉丝