打印

没日没夜10天,搞定一个老产品的升级,169K的51代码

[复制链接]
楼主: mohanwei
手机看帖
扫描二维码
随时随地手机跟帖
21
acute1110| | 2010-6-23 16:45 | 只看该作者 回帖奖励 |倒序浏览
linux下谁还会用仿真器啊,用printf也蛮好的了,恭喜你在8位机上用到了32位机的方法。

使用特权

评论回复
22
mohanwei|  楼主 | 2010-6-23 18:16 | 只看该作者
是在老产品的基础上改,这里首先要对最开始开发这个系统的开发者表示敬仰……

真要10天搞出这么大的程序来我估计就是传说中的神了,呵呵
不过这种全面状态机化的大程序理解和维护起来也是很吃力的,框架原理倒是不复杂,main()里一个大循环,循环开头先设置一下时间片标记:
void  time_basic_set(void)
{
        if(F_100MS==M_TRUE)
        {
                F_100MS=M_FALSE;
                F_100MS_BACK =M_TRUE;               
                time0_deal_reader_led();
        }
        if(F_250MS==M_TRUE)
        {
                F_250MS=M_FALSE;
                F_250MS_BACK =M_TRUE;
        }
        if(F_500MS==M_TRUE)
        {
                F_500MS=M_FALSE;
                F_500MS_BACK =M_TRUE;
        }
        if(F_1S==M_TRUE)
        {
                F_1S=M_FALSE;
                F_1S_BACK =M_TRUE;
        }
       
}
大循环尾部则清一下时间片标记:
void  time_basic_reset(void)
{
        F_100MS_BACK =M_FALSE;
        F_250MS_BACK =M_FALSE;
        F_500MS_BACK =M_FALSE;
        F_1S_BACK =M_FALSE;
}

中间的程序就是一个状态机套一个状态机了,大部分都全局变量……估计原本的程序都是分成一块块的,就算是全局变量,只要保持良好的习惯不要随便在别的地方用,也没什么事。但是后来的维护者陆续增、删、改了不少功能,就慢慢乱了。
大致看了一下,C文件7K行以上的有一个,3K行以上的有5个……其它的“小”文件不计

使用特权

评论回复
23
SeaSun| | 2010-6-23 20:23 | 只看该作者
还以为是汇编......

使用特权

评论回复
24
xwj| | 2010-6-23 20:54 | 只看该作者
呵呵,只看一楼就知道不是汇编了

使用特权

评论回复
25
yyj222hf| | 2010-6-23 22:52 | 只看该作者
:loveliness:新手飘过

使用特权

评论回复
26
gz04022167| | 2010-6-24 16:34 | 只看该作者
有弄过2M的代码,外扩Rom 、Ram。含有全部中文字库

使用特权

评论回复
27
haotz| | 2010-6-25 21:42 | 只看该作者
应该弄个monitor 程序或 loader 才好

使用特权

评论回复
28
木字四点水| | 2010-6-26 15:09 | 只看该作者
强大

使用特权

评论回复
29
maxking| | 2010-6-27 08:53 | 只看该作者
没日没夜弄了这么久,不要民工价就好了。毕竟伤身体。

使用特权

评论回复
30
MyLovetus| | 2010-6-27 11:47 | 只看该作者
肯定不是汇编,
不要169KHEX里面有160K的PRINTF就好,呵呵,纯属玩笑.
代码并不是越大越好,这个是我想唯一表达的意思.

使用特权

评论回复
31
mohanwei|  楼主 | 2010-6-27 19:52 | 只看该作者
编译输出窗口提示的169K,实际也就是bin的大小……调完肯定已经把printf用宏屏蔽掉的,呵呵。
也就是很简单的处理方法:
#if(UsePrintf)
     printf("\nSendLen=%0d",sendlen);
#endif
调试完了把UsePrintf定义为0即可。

一开始看到里面的代码很多字符串、内存函数(例如memcpy,memchk,strstr,strlen……)都自己实现,还以为原作者不知道C51库函数……调试过程中发现了一些百思不得其解的问题,将库函数改为自编的就搞定了,而这个软件架构就是简单的定时器、串口、外中断+外部while(1)大循环,根本没有什么函数重入问题。
昨天试着将common bank里的小字库在外面单独编一个小工程(用过C51 分区模式的人都知道,程序中所有常量都会而且必须被编译到common bank去),输出的hex直接加载到bank7上,在主工程里仅使用bank0-bank6,以及common bank。凡是涉及到读取字库的地方,通过调用一个函数,根据字符编码从bank7提取字库。结果本来已经溢出的32K common bank空间一下腾空了十几K,可以随心所欲的加功能了,呵呵

使用特权

评论回复
32
haitao10086| | 2010-6-29 16:38 | 只看该作者
用STM8做的汽车淡定产品有175K

使用特权

评论回复
33
ecomputer| | 2010-6-30 22:11 | 只看该作者
10天,楼主很厉害,没仿真器不可怕,可怕的是没有串口,哈哈,

使用特权

评论回复
34
wangkangming| | 2010-10-21 15:13 | 只看该作者
你真的好强啊,佩服你:handshake

使用特权

评论回复
35
李冬发| | 2010-10-22 09:06 | 只看该作者
我基本是用串口提调试信息。
代码里内置了调试程序,再用VC写了调试程序,可以发相应的指令和显示返回的信息。大致可以知道内部的情形。如一些重要的变显或端口的值。

使用特权

评论回复
36
Txapp| | 2010-11-4 14:53 | 只看该作者
51 bank 技术,169K hex的代码,好像Mstar之类的就是这样整的,原始架构都是原厂搞定的。

使用特权

评论回复
37
acute1110| | 2010-11-4 16:09 | 只看该作者
的确是在做之前设计好状态机是重中之重

使用特权

评论回复
38
john_light| | 2010-11-4 16:26 | 只看该作者
我的ARM程序都写了两年了,不过有一段时间没加码了,目标代码也就二十来k。准备一旁面壁思过……

使用特权

评论回复
39
johnwjl| | 2010-11-4 16:50 | 只看该作者
强人!

使用特权

评论回复
40
zq1987731| | 2010-11-4 20:24 | 只看该作者
最可恨的是接手他人程序,尤其是水平较低的那种
现在碰到类似情况,重写没商量,事实上这样效率要比看他人程序高多了

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则