打印

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

[复制链接]
楼主: 救火车
手机看帖
扫描二维码
随时随地手机跟帖
21
古道热肠| | 2007-6-14 09:53 | 只看该作者 回帖奖励 |倒序浏览

救火车宣传消防知识,1个字“好”

  要救火更要防火,普及单片机开发中的消防知识,是大好事,值得嘉奖。

使用特权

评论回复
22
fineamy| | 2007-6-14 10:27 | 只看该作者

赫赫,果然好贴

对于可能同时出现有多个访问路径的变量来说,采取同步技术是必需的。

用一个简单的semaphore技术如river1972用的,可以解决这个问题。
借用下平常人的方法,赫赫,修改下:
可以简化一下。定义一个全局变量,seq_count.
读ms_counter时这样
do {
    tmp_seq =seq_count;
    tmp_counter =ms_counter;
while (tmp_seq != seq_count);

在中断中修改ms_counter时这样:

seq_count++;
if (ms_counter<1000) ms_counter++;





使用特权

评论回复
23
gyt| | 2007-6-14 11:02 | 只看该作者

不错不错

支持楼主。

支持8楼。

使用特权

评论回复
24
wowow| | 2007-6-14 11:02 | 只看该作者

倾向于关中断的方法

开关中断各只要一条指令,比较简单,而且一般情况下中断也不会那么紧急要处理.

使用特权

评论回复
25
孤独泪| | 2007-6-14 11:18 | 只看该作者

8楼的方法果然不错,支持

使用特权

评论回复
26
mryyh| | 2007-6-14 11:35 | 只看该作者

24楼的方法看不懂

个人认为你不但将8楼的方法复杂化(多一个全局变量),而且搞错了。

使用特权

评论回复
27
huangqi412| | 2007-6-14 11:42 | 只看该作者

正式宣布:我是你的fans了 支持···

使用特权

评论回复
28
stone99| | 2007-6-14 12:33 | 只看该作者

赞成8楼的解决办法

使用特权

评论回复
29
救火车|  楼主 | 2007-6-14 12:58 | 只看该作者

看来我这回真是抛砖引玉了。

使用特权

评论回复
30
gtw| | 2007-6-14 13:05 | 只看该作者

我不这样认为

八楼使用了一个影子

但是当你的中断程序和主程序都要去修改同一个变量时如何控制?注意是修改
可能主程序做了修改即将送往变量时来了中断又对做了修改,但中断返回后主程序又把处理后的数据重新送给变量而把中断内修改的值给冲掉。
所以必须控制一个先后顺序。


load  var1 to reg
add   1 to reg  ---->来了中断:clr var1或是其他对var1的修改
save  reg  to var1  <----中断返回

使用特权

评论回复
31
coldra| | 2007-6-14 13:18 | 只看该作者

汗,俺也常犯这种错误

其实像int型也可以改为中断里累加低字节,高字节在中断外判断低位溢出情况而累加,应该可以避免了,方法有些笨,呵呵

使用特权

评论回复
32
古道热肠| | 2007-6-14 16:26 | 只看该作者

用互斥,应该不会出问题

  中断程序在中断,置中断标志,我主程序就等待,等待中断完成。
主程序要用中断区的变量,我就关中断,读或写中断区共用的变量,然后再开中断,只是这关中断时间不能长,长了就会丢东西的。

使用特权

评论回复
33
ylj2008| | 2007-6-14 16:37 | 只看该作者

好,能把经验分享难能可贵,支持你

使用特权

评论回复
34
wegoinrain| | 2007-6-14 17:13 | 只看该作者

呵呵,路过,支持一下

使用特权

评论回复
35
turmary| | 2007-6-14 17:48 | 只看该作者

顶顶顶!!!!!!!!!!!!!!!!!!!!!!

使用特权

评论回复
36
gtw| | 2007-6-14 18:03 | 只看该作者

对的

只要主程序和中断子程序都有对同一变量的读取 和 写 操作,看起来就必须暂时关闭中断或者 暂时关闭对相应变量操作的中断。

8楼的方法只能读!

使用特权

评论回复
37
ocon| | 2007-6-14 21:44 | 只看该作者

道理大家都知道,但是实际用的时候就要加倍小心了,所以

一般我是尽量避免出现这种高风险的程序结构,我会把ms_counter的判断和改写都放在中断里完成,然后管理一些相应的标志位,在工作循环里按这些标志操作。例如:
//中断处理
#int_timer0
void get_time()
{
    set_timer0(get_timer0()+13); //刷新timer0初值
    count++;
    if(count>=20) //timer0每溢出20次
    {
        count=0;
        get_in(); //扫描一次IO
        sec++;
        show++;
        take++;
        if(sec>=1000)
        {
            sec=0;
            sec_tick=1; //秒节拍标志
        }
        if(show>=200)
        {
            show=0;
            show_tick=1; //动画节拍标志
        }
        if(take>=1000)
        {
            take=0;
            take_tick=1; //其他时间标志
        }
    }
}

使用特权

评论回复
38
ocon| | 2007-6-14 21:49 | 只看该作者

好像还行,我贴到外面去咯~

使用特权

评论回复
39
waha| | 2007-6-14 22:55 | 只看该作者

ocon说的不错,能避免这种易出错的方式更好--用单字节标

在较简单的程序中,少用“开关中断”这种相对复杂的技术。

“越简单,越可靠!”--这就是我开发产品的思想。

使用特权

评论回复
40
jolee| | 2007-6-14 23:25 | 只看该作者

感觉关中断总不是办法

多字节数比较一般先从高字节比较吧,编译出来怎么是先比较低字节?
如果先比较高字节,那即使产生中断,结果最多相差1个中断延时,应该可以接受.
是这样吗?

使用特权

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

本版积分规则