关于core_cm3.c和core_cm3.h,Core_cmFunc.h 和 Core_cmInstr.h的理解

发布者:火星最新更新时间:2024-04-15 来源: elecfans 手机看文章 扫描二维码
随时随地手机看文章

CMSIS是Cortex微控制器软件接口标准(CortexMicroController Software Interface Standard)的缩写,这个是ARM定制的一个用于Cortex-M系列的一个标准,主要是为了提供通用api接口来访问内核和一些片上外设,提高代码的可移植性。

CMSIS有三个层:核内外设访问层CorePeripheral Access Layer(CPAL),中间件访问层Middleware Access Layer(MWAL),设备访问层(DevicePeripheral Access Layer)。

CPAL用于访问内核的寄存器和组件,如NVIC,调试系统等。该层是由ARM实现的。

MWAL用于对中间件的访问,现在该层还未实现。(也不知道所谓的中间件是什么东西)。

DPAL用于定义一些硬件寄存器的地址和一些外设访问函数,由芯片制造商实现。

 

CPAL层的实现就是Core_cm3.c文件,DPAL层的实现就是system_stm32f10x.c文件(似乎还应该加上外设的函数库)。

 

接下来就来了解一下Core_cm3.c里面有什么东东:

首先是汇编关键字__ASM和__INLINE的宏定义,支持不同的编译器。由于使用的是Keil,所以就只看第一种,__CC_ARM。

这里面的函数调用都只符合ARM过程调用标准的,如R0到R3用作参数和返回值传递,这也是这里面唯一用到的。

此外,在Keil中使用了__asm关键字后,编译器不会为函数增加返回指令,所以需要自己编写返回命令,也就是每个函数后面的  bx lr。

1.     __ASM uint32_t__get_PSP(void):获取进程堆栈指针PSP。

2.     __ASM void__set_PSP(uint32_t topOfProcStack):设置PSP。

3.     __ASM uint32_t__get_MSP(void):获取主堆栈指针MSP。

4.     __ASM void__set_MSP(uint32_t mainStackPointer):设置MSP。

5.     __ASM uint32_t__REV16(uint16_t value):反转半字中字节顺序,如0xABCD反转后得到0xCDAB。

6.     __ASM int32_t__REVSH(int16_t value):反转字节顺序,并做符号拓展。就是在__REV16函数得到的结果上再进行一次符号拓展。这两个函数主要是方便进行大小端的切换。

7.     __ASM void__CLREX(void):清除由LDREX指令造成的互斥锁。LDREX和STREX是Cortex用来实现互斥访问,保护临界资源的指令,LDREX执行后,只有离它最近的一条存储指令(STR,STREX)才能执行,其他的存储指令都会被驳回,而CLREX就是用于清除互斥访问状态的标记。

8.     __ASMuint32_t  __get_BASEPRI(void):获取BASEPRI寄存器的值,优先级号高于该寄存器的中断都会被屏蔽(优先级号越大,优先级越低),为零时不屏蔽任何中断。

9.     __ASM void__set_BASEPRI(uint32_t basePri):设置BASEPRI的值。

10.  __ASM uint32_t__get_PRIMASK(void):PRIMASK是一个只有一位的寄存器,置位时屏蔽绝大部分的异常中断,只剩下NMI和HardFault可以响应。

11.  __ASM void __set_PRIMASK(uint32_tpriMask):设置PRIMASK的值。

12.  __ASM uint32_t __get_FAULTMASK(void):FAULTMASK也是一个只有一位的寄存器,为1时只有NMI才能响应,其他异常与中断全部被屏蔽。

13.  __ASM void __set_FAULTMASK(uint32_tfaultMask):设置FAULTMASK的值。

14.  __ASM uint32_t__get_CONTROL(void):获取CONTROL的值。寄存器CONTROL只有两位。CONTROL[0]选择特权级别,0为特权级,1为敌用户级。CONTROL[1]用于选择堆栈指针,0为MSP,1为PSP。

15.  __ASM void __set_CONTROL(uint32_tcontrol):设置CONTROL寄存器的值。

BASEPRI,PRIMASK,FAULTMASK,CONTROL都只能在特权模式下被修改。

还有两个文件,一个是Core_cmFunc.h 和 Core_cmInstr.h  这两个文件是干嘛的,第一个文件是不同编译器下的一些系统级的汇编函数,第二个文件是不同编译器下的指令,我猜Keil公司这样做是为了兼容不同的编译器做设计的。把这两个头文件在Core_cm3.h头文件里注释掉也是可以的。说明这两个头文件对于keil开发环境是不需要的。

