打印
[RISC-V MCU 应用开发]

【RISC-V MCU CH32V103测评5】+ 全局变量要加volatile修饰

[复制链接]
378|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
xyz549040622|  楼主 | 2020-12-5 22:49 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
在上次的串口例程中,我们使用了两个全局变量,一个是串口接收中断完成标志,另一个是串口接收的数据,但是这两个变量在使用过程中发现了在中断中赋值后主循环检测不到改变的情况的情况。比如:
/*******************************************************************************
* Function Name  : USART2_IRQHandler
* Description    : This function handles USART2 global interrupt request.
* Input          : None
* Return         : None
*******************************************************************************/
void USART1_IRQHandler(void)
{
    if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET) //中断产生
    {
        RxBuffer[0] = USART_ReceiveData(USART1);               //接收数据
        USART_ClearITPendingBit(USART1,USART_IT_RXNE);    //清除中断标志
        RxOK = 1;
        USARTx_SendByte(USART1,0x01);
    }
}
 while(1)
        {
            if(RxOK == 1)
            {
            if(RxBuffer[0] == 0x01)
            {
                Toggle_User_Led(User_LED1);
            }
            RxOK = 0;
            }
        }
当我们在中断中RxOK 置1的时候,while循环怎么也检测不到RxOK为一的情况,这是什么原因呢?
定义,定义,在定义全局变量的时候,必须要加volatile进行修饰才可以。
比如下面这样定义:
//定义一个字节的缓冲数组
volatile uint8_t RxBuffer[RxBufferSize]={0};
//接收OK标志
volatile uint8_t RxOK = 0;


使用特权

评论回复

相关帖子

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

本版积分规则

个人签名:qq群: 嵌入式系统arm初学者 224636155←← +→→点击-->小 i 精品课全集,21ic公开课~~←←→→点击-->小 i 精品课全集,给你全方位的技能策划~~←←

2710

主题

19166

帖子

103

粉丝