小飞侠
发表于 2024-11-26 07:30:28
ercircle 发表于 2024-11-25 10:11
请问是中断的问题,那这里在变量定义时赋值又是什么问题?
变量定义时赋值应该没有问题,我在中断程序中有一些其他操作,暂时正常了,如果把其他操作都去掉,只保留变量的自加操作,还是会出现问题
社区闲人
发表于 2024-11-29 18:47:26
临界变量问题,要注意保护。
小飞侠
发表于 2024-12-9 08:26:22
VCC 发表于 2024-11-20 13:30
我虽然没点开楼主的程序,但是结合他的截图,和你的修改,我就知道问题出在哪里了
{:5_278:}
所以进行16位,32位的volatile变量访问时,一定要关闭中断!确保访问操作的原子性,关闭中断这确实是正解
axushilong
发表于 2024-12-10 17:59:07
void main(void)
{
P_SW2 |= 0x80;
Init_Timer_1ms();
EA = 1;
P3M1 = 0;P3M0 = 0x10;
while(1)
{
uint16_t usTmp;
EA = 0;
usTmp = timer_ms;
EA = 1;
if(usTmp>=500)
{//500ms任务
P34 ^= 1;
rf_buf=usTmp;
EA = 0;
timer_ms = 0;
EA = 1;
aa++;
if(aa>=28)
{
aa=0;
}
}
}
}
上面这样或者下面这样,但是要加volatile声明变量timer_ms,试试。void main(void)
{
P_SW2 |= 0x80;
Init_Timer_1ms();
EA = 1;
P3M1 = 0;P3M0 = 0x10;
while(1)
{
uint16_t usTmp;
while(usTmp != timer_ms){usTmp = timer_ms;};
if(usTmp>=500)
{//500ms任务
P34 ^= 1;
rf_buf=usTmp;
EA = 0;
timer_ms = 0;
EA = 1;
aa++;
if(aa>=28)
{
aa=0;
}
}
}
}
小飞侠
发表于 2024-12-10 22:12:27
axushilong 发表于 2024-12-10 17:59
上面这样或者下面这样,但是要加volatile声明变量timer_ms,试试。
上面的办法就挺好的
白水大虾2016
发表于 2024-12-14 09:25:44
<p>学习了!</p>
STC企鹅
发表于 2024-12-14 11:06:45
<p>学习到三个专业名词</p>
men007
发表于 2024-12-14 12:25:30
学习了{:4_187:}
jiananmeidi
发表于 2024-12-21 08:03:33
又懂一个知识点了
mcu
发表于 2024-12-21 09:27:00
<p>很好的例子,</p>