搜索
bottom↓
回复: 38

对于判断两个数的大小有什么很好的节省FLASH空间的算法吗?

[复制链接]

出0入0汤圆

发表于 2016-3-8 11:32:18 | 显示全部楼层 |阅读模式
       现在在做的一个项目用的C8051F330单片机,FLASH只有8K大小,程序是别人写的,现在想把代码减小一点,
检查后发现里面有多个判断两个数据的大小的函数,然后输出0或输出1,经过编译检查,每个大概占用13BYTE
的空间,有没有更好的算法来判断两个数的大小然后输出0或1呢。下面是函数的代码


//数据大小判断的函数原型
byte highrange( int max, int value)
{
          if(max<=value)
          {
                return 1;
          }
          return 0;
}

byte uhighrange(unsigned int max,unsigned int value)
{
          if(max<=value)
          {
                  return 1;
          }
          return 0;
}

//数据大小判断的函数的调用

if(uhighrange(csaw->rphw,t))
{
        twarn.bitWA.rxpwrh=1;
}

谢谢了

这个问题折磨很久了。。。。     PS:单片机不可更换

出0入0汤圆

发表于 2016-3-8 12:00:34 | 显示全部楼层
#define highrange(max,value) (max<=value)?1:0
C语言有这种语法,就是不知道省不省空间

出300入477汤圆

发表于 2016-3-8 12:05:12 | 显示全部楼层
qq78929709 发表于 2016-3-8 12:00
#define highrange(max,value) (max

太搞笑了,整数比较竟然要写成函数
这到底是节约空间还是浪费空间啊??
不过对8位机,没准调用函数传参的开销真的小于8位机做16位整数比较的开销。。。
反正要是8位比较,写成define一定比包装成函数要节约

出0入18汤圆

发表于 2016-3-8 12:14:07 | 显示全部楼层
显然  2 楼的  问号表达式 简单

出0入0汤圆

发表于 2016-3-8 13:09:13 | 显示全部楼层
我相信Keil的汇编比人肉的更好

出0入4汤圆

发表于 2016-3-8 14:04:00 来自手机 | 显示全部楼层
试下二楼的方式,函数如果没有编译成内联函数,调用开销大很多。

出300入477汤圆

发表于 2016-3-8 14:20:12 来自手机 | 显示全部楼层
laujc 发表于 2016-3-8 14:04
试下二楼的方式,函数如果没有编译成内联函数,调用开销大很多。

人家不关心是快是慢,只关心rom大小,
结果只要调用的包装代码小于函数体自身,就是合算的。

出0入0汤圆

发表于 2016-3-8 14:46:16 | 显示全部楼层
这个要看了,假如调用比较大小的函数的地方很多,写成内联方式应该要占用更多的空间吧!不知道编译器会不会优化。

出0入0汤圆

发表于 2016-3-8 14:57:31 | 显示全部楼层
这个没有办法,我看函数基本是最简单了,你看看函数调用花了几个字节

出0入0汤圆

 楼主| 发表于 2016-3-8 15:08:36 | 显示全部楼层
redroof 发表于 2016-3-8 14:20
人家不关心是快是慢,只关心rom大小,
结果只要调用的包装代码小于函数体自身,就是合算的。 ...

恩 对的 慢是可以接受的 只要占用ROM比较小就可以了

出0入0汤圆

发表于 2016-3-8 15:24:33 | 显示全部楼层
是否和调用的次数有关呢

出0入0汤圆

 楼主| 发表于 2016-3-8 15:52:33 | 显示全部楼层
沧海清风 发表于 2016-3-8 15:24
是否和调用的次数有关呢

有呢,调用次数很多,10次以上

出0入0汤圆

发表于 2016-3-8 16:04:44 | 显示全部楼层
调用次数多的话当然函数是更省空间,当然函数内部也可以用 ? : 表达式。

出300入477汤圆

发表于 2016-3-8 16:23:46 | 显示全部楼层
rain73 发表于 2016-3-8 16:04
调用次数多的话当然函数是更省空间,当然函数内部也可以用 ? : 表达式。

