请教HC32F005中断接收无法离开while循环
本帖最后由 volbin0042 于 2023-3-22 14:37 编辑UART 发送接收正常
程序写了发送码,用 while 条件循环等待
直到收到 0x03 会将条件不成立
但 debug 已收到 0x03 将条件不成立
while 条件循环仍然无法离开
uartr接收中断已使条件式u8Rx0num =1
while(1)
{
for(IX=0;IX<=12;IX++)
{
u8Rx0Data=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 );
}
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 = u8Rx0_tmp;
if(u8Rx0Data == 0x03)
{
u8Rx0num = 1;
}
IR0++;
if(IR0 >= 15)
{
IR0=0;
}
}
} while里面还套一个while,最里面这个while如果程序一开始初始化的时候是0,那么这个代码用在在第二个while里执行,你在这个while里做了啥处理,有break?有return吗? 本帖最后由 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
} 判断的变量加上volatile修饰,避免优化 nvjwiciw659 发表于 2023-3-23 08:41
判断的变量加上volatile修饰,避免优化
请问这有何作用 本帖最后由 volbin0042 于 2023-3-23 13:41 编辑
nvjwiciw659 发表于 2023-3-23 08:41
判断的变量加上volatile修饰,避免优化
可以了!感谢!好心人!祝您顺心!
在 C 语言中,volatile 是一个关键字,用于告诉编译器变量具有“易变性”,即可能在程序执行期间随时发生变化,以及不应该被优化器优化掉。具体来说,使用 volatile 关键字可以有以下作用:
防止编译器优化
编译器为了提高程序的运行效率,可能会对程序进行各种优化,如重排语句顺序、删除无用代码等。但是,在某些情况下,我们需要确保程序中某些变量的值不能被编译器优化掉,否则可能导致程序出错。使用 volatile 关键字可以告诉编译器这些变量是易变的,不能被优化。
处理多线程并发访问
在多线程程序中,可能会有多个线程同时访问某些共享变量。如果这些变量不是 volatile 类型,那么编译器可能会对它们进行优化,导致线程间访问出错。使用 volatile 关键字可以保证这些变量在多线程并发访问时的正确性。
处理外设硬件访问
在嵌入式系统中,可能会有一些硬件设备通过寄存器与 CPU 进行通信。这些寄存器的值可能会在设备运行期间发生变化,因此需要用 volatile 关键字来告诉编译器这些寄存器是易变的。
需要注意的是,volatile 关键字不能用于多线程同步或实现原子操作。如果需要进行同步或原子操作,请使用专门的同步机制或原子操作函数。
这个变量u8Rx0num,楼主定义的是什么类型的啊 nvjwiciw659 发表于 2023-3-23 08:41
判断的变量加上volatile修饰,避免优化
感觉这种应用情况下是不会被优化掉的吧 volbin0042 发表于 2023-3-23 13:07
可以了!感谢!好心人!祝您顺心!
在 C 语言中,volatile 是一个关键字,用于告诉编译器变 ...
如果不加这个关键字 降低优化等级能好用吗 volbin0042 发表于 2023-3-23 13:07
可以了!感谢!好心人!祝您顺心!
在 C 语言中,volatile 是一个关键字,用于告诉编译器变 ...
还是没有搞明白这个的原理 主要是不知道为什么会被优化掉 volbin0042 发表于 2023-3-23 13:07
可以了!感谢!好心人!祝您顺心!
在 C 语言中,volatile 是一个关键字,用于告诉编译器变 ...
就是说加入这个关键字以后 相关变量就肯定不会被优化掉是吗 voliate不能保证原子性,它保证了内寸可见性和一定程度上的有序性 volatile修饰可以避免被优化
页:
[1]