打印
[牛人杂谈]

PC编程与嵌入式编程的差别

[复制链接]
751|7
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
这是一个很重要的概念!
1.printf()的时间
在PC编程中,你可以用printf()这个函数来看变量值,而忽略它所占用的时间,(相对于3GHZ的CPU来说可以忽略),但是在嵌入式编程中,用printf()在超级终端中看变量值的时候,它的开销你要计算进去,尤其是程序对信号的捕捉到了毫秒,微秒级别的时候!
笔者曾经干过这样一件事情,用定时器函数来delay()9毫秒时间,过0.9毫秒,让里面的变量i加一,结果i等于9的时候跳出循环,而在里面多加了一句printf(),i加到了6就跳出了循环,害的我以为我的算法错了,希望大家不要走同样的弯路!
2.乘法时间
说到delay()函数,我的原型如下:
void delay(double time)
{
delayEnd = 0;
time = time * 12000;//得到计时次数

TCMPR0 = (long)time;

TCSR0 |= CEN; //开始计数
while(delayEnd == 0); //得到定时中断服务函数吧delayEnd 置为1
}
笔者用这个延迟函数想产生一个周期为26us的方波,于是delay(0.026);然后取反,结果产生了周期为100us的方波于是笔者改成了这样:
void Delay(long time)
{
delayEnd = 0;

TCMPR0 = time; //得到计时次数

TCSR0 |= 0x40000000; //开始计数,对TCSR0的第30位尅是写1,表示计数
while(delayEnd == 0); //得到定时中断服务函数吧delayEnd 置为1
}
结果产生周期为50us的方波,从两个delay()函数中我们可以看到,乘法的占用时间在程序达到us级别的时候,是必须要简化和考虑的,而每条语句的汇编条数我们也要看到,尽量精简,因为延迟函数之前,程序的条数也会占用时间,这些在PC机中从来不用考虑!

沙发
xinpian101|  楼主 | 2017-8-21 20:45 | 只看该作者
大家觉得呢?

使用特权

评论回复
板凳
xinpian101|  楼主 | 2017-8-21 20:47 | 只看该作者
红外发射搞了我整整5天,最后一天是加班加点才搞了出来!
我用的是HS0038B这个接收端,而"38"代表要载波成38KHZ的意思,电路图如下:

我原来以为只要往P3.6端口写1,那红外就会发出1,太天真了,红外发射一定要载波,调制,这样抗干扰的能力才强!
但是我当时有个问题,为什么我的接收端用成品红外发射它就是高电平和低电平,老师给我的回答:因为HS0038B里面有解调电路,你看到的信号是已经是解调好的!就因为这个原因不明白,我整整忙活了五天,等到出来的那一刹那,整个人都非常高兴,正好是周末,可以好好休息了。

使用特权

评论回复
地板
天灵灵地灵灵| | 2017-8-21 21:01 | 只看该作者
一个直接用printf,一个还要考虑从哪个端口输出。

使用特权

评论回复
5
捉虫天师| | 2017-8-21 22:34 | 只看该作者
差别其实不是很大,就看怎么理解。

使用特权

评论回复
6
zxq6| | 2017-8-21 22:42 | 只看该作者
思路转换的问题,做哪个开发,就要了解这个系统的特点。比如,单片机实现1ms.定时器很容易,计算机上试试?

使用特权

评论回复
7
ligen13872| | 2017-8-22 14:39 | 只看该作者
学习了

使用特权

评论回复
8
huahuagg| | 2017-8-25 17:08 | 只看该作者
有意思学习学习。

使用特权

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

本版积分规则

97

主题

1413

帖子

1

粉丝