0 单片机C语言请教! - 第3页 - 单片机论坛,单片机技术交流论坛 - 21ic电子技术开发论坛
打印

单片机C语言请教!

[复制链接]
楼主: space005
手机看帖
扫描二维码
随时随地手机跟帖
41
horse7812| | 2008-10-14 15:23 | 只看该作者 回帖奖励 |倒序浏览

123

顶!

使用特权

评论回复
42
horse7812| | 2008-10-14 15:53 | 只看该作者

不能太浮躁

    看了楼主的问题和回复的贴子,觉得很多人在学习的过程中显得非常飘浮,基本功非常缺欠,对单片机的基本原理不理解,对KEIL C理解又太片面,受那些所谓经典教材上声称的C语言如何如何强大的误导非常深.其实,学过8位机的话就应该知道这个"8"的含义的,即任何一条指令只能操作8个位也就是单字节的数据,如果要操作超过1个字节的数据,则必须至少要通过不少于两条的指令.再就是中断机制(详细的可参考上海复旦大学的那本教材),只有单条指令才能保证不被中断,也就是说单条指令是符合"原子性的",处理多字节数据时,就有可能在处理的过程中被中断,对于新手来说,表面上看程序确实是没问题,逻辑上也很清晰,但这只是宏观上的,还应该从微观上去进行思考.如果在中断后所执行的代码中没有对该多字节数据进行操作,则是不会出问题的,问题就出在对这个多字节数据进行的操作,从而引起错误.就拿楼主的程序来说吧,假设在while中,TD = 00 FF(高字节在前,16进制),先取出高字节00H,接着中断发生,TD= 01 00,中断返回后,取低字节本来应该是FFH才对,但由于中断的影响,取出来的TD就变成了00 00了!

使用特权

评论回复
43
xinzha| | 2008-10-14 18:09 | 只看该作者

ll

楼上的问题救火车已经在很早的回复就说明了。
我之所以说编译器有问题,就是因为在这种情况下,汇编器应该先去比较高位,然后再去比较低位,或者保留一份计数的副本,这就避免产生楼主碰到的时长不够情况下却计时到时的情况。楼主的程序在逻辑上没有任何问题,只是汇编器做错了,所以说汇编器有问题。另外c真的很强大,只是看不同的编译器能否做到按照程序员本意将它翻译成汇编语言和机器码。
How are you 和 how old are you被翻译成“怎么是你?”,“怎么老是你?”,难道不是翻译者的问题,而是说话者的问题?写编译器的是人,而编译器也仅仅是一种语言解释软件而已。

使用特权

评论回复
44
eleclike| | 2008-10-14 21:45 | 只看该作者

学习了

学习了

使用特权

评论回复
45
inter_zhou| | 2008-10-14 23:04 | 只看该作者

无语

编译器是死的,人是活的,又不是避不开的错误,为什么要把责任加上编译器上?

使用特权

评论回复
46
xinzha| | 2008-10-15 09:29 | 只看该作者

gcc出了多少个版本了?

使用特权

评论回复
47
tjmcu| | 2008-10-15 12:42 | 只看该作者

xuexi

henhao

使用特权

评论回复
48
horse7812| | 2008-10-15 16:35 | 只看该作者

好好学习,天天向上!

说编译器有问题的人只能说是菜鸟,要么就根本没有经过正规的单片机方面的学习!顶多就学了点所谓的高级语言VB,C等等什么的,就以为自己了不起,不去找自身的原因,竟然还怪编译器!恕我直言.如果你觉得我说话太过份了,你就去随便找个相关的公司去面试一下,看看人家能开多少的工资给你.

使用特权

评论回复
49
补丁| | 2008-10-15 16:54 | 只看该作者

见识了

见识了

使用特权

评论回复
50
xinzha| | 2008-10-16 10:34 | 只看该作者

ll

哈哈,菜鸟我承认,跟我导师比我再练20年还是个菜鸟。要说正规的单片机学习倒是有,要不然给我导师丢人。至于是不是编译器的问题,说得够多了,不用再说了。工作问题就不用你发愁了,我们从事的行业圈子很窄,即使跳过几次槽,也多年没有经过技术面试了。
另外,奉劝你这样人收敛一些,明明是个技术讨论,开始人身攻击有劲没?编译器有没有问题都是技术层面的事,没必要搞那么激动,工程师也得注重自身修养对不。

使用特权

评论回复
51
学生D| | 2008-10-16 15:02 | 只看该作者

楼主的程序在逻辑上就有问题。

43楼认为:
楼主的程序在逻辑上没有任何问题,只是汇编器做错了,所以说汇编器有问题。另外c真的很强大,只是看不同的编译器能否做到按照程序员本意将它翻译成汇编语言和机器码。
*********************************************************************
问题在于:双方看法不同:

