基于CMSIS标准的Cortex-M3的应用软件开发

发布者:独享留白1028最新更新时间:2013-10-26 来源: eefocus关键字:软件接口  硬件抽象层  Cortex-M3 手机看文章 扫描二维码
随时随地手机看文章
引 言

  ARM公司于2008年11月12日发布了ARM Cortex微控制器软件接口标准(CMSIS:Cortex Microcon-troller Software InteRFace Standard)。CMSIS是独立于供应商的Cortex-M处理器系列硬件抽象层,为芯片厂商和中间件供应商提供了连续的、简单的处理器软件接口,简化了软件复用,降低了Cortex-M3上操作系统的移植难度,并缩短了新入门的微控制器开发者的学习时间和新产品的上市时间。

  根据近期的调查研究,软件开发已经被嵌入式行业公认为最主要的开发成本。图1为近年来软件开发与硬件开发成本对比图。因此,ARM与Atmel、IAR、Keil、hami-nary Micro、Micrium、NXP、SEGGER和ST等诸多芯片和软件厂商合作,将所有Cortex芯片厂商产品的软件接口标准化,制定了CMSIS标准。此举意在降低软件开发成本,尤其针对新设备项目开发,或者将已有软件移植到其他芯片厂商提供的基于Cortex处理器的微控制器的情况。有了该标准,芯片厂商就能够将他们的资源专注于产品外设特性的差异化,并且消除对微控制器进行编程时需要维持的不同的、互相不兼容的标准的需求,从而达到降低开发成本的目的。

 

  1 基于CMSIS标准的软件架构

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

   CMSIS层主要分为3部分。

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

  ②中间件访问层(MWAL):由ARM负责实现,但芯片厂商需要针对所生产的设备特性对该层进行更新。该层主要负责定义一些中间件访问的API函数,例如为TCP/IP协议栈、SD/MMC、USB协议以及实时操作系统的访问与调试提供标准软件接口。该层在1.1标准中尚未实现。

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

  2 CMSIS规范

  (1)文件结构

  CMSIS的文件结构如图3所示(以STM32为例)。其中stdint.h包括对8位、16位、32位等类型指示符的定义,主要用来屏蔽不同编译器之前的差异。core_cm3.h和core_cm3.C中包括Cortex_M3核的全局变量声明和定义,并定义一些静态功能函数。system_.h和system_.c(即图3中的system_stm32.h和system_stm32.c)是不同芯片厂商定义的系统初始化函数SystemInit(),以及一些指示时钟的变量(如SystemFre-quency)。.h(即图3中的stm32.h)是提供给应用程序的头文件,它包含core_cm3.h和system_.h,定义了与特定芯片厂商相关的寄存器以及各中断异常号,并可定制M3核中的特殊设备,如MCU、中断优先级位数以及SysTick时钟配置。虽然CMSIS提供的文件很多,但在应用程序中只需包含h。

   (2)工具链

  CMSIS支持目前嵌入式开发的三大主流工具链,即ARM ReakView(armcc)、IAR EWARM(iccarm)以及GNU工具链(gcc)。通过在core_cm3.C中的如下定义,来屏蔽一些编译器内置关键字的差异。 

  这样,CPAL中的功能函数就可以被定义成静态内联类型(static_INLINE),实现编译优化。

  (3)中断异常

  CMSIS对异常和中断标识符、中断处理函数名以及中断向量异常号都有严格的要求。异常和中断标识符需加后缀_IRQn,系统异常向量号必须为负值,而设备的中断向量号是从0开始递增,具体的定义如下所示(以STM32为例):

CMSIS对系统异常处理函数以及普通的中断处理函数名的定义也有所不同。系统异常处理函数名需加后缀_Handler,而普通中断处理函数名则加后缀_IRQHandler。这些异常中断处理函数被定义为weak属性,以便在其他的文件中重新实现时不出现重复定义的错误。这些处理函数的地址用来填充中断异常向量表,并在启动代码中给以声明,例如:NMI_Handler、MemManage_Handler、SysTick_Handler、WWDG_IRQHandler等。

 CMSIS对系统异常处理函数以及普通的中断处理函数名的定义也有所不同。系统异常处理函数名需加后缀_Handler,而普通中断处理函数名则加后缀_IRQHandler。这些异常中断处理函数被定义为weak属性,以便在其他的文件中重新实现时不出现重复定义的错误。这些处理函数的地址用来填充中断异常向量表,并在启动代码中给以声明,例如:NMI_Handler、MemManage_Handler、SysTick_Handler、WWDG_IRQHandler等。

      (4)数据类型