最后剩下Core_cm3.h文件了,这个文件是内核文件,就是定义了一些Cortex-M3的寄存器和一些函数,包括NVIC,MPU,SCB,SysTick,Debug寄存器。

 

最近在看LPC17XX系列的东东,发现这个文章说得有一些不对(上面是复制别人的),我用的是MDK4.14版本的开发环境。

说说我对这几个文件的理解:

第一个:core_cm3.c是定义了一些兼容各个开发环境的一些内嵌汇编函数,都是关于M3内核寄存器操作的函数。其实这个函数在工程中根本没有使用到,用的是Core_cmFunc.h的汇编函数,因为Core_cmFunc.h里的函数和core_cm3.c差不多是一样的。不信自己建一个工程,调试一下就知道不是进去core_cm3.c,而是去Core_cmFunc.h执行的。所以core_cm3.h包含了Core_cmFunc.h 和 Core_cmInstr.h头文件。

第二个:core_cm3.h定义了兼容各种编译器的关于debug和NVIC的一些函数,这些函数在中断设置中是很好用的。其中还有系统节拍器函数。我觉得core_cm3.h和core_cm3.c是一点关系都没有的,虽然他们同名。担不是头文件和源文件的关系。当然这个文件一开头还有内核寄存器的定义。下面才能用操作内核寄存器。

第三个:Core_cmInstr.h定义了很多内核指令的函数,这个应该不常用,先不管。

第四个:Core_cmFunc.h和core_cm3.c是非常相似的,大多数函数连函数名都一样的,不知道为什么要这样做,实际用函数是在Core_cmFunc.h里的函数,甚至把core_cm3.c从工程里删除,都没有问题的。但是屏蔽core_cm3.h里的Core_cmFunc.h 和 Core_cmInstr.h,就不行了。说明这个core_cm3.c是没什么用的,起码在Keil开发环境下是没用的。

暂时研究到这里,后面开始实践咯,就是使用几个文件中的各种函数试试。

 

上面是转载的,经过测试,上面说的不完全对,在老版本的core_cm3.c文件中,是有调用的很多汇编指令的,但是新版的文件就入上面所说的实际情况,core_cm3.c和core_cm3.h不相关,所以这个也是挺奇怪的。


引用地址:关于core_cm3.c和core_cm3.h,Core_cmFunc.h 和 Core_cmInstr.h的理解

上一篇:lp17xx的iap的向量表区别
下一篇:Linux定时器的使用

推荐阅读最新更新时间:2024-11-21 11:20

TMS320C62X DSP的混合编程研究
摘要:目前,C语言和汇编语言的混合编程已经在TI公司的TMS320C62X上成为一种最流行的编程方法。阐述了基于TMS320C62X的C语言和汇编语言混合编程应遵循的接口规范以及并行汇编代码的编写。给出了一个基于TMS320C62X的运动补偿的混合编程设计实例。 关键词:DSP C语言 并行汇编 混合编程 TMS320C62X是美国德州仪器公司TI的新一代高性能定点数字信号处理器(DSP)芯片。基于DSP的软件设计问题,就是采用编程语言进行算法实现并使程序效率尽量满足实时性要求。TI DSP的软件设计可以采用汇编语言、高级语言C/C++以及C语言与汇编语言的混合编程。完全采用汇编语言编程复杂性高、开发周期长,而完全采用
[应用]
浅谈DS80C390双CAN总线监控系统的设计与实现
   1 引言   CAN总线的全称是ControllerAreaNetworkBus,简称控制器局部网总线,它是现场总线的一种,是一种有效支持分布式控制或实时控制的串行通信网络。CAN是控制器局域网络(Controller Area Network, CAN)的简称,是由研发和生产汽车电子产品着称的德国BOSCH公司开发了的,并最终成为国际标准(ISO118?8)。是国际上应用最广泛的现场总线之一。 在北美和西欧,CAN总线协议已经成为汽车计算机控制系统和嵌入式工业控制局域网的标准总线,并且拥有以CAN为底层协议专为大型货车和重工机械车辆设计的J1939协议。近年来,其所具有的高可靠性和良好的错误检测能力受到重视,被广泛应用于
[嵌入式]
基于单片机C8051F410的精确信号模拟电路设计
  引言   在对某型发射装置进行检测时.需要提供三组以11.50伏为基准的精确直流电压信号。为配合测试流程,这三组信号需要在不同的时段取18个不同的直流电压值,幅度分布在9.33-12.13伏范围之内。原有的测试仪采用22个精密电阻组成的分压器,配合波段开关选择来产生这18种不同的精确直流电压信号。这种设计方法价格昂贵,并且不能实现自动化检测,需要通过手工拨动波段开关来实现测试步骤的转换。为了实现对发射装置的自动测试。采用微机技术设计了新型的检测仪。新的检查仪以CPU模块为核心,通过程序控制D/A转换器来产生这三组精确直流电压信号,简化了设计,降低了成本,实现了测试步骤的自动切换。但是在检测仪的使用过程中发现经常出现重测合格
