单片机C语言请教!

[复制链接]
13900|76
chongxing 发表于 2008-10-19 11:17 | 显示全部楼层

有收获

5楼的厉害啊
学生D 发表于 2008-10-20 09:53 | 显示全部楼层

53楼担心TD4测试期间发生中断会修改其值,可能吗?

下面这段程序可以看出:使用信号量TD4时,不用考虑中断影响。
开/关几万、几十万次无效中断是完全可以避免的。

    4: main() 
     5: {
     6: while(1){ 
     7: while(TD4)TD4--,TD3++;

C:0x0003    E50A     MOV      A,TD4(0x0A)
C:0x0005    60FC     JZ       main(C:0003)      ;  这里应跳到主程序c:0004,(如果有的话)。
C:0x0007    150A     DEC      TD4(0x0A)
C:0x0009    0509     INC      0x09
C:0x000B    E509     MOV      A,0x09
C:0x000D    70F4     JNZ      main(C:0003)
C:0x000F    0508     INC      TD3(0x08)
C:0x0011    80F0     SJMP     main(C:0003)

c:0004 这里有主程序
horse7812 发表于 2008-10-20 12:40 | 显示全部楼层

向楼上学习了

  我原来的想法有些多余了,只要TD4不为xdata类型,对于data和idata类型,KEIL C都只用一跳指令去完成减法操作,不会去执行读出来--->改写---->写回去的步骤,这也说明了KEIL C在大多数的时候还是很聪明的.
linqing171 发表于 2008-10-20 12:59 | 显示全部楼层

双线程都要访问的变量必须先锁住。

操作之前关中断是必须的。
Keil C里面似乎没有变量可重入的关键字。
学生D 发表于 2008-10-20 13:14 | 显示全部楼层

还有。

再仔细分析一下。
好像还错过了什么细节。

while(1)
{
while(TD4)TD4--,TD3++;
.
.
.
主程序其他内容
.
.
.
}

这里while(TD4)TD4--,TD3++;已经不是一个持续循环;TD4减到0就会退出执行主程序其他内容。
while(TD4)TD4--,TD3++ 测试可以发生在2个时标之间的任何时刻点。这也是说时标中断只有能够恰好发生在while(TD4)TD4--,TD3++ 运行时隙,才可能影响TD4的值。
也即:主程序其他内容的运行时间长度恰好与时标(或倍率)吻合。

这个概率?
horse7812 发表于 2008-10-20 14:31 | 显示全部楼层

。。。。。。。。。。

   在不使用其他中断的情况下应该可以把它看作不可能事件了。不过在一般应用中,很少不使用其他的中断。
学生D 发表于 2008-10-21 09:46 | 显示全部楼层

请教64楼。

64楼说的是操作系统的功能,用户不可能考虑到这么复杂的机制。

假设这里要关18000次(或者500000次)中断,其他地方可能还有类似的问题,也要由用户考虑是否关中断,那么这个用户是在写操作系统程序还是在写用户程序?

操作系统是用户程序与系统硬件之间的接口。嵌入式系统开发工程师写的是用户程序,他不必关心操作系统是如何完成他申请的的操作的。

操作系统,或者说线程、互锁、关中断进入管态....这些观念是计算机专家的事。用户程序员不可能强大到两者都是专家。

所以,既然这里没有用操作系统,程序员只要按照规则编程序及至中断程序,就不应该有问题,难道一个裸奔程序设计员要不断地考虑中断发生时产生的影响?
中断是后台程序,它的基本行为准侧就是不能喧宾夺主,影响到前台的演出,甚或自己跑到前台来。(排除硬件行为)

所以,前后台程序是两个独立设计运行的程序,通过信号互相协调。软件禁止后台,又要考虑一堆其他问题。还不如不管。
杨晓波 发表于 2008-10-25 10:02 | 显示全部楼层

单片机C语言请教!

你在试验一下吧!
花花牛 发表于 2008-10-25 13:48 | 显示全部楼层

呵呵

我认为3,4楼说的对
icmap 发表于 2008-10-26 18:52 | 显示全部楼层

长时间定时没必要用中断。

lxcx 发表于 2008-10-28 17:56 | 显示全部楼层

我不认为这是编译器的Bug

我不认为这是编译器的Bug
lsp6257495 发表于 2008-10-29 09:36 | 显示全部楼层

学习学习

学习———思考———学习
雅子 发表于 2008-10-29 14:12 | 显示全部楼层

计数初值

TD3跟TH0=(65536-50000)/256;TL0=(65536-50000)%256有关
低功耗 发表于 2008-12-3 19:07 | 显示全部楼层

学习了

又学到一点知识了!所以有事没事,都要常来21IC逛逛,看看别人的问题,学下怎么解决。
异客 发表于 2008-12-4 00:18 | 显示全部楼层

受教了~~~

最最 发表于 2008-12-4 13:25 | 显示全部楼层

学习了

看了两篇** ,受教了。
还我今生 发表于 2008-12-4 16:33 | 显示全部楼层
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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