社区闲人 发表于 2024-7-13 12:14:06

C251优化编程之bit篇

虽然C251编译器推出的时间有20多年了,因为8xC251核的mcu在2019年之前并没有大批量生产和使用,也造成C251编译器不如C51编译器那么完善。而且C251编译器在2018年后停止更新。
虽然C251编译器有诸多缺点,但是在没有第二种选择的情况下,C251编译器在相当长的时间内是STC32的唯一的选择。
为了避免在使用C251编译器出现BUG,还要让编译结果在STC32芯片上高效运行,所以优化C代码,是必做的功课。

之一:bit篇

1,对端口取反:
P54 = ~P54; //编译结果----->

0xFF09B5   B2CC      CPL      P54(0xC8.4)

如果: P54 = !P54;//编译结果---->

1653:      
0xFF09B5   20CC03      JB       P54(0xC8.4),C:0x09BB
0xFF09B8   D3          SETB   C
0xFF09B9   8001      SJMP   C:0x09BC
0xFF09BB   C3          CLR      C
0xFF09BC   92CC      MOV      P54(0xC8.4),C


2, if(b_busy)   //编译结果----->

0xFF0A5C   300199      JNB      b_busy(0x20.1),C:0x09F8

如果:if(b_busy == 1)   //编译结果----->

0xFF0911   A200      MOV      C,b_busy(0x20.1)
0xFF0913   E4          CLR      A
0xFF0914   33          RLC      A
0xFF0915   B40128      CJNE   A,#0x01,C:0x0940


3,             if(!b_busy) //编译结果---->
1701:         {
0xFF0A02   200028      JB       b_busy(0x20.1),C:0x0A2D


如果:         if(b_busy == 0) //编译结果---->
1701:         {
0xFF0911   A200      MOV      C,b_busy(0x20.1)
0xFF0913   E4          CLR      A
0xFF0914   33          RLC      A
0xFF0915   7828      JNE      C:0x093F



4,使用_testbit_():

if (!_testbit_(RI)) //编译结果---->

0xFF0A2D   10989D      JBC      RI(0x98.0),C:0x09CD


hsrzq 发表于 2024-7-13 12:54:38

wnagming 发表于 2024-7-13 12:33
好好好,这样看我的代码习惯是很不好的

其实你的习惯应该才是更好的。
但是……为了……就……知道吧。

xxkj2010 发表于 2024-7-13 15:28:50

先收藏,后继续关注内容更新。{:4_250:}

大明狐 发表于 2024-7-13 17:02:02

学习ing~~~

soma 发表于 2024-7-13 17:15:49

收藏持续关注,C251编译器暂时也没有替换方案。

jwd 发表于 2024-7-13 20:35:21

喜欢这个帖子,谢谢分享

hsrzq 发表于 2024-7-13 20:59:47

wnagming 发表于 2024-7-13 20:44
我明白了?还是我应该明白了?

哈哈哈哈,绕进去了。
鱼与熊掌不可兼得~~
为了效率,不得不向编译器低头

社区闲人 发表于 2024-7-13 21:23:50

if(b_busy) 和 if(!b_busy) 是C语言中判断bool变量 标准写法。

jwd 发表于 2024-7-16 20:28:26

希望stc官方多出这种已知有坑的bug教程
页: [1]
查看完整版本: C251优化编程之bit篇