- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
代码规范与优化笔记.doc
总结一些C语言代码规范与优化的基本形式,及C语言细节问题
使用处理器stm32f103vbt6(万利板),8M晶振。集成开发环境:IAR4.42,不使用优化。
首先是基本规则:
(1)代码优化之前,先要有代码的非优化版本。
(2)最有效的优化是算法优化,必须首先优化算法。
(3)使用汇编优化之前,要先使用高级语言优化
(4)使用处理器指令可以做的优化,就使用汇编实现。
参考《代码优化:有效使用内存》、《嵌入式软件概论》(Colin Walls)
(1)使用unsigned 代替signed变量。
(2)尽量避免访问内存。
(3)32位机访问单个32位变量速度较快。
实验:
为定量的确定上述原则,进行了实验:
vu32 a[5];
void wait1(int a);
void wait2(volatile int a);
void wait3(u32 a);
void wait4(vu32 a);
void wait5(u16 a);
/////////////////////////////////////
time=0;
wait1(0xFFFF);
a[0]=time;
time=0;
wait2(0xFFFF);
a[1]=time;
time=0;
wait3(0xFFFF);
a[2]=time;
time=0;
wait4(0xFFFF);
a[3]=time;
time=0;
wait5(0xFFFF);
a[4]=time;
其中time在毫秒中断中加一。
目的在于通过不同类型的wait函数,得到不同的等待时间,来确定什么类型的变量运算速度快。
实验结果:
a[]={6,12,5,12,7}
也就是说,无符号数要比有符号数快,但是快的不是很多。
加入volatile关键字以后,函数访问变量时总是访问内存。如下反汇编结果:
wait2是有volatile关键字的,每次判断访问内存一次,每次减一又访问内存两次(一次读出,一次写入)而wait3则是直接在寄存器中运算,速度要快一倍。
又使用IAR编译器进行优化,设置为速度优先,最高级优化,结果是:
a[]={0,12,0,12,0}
也就是说,他把没有volatile关键字的变量就干掉了,这在编程的时候必须注意。
wait5的目的在于说明:32位机访问单个32位变量的速度要快一些。
(4)二维数组定义为一维数组
当处理二维数组时,可以将其定义为一维数组,尤其顺序访问的时候,会比较快。但IAR编译器优化以后,反而不如二维数组快。
实验:
使用上面的程序中的wait3和wait4:
void wait3(u32 a)
{
u8 i,j,k;
for(;a!=0;a--)
{
for(i=0,k=0;i10;i++)
for(j=0;j10;j++)
{
b[i][j]=k++;
}
}
}
void wait4(u32 a)
{
u8 i;
for(;a!=0;a--)
{
for(i=0;i100;i++)
{
c[i]=i;
}
}
}
其中:u8 b[10][10]; u8 c[100];
实验中更换了b和c的类型。实验结果:
单位:ms 不使用编译器优化 使用编译器优化 U8 U32 U8 U32 二维数组 2204 2477 825 1078 一维数组 1562 1927 1005 1186 从结果中可以看出,8位数组的访问速度比32位快。在没有编译器优化的情况下,使用一维数组确实要比二维数组快,但并不明显。但使用编译器优化的二维数组却大大提速。
(5)使用移位代替乘除法
实验表明,效果并不明显。可能是stm32有硬件乘法器的缘故。
实验:
修改之前的程序:
void wait1(u32 a);
void wait2(u32 a);
void wait3(u32 a);
void wait4(u32 a);
void wait5(u32 a);
void wait1(u32 a)
{
u32 i=0;
for(;a!=0;a--)
{
i=i3;
}
}
void wait2(u32 a)
{
u32 i=1;
float j=0.125;
for(;a!=0;a--)
{
i*=j;
}
}
void wait3(u32 a)
{
u32 i=1;
u8 j=256;
for(;a!=0;a--)
{
i*=j;
}
}
void wait4(u32 a)
{
文档评论(0)