打印

UP8楼!但是:**这楼这么高了,我还是删了吧,

[复制链接]
楼主: 救火车
手机看帖
扫描二维码
随时随地手机跟帖
81
孤独泪| | 2007-6-18 09:58 | 只看该作者 回帖奖励 |倒序浏览

楼上这个方法没有什么问题

但是改变了中断和增加了一个位变量我觉得还是不够理想了。
如果要针对你这个例子可以这样改一下,不过也太麻烦了。
union 
{
     unsigned int tt;
     unsinged char t_char[2];
}LS;

if ((LS.t_char[1]>0)&&LS.tt>400)
{
//应用程序
}
else 
{
//应用程序
}
/////////////如果实在不行就用以下的方法
if (tt>400 && tt>400)
{
//应用程序
}
else 
{
//应用程序
}

使用特权

评论回复
82
gtw| | 2007-6-18 13:08 | 只看该作者

即便是字节型,也有问题

除非判断与修改操作能在一条指令里。

关中断是一个方法。
使用影子,还没有成熟的方法……哈哈

事实上,在CISC指令集某些多周期的指令执行器件,也是不能进入中断的,所以,人为的暂时关闭一下中断,就相当于模拟一条多周期的指令。

不知各位看法如何?

使用特权

评论回复
83
救火车|  楼主 | 2007-6-18 13:23 | 只看该作者

字节型的应该没有什么问题吧!

使用特权

评论回复
84
Flyer369| | 2007-6-18 13:54 | 只看该作者

成为技术好友、成为你的客户

成为你的客户

使用特权

评论回复
85
古道热肠| | 2007-6-18 15:51 | 只看该作者

有个问题想问你

从你的竞选资料摘录如下两点:   
    21IC网龄:大概5年(原来有一个号丢了)
    加入时间 2006-4-25 10:38:23 
请问你的ID号如何丢了,是不常来21IC论坛?还是记性不好忘了密码进不了论坛?当选斑竹后是否还会出现丢ID的状况?

使用特权

评论回复
86
wbygmm| | 2007-6-18 16:33 | 只看该作者

冲着你的3点开发体会,就是你了!

犹豫观望了好久,这神圣的一票是楼主的啦!
不过,以后可要给坛子里多灌有营养的矿泉水喔~~~

使用特权

评论回复
87
5brother| | 2007-6-18 16:54 | 只看该作者

我的做法

我通常这样:
1,在定时器中断中设置一个标志,flag_100ms

void T0()
{   
    flag_100ms = 1;    
}
2,在主程序中做一个函数,用来更新时间
void Updata(void)
{
   if (flag_100ms)
   {
         flag_100ms = 0;
         ms_counter++;
        //其他时间更新
   }
}
3,通过这种方式,可以避免由于中断和主程序同时操作变量导致的错误,而且效率也很高

使用特权

评论回复
88
gtw| | 2007-6-18 18:17 | 只看该作者

。。


to  救火车 发表于 2007-6-18 13:23 侃单片机 ←返回版面    

85楼: 字节型的应该没有什么问题吧! 

怎会没问题?看看89楼5brother的。

89楼: 我的做法 

我通常这样:
1,在定时器中断中设置一个标志,flag_100ms

void T0()
{   
    简单提醒一下,当某一时间点任务最繁重时,运行时间可能会超出你的基本时钟,这时直接赋1就不合适了。不过你的100ms似乎一般情况下不成问题。
    flag_100ms = 1;    
}
2,在主程序中做一个函数,用来更新时间
void Updata(void)
{
   if (flag_100ms)
   {
         注意:如果在这里来了T0中断,呵呵,那么这个中断就白来了。
         所以不管是字节型还是整型都可能出问题,只是整型的几率更高而已。
         flag_100ms = 0;
         ms_counter++;
        //其他时间更新
   }
}


使用特权

评论回复
89
why_buaa| | 2007-6-18 20:41 | 只看该作者

最简单的方法:连续比两次

 我前面55楼就写过了,好像没人看见,一直在关不关中断,加不加信号量上面绕,还越整越复杂。
  这种情况是一个写一个读,并非两个都要改写,所以没有必要搞得那么复杂,只要取数先比一次,接着再取数再比一次,只要两次的结果一致,就表明中间没有被改写过,就是可信的结果。
  其实你可以把它理解为一种“防抖”,采用的思路和键盘防抖是一样的,只是这种情况需要“防抖”的时间比键盘要短多了。

使用特权

评论回复
评分
参与人数 1威望 +1 收起 理由
huanben + 1 很给力!
90
救火车|  楼主 | 2007-6-18 21:18 | 只看该作者

每种算法都有优缺点,编程注意保护好,不留漏洞就行。

回87楼:古道热肠 
请放心这回不会丢了。

回90楼:
89楼写的也不能说是错的。只要注意程序周期不能太长。

我的习惯是这样的:
void T0()
{   
    flag_100ms ++;    
}

void Updata(void)
{
   if (flag_100ms>100)
   {
         flag_100ms -= 100;         
        //其他时间更新
   }
}

使用特权

评论回复
91
孤独泪| | 2007-6-18 21:24 | 只看该作者

搞得太复杂了

简单问题复杂化,又是关中断,又是增加变量的

使用特权

评论回复
92
gtw| | 2007-6-19 08:16 | 只看该作者

如果讨论主程序和中断都读写

那么连续两次读是行不通的。

to 92楼,咱们的方法类似。

不过我在中断是

    if (flag_100ms<255) flag_100ms ++;    

呵呵。

使用特权

评论回复
93
救火车|  楼主 | 2007-6-19 08:22 | 只看该作者

同意楼上。需要的时候我也会加。

如果我的主程序循环速度不确定,我也会加楼上这种的保护。

使用特权

评论回复
94
sklar| | 2007-6-19 12:36 | 只看该作者

好铁

好铁,留个名收掉

使用特权

评论回复
95
gtw| | 2007-6-19 12:48 | 只看该作者

96楼需要再考虑一下

使用特权

评论回复
96
bingerbuku| | 2007-6-19 13:57 | 只看该作者

我就是来占楼的 嘿嘿

使用特权

评论回复
97
bingerbuku| | 2007-6-19 13:58 | 只看该作者

吼吼3~~~

使用特权

评论回复
98
gyt| | 2007-6-19 18:31 | 只看该作者

LS占了100楼:)

使用特权

评论回复
99
救火车|  楼主 | 2007-6-19 18:52 | 只看该作者

可惜没见到hotpower大叔的身影

使用特权

评论回复
100
HotPower| | 2007-6-19 19:31 | 只看该作者

倒塌了~~~把攻占100楼的重任给忘了~~~我的目标250楼

使用特权

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

本版积分规则