搜索
bottom↓
回复: 16

求菜单程序编译代码过于庞大的解决之道。

[复制链接]

出0入0汤圆

发表于 2013-11-9 18:03:37 | 显示全部楼层 |阅读模式
本帖最后由 ThinkCell 于 2013-11-9 18:09 编辑

设计了一款仪表,C语言程序编译后大约有50K以上。
程序为模块化设计,架构就是各个功能模块和菜单设置参数模块的组合。
不检查不知道,编译后发现菜单竟然占到总程序一半还多。
目前我还有几个功能没有做进去,如果程序突破58K,这个方案就要宣告失败了。

仪表显示为:5位数码管,两排显示。上面一排提示参数名称,下面一排显示参数值。
通过按【设置】切换参数,按【↑】【↓】【←】【→】修改程序值。

特此求助:求菜单程序编译代码过于庞大的解决之道。(无需代码,提供思路或方法即可)谢谢!

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

知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)

出0入0汤圆

发表于 2013-11-9 18:41:44 来自手机 | 显示全部楼层
你的菜单结构是怎么样的?链表?结构体数组?

出0入0汤圆

发表于 2013-11-9 19:08:15 | 显示全部楼层
你的程序如果调用了其他人写的子函数库。或者你的工程中包含了别人写的文件。把没有用到的函数删除了,不要在工程文件中编译。这样会减少一点烧入单片机的代码量

出0入0汤圆

发表于 2013-11-9 19:09:37 | 显示全部楼层
数码管的方案按说菜单占不了太多啊。楼主可以试试这个方案。。。

定义一个菜单的结构数据里面包含:
菜单项字符串 菜单项对应变量指针 数值最大值 数值最小值 数值类型(单字节双字节 定点数等)  菜单项回调函数指针

剩下的就是写各个按键菜单跳转和参数调整的函数了。
写好后就可以定义菜单项的常量了。

出0入442汤圆

发表于 2013-11-9 19:20:35 | 显示全部楼层
zhangshixing 发表于 2013-11-9 19:09
数码管的方案按说菜单占不了太多啊。楼主可以试试这个方案。。。

定义一个菜单的结构数据里面包含:

其实设计菜单的人才是真正的垃圾。典型的菜单可以用一个状态机轻松搞定,显示部分调用一个子函数,设定位置、内容,然后就等着输入了。之后根据状态机选择相应的操作。又不是MFC,一个菜单撑死几K。

出0入0汤圆

发表于 2013-11-9 20:24:47 | 显示全部楼层
不会是if...else....if...else型的菜单吧.....
八成是菜单结构问题。

出0入10汤圆

发表于 2013-11-9 20:33:32 | 显示全部楼层
需要这么大的空间吗? 楼主不会吧图片啥的转成数据放在里面了吧。这个可以放在FLASH,EEPROM等外存,需要的时候去读取加载。常用的比如箭头,图标这些小的,频繁使用的可以放在菜单程序中,总之应该分析下为什么这么大。 然后对症下药。

出0入0汤圆

发表于 2013-11-9 20:39:48 | 显示全部楼层
本来UI就这个比例,但对数码管来说确实大了些, 可以用层次状态机试试,

出0入0汤圆

 楼主| 发表于 2013-11-9 21:12:56 | 显示全部楼层
本帖最后由 ThinkCell 于 2013-11-9 21:33 编辑

非常感谢楼上几位朋友热情解答,在此表示感谢!
如果菜单的参数可以做成一个子程序当然是最好不过。这样50个参数只需要调用50次就可以了,代码肯定就非常少了。
我的参数中有些是long参数用到5个数码管(比如:额定量程),
有些是char参数只用到1个数码管(比如:滤波等级),
有些用到2个数码管,但是必须小于32(比如:仪表地址号),
有些是组合参数比如: ABCD(A=0~4;B=0~4;C=0~6;D=0~9)
修改当前参数位时,对应的数码管需要闪烁显示。
等等,就不举例了。总之就是不方便做成一个子函数或子程序。当然我也不是要解释我为什么编出50K程序的原因,而是将实际请款说出来与大家分享一下,希望获取大家的帮助与建议。

4楼  zhangshixing 和 5楼  wye11083的方法其实我也一直在考虑的,很有建设性.但是脏话还是少说的好.

出0入0汤圆

发表于 2013-11-9 21:24:59 | 显示全部楼层
这个...数码管用不了那么大吧,在51上RAM倒是有不够用的可能

出0入0汤圆

发表于 2013-11-9 21:28:13 | 显示全部楼层
LZ是做仪表的吗?我想请教LZ一个问题,关于线性校正
通关AD采样得到数据,在经过一定转换得到显示值,由于器件线性不够好,就要校正
通过“+”,“-”健来调整,再保存
我没想到一种比较好的方法,LZ能否告知一二,这个在内部是如何实现的啊

出0入0汤圆

发表于 2013-11-9 21:35:59 | 显示全部楼层
顶起。。。。

出0入0汤圆

发表于 2013-11-9 21:36:43 | 显示全部楼层
你可能是在菜单程序中使用了单片机不支持的除法运算,这样代码量就成倍的增长了。

出0入0汤圆

 楼主| 发表于 2013-11-9 21:43:37 | 显示全部楼层
skyxjh 发表于 2013-11-9 21:36
你可能是在菜单程序中使用了单片机不支持的除法运算,这样代码量就成倍的增长了。 ...

确实如你所说,呵呵.
比如A参数为8000,显示到数码管之前需要计算出对应数码管数值,然后查表得出对应字符.

出0入0汤圆

 楼主| 发表于 2013-11-9 21:54:46 | 显示全部楼层
苦行僧 发表于 2013-11-9 21:28
LZ是做仪表的吗?我想请教LZ一个问题,关于线性校正
通关AD采样得到数据,在经过一定转换得到显示值,由于 ...

这个问题于几个参数有关
1,零点
2,当前AD值
3,当前标率
4,但前显示数值.
你可以通过[+]或[-]来调整显示数值,直到达到你的要求,让后确认.此时仪表重新计算标率(当前AD-零点)/显示数据,然后就可以了.
如果非线性严重的话就得上多段标定修正(直线和曲线视情况而定)
你讲的方法在起重超载限制器中用的比较多,对不懂的人就直接上[+][-]很容易上手,但也会提高误操作的概率.

出0入0汤圆

发表于 2013-11-9 22:01:51 | 显示全部楼层
将除法做一个子函数,用到除法的地方都调用这个子函数代替,这样代码量就可以降下来了。

出0入0汤圆

发表于 2013-11-9 22:22:20 | 显示全部楼层
ThinkCell 发表于 2013-11-9 21:54
这个问题于几个参数有关
1,零点
2,当前AD值

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

本版积分规则

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

GMT+8, 2024-7-23 16:12

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

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