ARM优化之函数的形参数量

发布者:PeacefulWarrior最新更新时间:2016-08-13 来源: eefocus关键字:ARM优化  函数  形参数量 手机看文章 扫描二维码
随时随地手机看文章
ARM 的参数传递遵循 ATPCS 的规范,子程序间通过寄存器 R0-R3 来传递参数,返回值也通过 R0 来返回。这就造成一个问题,当构造超过 4 个参数的函数时,如何实现。

翻阅了其他资料以及下面的代码比对表明,多出来的参数传递的时候,需要使用栈,而栈需要使用额外的指令以及对慢速存储单元的读写,所以不超过 4 个参数的函数是很有利于程序的优化。

 
 
测试代码如下:

 
 
第一段为采用4个参数的函数:

 

view plain copy to clipboard print ? 
01.int  Test( void )   
02.{   
03.    return  SubCode (1,2,3,4);   
04.}   
05.    
06.int  SubCode( int  a,  int  b,  int  c,  int  d)   
07.{   
08.    return  a+b+c+d;   
09.}  

 


view plaincopy to clipboardprint?
00.int Test(void)  
00.{  
00.    return SubCode (1,2,3,4);  
00.}  
00.   
00.int SubCode(int a, int b, int c, int d)  
00.{  
00.    return a+b+c+d;  
00.}  
 

 
 
这段会编译成
 


view plain copy to clipboard print ? 
01.Test   
02.MOV   r3,#4   
03.MOV   r2,#3   
04.MOV   r1,#2   
05.MOV   r0,#1   
06.B     SubCode   
07.    
08.SubCode   
09.ADD   r0,r0,r1   
10.ADD   r0,r0,r2   
11.ADD   r0,r0,r3   
12.MOV   pc,lr  

 


view plaincopy to clipboardprint?
00.Test  
00.MOV   r3,#4  
00.MOV   r2,#3  
00.MOV   r1,#2  
00.MOV   r0,#1  
00.B     SubCode  
00.   
00.SubCode  
00.ADD   r0,r0,r1  
00.ADD   r0,r0,r2  
00.ADD   r0,r0,r3  
00.MOV   pc,lr  
 

 
 
 
 
第二段为采用6个参数的函数:

 

 

view plain copy to clipboard print ? 
01.int  Test( void )   
02.{   
03.    return  SubCode (1,2,3,4,5,6);   
04.}   
05.    
06.int  SubCode( int  a,  int  b,  int  c,  int  d,  int  e,  int  f)   
07.{   
08.    return  a+b+c+d+e+f;   
09.}  

 

view plaincopy to clipboardprint?
00.int Test(void)  
00.{  
00.    return SubCode (1,2,3,4,5,6);  
00.}  
00.   
00.int SubCode(int a, int b, int c, int d, int e, int f)  
00.{  
00.    return a+b+c+d+e+f;  
00.} 

 
 
 
而这段又会编译成:

 

 

