本帖最后由 gaofeisz_sibet 于 2013-6-7 14:34 编辑
void USART3_IRQHandler(void)
{
static INT8U RecvData;//中断处理函数结束,该静态变量的值不会被销毁,非常重要!
#ifdef OS_TICKS_PER_SEC//如果时钟节拍数定义了,说明要使用UCOSII了。
OSIntEnter();
#endif
if(USART_GetITStatus(USART3, USART_IT_RXNE) != RESET)
{
/* Read one byte from the receive data register */
RecvData = USART_ReceiveData(USART3);
//USART_ClearFlag(USART3,USART_FLAG_TC);
USART_SendData(USART3, RecvData);
while(USART_GetFlagStatus(USART3, USART_FLAG_TC) == RESET){}
OSMboxPost(gp_MBox_USART, (void*)(&RecvData));
}
#ifdef OS_TICKS_PER_SEC//如果时钟节拍数定义了,说明要使用UCOSII了。
OSIntExit();
#endif
}
/*USART处理任务*/
static void TASK_USART(void *p_arg)
{
INT8U err;
INT8U *msg;
p_arg = p_arg;//防止编译器产生警告
while(1)
{
msg = (INT8U *)OSMboxPend(gp_MBox_USART, 0, &err);
//USART_ClearFlag(USART3,USART_FLAG_TC);
USART_SendData(USART3, *msg);
while(USART_GetFlagStatus(USART3, USART_FLAG_TC) == RESET){}
if (((*msg)&0x80) == 0x00)
g_ms1 = ((*msg)&0x7f) * 10;
else
g_ms2 = ((*msg)&0x7f) * 10;
}
}//不加static结果肯定是不可预见的,ISR中的RecvData地址在中断返回后已经被释放了,等收消息的时候值自然就不同了。
|