夜尽天明 发表于 2015-9-11 10:43:12

判断两个变量是否相等,有没有更省空间的办法

如题:现在用的芯片程序空间已经快写满了,功能还差一点没做完,只能想办法省点空间出来。
1.
       if(key1_check_sum==0x0100)
       {   
                  .
                  .
                  .
       }

2.
       if(!(key1_check_sum&&0xfeff))
       {   
                  .
                  .
                  .
       }
编译后发现2比1要省三四个字节,但是感觉这样写好像有点问题一样。

图片所示的几个判断条件可以怎么改?

gallle 发表于 2015-9-11 10:47:08

一般用减法比较快些,
试试用异或判断也可以

tcm123 发表于 2015-9-11 10:48:25

靠这样省能省出多少空间。 启用编译器优化、尽量不用库函数如PRINTF、梳理程序逻辑、以运算量换空间

xhcyfc 发表于 2015-9-11 10:49:28

还有就是调试的时候看汇编代码,你就知道那种方式更加节省程序空间,更加有效率

夜尽天明 发表于 2015-9-11 10:54:07

gallle 发表于 2015-9-11 10:47
一般用减法比较快些,
试试用异或判断也可以

就是不知道怎么用异或判断啊

夜尽天明 发表于 2015-9-11 10:55:08

tcm123 发表于 2015-9-11 10:48
靠这样省能省出多少空间。 启用编译器优化、尽量不用库函数如PRINTF、梳理程序逻辑、以运算量换空间 ...

软件流程已经梳理了好几遍了

夜尽天明 发表于 2015-9-11 10:56:26

xhcyfc 发表于 2015-9-11 10:49
还有就是调试的时候看汇编代码,你就知道那种方式更加节省程序空间,更加有效率 ...

关键是这里我就算用汇编写也没想到怎么去压缩代码

夜尽天明 发表于 2015-9-11 10:57:07

再整个几十个字节基本上就OK了

brother_yan 发表于 2015-9-11 11:01:10

2多了一个&

snoopyzz 发表于 2015-9-11 11:01:49

喷, &&不能代替 &

夜尽天明 发表于 2015-9-11 11:04:33

snoopyzz 发表于 2015-9-11 11:01
喷, &&不能代替 &

这里是要用逻辑AND啊

jm2011 发表于 2015-9-11 11:04:51

本帖最后由 jm2011 于 2015-9-11 11:09 编辑

使用了逻辑与,不是位与,估计编译器直接优化掉了0xfeff了,楼主你换成位与操作(&)试试
看看结果是什么?

另外编译器都会有选项的,是偏重速度还是偏重代码大小;楼主可以找一下,看看有没有类似的选项;

实在不行,可以试试使用压缩程序,把代码压缩在FLASH里面,在使用的时候再释放出来;

snoopyzz 发表于 2015-9-11 11:05:53

夜尽天明 发表于 2015-9-11 11:04
这里是要用逻辑AND啊

这里用逻辑与能正常才是见鬼了

你懂逻辑 和 算术 运算的区别吗?

if(!(key1_check_sum&&0xfeff))
等效于
if(!(key1_check_sum))

if(key1_check_sum == 0)

prow 发表于 2015-9-11 11:09:44

你要用的是按位与而不是逻辑与啊!

xzhiwei 发表于 2015-9-11 11:13:24

同一个变量判断 为什么不用 else if ,个人觉得 楼主程序应该还有优化的空间

babysnail 发表于 2015-9-11 11:16:51

本帖最后由 babysnail 于 2015-9-11 11:18 编辑

从程序整体结构来优化。 估计是按键程序, 把sum值组成表格,用查表法得键值。执行按键子程序用函数指针。编译完后程序只有查表指令,跳转子程序指令。不会用很多的 if esle 等产生的判断 jmp等指令。分支越多越明显。 学会汇编没坏处!

mcu5i51 发表于 2015-9-11 11:18:03

几个字节很容易的,不要纠结在一个位置

夜尽天明 发表于 2015-9-11 11:18:03

snoopyzz 发表于 2015-9-11 11:05
这里用逻辑与能正常才是见鬼了

你懂逻辑 和 算术 运算的区别吗?


多谢提醒,C我还真不会用

yerrmin 发表于 2015-9-11 11:22:57

把对同一个变量的多个if判断换成switch呢?
只靠这个减少不了多少
单片机初始化那块是不是可以节省一点

夜尽天明 发表于 2015-9-11 11:24:53

yerrmin 发表于 2015-9-11 11:22
把对同一个变量的多个if判断换成switch呢?
只靠这个减少不了多少
单片机初始化那块是不是可以节省一点 ...

因为外部已经用了一个switch 语句,不知道switch语句里面还能不能再嵌套一个

gvgvfghv 发表于 2015-9-11 11:36:19

就算写成按位与也不能判断是否相等啊。

夜尽天明 发表于 2015-9-11 11:39:08

switch语句里面还能不能再嵌套一个switch

bailangcn 发表于 2015-9-11 13:33:27

夜尽天明 发表于 2015-9-11 11:39
switch语句里面还能不能再嵌套一个switch

可以~~~

youlongam 发表于 2015-9-11 13:48:32

夜尽天明 发表于 2015-9-11 11:39
switch语句里面还能不能再嵌套一个switch

嵌套10个应该都可以吧。

alias 发表于 2015-9-11 14:25:46

本帖最后由 alias 于 2015-9-11 16:44 编辑

>>但是感觉这样写好像有点问题一样。

本人以下所言,的确误人子弟,勿信。{:funk:}

楼主,想知道key_check_sum是不是 0x0100,那就要用 key_check_sum & 0x0100,而不是用 key_check_sum & 0xfeff。

前者运算后只有两个可能,是零(即不是0x0100) 或 0x0100。

takashiki 发表于 2015-9-11 15:45:46

alias 发表于 2015-9-11 14:25
>>但是感觉这样写好像有点问题一样。

楼主,想知道key_check_sum是不是 0x0100,那就要用 key_check_sum & ...

误人子弟。0xFFFF & 0x0100 = 0x0100,那么0xFFFF等于 0x0100?
明明最方便的就是==,非得折腾就用+、-、^。

huaxiling 发表于 2015-9-11 15:52:50

!(key_check_sum^0x0100)

xhcyfc 发表于 2015-9-11 15:57:06

还有就是优化程序结构,将功能相近的写成子函数

zhonghua_li 发表于 2015-9-11 16:29:50

贴一段代码上来,我告诉你怎么优化。

夜尽天明 发表于 2015-9-12 08:05:41

youlongam 发表于 2015-9-11 13:48
嵌套10个应该都可以吧。

谢谢,昨天看了看了写,可以嵌套。但是用switch语句,后面的case 是要用常量吧。我这里是几个变量,编译之后报错。

夜尽天明 发表于 2015-9-12 08:07:50

alias 发表于 2015-9-11 14:25
>>但是感觉这样写好像有点问题一样。

本人以下所言,的确误人子弟,勿信。


这地方确实是写错了,没搞清楚&与&& 的却别,多谢指点。

夜尽天明 发表于 2015-9-12 08:13:44

zhonghua_li 发表于 2015-9-11 16:29
贴一段代码上来,我告诉你怎么优化。

软件基本都是这种,判断条件有点多。

夜尽天明 发表于 2015-9-12 08:20:49

takashiki 发表于 2015-9-11 15:45
误人子弟。0xFFFF & 0x0100 = 0x0100,那么0xFFFF等于 0x0100?
明明最方便的就是==,非得折腾就用+、-、 ...

我以前看别人写的库文件,用汇编写的,判断两个条件是否相等全都用与或非判断的,当时没记下来。

wind2100 发表于 2015-9-12 08:43:53

这是要省FLASH 的节奏!
应该是效率优先吧

babysnail 发表于 2015-9-12 11:00:36

象key1_check_sum 这种应用两个unsigned char 表示,而不是用16位,那怕是unsigned char数组,判断处理16位对8位机来说程序rom要多很多。 自己体会 !!!!!!!!!

夜尽天明 发表于 2015-9-12 12:44:13

babysnail 发表于 2015-9-12 11:00
象key1_check_sum 这种应用两个unsigned char 表示,而不是用16位,那怕是unsigned char数组,判断处理16位 ...

要能用八位的话我肯定用八位的,这个地方还涉及到其他功能,只能用16位或者更大的数据

夜尽天明 发表于 2015-9-12 12:45:26

babysnail 发表于 2015-9-11 11:16
从程序整体结构来优化。 估计是按键程序, 把sum值组成表格,用查表法得键值。执行按键子程序用函数指针。 ...

我以前就是用汇编的,所以现在用C还有点不习惯

zhonghua_li 发表于 2015-9-13 21:38:14

夜尽天明 发表于 2015-9-12 08:13
软件基本都是这种,判断条件有点多。

把你的 *1*,*2*,*3*(类似key1_check_sum,key2_check_sum...) 变量定义成数组(key_check_sum),然后用循环语句实现。
可能可以节约点空间。
另外就是优化你的算法和模型。

camtime 发表于 2015-9-13 22:46:37

8位MCU处理16位当然吃空间
如果比较的源数据及目的数据都是变量的话,不如将比较项写成子函数,参数为指针传址
看看会不会比原来省空间


夜尽天明 发表于 2015-9-16 16:47:33

zhonghua_li 发表于 2015-9-13 21:38
把你的 *1*,*2*,*3*(类似key1_check_sum,key2_check_sum...) 变量定义成数组(key_check_sum),然后 ...

已经OK了,谢谢

夜尽天明 发表于 2015-9-16 16:48:08

camtime 发表于 2015-9-13 22:46
8位MCU处理16位当然吃空间
如果比较的源数据及目的数据都是变量的话,不如将比较项写成子函数,参数为指针 ...

已经OK了,谢谢
页: [1]
查看完整版本: 判断两个变量是否相等,有没有更省空间的办法