优化设计c语言,嵌入式软件设计:ARM C程序优化设计

版权声明:以上文章中所选用的图片及文字来源于网络以及用户投稿,由于未联系到知识产权人或未发现有关知识产权的登记,如有知识产权人并不愿意我们使用,如果有侵权请立即联系:55525090@qq.com,我们立即下架或删除。

简介:代码优化的思路

大连理工大学 赖晓晨

代码优化:时间优化、空间优化

代码优化与程序的可读性:矛盾

需要优先优化的代码对象:频繁使用的代码

优化概述

例:清除从指针data开始的N个字节空间

void memclr(char *data, int N)

{

for ( ; N>0; N--)

{

*data=0;

data++;

}

}

data

N

假设32位处理器

问题:

 编译器不知道N是否为0。

 编译器不知道data是否4字节对齐。

 编译器不知道N是否为4的倍数

void memclr(char *data, int N)

{

for ( ; N>0; N--)

{

*data=0;

data++;

}

}

例:清除从指针data开始的N个字节空间

假设32位处理器

结论

编译器必须是保守的:

 必须假定N的所有可能值

 必须假定data所有可能的边界值

编写高效C代码的要求

了解哪些方面编译器是保守的

了解编译器对应的处理器体系结构

高效的C程序设计的研究途径

通过研究编译器如何把C代码转换成ARM汇编代码,以帮助程序员区分快速

和慢速的C代码,进而指导程序员进行C程序设计。

嵌入式软件设计

大连理工大学 赖晓晨

变量的数据类型选择

大连理工大学 赖晓晨

假设采用32位ARM机器

Load/store不同的C数据类型,效率不同。

变量的数据类型

例:求校验和

int checksum_v1(int *data)

{

char i;

int sum=0;

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

sum += data[i];

return sum;

}

i声明为char的优缺点?

 char表达的范围超过了64,可

以完成题目要求。

 char更节省寄存器和内存空间

checksum_v1_s

MOV r2,r0 ; r2 = data,地址指针

MOV r0,#0 ; sum = 0

MOV r1,#0 ; i = 0,计数器

checksum_v1_loop

LDR r3,[r2,r1,LSL #2] ; r3 = data[i]

ADD r1,r1,#1 ; r1 = i+1

AND r1,r1,#0xff ; i = (char)r1

CMP r1,#0x40 ; compare i, 64

ADD r0,r3,r0 ; sum += r3

BCC checksum_v1_loop ; if (i<64) loop

MOV pc,r14 ; return sum

例:求校验和

i是char型,超过255要归零,所以汇编程序中要确保其不超过255。

上述汇编共10条指令

讨论

int checksum_v1(int *data)

{

char i;

int sum=0;

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

sum += data[i];

return sum;

}

int checksum_v2(int *data)

{

unsigned int i;

int sum=0;

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

sum += data[i];

return sum;

}

例:求校验和

checksum_v2_s

MOV r2,r0 ; r2 = data

MOV r0,#0 ; sum = 0

MOV r1,#0 ; i = 0

checksum_v2_loop

LDR r3,[r2,r1,LSL #2] ; r3 = data[i]

ADD r1,r1,#1 ; r1++

CMP r1,#0x40 ; compare i, 64

ADD r0,r3,r0 ; sum += r3

BCC checksum_v2_loop ; if (i<64) goto loop

MOV pc,r14 ; return sum

共9条语句,少了一条

例:求校验和

short checksum_v3(short *data)

{

unsigned int i;

short sum=0;

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

sum = (short)(sum + data[i]);

return sum;

}

假设需校验的数据为16位

例:16位数据求校验和

checksum_v3_s

MOV r2,r0 ; r2 = data

MOV r0,#0 ; sum = 0

MOV r1,#0 ; i = 0

checksum_v3_loop

ADD r3,r2,r1,LSL #1 ; r3 = &data[i]

LDRH r3,[r3,#0] ; r3 = data[i]

ADD r1,r1,#1 ; i++

CMP r1,#0x40 ; compare i, 64

ADD r0,r3,r0 ; r0 = su... 更多>>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值