打印

一个函数的优化的问题,基于ARM的

[复制链接]
2248|7
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
fengxiaohh|  楼主 | 2007-3-14 21:58 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
基于ARM的两个函数,用C写的,有几个问题

先看没有优化的版本,使用了位段

void dostageA(void)
void dostageB(void)
void dostageC(void)

typedef struct{

unsigned int stageA:1;

unsigned int stageB:1;

unsigned int stageC:1;

}Stages_v1;

void dostages_v1(Stages_v1 *stages)

{if(stages->stageA)

{dostageA();}

if(stages->stageB)

{dostageB();}

if(stages->stageC)

{dostageC();}

}

下面是优化过得版本,有两个问题:

1:Stages_v2为什么要定义为无符号长整型?定义为无符号整型或者字符型可不可以?

2:宏定义中lul<<1是什么意思,在函数里是怎么用到的?

typedef unsigned long Stages_v2

#define STAGEA (lul<<0)
#define STAGEB (lul<<1)
#define STAGEC (lul<<2)

void dostages_v2(Stages_v2 *stages_v2)
{

Stages_v2 stages= *stages_v2;

if(stages&STAGEA)

{dostageA();

}

if(stages&STAGB)

{dostageB();

}

if(stages&STAGEC)

{dostageC();

}


<<ARM嵌入式系统开发--软件设计与优化>> Anderw N.Sloss
第5。8节

相关帖子

沙发
rockos| | 2007-3-15 11:20 | 只看该作者

这些优化可以由编译器做的


1> 可以,至少目前arm处理器中,unsigned int和unsigned log都是四个字节的

2> 自己查一下C的语法吧

这两段代码里隐含了编译器的字节序问题, 当使用little-endian时, 这两个代码片断是完全等效的。但如果是big-endian,结果就不一样了。

不过ATPCS规范上要求使用little-endian的字节序。

使用特权

评论回复
板凳
fengxiaohh|  楼主 | 2007-3-15 12:21 | 只看该作者

第二个问题

第二个问题没有查到,可不可以解释一下。

使用特权

评论回复
地板
fengxiaohh|  楼主 | 2007-3-16 10:05 | 只看该作者

yumen

找了各种资料,没有讲这个语法现象。自己编个程序,也编译没有通过。应该是错了,书上是这么写的,如果是错了,怎么改。

使用特权

评论回复
5
fengxiaohh|  楼主 | 2007-3-17 16:37 | 只看该作者

注意重点

楼上的,是个人都知道<<是左移的意思。
我的重点问题在lul,大哥,人人都知道的问题不用你再来说一遍。

使用特权

评论回复
6
平常人| | 2007-3-17 20:47 | 只看该作者

7楼正解! 还是用大写比较容易看 1UL,最好用0x01UL

楼主的这个问题说明程序的易读性是多么的重要!

使用特权

评论回复
7
fengxiaohh|  楼主 | 2007-3-18 10:04 | 只看该作者

7楼应该是

我觉得7楼应该是正解,至少功能上是对的,外形上也差不多,可能是书上印错了。

使用特权

评论回复
8
fengxiaohh|  楼主 | 2007-3-18 10:05 | 只看该作者

多谢

多谢

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

2

主题

7

帖子

0

粉丝