OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 8506|回复: 11

怎样优化Keil switch语句

[复制链接]

10

主题

50

帖子

1

精华

中级会员

Rank: 3Rank: 3

积分
291
金钱
291
注册时间
2014-11-6
在线时间
24 小时
发表于 2015-1-17 12:14:47 | 显示全部楼层 |阅读模式
5金钱
       我的一个C 函数 void BIT_SET(uchar *a,uchar b),意义是将地址为a的内存的第b位置1(0<=b<=7)
uchar bdata btemp;//位寻址区全局变量
sbit btemp0=btemp^0;
sbit btemp1=btemp^1;
。。。。。。。。。。
sbit btemp7=btemp^7;

{
        btemp=*a;
        switch(b)
       {
            case 0: btemp0=1;break;
            case 1: btemp1=1;break;
。。。。。。。。。。。
            case 7: btemp7=1;break;
            default:break;
       }
      *a=btemp;
}
功能能实现,编译器也编译为散转指令,但我嫌效率还是不够高。
LJMP  XXX0
LJMP  XXX1
。。。。。
LJMP  XXX07
XXX0:
        SETB  btemp.0   
        SJMP  XXX
XXX1:
        SETB  btemp.1   
        SJMP  XXX
。。。。。。。。
XXX7:
        SETB  btemp.7  
XXX:
       。。。。。。
        。。。。。。
      我想那LJMP  XXX0到LJMP XXX7完全可以去掉,直接散转到XXX0到XXX7,因为XXX0到XXX7的间隔都是4个字节,偏移量b,两次加倍就可以。多跳一次完全没必要,反而浪费时间。多占程序空间我不计较,但我这程序对缩短运行时间有要求。 
      编译器怎么不开窍?还是可以设置优化?

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

头像被屏蔽

6168

主题

7036

帖子

1

精华

论坛元老

Rank: 8Rank: 8

积分
19705
金钱
19705
注册时间
2012-12-27
在线时间
25 小时
发表于 2015-1-17 13:23:10 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

34

主题

805

帖子

4

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1863
金钱
1863
注册时间
2011-3-29
在线时间
139 小时
发表于 2015-1-17 14:46:35 | 显示全部楼层
51?那就直接用汇编咯。不在乎空间的话不是应该:
case 7: btemp7=1; *a=btemp;return;
直接用内部寄存器不行吗非要用sbit?
业余程序玩家。
回复

使用道具 举报

34

主题

805

帖子

4

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1863
金钱
1863
注册时间
2011-3-29
在线时间
139 小时
发表于 2015-1-17 14:48:38 | 显示全部楼层
用inline不是更省指令?其实,够用就好…
业余程序玩家。
回复

使用道具 举报

10

主题

50

帖子

1

精华

中级会员

Rank: 3Rank: 3

积分
291
金钱
291
注册时间
2014-11-6
在线时间
24 小时
 楼主| 发表于 2015-1-17 16:51:10 | 显示全部楼层
回复【2楼】xouou_53320:
---------------------------------
       对我而言,用1<<n位的弊端是,51没有优化此类指令的寻址方式,他是循环操作完成的,指令运行时间在1><<0、1<<1时执行时间短,但1<<6、1<<7时间就花的多了

    位寻址区空间有限,不能满足系统要求
回复

使用道具 举报

10

主题

50

帖子

1

精华

中级会员

Rank: 3Rank: 3

积分
291
金钱
291
注册时间
2014-11-6
在线时间
24 小时
 楼主| 发表于 2015-1-17 16:58:28 | 显示全部楼层
回复【3楼】ofourme:
---------------------------------
回复【3楼】ofourme:
---------------------------------
空间节省也要,执行时间尤为重要
回复

使用道具 举报

10

主题

50

帖子

1

精华

中级会员

Rank: 3Rank: 3

积分
291
金钱
291
注册时间
2014-11-6
在线时间
24 小时
 楼主| 发表于 2015-1-17 17:09:35 | 显示全部楼层
回复【3楼】ofourme:
---------------------------------
你这样,程序运行时少了一个跳转,而代码多了7个*a=btemp,功过相抵

sbit是伪指令,对程序运行没有影响吧。

位寻址区有限,位操作还不支持间接寻址,郁闷啊
回复

使用道具 举报

1

主题

70

帖子

0

精华

初级会员

Rank: 2

积分
142
金钱
142
注册时间
2011-6-17
在线时间
15 小时
发表于 2015-1-17 17:38:41 | 显示全部楼层
回复【4楼】ofourme:
---------------------------------
請問inline怎用法?
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165309
金钱
165309
注册时间
2010-12-1
在线时间
2108 小时
发表于 2015-1-17 23:03:50 | 显示全部楼层
回复【8楼】Cho:
---------------------------------
直接在函数前面加__inline就是了.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

1

主题

70

帖子

0

精华

初级会员

Rank: 2

积分
142
金钱
142
注册时间
2011-6-17
在线时间
15 小时
发表于 2015-1-18 16:07:37 | 显示全部楼层
回复【9楼】正点原子:
---------------------------------
請原子哥指導什麼情況下要使用__inline,這是個指令嗎? 

我在程序中看過,但在我的書中找不到解釋,請指點。謝謝
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165309
金钱
165309
注册时间
2010-12-1
在线时间
2108 小时
发表于 2015-1-18 23:19:30 | 显示全部楼层
回复【10楼】Cho:
---------------------------------
在需要以空间换时间的地方.
inline相当于宏定义这个函数了.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

1

主题

70

帖子

0

精华

初级会员

Rank: 2

积分
142
金钱
142
注册时间
2011-6-17
在线时间
15 小时
发表于 2015-1-19 11:13:37 | 显示全部楼层
回复【11楼】正点原子:
---------------------------------
謝原子哥, 找些程序研究先
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-23 08:07

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表