您的位置 首页 技术

ARM Cortex―M0/M0+单片机的指针变量替换办法

ARM Cortex―M0/M0+单片机的指针变量替换方法, 摘要:32位ARM Cortex-M0/M0+内核定位于“全面替代”各类8/16位微控制器(MCU)内核,其硬件

摘要:32位ARM Cortex-M0/M0+内核定坐落“全面代替”各类8/16位微控制器(MCU)内核,其硬件规划支撑运用16位短指针变量。现在干流的ARM编译器仅运用32位长指针变量,这关于资源有限的MCU来说十分糟蹋。为了优化指针变量的运用办法、节省RAM资源,本文给出一种替换长指针的办法,并以运转μC/OS-II为例,阐明替换作用。

导言

Cortex—M0/M0+是RISC类型的低端ARM内核,其指令集与高端ARM兼容,在功能、功耗和价格方面远优于传统的以8051、68S08/12等为代表的8/16位CISC(杂乱指令流)CPU。现在,参半导体厂商纷繁以之代替原有的8/16位MCU内核,32位ARM MCU全面代替8/16位MCU已是大势所趋。

Cortex—M0+将Cortex—M0的3级流水线简化为2级,并进一步下降功耗、进步功能,这些长处使得Cortex—M0+成为现在8/16位处理器较好的代替者。不过代替8/16位MCU的低端ARM往往内存资源十分有限,现在典型的Cortex—M0/M0+MCU往往仅有2 KB、4 KB或8 KB,最多16 KB片内RAM,Flash一般也不大于64KB。对这类MCU编程,运用短指针变量就够了。而现在ARM处理器的集成开发环境(IDE)中的C编译器,连续Cortex—M3/M4的运用传统,仍运用32位长指针变量。这无形中多占用了1倍的RAM资源。这儿以飞思卡尔ARM Cortex—M0+处理器中的Kine tis系列MCU为例,阐明怎么运用16位短指针代替32位长指针,以便在将原有的以8/16位MCU为中心的产品升级到选用32位ARM内核时,不添加体系开支。特别是若运用了实时操作体系,体系的内存会愈加严重。在专门面向Cortex—M0/M0+的集成开发环境(IDE)推出前,可运用本文供给的替换办法,以下降体系的RAM开支,提高体系的功能。

1 指针替换原理

32位ARM内核的内部寄存器都是32位的,其寻址空间能够到达4 GB,一般也应运用32位的地址指针。但在数据空间、程序空间和I/O空间都不大于64 KB的情况下,能够选用1个32位基地址加1个16位偏移量的办法,组成ARM需求的长指针。

以Cortex—M0+为内核的MCU,其SRAM、FLASH很少超越64 KB,一般运用16位的偏移量指针就能满意需求。

以Freescale公司的KL25Z128 MCU为例,有16 KBSRAM和128 KB FLASH存储空间。其SRAM的地址规模是0x1FFF_F000~0x2000_2FFF,运用16位的偏移量指针便能够满意寻址规模的要求。

图1阐明晰长指针替换办法的基本原理,经过运用一个32位的RAM基地址,完结原始32位肯定地址与相对基地址的16位相对偏移地址的彼此转化。

ARM Cortex—M0/M0+单片机的指针变量替换办法

其转化联系如下所示:

Address_32bits=Address_16bits+Address_base (1)

Address_16bits=Address_32bits_Address_base (2)

关于KL25Z128,Address_base基地址值可选择为0x1FFF F000。经过以上办法的转化,32位的地址空间0x1FFF_F000~0x2000_2FFF(16 KB)能够转化为16位的地址空间0x0000~0x3FFF(16 KB)。

2 指针替换计划

2.1 常量方式完成计划

以下运用Freescale公司引荐的IDE CodeWarriorv10.5予以阐明。

ARM Cortex—M0/M0+单片机的指针变量替换办法

程序中运用宏界说了一个32位常数的基地址,明显也能够运用一个全局变量或寄存器变量来存储基地址。在将长指针变量pt_addr_32转化为16位地址“指针”时,需先将指针变量pt_addr_32做强制类型转化,变为32位无符号数后再进行基地址扣除的核算。该段代码还声明晰一个16位无符号数的数据类型pointer_16,用来界说或存储16位地址偏移量,例如运用如下句子来界说一个16位的指针变量:

pointer_16 ptl6_data=addr_16(data);

ptl6_data的值就是指向data的16位“指针”(转化而成的16位地址偏移量值),编译器编译出的汇编代码如下所示:

ARM Cortex—M0/M0+单片机的指针变量替换办法

需求将16位地址转化为长指针时,以下面的整型数据赋值操作为例:

int temp=*(int*)(addr_32(ptl6_data));

数据data的值赋值给了变量temp,其间int数据类型能够替换成恣意其他的数据类型(例如unsigned int、unsigrted short、short、unsigned char、char等)。

2.2 高组寄存器优化计划

Cortex—M系列内核是专门为ARM MCU规划的,仅支撑无条件履行的Thumb指令。Cortex—M0/M0+运用ARMv6指令集,而Cortex-M3/M4运用ARMv7指令集。ARMv6对ARMv7做了高度简化,仅保留了其间56条指令。指令中除个别32位指令外,都是16位指令。Cortex—M0/M0+的内部寄存器结构与高端ARM兼容,但低端MCU运用往往不需求那么多寄存器,Cortex—M0/M0+仅供给了R0~R12共13个通用寄存器。这些通用寄存器分为两部分:低组寄存器(Low registers,R0~R7),高组寄存器(High registers,R8~R12)。Cortex—M0/M0+献身了很多面向高组寄存器的指令,尽量削减32位指令的运用。实际上Cortex—M0/M0+的指令会集仅有以下3条指令支撑高组寄存器R8~R12:

MOV ;寄存器间数据传送

ADD ;基地址+偏移量

CMP ;地址的比较

这儿Rd和Rm之一能够是高组寄存器。能够看出,关于高组寄存器,ARMv6仅保留了凹凸组寄存器间数据传递、不影响标志位的加法运算和独自的地址比较这3种操作,其用途明显是为了支撑将高组寄存器用于地址运算。

现在根据gcc的干流ARMC编译器对Cortex—M0/M0+的高组寄存器采纳尽量不予运用的战略,在界说指针变量时,仅运用长指针。而剖析ARMv6指令集的规划初衷,明显应该用高组寄存器和相关指令。这关于旨在代替8/16位MCU的低成本ARM器材十分必要。

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/xinpin/jishu/322425.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部