fzhlpp 发表于 2009-11-13 20:52:18

芯片M8,刚学这个,请教全局定义的变量可以在中断服务里赋值吗?(关于EEPROM)

我在全局定义的变量可以在中断服务里赋值吗?比如我全局定义的a或b,我在中断服务函数里赋值:
uchar a,b;
#pragma interrupt_handler Timer0_OVF_ISR:iv_TIMER0_OVF

void Timer0_OVF_ISR (void)
{
...
a=0;
}
main()
{
while((1)
{
a++;
if(a==10){EEPROM_write(0X01,b+1);EEPROM_write(0X02,b);}
}
}
这样可以吗?如果这样可以的话,我想就可以用检测这个中断里的这个变量来判断写EEPROM函数,这个中断我就可以用外部的交流电过零产生,没有交流信号就没有中断了,没有中断我在主函数里的变量自加就不会清零,到了自加的某一个数就当是断电了就写EEPROM.

gliet_su 发表于 2009-11-13 21:09:43

地球人都知道这么用。

xyqdoudou 发表于 2009-11-13 22:25:53

TO LZ:
可以的 但是在中断函数里改变的量最好使用 volatile 定义 EEPROM的读写相对比较占用时间 好的习惯是 在中断函数中 只置标志位 然后在主循环中通过检测标志位来执行对应的操作 这样做的好处是可以尽量避免中断的嵌套 只是个人看法 供参考 当然如果你中断中所做的事情对响应时间要求比较高 也可以直接在中断中执行 但别忘记 进 关中断 出 开中断

jianghehupo 发表于 2009-11-13 23:03:02

当然可以啦,只要记住中断函数要尽可能执行时间短,在不同的单片机里还有不同的限制,比如冲入函数的调用,浮点计算等

fzhlpp 发表于 2009-11-14 00:35:44

一, 谢谢楼上的各位大侠指导,我就是不知道在中断服务函数里给变量赋值和在其他地方给变量赋值有没有区别,这么说是一样的了,那我这样做就可以实现关机时写入EEPROM了,我要去试试。

二,2楼的xyqdoudou说要使用volatile定义,为什么呢?我每次在中断里就是要使那个变量在没关机时归零(有过零信号),这样不能做到吗?

三,正常工作时在中断里变量变为0值,而后又开始在主函数里自加,但要在自加不能到if判断里的那个数(我设置的是10)就被过零中断服务函数归零(50Hz过零信号有100Hz个中断信号=10ms)也就是每10ms就肯定要归零一次,我这样分析对吗?

四,当关机时,就没有了过零信号,这时程序还在跑(有1000uF的电解),只要程序能跑到那个变量自加到if判断里的那个数就可以执行写EEPROM了是吧(过零信号没了那个变量就不能归零了),然后在算上写EEPROM的时间,不知道那个电容能维持的到吗?我这样分析有问题吗?请各位大侠帮忙指点一下...

五,3楼的jianghehupo大侠说的中断函数的时间问题,我有点理解他的意思,我中断函数的执行时间只有小于10ms的程序,这样可以吗?

六,我那个if里的数有什么讲究吗?我应该注意那些问题?这个数值大小跟我整个程序的大小有关系吗?这些我一头雾水,刚学的,菜鸟一个,望能得到各位大侠的指点感激不尽...

fzhlpp 发表于 2013-7-12 19:27:26

现在回过头来看觉得很有意思,第一个特点就是表述的稀里糊涂,不过后来的结果证实了我当时的分析是正确的,也成功的完成了产品的开发,当时真是很迷茫啊,不过皇天不负有心人,呵呵,给我弄出来了,当然现在的存储更先进了,结果告诉我要勤快点才有出路,自己不多动手进步是很缓慢的,最后还要感谢上面回复的网友,是你们的帮助使我更深入理解了编写程序的很多机理,感谢这个论坛,有这样的论坛真好。{:victory:}
页: [1]
查看完整版本: 芯片M8,刚学这个,请教全局定义的变量可以在中断服务里赋值吗?(关于EEPROM)