[RISC-V MCU 应用开发] 【RISC-V MCU CH32V103测评5】+ 全局变量要加volatile修饰

[复制链接]
 楼主| xyz549040622 发表于 2020-12-5 22:49 | 显示全部楼层 |阅读模式
在上次的串口例程中,我们使用了两个全局变量,一个是串口接收中断完成标志,另一个是串口接收的数据,但是这两个变量在使用过程中发现了在中断中赋值后主循环检测不到改变的情况的情况。比如:
  1. /*******************************************************************************
  2. * Function Name  : USART2_IRQHandler
  3. * Description    : This function handles USART2 global interrupt request.
  4. * Input          : None
  5. * Return         : None
  6. *******************************************************************************/
  7. void USART1_IRQHandler(void)
  8. {
  9.     if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET) //中断产生
  10.     {
  11.         RxBuffer[0] = USART_ReceiveData(USART1);               //接收数据
  12.         USART_ClearITPendingBit(USART1,USART_IT_RXNE);    //清除中断标志
  13.         RxOK = 1;
  14.         USARTx_SendByte(USART1,0x01);
  15.     }
  16. }
  1. while(1)
  2.         {
  3.             if(RxOK == 1)
  4.             {
  5.             if(RxBuffer[0] == 0x01)
  6.             {
  7.                 Toggle_User_Led(User_LED1);
  8.             }
  9.             RxOK = 0;
  10.             }
  11.         }
当我们在中断中RxOK 置1的时候,while循环怎么也检测不到RxOK为一的情况,这是什么原因呢?
定义,定义,在定义全局变量的时候,必须要加volatile进行修饰才可以。
比如下面这样定义:
  1. //定义一个字节的缓冲数组
  2. volatile uint8_t RxBuffer[RxBufferSize]={0};
  3. //接收OK标志
  4. volatile uint8_t RxOK = 0;


您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

2841

主题

19330

帖子

110

粉丝
快速回复 在线客服 返回列表 返回顶部