基于ARM的高效C语言编程

发布者:PositiveVibes最新更新时间:2021-01-14 来源: eefocus关键字:ARM  C语言  编程 手机看文章 扫描二维码
随时随地手机看文章

引言


ARM处理器以其高性能、低功耗、低成本等优势被广泛应用于各种成功的32位嵌入式系统中。提高执行速度和减小代码尺寸是嵌入式软件设计的关键需求。尽管大多数的ARM编译器和调试器都带有性能优化工具,但是为了保证其正确性,编译器必须是稳妥和安全的,而且它还受到处理器自身结构的限制。因此,编程人员必须在理解编译器工作特点的基础上来实现代码优化。代码的优化方法较多,本文针对函数优化方法进行阐述。


1 函数局部变量的数据类型


局部变量包括函数内局部变量、函数参数、函数返回值。由于ARM数据操作都是32位,即使数据本身只需要8位或16位,对于这三类局部变量也应尽可能使用32位的数据类型int或long,以提高代码执行效率。下面以简单求和函数为例进行分析。


函数add1计算包含10个字的数组array的累加和,add2与add1功能相同,只是将函数add1的参数array类型改为16位的short,函数内局部变量i类型改为8位的char,sum改为16位的short。add1、add2的C源代码如下:


int add1(int *array){


unsigned int i;


int sum=0;


for(i=0;i<10;i++)


sum=sum+array[i];


return sum;


}


short add2(short *array){


char i;


short sum=0;


for(i=0;i<10;i++)


sum= sum+array[i];


return sum;


}


add1经编译产生的汇编代码:


add1


mov r2,r0


mov r0,#0


mov r1,#0


add1_loop