[单片机]
基于单片机<font color='red'>C</font>8051F410的精确信号模拟电路设计
C51单片机学习(二):中断系统和定时器
中断系统: 中断概念 CPU在处理某一事件A时,发生了另一事件B请求CPU迅速去处理(中断发生); CPU暂时中断当前的工作,转去处理事件B(中断响应和中断服务); 待CPU将事件B处理完毕后,再回到原来事件A被中断的地方继续处理事件A(中断返回),这一过程称为中断 。 中断的结构图 其中一些说明: 1、(P3.2)可由IT0(TCON.0)选择其为低电平有效还是下降 沿有效。当CPU检测到P3.2引脚上出现有效的中断信号时, 中断标志IE0(TCON.1)置1,向CPU申请中断。 2、(P3.3)可由IT1(TCON.2)选择其为低电平有效还是下降沿有效。当CPU检测到P3.3引脚上出现有效的中断信号时,中
[单片机]
<font color='red'>C</font>51单片机学习(二):中断系统和定时器
CKS32F103C8T6最小系统板调试记录——SWD下载
cks32f103是国产芯片,由中科芯研发,比起ST公司F103多了一个刹车功能 它有keil的器件安装包,支持keil的开发。 下载方式是:SWD方式 连接图 STLINK 烧写器引脚定义. 备注: 检查TVCC引脚是否有电压,如果没有电压就就外部引入供电线(如usb供电) 或者将ST-link v2 的19脚接回系统板的V3.3引脚 一定要接TVCC!
[单片机]
CKS32F103<font color='red'>C</font>8T6最小系统板调试记录——SWD下载
s3c2440 ads程序移植到keil中(三) 初步完成
如果我把参数配置发生改变呢 然后再一次编译 要包错误 如下所示 其实我们到这里离 在s3c2440 ads程序移植到keil中(二)中看到这个网友不值提供了方法 而且提供了几个文件的下载地址 http://download.csdn.net/detail/googlemi/5176844 我直接下载下来了 把其中的2440init.s文件直接拷贝复制替代我工作中的2440init.s 该错误消失了 但是出现了 这一个错误 反正修改就能解决 然后 提示了一个错误 意思 就nand.c和nand.h 没有加上去 让后加上去了 编译成功没有错误 这种方式到此结束
[单片机]
s3<font color='red'>c</font>2440 ads程序移植到keil中(三) 初步完成
C51的基础7《 文件的输入输出函数 》
1.2 文件的输入输出函数 键盘、显示器、打印机、磁盘驱动器等逻辑设备, 其输入输出都可以通过文件管理的方法来完成。而在编程时使用最多的要算 是磁盘文件, 因此本节主要以磁盘文件为主, 详细介绍Turbo C2.0提供的文件操作函数, 当然这些对文件的操作函数也适合于非磁 盘文件的情况。 另外, Turbo C2.0提供了两类关于文件的函数。一类称做标准文件函数也称缓冲型文件函数, 这是ANSI标准定义的函数; 另一 类叫非标准文件函数, 也称非缓冲型文件函数。这类函数最早公用于UNIX操作系统, 但现在MS-DOS3.0 以上版本的操作系统也可以 使用。下面分别进行介绍。 1.2.1 标准文件函数 标准文件函数
[单片机]
搭建测试环境——针对S3C6410开发板
(一)前言 目前市面上的开发板型号和种类很多,但目前最流行的是基于三星S3C6410 ARM11架构的开发板。国内很多厂商在S3C6410 ARM11架构的开发板的基础上进行了扩展,开发了扩展板,本博文针对OK6410-A开发板 S3C6410是由三星公司推出的一款低功耗、高性价比的RISC处理器,它基于ARM11内核(ARM1176JZF-S),可广泛应用于移动电话和通用处理等领域。 (二)安装串口调试工具:minicom OK6410开发板带了一个串口,可以通过串口线与PC连接,Linux驱动在输出调试信息的同时会通过串口线将调试信息发送到PC上,这样Linux驱动程序员就可以直接在PC上查看调试信息了。 minicom是一款
[单片机]
搭建测试环境——针对S3<font color='red'>C</font>6410开发板
小广播
设计资源 培训 开发板 精华推荐

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

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

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved