判断两个变量是否相等,有没有更省空间的办法
如题:现在用的芯片程序空间已经快写满了,功能还差一点没做完,只能想办法省点空间出来。1.
if(key1_check_sum==0x0100)
{
.
.
.
}
2.
if(!(key1_check_sum&&0xfeff))
{
.
.
.
}
编译后发现2比1要省三四个字节,但是感觉这样写好像有点问题一样。
图片所示的几个判断条件可以怎么改? 一般用减法比较快些,
试试用异或判断也可以 靠这样省能省出多少空间。 启用编译器优化、尽量不用库函数如PRINTF、梳理程序逻辑、以运算量换空间 还有就是调试的时候看汇编代码,你就知道那种方式更加节省程序空间,更加有效率 gallle 发表于 2015-9-11 10:47
一般用减法比较快些,
试试用异或判断也可以
就是不知道怎么用异或判断啊 tcm123 发表于 2015-9-11 10:48
靠这样省能省出多少空间。 启用编译器优化、尽量不用库函数如PRINTF、梳理程序逻辑、以运算量换空间 ...
软件流程已经梳理了好几遍了 xhcyfc 发表于 2015-9-11 10:49
还有就是调试的时候看汇编代码,你就知道那种方式更加节省程序空间,更加有效率 ...
关键是这里我就算用汇编写也没想到怎么去压缩代码 再整个几十个字节基本上就OK了 2多了一个& 喷, &&不能代替 & snoopyzz 发表于 2015-9-11 11:01
喷, &&不能代替 &
这里是要用逻辑AND啊 本帖最后由 jm2011 于 2015-9-11 11:09 编辑
使用了逻辑与,不是位与,估计编译器直接优化掉了0xfeff了,楼主你换成位与操作(&)试试
看看结果是什么?
另外编译器都会有选项的,是偏重速度还是偏重代码大小;楼主可以找一下,看看有没有类似的选项;
实在不行,可以试试使用压缩程序,把代码压缩在FLASH里面,在使用的时候再释放出来; 夜尽天明 发表于 2015-9-11 11:04
这里是要用逻辑AND啊
这里用逻辑与能正常才是见鬼了
你懂逻辑 和 算术 运算的区别吗?
if(!(key1_check_sum&&0xfeff))
等效于
if(!(key1_check_sum))
即
if(key1_check_sum == 0) 你要用的是按位与而不是逻辑与啊! 同一个变量判断 为什么不用 else if ,个人觉得 楼主程序应该还有优化的空间 本帖最后由 babysnail 于 2015-9-11 11:18 编辑
从程序整体结构来优化。 估计是按键程序, 把sum值组成表格,用查表法得键值。执行按键子程序用函数指针。编译完后程序只有查表指令,跳转子程序指令。不会用很多的 if esle 等产生的判断 jmp等指令。分支越多越明显。 学会汇编没坏处! 几个字节很容易的,不要纠结在一个位置 snoopyzz 发表于 2015-9-11 11:05
这里用逻辑与能正常才是见鬼了
你懂逻辑 和 算术 运算的区别吗?
多谢提醒,C我还真不会用 把对同一个变量的多个if判断换成switch呢?
只靠这个减少不了多少
单片机初始化那块是不是可以节省一点 yerrmin 发表于 2015-9-11 11:22
把对同一个变量的多个if判断换成switch呢?
只靠这个减少不了多少
单片机初始化那块是不是可以节省一点 ...
因为外部已经用了一个switch 语句,不知道switch语句里面还能不能再嵌套一个 就算写成按位与也不能判断是否相等啊。 switch语句里面还能不能再嵌套一个switch 夜尽天明 发表于 2015-9-11 11:39
switch语句里面还能不能再嵌套一个switch
可以~~~
夜尽天明 发表于 2015-9-11 11:39
switch语句里面还能不能再嵌套一个switch
嵌套10个应该都可以吧。 本帖最后由 alias 于 2015-9-11 16:44 编辑
>>但是感觉这样写好像有点问题一样。
本人以下所言,的确误人子弟,勿信。{:funk:}
楼主,想知道key_check_sum是不是 0x0100,那就要用 key_check_sum & 0x0100,而不是用 key_check_sum & 0xfeff。
前者运算后只有两个可能,是零(即不是0x0100) 或 0x0100。 alias 发表于 2015-9-11 14:25
>>但是感觉这样写好像有点问题一样。
楼主,想知道key_check_sum是不是 0x0100,那就要用 key_check_sum & ...
误人子弟。0xFFFF & 0x0100 = 0x0100,那么0xFFFF等于 0x0100?
明明最方便的就是==,非得折腾就用+、-、^。 !(key_check_sum^0x0100) 还有就是优化程序结构,将功能相近的写成子函数 贴一段代码上来,我告诉你怎么优化。 youlongam 发表于 2015-9-11 13:48
嵌套10个应该都可以吧。
谢谢,昨天看了看了写,可以嵌套。但是用switch语句,后面的case 是要用常量吧。我这里是几个变量,编译之后报错。 alias 发表于 2015-9-11 14:25
>>但是感觉这样写好像有点问题一样。
本人以下所言,的确误人子弟,勿信。
这地方确实是写错了,没搞清楚&与&& 的却别,多谢指点。 zhonghua_li 发表于 2015-9-11 16:29
贴一段代码上来,我告诉你怎么优化。
软件基本都是这种,判断条件有点多。 takashiki 发表于 2015-9-11 15:45
误人子弟。0xFFFF & 0x0100 = 0x0100,那么0xFFFF等于 0x0100?
明明最方便的就是==,非得折腾就用+、-、 ...
我以前看别人写的库文件,用汇编写的,判断两个条件是否相等全都用与或非判断的,当时没记下来。 这是要省FLASH 的节奏!
应该是效率优先吧 象key1_check_sum 这种应用两个unsigned char 表示,而不是用16位,那怕是unsigned char数组,判断处理16位对8位机来说程序rom要多很多。 自己体会 !!!!!!!!! babysnail 发表于 2015-9-12 11:00
象key1_check_sum 这种应用两个unsigned char 表示,而不是用16位,那怕是unsigned char数组,判断处理16位 ...
要能用八位的话我肯定用八位的,这个地方还涉及到其他功能,只能用16位或者更大的数据 babysnail 发表于 2015-9-11 11:16
从程序整体结构来优化。 估计是按键程序, 把sum值组成表格,用查表法得键值。执行按键子程序用函数指针。 ...
我以前就是用汇编的,所以现在用C还有点不习惯 夜尽天明 发表于 2015-9-12 08:13
软件基本都是这种,判断条件有点多。
把你的 *1*,*2*,*3*(类似key1_check_sum,key2_check_sum...) 变量定义成数组(key_check_sum),然后用循环语句实现。
可能可以节约点空间。
另外就是优化你的算法和模型。 8位MCU处理16位当然吃空间
如果比较的源数据及目的数据都是变量的话,不如将比较项写成子函数,参数为指针传址
看看会不会比原来省空间
zhonghua_li 发表于 2015-9-13 21:38
把你的 *1*,*2*,*3*(类似key1_check_sum,key2_check_sum...) 变量定义成数组(key_check_sum),然后 ...
已经OK了,谢谢 camtime 发表于 2015-9-13 22:46
8位MCU处理16位当然吃空间
如果比较的源数据及目的数据都是变量的话,不如将比较项写成子函数,参数为指针 ...
已经OK了,谢谢
页:
[1]