[技术问答]

请教HC32F005中断接收无法离开while循环

[复制链接]
1037|12
手机看帖
扫描二维码
随时随地手机跟帖
volbin0042|  楼主 | 2023-3-22 14:33 | 显示全部楼层 |阅读模式
本帖最后由 volbin0042 于 2023-3-22 14:37 编辑

UART 发送接收正常
程序写了发送码,用 while 条件循环等待
直到收到 0x03 会将条件不成立
但 debug 已收到 0x03 将条件不成立
while 条件循环仍然无法离开
uartr接收中断已使条件式u8Rx0num =1

  while(1)
        {

                        for(IX=0;IX<=12;IX++)
                        {
                                u8Rx0Data[IX]=0x00;
                        }
                        u8Rx0** = 0;
                        Gpio_WriteOutputIO(STK_WR0_PORT, STK_WR0_PIN,TRUE );
                        delay10us(1);        
                        IY=0;
                        for(IY=0;IY<=14;IY++)
                        {
                                Uart_SendDataPoll(M0P_UART0,u8Tx0[1][IY] );
                        }                                       
                        Gpio_WriteOutputIO(STK_WR0_PORT, STK_WR0_PIN, FALSE);
                        IA=0;

                        while(u8Rx0num == 0)
                        {                                
                        //无法离开
                        }
}

///< UART0 中断服务函数
void Uart0_IRQHandler(void)
{
    if(TRUE == Uart_GetStatus(M0P_UART0, UartRC))
    {
                                uint8_t u8Rx0_tmp=0;
        Uart_ClrStatus(M0P_UART0, UartRC);        
                                u8Rx0_tmp = Uart_ReceiveData(M0P_UART0);        
                                if(u8Rx0_tmp == 0x02)
                                {
                                        IR0=0;
                                }        
        u8Rx0Data[IR0] = u8Rx0_tmp;
                                if(u8Rx0Data[IR0] == 0x03)
                                {
                                        u8Rx0num = 1;
                                }
                                IR0++;
                                if(IR0 >= 15)
                                {
                                        IR0=0;
                                }        
   }

}

使用特权

评论回复
wubangmi| | 2023-3-22 14:49 | 显示全部楼层
while里面还套一个while,最里面这个while如果程序一开始初始化的时候是0,那么这个代码用在在第二个while里执行,你在这个while里做了啥处理,有break?有return吗?

使用特权

评论回复
volbin0042|  楼主 | 2023-3-22 15:15 | 显示全部楼层
本帖最后由 volbin0042 于 2023-3-23 12:30 编辑
wubangmi 发表于 2023-3-22 14:49
while里面还套一个while,最里面这个while如果程序一开始初始化的时候是0,那么这个代码用在在第二个while ...

有的!
我写多站轮询
若接收0x03完成 u8Rx0num =1 离开while 发送下一站
等待接收若大于10ms 则timeout
发下一站  
                        while(u8Rx0num == 0)
                        {                                
                                IA++;

                                if(IA>=0x9025){break;}                //0x9025                 10ms timeout
                                
                        }

使用特权

评论回复
nvjwiciw659| | 2023-3-23 08:41 | 显示全部楼层
判断的变量加上volatile修饰,避免优化

使用特权

评论回复
volbin0042|  楼主 | 2023-3-23 12:00 | 显示全部楼层
nvjwiciw659 发表于 2023-3-23 08:41
判断的变量加上volatile修饰,避免优化

请问这有何作用

使用特权

评论回复
volbin0042|  楼主 | 2023-3-23 13:07 | 显示全部楼层
本帖最后由 volbin0042 于 2023-3-23 13:41 编辑
nvjwiciw659 发表于 2023-3-23 08:41
判断的变量加上volatile修饰,避免优化

可以了!感谢!好心人!祝您顺心!

在 C 语言中,volatile 是一个关键字,用于告诉编译器变量具有“易变性”,即可能在程序执行期间随时发生变化,以及不应该被优化器优化掉。具体来说,使用 volatile 关键字可以有以下作用:

防止编译器优化
编译器为了提高程序的运行效率,可能会对程序进行各种优化,如重排语句顺序、删除无用代码等。但是,在某些情况下,我们需要确保程序中某些变量的值不能被编译器优化掉,否则可能导致程序出错。使用 volatile 关键字可以告诉编译器这些变量是易变的,不能被优化。

处理多线程并发访问
在多线程程序中,可能会有多个线程同时访问某些共享变量。如果这些变量不是 volatile 类型,那么编译器可能会对它们进行优化,导致线程间访问出错。使用 volatile 关键字可以保证这些变量在多线程并发访问时的正确性。

处理外设硬件访问
在嵌入式系统中,可能会有一些硬件设备通过寄存器与 CPU 进行通信。这些寄存器的值可能会在设备运行期间发生变化,因此需要用 volatile 关键字来告诉编译器这些寄存器是易变的。

需要注意的是,volatile 关键字不能用于多线程同步或实现原子操作。如果需要进行同步或原子操作,请使用专门的同步机制或原子操作函数。

使用特权

评论回复
tpgf| | 2023-4-12 16:27 | 显示全部楼层
这个变量u8Rx0num,楼主定义的是什么类型的啊

使用特权

评论回复
磨砂| | 2023-4-12 16:45 | 显示全部楼层
nvjwiciw659 发表于 2023-3-23 08:41
判断的变量加上volatile修饰,避免优化

感觉这种应用情况下是不会被优化掉的吧

使用特权

评论回复
晓伍| | 2023-4-12 16:57 | 显示全部楼层
volbin0042 发表于 2023-3-23 13:07
可以了!感谢!好心人!祝您顺心!

在 C 语言中,volatile 是一个关键字,用于告诉编译器变 ...

如果不加这个关键字 降低优化等级能好用吗

使用特权

评论回复
八层楼| | 2023-4-12 17:20 | 显示全部楼层
volbin0042 发表于 2023-3-23 13:07
可以了!感谢!好心人!祝您顺心!

在 C 语言中,volatile 是一个关键字,用于告诉编译器变 ...

还是没有搞明白这个的原理 主要是不知道为什么会被优化掉

使用特权

评论回复
观海| | 2023-4-13 08:29 | 显示全部楼层
volbin0042 发表于 2023-3-23 13:07
可以了!感谢!好心人!祝您顺心!

在 C 语言中,volatile 是一个关键字,用于告诉编译器变 ...

就是说加入这个关键字以后 相关变量就肯定不会被优化掉是吗

使用特权

评论回复
guanjiaer| | 2023-4-13 09:31 | 显示全部楼层
voliate不能保证原子性,它保证了内寸可见性和一定程度上的有序性

使用特权

评论回复
Henryko| | 2023-5-12 23:57 | 显示全部楼层
volatile修饰可以避免被优化

使用特权

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

本版积分规则

12

主题

42

帖子

1

粉丝