不一定。
这种很短的函数,没准传参数加上取返回值所需的代码量比直接执行函数体还长呢??
把这个函数写成宏,或者当成正常函数,各试一遍,看看哪种代码更少就行了。

出0入0汤圆

 楼主| 发表于 2016-3-8 16:35:09 | 显示全部楼层
redroof 发表于 2016-3-8 16:23
不一定。
这种很短的函数,没准传参数加上取返回值所需的代码量比直接执行函数体还长呢??
把这个函数写 ...

我试了一下,单独写了一个小的测试程序使用宏定义占用的空间比函数小,但是在我们完整的程序中使用宏定义占用的空间比函数大

出300入477汤圆

发表于 2016-3-8 16:44:10 | 显示全部楼层
yjamd 发表于 2016-3-8 16:35
我试了一下,单独写了一个小的测试程序使用宏定义占用的空间比函数小,但是在我们完整的程序中使用宏定义 ...

那这就是答案了啊
实际应该是宏定义的代码比调用函数的开销代码稍微多一点点,但调用函数还有个函数体自身的大小,这个是会按调用次数分摊的。
结果如果你只调用一两次,宏定义更省空间,如果调用很多次,写成函数更省

出0入0汤圆

 楼主| 发表于 2016-3-8 16:48:51 | 显示全部楼层
redroof 发表于 2016-3-8 16:44
那这就是答案了啊
实际应该是宏定义的代码比调用函数的开销代码稍微多一点点,但调用函数还有个 ...

恩 这个是结论了哦 但是我的问题还没有解决啊

出0入0汤圆

发表于 2016-3-8 18:29:37 | 显示全部楼层
redroof 发表于 2016-3-8 16:23
不一定。
这种很短的函数,没准传参数加上取返回值所需的代码量比直接执行函数体还长呢??
把这个函数写 ...

别不一定,一定的。
关键在于你调用多少次,有个临界值。函数的代码是固定的,而你内嵌的代码线性增长的。

出0入0汤圆

发表于 2016-3-8 18:31:52 | 显示全部楼层
redroof 发表于 2016-3-8 16:44
那这就是答案了啊
实际应该是宏定义的代码比调用函数的开销代码稍微多一点点,但调用函数还有个 ...

你这不成了屁话?

出300入477汤圆

发表于 2016-3-8 18:32:29 | 显示全部楼层
rain73 发表于 2016-3-8 18:29
别不一定,一定的。
关键在于你调用多少次,有个临界值。函数的代码是固定的,而你内嵌的代码线性增长的 ...

万一你的函数代码短于调用函数开销呢(8位机做8位的加法函数,或者32位机做32位的加法函数)?
那种情况就永远是内嵌更小了。

出0入0汤圆

发表于 2016-3-8 18:36:25 | 显示全部楼层
yjamd 发表于 2016-3-8 16:48
恩 这个是结论了哦 但是我的问题还没有解决啊

你就不要纠结这个问题了,如果一个功能重复调用有2次以上,写成函数比较科学,容易修改且不易出错,
如果以后要修改表达式,一个一个来多累?不要在呼那点空间的差别。

出0入0汤圆

发表于 2016-3-8 18:45:39 | 显示全部楼层
redroof 发表于 2016-3-8 18:32
万一你的函数代码短于调用函数开销呢(8位机做8位的加法函数,或者32位机做32位的加法函数)?
那种情况 ...

函数是固定的,调用开销也是固定的,有什么万一呢?除非你写一个函数入是a出也是a,内嵌语句中a什么也不干。

出0入131汤圆

发表于 2016-3-8 18:49:25 | 显示全部楼层
才13字节,lz就算你想速小rom占用也不应该差这两个函数。lz你方向错了吧

出300入477汤圆

发表于 2016-3-8 18:57:16 来自手机 | 显示全部楼层
rain73 发表于 2016-3-8 18:45
函数是固定的,调用开销也是固定的,有什么万一呢?除非你写一个函数入是a出也是a,内嵌语句中a什么也不 ...

