新闻中心

EEPW首页 > 嵌入式系统 > 设计应用 > ARM Cortex―M0/M0+单片机的指针变量替换方法

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

作者:时间:2016-09-12来源:网络收藏

实际上,应用程序中可通过MOV指令将R8~R11初始化成“寄存器常数”,而以后不再改变它们的值。例如可以令:

R8,=0 用于低寄存器的快速清零

R9,=基地址 用于拼接长指针

R10,=I/O模块基地址

R11,=库函数基地址

当FLASH存储器空间不大于64 KB时,函数指针无需设定基地址,可以直接使用低16位作为16位指针。对于超过64 KB的FLASH,可以使用库函数基地址,采用类似分页的方法实现16位

最后一个高组寄存器R12可在响应中断时和R0~R3,PC、SP一同自动入栈,是用户可以使用的寄存器变量。

2.1节中提出的宏定义方案形式上简单清楚,但展开后需要多条指令才能完成。将Address_base作为寄存器变量,存放在R8~R12中的某个高组寄存器中,而不是使用宏定义常量或全局变量。由于C语言不能直接对通用寄存器进行操作,需通过将汇编嵌入到C语言中实现长指针的替换。在程序初始化时,将R8~R12中的一个寄存器初始化为Address_base的值,例如下面给出的语句:

asm(“LDR r1,=0x1ffff000”);//R1=基地址

asm(“MOV R9,R1”);//R9=R1,即基地址

R9寄存器初始化后无需再修改,是一个“寄存器常数”。对于已经存储在R0中的长指针,则使用如下汇编代码,很容易将其转化为16位地址:

asm(“MOV R1,R9”);//R1=基地址

asm(“SUB R0,R0,R1”);//R0=R0-R1,R0低16位即16位

//短指针值

代码首先将R9寄存器存储的基地址转移到R1寄存器,随后利用单条指令完成从R0寄存器所存长指针值减去R1中存储的基地址,并将所得结果保存在R0中。执行完成后,R0低16位便是转化后的16位地址。16位地址转化为长指针是类似的转化形式(SUB指令换为ADD指令),在此不再赘述。这种方法充分利用了内核提供的高组寄存器,并且简化了指针转化的算法,减少了所需指令的数目,提高了运行效率,缩短了转换时间,降低MCU因而产生的时间损失。转换所需指令数目也压缩到两条,减少转换过程所带来的额外指令代码的存储空间开销。

3 结果

μC/OS(含μC/OS-II、μC/OS—III)是适用于低成本MCU的多任务实时内核。以μC/OS为例,当最大任务数为10时,整个内核需使用12个全局指针型变量,而非指针型变量仅需占用8字节空间。若使用默认的长指针模式,共需12×4+8=56字节;若改用短指针,则需使用12 ×2+8=32字节。任务数目、任务间通信机制增多时,指针变量的使用将更频繁,本文介绍的方法所节约的空间也更加显著。在Cortex-M0/M0+处理器替代8/16位MCU的应用中,非常有必要使用短指针。

最新版本的μC/OS—III针对带有计算前导零硬件指令(CLZ)的Cortex—M3/M4处理器进行了重大改进,提高了其优先级任务搜索的效率。但Cortex—M0/M0+的ARMv6指令集简化掉了CLZ指令,故不适宜使用μC/OS—III。这里以运行μC/OS—II v2.92(最多256个任务)为例,说明指针替换效果。实际上对于内存紧张的MCU,μC/OS—II v2.82及以下的版本(最多64个任务)就足够用了。

μC/OS—II每个任务都需要使用任务控制块TCB(Task Control Block)的数据结构,来维护任务相关的信息。在μC/OS—II v2.92中,每个任务的TCB数据结构包含9个指针变量,采用本文描述的16位指针替换方法后,每个任务控制块均可以节省18字节的RAM空间。在μC/OS—II中还存在很多数据结构,均包含着大量的指针变量。这些数据结构采用本文描述的方法所节约的RAM空间如表1所列。

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

可以看出,以16位短指针替代ARM编译器默认的32位长指针,能使Cortex—M0/M0+MCU对RAM资源的占用接近8/16位MCU。这一点对“全面替代”是十分重要的。

结语

以ARM Cortex-M0/M0+为内核的32位MCU以其性能、功耗和价格的优势,“全面替代”以8051/52、68S08/12等为代表的8/16位MCU已是大势所趋。而目前主流ARM IDE中的C编译器仅支持长指针变量。若将原有的8/16位MCU应用程序移植到内存资源相当的ARM MCU上,大量长指针变量的使用可能会导致RAM资源不足,而改用更大内存的MCU无疑会增加产品成本。通过使用Cortex—M0/M0+内核的高组寄存器操作指令,可以实现长短指针的转换,极大地节约RAM占用量,为既有应用的顺利移植提供帮助。

当然,长短指针的转换操作会带来额外的运行时间的开销,转换指令也带来代码存储量的增加。在一定程度上,这种方法是通过增加程序存储量和运行周期的代价来换取数据存储量的减少。由于ARM精简指令集的结构,其指令编码长度和执行速度上都有提升,可以部分抵销程序存储量和运行周期的开销,而数据存储量的矛盾则更加突出和棘手。本文介绍的方法对此作出了有益尝试。

本文介绍的方法需要对已有代码进行一定的改造,笔者希望ARM编译器能尽快提供面向Cortex—M0/M0+内核的短指针优化编译选项,为完成ARM对8/16位MCU内核的“全面替代”提供良好的支持。


上一页 1 2 下一页

评论


相关推荐

技术专区

关闭