50楼认为LZ的程序在逻辑上没有问题,而是编译器不能按照程序员的本意翻译成有效的机器码。

我站在反方。我认为:楼主的程序在逻辑上就有问题。编译器不可能对“病句”做出“正确的翻译”。你说“How are  you ”,机器翻译都能正确翻出来。但是如果你说“Are you how”“you are how”,我不知道机器怎样翻译?
while(TD3<=18000);
TD3每100ms增长1,100ms之内while(TD3<=18000;做了多少次无效的测试?我不认为对TD3连续读5000000(500万)次都是可靠的。虽然是机器,但是软件对外部干扰是脆弱的。这种稍微修改一下就能提高程序坚固性的问题,众网友都提过了。最基本的合理逻辑:“每100ms/每中断一次,测试一次TD3。”

这在软件设计规则里有点像“与一个共享资源(TD3)相关的两件事物之间的协调和同步。”

如果不照规则设计,(我只管测试,我才不管什么时候协调/同步中断),那编译器怎么办?

有一位网友说增加一个(char)TD4,(不是标志位)那可真不是多余。中断中最合理的设计是TD4++累计。然后主程序通过TD4--来了解是否丢失过中断次数,来进行补偿。就好像:

while(TD4--)TD3++;

可快可慢。这样算是协调了。

使用特权

评论回复
52
liudewei| | 2008-10-16 23:29 | 只看该作者

类似的问题请在中断里判断,或先关中断后判断,再开终端

使用特权

评论回复
53
horse7812| | 2008-10-17 10:52 | 只看该作者

对51楼的看法中的几点疑问

对于"while(TD4--)TD3++;"来说,TD4完全有可能大于1,这样就意味着每中断1次后,并不能保证"while(TD4--)TD3++;"执行至少1次,那么会不会出现在执行"while(TD4--)TD3++;"的过程中发生中断?如果发生了中断,那么TD4就可能发生错误,因为在"while(TD4--)TD3++;"中对TD4进行了运算,而不仅仅是判断,从而引起误差.如果能保证每中断1次后就能够执行"while(TD4--)TD3++;"至少1次,那么就没必要用"char",用个"bit"就可以了.

使用特权

评论回复
54
hanssonli| | 2008-10-17 15:40 | 只看该作者

各位大师

小弟学习了 17楼说得很明白  

使用特权

评论回复
55
WOAILYMD| | 2008-10-17 17:52 | 只看该作者

8位单片机很生气!

争论出真知!大家稍安勿躁,知识面前,大家都是学生。研发无高手,研发无止境,学习无止境。

总结以上精华为一句话:
减小CPU的负担,不要让while(TD3<=18000); 无休止的执行;象17楼那样,去掉这样的累死CPU的循环语句;而改在中断里面执行,并设置终端标志,每终端一次,再判断一次,这样,既减少终端乱了while的隐患,又减小了main函数(CPU)的负担。最重要的是,它解决了LZ的问题。

使用特权

评论回复
56
WOAILYMD| | 2008-10-17 17:54 | 只看该作者

LS终端应为中断,汗!

使用特权

评论回复
57
SkyCode| | 2008-10-17 18:58 | 只看该作者

不错的问题

学习中

使用特权

评论回复
58
学生D| | 2008-10-18 09:52 | 只看该作者

和53楼讨论。

while(TD4--)TD3++;正是为了保证当while(TD4--)TD3++;后面的主程序运行时间大于TD4时标时设计的。TD4叫做计数型信号量。必须是char/int类型。没说TD4受限不能大于1.通用设计,是10都可能的。

以本题目为例,主程序如果运行一次循环时间大于200ms,那么就不可能保证像bit信号量那样在时标中断TD4++后,TD3及时++,(不能保证每时标循环到while(TD4--)TD3++;指令处一次。)由此造成2者失步。

while(TD4--)TD3++;是为TD3/TD4同步设计的。假设主程序循环一个周期500ms!这样2次while(TD4--)TD3++;之间将丢失4、5个时标TD4,要解决这样的问题就必须把TD4设计成计数型信号量。当主程序运行时间大于时标时,利用计数型信号量可以进行对丢失时标进行补偿。
用bit标志位只是位信号量,无法解决上述失步问题。

至于“在while(TD4--)TD3++;中对TD4进行了运算,而不仅仅是判断,从而引起误差....”,前提就是担心在while(TD4--)TD3++;指令执行中间会发生时标中断,造成TD4变化。会吗?

请再仔细分析一下。会吗?

使用特权

评论回复
59
1icme| | 2008-10-18 19:17 | 只看该作者

受益

使用特权

评论回复
60
woymoon| | 2008-10-18 20:50 | 只看该作者

不错!

没碰到还真不会深究,各位都分析得很在理!

使用特权

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

本版积分规则