CMSIS对数据类型的定义是在stdint.h中完成的,对核寄存器结构体的定义是在core_cm3.h中完成的,寄存器的访问权限是通过相应的标识来指示的。CMSIS定义以下3种标识符来指定访问权限:_I(volatile const)、_O(volatile)和_IO(volatile)。其中_I用来指定只读权限,_O指定只写权限,_IO指定读写权限。

      (5)调 试

嵌入式软件开发中的一个基本需求就是能通过终端来输出调试信息,一般可通过2种方式实现:一种是使用串口线连接板上的UART和PC上的COM口,通过PC上的超级终端来查看调试信息;另一种则是采用半主机机制,但有可能不被所用的工具链支持。基于Cortex-M3核的软件调试突破了这样的限制,Cortex-M3内核提供了一个ITM(Instrumentation Trace Macrocell)接口,通过SWV(Serial Wire Viewer)可调试由SWO引脚接收到的ITM数据。ITM实现了32个通用的数据通道,基于这样的实现,CMSIS规定用通道0作为终端来输出调试信息,通道31用于操作系统的输出调试(特权模式访问)。在core_cm3.h中定义了ITM_SendChar()函数,因此可通过调用该函数来重写fputc,以在应用程序中通过printf打印调试信息,并可通过ITM Viewer查看这些调试信息。有了这样的实现,嵌入式软件开发者就可以在不配置串口和使用终端调试软件的情况下输出调试信息,在一定程度上减少了工作量。

      (6)安全机制

在嵌入式软件开发过程中,代码的安全性和健壮性一直是开发人员所关注的,因此CMSIS在这方面也作出了努力,所有的CMSIS代码都基于MISRA-C2004(Motor Industry Software Reliability Association forthe C programming language)标准。MIRSA-C 2004制定了一系列安全机制用来保证驱动层软件的安全性,是嵌入式行业都应遵循的标准。对于不符合MISRA标准的,编译器会提示错误或警告,这主要取决于开发者所使用的工具链。

      3 基于CMSIS标准的代码实现

CMSIS降低了代码开发的难度,为了更好地诠释这一点,下面以一个基于STM32微处理器的简单例子来说明。代码实现如下:

可以看到用户程序中仅需短短的几行代码就实现了定时器的功能,每隔1 S报数1次,并可通过ITM窗口查看输出的调试信息。其中SystemInit()用来初始化时钟,SysTick_Config()用来配置系统定时器,而SysTick_Han-dler()用来处理系统时钟异常,该异常每1 ms发生1次。由于重写了fputc(),所以可通过printf()函数将调试信息打印到ITM窗口上,输出结果如图4所示。

结 语

本文阐述了基于CMSIS标准的软件架构、规范,并通过一个实例更加清晰地解读了CMSIS作为一个新的基于Cortex-M核处理器系列的软件开发标准所具有的巨大潜力。它不仅降低了软件开发的难度,更减少了软件开发的成本。因此,工程师尽早掌握CMSIS标准,对进行基于Cortex-M3处理器的软件开发会大有帮助。

关键字:软件接口  硬件抽象层  Cortex-M3 引用地址:基于CMSIS标准的Cortex-M3的应用软件开发

上一篇:基于ARM和WinSock的多人对战游戏平台设计
下一篇:STM32F103系列微控制器在应用编程技术研究

推荐阅读最新更新时间:2024-03-16 13:29

自己动手用Cortex-M3与ADXL345做个重力感应遥控器
 已经是很久没有写文章了,因为没有时间,人家都说大四不考研,天天像过年,可我依旧没能有那份闲暇的时间。 现在几乎人人的手里都是一款安卓智能机这是我非常羡慕的,而我手里只有上学期用380元买的一台二手诺基亚N96,虽然也称得上智能机但是远远没有如今安卓智能的优秀,其中一个功能就是通过重力感应玩赛车游戏,我想这个大家都不陌生,只要把手机歪一歪斜一斜就可以控制赛车方向了,这个功能令桥哥好生羡慕嫉妒恨,可惜自己的手机不能玩,上周突来灵感何不自己做一个玩玩。正好上学期开始着手给侄子做的四轴飞行器的基板基本调试完成,核心的芯片就是一块M3微控器,一块三轴加速度传感器ADXL345,一块三轴数字陀螺仪。而要做一个简单的重力感应遥控器用M3结合A