view plain copy to clipboard print ? 
01.Test   
02.STMFD    sp!,{r2,r3,lr}   
03.MOV      r3,#6   
04.MOV      r2,#5   
05.STMIA    sp,{r2,r3}   
06.MOV      r3,#4   
07.MOV      r2,#3   
08.MOV      r1,#2   
09.MOV      r0,#1   
10.BL       SubCode   
11.LDMFD    sp!,{r2,r3,pc}   
12.    
13.SubCode   
14.STR      lr, [sp,#-4]!   
15.ADD      r0,r0,r1   
16.ADD      r0,r0,r2   
17.ADD      r0,r0,r3   
18.LDMIB    sp,{r12,r14}   
19.ADD      r0,r0,r12   
20.ADD      r0,r0,r14   
21.LDR      pc,{sp},#4  

 

view plaincopy to clipboardprint?
00.Test  
00.STMFD    sp!,{r2,r3,lr}  
00.MOV      r3,#6  
00.MOV      r2,#5  
00.STMIA    sp,{r2,r3}  
00.MOV      r3,#4  
00.MOV      r2,#3  
00.MOV      r1,#2  
00.MOV      r0,#1  
00.BL       SubCode  
00.LDMFD    sp!,{r2,r3,pc}  
00.   
00.SubCode  
00.STR      lr, [sp,#-4]!  
00.ADD      r0,r0,r1  
00.ADD      r0,r0,r2  
00.ADD      r0,r0,r3  
00.LDMIB    sp,{r12,r14}  
00.ADD      r0,r0,r12  
00.ADD      r0,r0,r14  
00.LDR      pc,{sp},#4 

 
 
 
就上面看来,增加了两个参数,就会增加很多代码用来完成这次调用。但是我们也无法保证函数的参数一定是小于4个的,所以这里笔者建议,如果函数的参数必须要4个以上的时候,可以采用结构体的方式来减少参数的个数。

 
 
这样的优化,对于一些经常需要调用的函数,或者需要快速响应的情况下,还是非常必要的。

 
关键字:ARM优化  函数  形参数量 引用地址:ARM优化之函数的形参数量

上一篇:关于ARM和存储器地址线错位连接详解
下一篇:一个相当详细的MINI2440按键驱动详解

推荐阅读最新更新时间:2024-03-16 15:04

STM32F4 新建标准库函数工程
前言 在 STM32 开发中,库函数开发相比寄存器方式具有开发周期短、代码可读性好、便于移植等优点,而使用 Keil 环境的第一步就是新建工程。本文以 STM32F401CE 芯片为例,介绍使用标准库函数新建工程的步骤。 材料准备 STM32F4xx 固件库:STM32F4xx_DSP_StdPeriph_Lib_V1.4.0.rar Keil-MDK 一点耐心 新建库函数工程注意事项 不同芯片在新建工程时的配置略有区别,主要体现在以下几点: 工程目标 Device 选择的芯片型号不同。 添加的启动文件不同。要根据芯片型号在 arm 目录下选择相应的 .s 文件。 C/C++ 选项卡的芯片型号宏定义不同。具体有哪些选
[单片机]
千兆网络接口在S3C2440A系统中的应用
嵌入式系统广泛应用在工业测控、智能仪表、智能家庭等很多领域。随着嵌入式系统应用范围的不断扩展及网络应用的日益普及,使得越来越多的嵌入式系统需要网络功能。三星公司S3C2440A是国内应用较多的嵌入式微处理器之一,在S3C2440A应用系统中,目前只支持10/100M的网络接口,有很大的实用价值,既可以拓展S3C2440A的应用领域,也可以给其它嵌入式系统高速接入网络提供一种简单易行的参考。 设计方案 本系统主要由S3C2440A、存储器、AX88180、千兆PHY芯片88E1111、嵌入式Linux、网络驱动程序等组成(见图1)。嵌入式Linux内核负责系统任务的管理并集成TCP/IP协议,方便实现网络功能控制。S3C2440
[应用]
高频精密函数波形发生器设计
    摘要: 介绍了一种由MAX038和MC145151构成的精密函数波形发生器,该发生器可输出正弦波、矩形波、三角波信号,输出频率能在8kHz~16MHz范围内调整,调整增幅为1kHz,可作为通用的高频精密函数波形发生器。     关键词: 函数波形发生器  MAX038  MC145151  信号源 集成函数波形发生器一般都采用ICL8038或5G8038,而它们只能产生300kHz以下的中低频正弦波、矩形波和三角波,且频率与占空比不能单独调节,从而给使用带来很大不便,也无法满足高频精密信号源的要求。本文介绍由MAX038和MC145151组成的高频精密函数波形发生器,该电路能够产生精确的正弦波、矩形波和三
[测试测量]
基于STM32定时器实现毫秒延时函数
STM32定时器包含基本定时器、通用定时器和高级定时器,其中TIM6和TIM7是STM32当中的基本定时器,作为初学者,先从最基本的学起最容易,下面我们用这个定时器实现毫秒延时函数来入门STM32定时器的应用。 学习单片机,就是学习使用它的寄存器。即便你用库函数,寄存器也是必须要学习的。 TIM6 TIM7的寄存器如下所示: 先略览一下寄存器,CR1和CR1是控制寄存器,SR是状态寄存器,ARR就是溢出值寄存器,CNT就是计数器的当前值,PSC是预分频寄存器。预分频寄存器?听的傻眼了吧,前面几个个寄存器听的还能理解,一听到预分频寄存器,好像不知道是干嘛用的。瑞生来给你解释一下吧,你可以给预分频寄存器里面写一个从0~6
[单片机]
基于STM32定时器实现毫秒延时<font color='red'>函数</font>
【STM32】窗口看门狗概述、寄存器、库函数(WWDG一般步骤)
STM32F1xx官方资料: 《STM32中文参考手册V10》-第18章 窗口看门狗 窗口看门狗概述 窗口看门狗的定义 窗口看门狗之所以称为窗口,就是因为其喂狗时间是一个有上下限的范围内(窗口),可以通过设定相关寄存器,设定其上限时间(但是下限是固定的0x3F)。也就是说:喂狗的时间不能过早,也不能过晚。 而对比与独立看门狗,独立看门狗限制喂狗时间在0-x内,x由相关RLR寄存器决定。 窗口看门狗的必要性: 对于一般的看门狗,程序可以在它产生复位前的任意时刻刷新看门狗,但这有一个隐患,有可能程序跑乱了又跑回到正常的地方,或跑乱的程序正好执行了刷新看门狗操作,这样的情况下一般的看门狗就检测不出来了; 如果使用窗口
[单片机]
【STM32】窗口看门狗概述、寄存器、库<font color='red'>函数</font>(WWDG一般步骤)
STM32通用定时器库函数设置
通用定时器 STM32的通用定时器为:TIM2、TIM3、TIM4和TIM5 在使用通用定时器时利用库函数直接设置定时器如下: 1.使能定时器TIM_X的时钟:(X=2、3、4、5) RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIMX,ENABLE); 2.计算要定时的时间,根据定时时间来设定分频数和最大计数值(以向上计数为例子),其中计算关系如下: 系统时钟(一般为72MHZ) =定时器分频数 * 计数值 假如分频数为7200,则定时器时钟为:72MHZ/7200=10KHZ,定时器每次计数时间间隔为1/10000秒,假如定时1秒,则要计数10000次,因此计数器的最大计数值为9999
[单片机]
C51延时函数delay的编写
例如,要写一个延迟10ms的delay函数:(12M晶振) void delay_10ms() { unsigned char i,j,k; for(i=5;i 0;i--) { for(j=4;j 0;j--) { for(k=248;j 0;j--); } } } 原理:3层for循环,循环次数是 NUM = 4X5X248 = 4960次,由每次循环都有条件判断(如 i 0)和自减语句(如 i--),因此每次循环又耗费两个机器周期 所以,总耗费的机器周期为 SUM = NUM x 2 = 9920个 又因为 12M 晶振频率,
[单片机]
STM32单片机ADC库函数的定义和使用方法
ADC的基本概念希望各位网友查阅相应的手册,上面对ADC有比较详尽的介绍,包括误差的分析和消除。这里主要介绍ADC的基本库函数的定义和使用。 1.ADC_DeInit函数的功能是将外设ADCx的全部寄存器重设为默认值。 ADC_DeInit(ADC2); 2.ADC_Init函数的功能是根据ADC_InitStruct中指定的参数初始化外设ADCx的寄存器。其中ADC_InitTypeDef定义在stm32f10x_adc.h中。其结构体如下所示: typedef struct { u32 ADC_Mode;//可以设置ADC_Mode FunctionalState ADC_ScanConvMode;//规定了模数转换工
[单片机]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

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

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

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