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

[复制链接]
11591|50
acute1110 发表于 2010-6-23 16:45 | 显示全部楼层
linux下谁还会用仿真器啊,用printf也蛮好的了,恭喜你在8位机上用到了32位机的方法。
 楼主| 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个……其它的“小”文件不计
SeaSun 发表于 2010-6-23 20:23 | 显示全部楼层
还以为是汇编......
xwj 发表于 2010-6-23 20:54 | 显示全部楼层
呵呵,只看一楼就知道不是汇编了
yyj222hf 发表于 2010-6-23 22:52 | 显示全部楼层
:loveliness:新手飘过
gz04022167 发表于 2010-6-24 16:34 | 显示全部楼层
有弄过2M的代码,外扩Rom 、Ram。含有全部中文字库
haotz 发表于 2010-6-25 21:42 | 显示全部楼层
应该弄个monitor 程序或 loader 才好
木字四点水 发表于 2010-6-26 15:09 | 显示全部楼层
maxking 发表于 2010-6-27 08:53 | 显示全部楼层
没日没夜弄了这么久,不要民工价就好了。毕竟伤身体。
MyLovetus 发表于 2010-6-27 11:47 | 显示全部楼层
肯定不是汇编,
不要169KHEX里面有160K的PRINTF就好,呵呵,纯属玩笑.
代码并不是越大越好,这个是我想唯一表达的意思.
 楼主| 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,可以随心所欲的加功能了,呵呵
haitao10086 发表于 2010-6-29 16:38 | 显示全部楼层
用STM8做的汽车淡定产品有175K
ecomputer 发表于 2010-6-30 22:11 | 显示全部楼层
10天,楼主很厉害,没仿真器不可怕,可怕的是没有串口,哈哈,
wangkangming 发表于 2010-10-21 15:13 | 显示全部楼层
你真的好强啊,佩服你:handshake
李冬发 发表于 2010-10-22 09:06 | 显示全部楼层
我基本是用串口提调试信息。
代码里内置了调试程序,再用VC写了调试程序,可以发相应的指令和显示返回的信息。大致可以知道内部的情形。如一些重要的变显或端口的值。
Txapp 发表于 2010-11-4 14:53 | 显示全部楼层
51 bank 技术,169K hex的代码,好像Mstar之类的就是这样整的,原始架构都是原厂搞定的。
acute1110 发表于 2010-11-4 16:09 | 显示全部楼层
的确是在做之前设计好状态机是重中之重
john_light 发表于 2010-11-4 16:26 | 显示全部楼层
我的ARM程序都写了两年了,不过有一段时间没加码了,目标代码也就二十来k。准备一旁面壁思过……
johnwjl 发表于 2010-11-4 16:50 | 显示全部楼层
强人!
zq1987731 发表于 2010-11-4 20:24 | 显示全部楼层
最可恨的是接手他人程序,尤其是水平较低的那种
现在碰到类似情况,重写没商量,事实上这样效率要比看他人程序高多了
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 在线客服 返回列表 返回顶部