[电源管理]
自己动手用<font color='red'>Cortex-M3</font>与ADXL345做个重力感应遥控器
基于ACR的硬件抽象层结构及关键技术研究
摘要:ACR使得大规模用户直接接入骨干高速网络,要求上层管理软件具有更高的灵活性,数据传输更加实时、高速。针对ACR接入方式的特点,讨论了硬件抽象层的实现方式及关键技术。   关键词:ACR(大规模接入汇聚路由器) 硬件抽象层 内部通信 虚拟驱动 目前,大多数路由器均采用分布式转发、集中式路由处理的体系结构 。该结构方式使主处理单元与各从处理单元可以根据所处位置及执行任务的不同采用不同的处理方式,但也使顶层管理软件对底层各从处理单元难以进行协调统一的管理。硬件抽象层HAL(Hardware Abstraction Layer)在逻辑上介于底层硬件与上层协议软件之间,维护两者之间的数据传递,并对底层各接口模块进行管理,屏蔽底层
[应用]
基于CORTEX-M3和CAN的印染机同步控制系统
0 引言 随着社会生活的发展,人们对现在的印染品的要求也越来越高,特别是布匹与包装外壳,那么对现代印染工艺的要求也越来越高。随着工艺的增加,对印染设备是个不小的挑战,这里面最主要的是大型印染联合机中多电机的同步控制问题。 在印染设备中,电机的同步控制主要有3方面决定:一是处理器对张力传感器数据的处理速度,以及电机对张力传感器的反应速度;二是不同的电机组之间机械性能的差异以及它们产生的实时同时控制问题;三是控制单元与各电机组之间的通信问题,包括速率,抗干扰等。传统印染联合机的做法是采用单片机加AD/DA芯片进行数据的处理与执行,也有为了提高数据的处理能力而采用DSP加单片机的做法。随着现在技术的发展,在研究了基于ARM的CO
[嵌入式]
Energy Micro新增12款Cortex-M3低功耗MCU
挪威奥斯陆,2011年7月12日 – 低功耗微控制器公司Energy Micro®日前公布了其QFP64封装的EFM32 Gecko和Tiny Gecko产品线。全新64引脚器件在不断发展的智能仪表市场特别受欢迎,此外还适用于其他对功耗敏感的应用,如楼宇自动化、安防系统和便携式健康医疗及健身设备。 此次,Energy Micro为ARM® Cortex™-M3架构新引入了12款大I/O引脚数的微控制器产品,提供从8K – 128K FLASH, 2K – 16K RAM。与EFM32 MCU系列的其他封装形式一样,EFM32G232、EFM32G842、EFM32TG232和EFM32TG842也提供低功耗的Gecko技术
[单片机]
ARM Cortex-M3 内核介绍
内核包含四部分:1.乘法器;2.控制逻辑;3.Thumb指令译码器;4.内部接口 CM3内部包含元素介绍: 1. DAP,调试访问接口,Debug Access Port。Cortex‐M3 的调试系统基于 ARM 最新的 CoreSight 架构。不同于以往的 ARM 处理器,内核本身不再含有 JTAG 接口。取而代之的,是 CPU 提供称为 调试访问接口(DAP) 的总线接口。通过这个总线接口,可以访问芯片的寄存器,也可以访问系统存储器,甚至是在内核运行的时候访问!对此总线接口的使用,是由一个调试端口(DP)设备完成的。DPs 不属于 CM3 内核,但它们是在芯片的内部实现的。目前可用的 DPs包括 SWJ‐DP(既支持传统的
[单片机]
Cortex-M3 的SVC、PendSV异常,与操作系统(ucos实时系统)
SVC异常是? PendSV异常是? ucos 任务切换时机? ucos 如何满足实时性(实现)? ucos中,systick的优先级? SVC和PendSV SVC(系统服务调用,亦简称系统调用)和PendSV(可悬起系统调用),它们多用于在操作系统之上的软件开发中。 SVC: SVC 用于产生系统函数的调用请求。 例如,操作系统不让用户程序直接访问硬件,而是通过提供一些系统服务函数,用户程序使用SVC 发出对系统服务函数的呼叫请求,以这种方法调用它们来间接访问硬件。 因此, 当用户程序想要控制特定的硬件时,它就会产生一个SVC 异常, 然后操作系统提供的SVC 异常服务例程得到执行, 它再调用相关的操
[单片机]
<font color='red'>Cortex-M3</font> 的SVC、PendSV异常,与操作系统(ucos实时系统)
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved