单片机/MCUwilliam hill官网
直播中

南天音乐

12年用户 627经验值
擅长:模拟技术 嵌入式技术
私信 关注
[讨论]

大家积极性不高啊,那我最后一次更新了,详见4楼

本帖最后由 ntmusic 于 2014-2-15 09:54 编辑

看完william hill官网 上的一个资料分享-让你的代码飞起来,深体会到了代码优化的重要性。在日常的程序设计中,我们编程除了要实现目标功能,还要注意代码的执行效率,以及尽可能减少目标代码长度。
当然这两点通常是矛盾的,所以我们就需要在这两点之间找到一个平衡点。
现在我们来活动活动大脑,看一下谁能按要求编写出程序精炼期执行效率较高的程序吧!
要求:将任意一个无符号整型数值(不大于32位),转变为字符串。如整型数值12345678转变为字符串"12345678",整型数值123转变为字符串"123"。
代码执行硬件:51单片机
请大家根据代码执行硬件进行程序编写和优化,并分享你的代码吧,看看谁的程序最精炼且效率又高。
为便于大家直观比较代码大小,并保证代码能正确运行,请大家按如下格式在Keil中进行程序编写和调试,在调试时打开串口监控窗口,查看转换结果是否正确,并将所生成的代码大小以及调试运行子程序时间做个截图进行比较吧。
#include
typedef  unsigned char uchar;
void UART_PRINT(uchar data *p) //字符串从串口输出,仅Keil调试可用
{
while(*p!='')
{
  SBUF=*p++;
}
}
/*你的转换子程序写在这里*/
void main()
{
//调用你的子程序,可以添加变量等,待转变的变量设为常量12345678.可以多试几个不同长度的整型数值进行验证
UART_PRINT(/*目标字符串*/); //将目标字符串进行输出
while(1);//停止,调试时在此处加断点,调试前先点击工具栏的复位按钮,然后点击运行,跟踪光标停在断点处,观察运行时间Sec,用以比较执行效率
}
注:以上代码占用约10字节RAM,50字节ROM。

回帖(4)

zerocan

2014-2-12 20:43:14
不错  收藏了    等技术好时试试看
举报

南天音乐

2014-2-14 16:04:35
本帖最后由 ntmusic 于 2014-2-14 16:11 编辑

这是我很久很久以前为TFT液晶显示整型数值时用的,应该也是多数初学者使用的方法吧。根据规则,不上代码,上截图。
下面是我之前写的整型数值转字符串代码:
主程序
下面是整个测试文件资源大小:
代码大小
测试整型数值176508,下面是串口监视的测试输出
输出
下面红下划线处是整个程序运行一次所用的时间(全部默认设置,时间仅供对比)。
执行一次时长
可以看出,整个转换程序占用了40多字节的RAM,程序大小有700多字节,执行时长(默认)居然有近14ms。这能不能接受呢?总之我不能接受。后面会有代码优化的程序,就留在下次再发上来吧。大家有啥启发请不要吝啬你们的想法,一起谈谈吧!
举报

南天音乐

2014-2-15 09:52:30
大家没想法吗?好吧,我继续。
3楼介绍的原始的写法明显有很大的改进空间。程序为了实现取余取模从10^9到10^0次方,使用了自建子函数mypow,这样每计算一位都要调用该函数(实际程序是调用了两次,当然可以用一个变量来缓存这个结果的),严重影响执行效率。
既然取余取模从10^9到10^0次方,是已知数,我们当然可以通过查表法来得到结果,这样不仅节省程序空间,而且能极大提高程序性能。
升级后的程序如下:
主程序.png
代码大小:
代码大小.png
输出结果
输出.png
执行时间
执行时间.png
可以看到,对比起第一种方法,程序更简单了,RAM减少了37%,ROM减少了34%,程序执行效率提升了近3倍。
还能再修改吗?当然可以。不过看大家积极性不高,就不再更新了,想知道的再联系我吧
举报

武向

2014-2-18 11:14:09
{:12:}{:12:}{:12:}{:12:}{:12:}
举报

更多回帖

发帖
×
20
完善资料,
赚取积分