做点跟CPU字长匹配的简单算术逻辑操作,加减与或非都行,保证函数体短于调用代码.

出0入0汤圆

发表于 2016-3-8 19:28:23 | 显示全部楼层
每当这个时候,我就来膜观大神的辩论

出0入0汤圆

 楼主| 发表于 2016-3-8 20:21:11 | 显示全部楼层
asj1989 发表于 2016-3-8 18:49
才13字节,lz就算你想速小rom占用也不应该差这两个函数。lz你方向错了吧

这两个函数被调用了很多次(>10),所以这个函数减小一点的话整个程序会小很多的

出0入131汤圆

发表于 2016-3-8 20:28:12 | 显示全部楼层
yjamd 发表于 2016-3-8 20:21
这两个函数被调用了很多次(>10),所以这个函数减小一点的话整个程序会小很多的 ...

一个函数占用13byte,即使你调用1万次 它还是占用13byte,而不是 1w*13

出0入0汤圆

 楼主| 发表于 2016-3-8 20:31:17 | 显示全部楼层
asj1989 发表于 2016-3-8 20:28
一个函数占用13byte,即使你调用1万次 它还是占用13byte,而不是 1w*13

我去试试

出300入477汤圆

发表于 2016-3-8 20:34:31 来自手机 | 显示全部楼层
asj1989 发表于 2016-3-8 20:28
一个函数占用13byte,即使你调用1万次 它还是占用13byte,而不是 1w*13

13字节是调用开销吧?

出0入0汤圆

发表于 2016-3-8 20:38:56 | 显示全部楼层
一个13个字节,10次也才130字节,再其他地方想想办法就省回来了,比如有些使用频繁的变量定义为data类型就能省不少空间

出0入131汤圆

发表于 2016-3-8 20:56:18 | 显示全部楼层
不管是占用开销还是调用开销,我觉得都不算多啊,到是去掉一些不用的东西,比如printf,或者优化一下常量数组。再或者改变一下程序逻辑架构,都可以省不少内存。 不要去纠结这2个函数

出0入0汤圆

 楼主| 发表于 2016-3-8 20:58:15 | 显示全部楼层
asj1989 发表于 2016-3-8 20:56
不管是占用开销还是调用开销,我觉得都不算多啊,到是去掉一些不用的东西,比如printf,或者优化一下常量数 ...

没有printf类的函数,程序大是因为里面有很多数组,必不可少的哦。起码有2K的FLASH

出0入0汤圆

发表于 2016-3-8 21:14:09 来自手机 | 显示全部楼层
目测是做光模块的

出0入0汤圆

 楼主| 发表于 2016-3-8 21:30:06 | 显示全部楼层
dz46316740 发表于 2016-3-8 21:14
目测是做光模块的

这也能猜到。。。服了。。。

出0入0汤圆

 楼主| 发表于 2016-3-8 21:32:02 | 显示全部楼层
dz46316740 发表于 2016-3-8 21:14
目测是做光模块的

很敬仰你啊

出0入0汤圆

发表于 2016-3-8 22:08:24 | 显示全部楼层
没有测试.但觉得下面的三个方法可能有用.
1 对函数的参数的定义增加idata的定义,因为51的参数是有多种类型,传参数是int是3个字节,有一个字节是用来说明是什么类型的.看你的程序的调用是否使用xdata参数,如时没有用可以这样试试.
2 把函数的返回改成bit.51支持bit参数的.这样应该可以减少代码量.
3 在程序中使用bdata数来处理位操作,用好可以减少代码量.

出0入0汤圆

发表于 2016-3-18 23:21:48 来自手机 | 显示全部楼层
我不说话,我是来膜拜大神的

出0入0汤圆

发表于 2016-3-18 23:37:51 | 显示全部楼层
进来看大神辩论!

出0入213汤圆

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

本版积分规则

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

GMT+8, 2024-5-9 13:47

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

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