gpt4 book ai didi

c - STM32F4 Discovery 上的中断未更新变量值

转载 作者:太空宇宙 更新时间:2023-11-03 23:44:49 26 4
gpt4 key购买 nike

在下面的代码中,我可以看到定时器工作正常,因为 LED 一直在闪烁。但是 count 变量的值在第二个 while 内永远不会改变。

我不知道可能会出现什么问题?

// count variable used only in main and TIM2_IRQHandler.
uint8_t count=0;

int main(void)
{
count=0;
SystemInit();
GPIOInit();
NVIC_Configuration();
TIM_Configuration();
init_USART3(115200);
// All initialization is ok.
USART_puts(USART3, "\r\nConnection ok.\r\n");// Working normally
while (1)
{
if(asterixok==1)// No problem. This code if ok ->>process continue next step.
{
GPIO_SetBits(GPIOD , GPIO_Pin_12); // Led on (ok)
count=0;// count going to zero, timer working, must be change in there
while(1)
{
//Led blinking continue
//Timer query working normal led (13) blink.
//There is a problem
if(count>5) // Timer working, count never change in timer interrupt query (WHY)
{
GPIO_SetBits(GPIOD , GPIO_Pin_14); // LED OFFFFFFFFFFFFFFFF
USART_puts(USART3, "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\r\n");
goto nextstate;
}
}
nextstate:
GPIO_SetBits(GPIOD , GPIO_Pin_15); // Led never going on because code step in while loop.
}
}
}

void USART3_IRQHandler(void)
{
if( USART_GetITStatus(USART3, USART_IT_RXNE) )
{
unsigned char t = USART3->DR;
if(t=='*')
{
asterixok=1;
}
}
}

void TIM2_IRQHandler(void)
{
if ( TIM_GetITStatus(TIM2 , TIM_IT_Update) != RESET )
{
TIM_ClearITPendingBit(TIM2 , TIM_FLAG_Update);
count++;
if(count>100)
count=0;
if( display )
{
GPIO_ResetBits(GPIOD , GPIO_Pin_13);
}
else
{
GPIO_SetBits(GPIOD , GPIO_Pin_13);
}
display = ~display;
}
}

我已尝试使用另一个 Discovery 开发板,但问题仍然存在。请帮忙。我要疯了!

最佳答案

您应该将 count 声明为 volatile,这样:

volatile uint8_t count;

在编译 main 时,编译器能够证明 count 在循环体中没有被修改,因此它可能将其值缓存在寄存器中,甚至可能进行了优化if 语句。您可以通过查看反汇编来验证这一点。根据标准,编译器不知道中断,因此被允许执行此类优化。将 count 限定为 volatile 将禁止编译器进行这些优化,迫使它在每次使用时从内存中重新加载变量。

在这种简单的情况下,volatile 就足够了,但请注意,它不能保证操作的原子性,也不能阻止编译器和 CPU 围绕对变量的访问重新排序指令.它只是强制编译器在每次使用变量时生成内存访问指令。为了实现原子性,您需要锁,为了防止重新排序,您需要内存屏障。

关于c - STM32F4 Discovery 上的中断未更新变量值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36483011/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com