搜索
bottom↓
回复: 40

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

[复制链接]

出0入0汤圆

发表于 2015-9-11 10:43:12 | 显示全部楼层 |阅读模式
如题:现在用的芯片程序空间已经快写满了,功能还差一点没做完,只能想办法省点空间出来。
1.
         if(key1_check_sum==0x0100)
         {   
                  .
                  .
                  .
         }

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

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

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

阿莫论坛20周年了!感谢大家的支持与爱护!!

曾经有一段真挚的爱情摆在我的面前,我没有珍惜,现在想起来,还好我没有珍惜……

出0入96汤圆

发表于 2015-9-11 10:47:08 | 显示全部楼层
一般用减法比较快些,
试试用异或判断也可以

出10入61汤圆

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

出0入0汤圆

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

出0入0汤圆

 楼主| 发表于 2015-9-11 10:54:07 | 显示全部楼层
gallle 发表于 2015-9-11 10:47
一般用减法比较快些,
试试用异或判断也可以

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

出0入0汤圆

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

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

出0入0汤圆

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

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

出0入0汤圆

 楼主| 发表于 2015-9-11 10:57:07 | 显示全部楼层
再整个几十个字节基本上就OK了

出10入284汤圆

发表于 2015-9-11 11:01:10 来自手机 | 显示全部楼层
2多了一个&

出0入0汤圆

发表于 2015-9-11 11:01:49 | 显示全部楼层
喷, &&不能代替 &

出0入0汤圆

 楼主| 发表于 2015-9-11 11:04:33 | 显示全部楼层

这里是要用逻辑AND啊

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

发表于 2015-9-11 11:04:51 | 显示全部楼层
本帖最后由 jm2011 于 2015-9-11 11:09 编辑

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

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

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

出0入0汤圆

发表于 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)

出0入8汤圆

发表于 2015-9-11 11:09:44 | 显示全部楼层
你要用的是按位与而不是逻辑与啊!

出0入0汤圆

发表于 2015-9-11 11:13:24 | 显示全部楼层
同一个变量判断 为什么不用 else if ,个人觉得 楼主程序应该还有优化的空间

出0入0汤圆

发表于 2015-9-11 11:16:51 | 显示全部楼层
本帖最后由 babysnail 于 2015-9-11 11:18 编辑

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

出0入0汤圆

发表于 2015-9-11 11:18:03 | 显示全部楼层
几个字节很容易的,不要纠结在一个位置

出0入0汤圆

 楼主| 发表于 2015-9-11 11:18:03 | 显示全部楼层
snoopyzz 发表于 2015-9-11 11:05
这里用逻辑与能正常才是见鬼了

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

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

出0入0汤圆

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

出0入0汤圆

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

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

出0入0汤圆

发表于 2015-9-11 11:36:19 | 显示全部楼层
就算写成按位与也不能判断是否相等啊。

出0入0汤圆

 楼主| 发表于 2015-9-11 11:39:08 | 显示全部楼层
switch语句里面还能不能再嵌套一个switch

出0入0汤圆

发表于 2015-9-11 13:33:27 | 显示全部楼层
夜尽天明 发表于 2015-9-11 11:39
switch语句里面还能不能再嵌套一个switch

可以~~~

出0入0汤圆

发表于 2015-9-11 13:48:32 | 显示全部楼层
夜尽天明 发表于 2015-9-11 11:39
switch语句里面还能不能再嵌套一个switch

嵌套10个应该都可以吧。

出0入0汤圆

发表于 2015-9-11 14:25:46 | 显示全部楼层
本帖最后由 alias 于 2015-9-11 16:44 编辑

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

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

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

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

出0入93汤圆

发表于 2015-9-11 15:45:46 | 显示全部楼层
alias 发表于 2015-9-11 14:25
>>但是感觉这样写好像有点问题一样。

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

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

出0入0汤圆

发表于 2015-9-11 15:52:50 | 显示全部楼层
!(key_check_sum^0x0100)

出0入0汤圆

发表于 2015-9-11 15:57:06 | 显示全部楼层
还有就是优化程序结构,将功能相近的写成子函数

出0入0汤圆

发表于 2015-9-11 16:29:50 | 显示全部楼层
贴一段代码上来,我告诉你怎么优化。

出0入0汤圆

 楼主| 发表于 2015-9-12 08:05:41 | 显示全部楼层
youlongam 发表于 2015-9-11 13:48
嵌套10个应该都可以吧。

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

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

 楼主| 发表于 2015-9-12 08:07:50 | 显示全部楼层
alias 发表于 2015-9-11 14:25
>>但是感觉这样写好像有点问题一样。

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

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

出0入0汤圆

 楼主| 发表于 2015-9-12 08:13:44 | 显示全部楼层
zhonghua_li 发表于 2015-9-11 16:29
贴一段代码上来,我告诉你怎么优化。

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

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

 楼主| 发表于 2015-9-12 08:20:49 | 显示全部楼层
takashiki 发表于 2015-9-11 15:45
误人子弟。0xFFFF & 0x0100 = 0x0100,那么0xFFFF等于 0x0100?
明明最方便的就是==,非得折腾就用+、-、 ...

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

出0入0汤圆

发表于 2015-9-12 08:43:53 | 显示全部楼层
这是要省FLASH 的节奏!
应该是效率优先吧

出0入0汤圆

发表于 2015-9-12 11:00:36 | 显示全部楼层
象key1_check_sum 这种应用两个unsigned char 表示,而不是用16位,那怕是unsigned char数组,判断处理16位对8位机来说程序rom要多很多。 自己体会 !!!!!!!!!

出0入0汤圆

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

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

出0入0汤圆

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

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

出0入0汤圆

发表于 2015-9-13 21:38:14 | 显示全部楼层
夜尽天明 发表于 2015-9-12 08:13
软件基本都是这种,判断条件有点多。

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

出0入0汤圆

发表于 2015-9-13 22:46:37 | 显示全部楼层
8位MCU处理16位当然吃空间
如果比较的源数据及目的数据都是变量的话,不如将比较项写成子函数,参数为指针传址
看看会不会比原来省空间


出0入0汤圆

 楼主| 发表于 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[3]),然后 ...

已经OK了,谢谢

出0入0汤圆

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

已经OK了,谢谢
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-8-26 02:12

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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