ldr r3,[r2,r1,lsl #2]


add r1,r1,#1


cmp r1,#0x0a


add r0,r3,r0


bcc add1_loop


mov pc,r14


add2经编译产生的汇编代码:


add2


mov r2,r0


mov r0,#0


mov r1,#0


add2_loop


add r3,[r2,r1,lsl #1];增加语句①


ldrh r3,[r3,#0]


add r1,r1,#1


and r1,r1,0xff;增加语句②


cmp r1,#0x0a


add r0,r3,r0


bcc add2_loop


mov r0,r0,lsl #16;增加语句③


mov r0,r0,asr #16;增加语句④


mov pc,r14


比较add1和add2两个函数的汇编代码,可以发现add2_loop循环比add1_loop循环增加了4条语句。


语句①:函数add2中变量sum为16位short类型,ARM指令中ldrh指令不支持移位地址偏移,因此增加add指令计算数组下标地址。


语句②:由于函数add2中循环变量i为8位的char类型,而ARM处理器的寄存器为32位,此语句用于处理循环变量累加过程中引起的溢出问题。即:当i累加到255时,再加1应该为0,而不是256。


语句③、④:函数add2中返回结果sum为short类型,在返回前需将32位寄存器的前16位用符号位填充,即转换为16位short类型。


2 函数局部变量的个数


为了加快程序的执行速度,函数编译时应尽可能将局部变量都分配在寄存器中。*部变量多于可用的寄存器时,编译器会将多余的变量压入堆栈(即存入存储器中),因此必须控制局部变量的个数。


ARM处理器采用RISC结构,带有丰富的内部寄存器。在编译器使用apcs开关选项,即支持ATPCS(ARMThumb Procedure CallStandard)标准时,理论上有14个寄存器(R0~R12,R14)可以用来存放局部变量。但是实际上有些寄存器有自身特殊的用途,例如R9在与读写位置无关(RWPI)的编译情况下作为静态基址寄存器使用,R12作为子程序内部调用的临时过渡寄存器使用。ATPCS规则中的寄存器名称及说明如表1所列。


表1 ATPCS规则中寄存器说明



因此,应尽量限制局部变量的数目:①对于函数的参数个数应控制在4个以内,只有R0~R3可用来保存参数,当参数多于4个时将被压入堆栈。如果由于实际应用的需要,参数多于4个,也可以采用结构体来组织参数,传递结构体指针来实现。②函数内部局部变量的个数应控制在12个以内(R0~R11),R12~R15都有特定用途。


3 函数内代码的编写


3.1 循环代码的编写


循环的控制条件设为递减到零的形式,可以减少指令条数。以求10个数的累加和为例进行分析。


代码1:


int sum=0;


for(int i=0;i<10;i++)


sum=sum+i;


代码2:


int sum=0;


for(int i=10;i!=0;i--)


sum=sum+i;


汇编代码1:


mov r0,#0


mov r1,#0


add1


add r1,r1,#1


cmp r1,#0x0a


add r0,r1,r0


bcc add1


汇编代码2:


mov r0,#0


mov r1,#0x0a


add2


subs r1,r1,#1


add r0,r1,r0


bne add2


比较代码1和代码2,两者的功能是相同的,但是代码2在循环中少了1条指令。该循环的执行次数为10次,即在执行时共减少了10条指令。


3.2 内联函数的使用


当函数体代码较少(通常只有一两条语句),且又被经常调用时,可将它设为内联函数(inline)。对内联函数的调用类似于宏定义的展开,因此没有函数调用的开销(即参数的传递和函数值的返回),只是增加了被调用函数的代码量。


例如在嵌入式系统中,经常访问的外设端口的读写代码就可以设成内联函数,以提高执行效率。外设寄存器的读写函数如下:


inline unsigned short reg_read(unsigned short reg){


return (unsigned short)*(volatile unsigned short *)( reg);//外设寄存器的读函数


}


inline void reg_write(unsigned short reg, unsigned short val){


*(volatile unsigned short *)(reg)=val;//外设寄存器的写函数


}


这两个函数的共同特点是:函数体的代码很少,只有1个语句;使用的局部变量很少,只有1~2个参数。由于定义为内联函数,程序的可读性较好;在执行时由于没有调用开销,执行效率较高;函数体很小,在被展开时空间开销不大。


结语


由于嵌入式系统对存储空间的限制和实时性的需求,在编写代码时必须采用相应的方法和原则以减少代码的空间开销和时间开销。代码优化需要花费时间,并且代码优化后将降低源代码的可读性。因此,只有对经常被调用且对性能影响较大的函数进行优化,才能最有效地优化系统。


关键字:ARM  C语言  编程 引用地址:基于ARM的高效C语言编程

上一篇:ARM的嵌入式操作系统概述及汇总
下一篇:基于ARM9-μC/OS-II软硬件平台的SD卡文件系统设计

推荐阅读最新更新时间:2024-11-03 23:32

LPC2XXX系列ARM带CAN的波特率计算
最近正在学习ARM的CAN部分,发现CAN的波特率计算方法网上竟然查不到,我就自己推到一个吧,有什么不对的地方大家指正啊。 当VPB时钟为4*11059200Hz时,常用波特率与总线时序器对照表(周立功给的,11059200kHz的波特率都是近似的,有误差) BPS = (SAM 23)|(TSEG2 20)|(TSEG1 16)|(SJW 14)| BRP #define BPS_5K (1 23)|(1 20)|(6 16)|(0 14)| 879 #define BPS_10K (1 23)|(1 20)|(6 16)|(0 14)| 439 #defin
[单片机]
LPC2XXX系列<font color='red'>ARM</font>带CAN的波特率计算
STM32Cubemx编程及Jlink下载
1.stm32cubemx安装 STM32CubeMX是 ST 意法半导体 近几年来大力推荐STM32 芯片图形化配置工具。它是一个单独的软件,直接安装到一个目录下即可。 2.开发环境搭建 安装Java,然后打开软件:help-updater Settings,这里是指定cube包的目录,可以在st官网上面下载cube包,在stm32cubemx的同一级目录下面建立repository,里面放入cube包,目录直接指到repository就行。 3.建立工程 新建工程,选择芯片后双击,此时会出现芯片的引脚图,首先对RCC进行配置-外部时钟,然后将clock configuration中的时钟图里面的进行填写。
[单片机]
STM32Cubemx<font color='red'>编程</font>及Jlink下载
基于ARM和FPGA的时间同步仪控制单元设计
随着现代科技的发展,信息需求不断增加,卫星导航定位系统备受关注,应用也有了更加深入的发展。为实现卫星导航系统高质量的定位、导航和授时服务,地面站与卫星之间的时间同步就显得尤为重要。作为卫星导航系统的关键型技术和基本性能,时间同步直接影响系统的定位、导航和授时服务。 文中论述的时间同步仪控制单元设计方案是以ARM9芯片为主控制单元,FPGA芯片作为辅助控制单元。采用这个方案,可以有效简化时间同步仪控制系统的复杂性,同时提高整个控制系统的灵活性和可靠性。 1 系统的组成和工作原理 时间同步仪控制单元作为时间同步仪系统的控制中心,采用基于ARM核的32位嵌入式RISC微处理器,设计了微处理器与外围设备控制端口与数据端口的连接,
[单片机]
基于<font color='red'>ARM</font>和FPGA的时间同步仪控制单元设计
迷你单片编程器设计
一. 支持的芯片型号 支持目前最为经典和市场占有量最大的ATMEL公司生产的AT89C51、C52、C55和最新的S51、S52;AT89C1051、2051、4051等芯片。51单片机学习网特别改进的线路和外观,是目前最为经济,美观和方便实用的小型51单片机编程器,本站特别诚意推荐! 二. 产品特点 1.使用串口通讯,芯片自动判别,编程过程中的擦除、烧写、校验各种操作完全由编程器上的监控芯片89C51控制,不受PC配置及其主频的影响。 2.采用高速波特率进行数据传送,经测试,烧写一片4K ROM的AT89C51仅需要9.5S,而读取和校验仅需要3.5S。 3.体积小巧,省去笨重的外接电源适配器,直接使用USB端口5V电
[工业控制]
迷你单片<font color='red'>编程</font>器设计
ARM微控制器LPC210X的LCD接口技术
摘要:本文分别以GPI0口直接连接、串行转换连接、CPLD分部连接三种方法阐述了无外部总线的Philips ARM微控制器LPC210X与点阵图形液晶显示器的接口设计,并给出硬件电路框图和主要程序。 关键词:ARM LPC210X LCD接口 串并转换 CPLD 引言 Philips最近推出了其第一款基于ARM内核的控制器LPC210X,但由于LPC210X外部总线不开放,无法扩展内存、驱动液晶显示器等,给它的推广带来了一定的影响。笔者最近在一工控板项目中采用了该系列芯片,项目后斯应客户要求需对几个参量进行显示并扩展键盘,不得已之下,采用了CPLD,并利用了GPIO口模拟总线和液晶时序与点阵图形液日模块HS12864-16建
[嵌入式]
ARM宣布更多合作伙伴加入big.LITTLE技术
    继去年公布big.LITTLE处理器技术,同时今年CES 2013期间也由三星公布采用此项技术的Exynos 5 Octa处理器,ARM在MWC 2013期间也宣布目前此项技术合作夥伴将包含三星、瑞萨通信技术、CSR、富士通与联发科等厂商。 ARM宣布目前旗下big.LITTLE处理器技术将与包含三星、瑞萨通信技术、CSR、富士通与联发科等厂商合作,预计在今年内将会推出相关应用处理器产品,而三星也已经在CES 2013期间正式宣布将推出采用此项技术的Exynos 5 Octa处理器。 根据ARM big.LITTLE处理器技术设计,将藉由Cortex-A7提供低耗电平稳运作,并且以Cortex-A15提供较高效能的运作模式
[手机便携]
XMOS掀起可编程系统级芯片产品新浪潮
 xCORE-XA™架构在可配置的xCORE™多核微控制器上加入ARM®Cortex®-M3处理器,创造了低成本、低能耗、可编程的SoC解决方案    英国布里斯托尔,2013年10月– XMOS今日发布了采用eXtended架构的xCORE器件产品中的xCORE-XA™系列,它将该公司的可配置多核微控制器技术与一个超低功耗ARM Cortex-M3处理器结合在一起,掀起可编程系统级芯片(SoC)产品的新浪潮。   xCORE-XA代表了可编程SoC器件演化进程中的一次巨大的飞跃,它是多核微控制器领导者XMOS公司与节能型ARM微控制器技术领导者Silicon Labs公司之间合作的成果。   “ARM Cortex处
[模拟电子]
XMOS掀起可<font color='red'>编程</font>系统级芯片产品新浪潮
ARM+台积电恐仍不敌英特尔
    ARM与台积电(TSMC)合作,针对FinFET制程技术最佳化下一代64位元ARM核心。这想必让英特尔感觉颇为自得。 毕竟,这验证了这家晶片巨擘的两位高阶主管──Paul Otellini(欧德宁) 和Brian Krzanich在投资者日(investor day)中所做的演说──英特尔领先最接近的代工竞争厂四年。 事实上,正如我的同事Peter Clarke在他的文章中所说的,台湾的制造商和ARM之间的合作甚至无法预期2015下半年以前能够量产,因此,这个赌注也可能过于乐观。 此外,这个新闻也透露出ARM的伺服器策略矛盾之处。 ARM曾多次表示,2014年将针对伺服器市场推出重量级产品,而且将在两到三年内达到一定程度的市
[手机便携]
小广播
设计资源 培训 开发板 精华推荐

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

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

换一换 更多 相关热搜器件
随便看看

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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