|
发表于 2011-9-5 23:24:08
|
显示全部楼层
回复【7楼】piccode
-----------------------------------------------------------------------
修改了一下驱动,在读数据前,判断一下RXDA(严格来讲只是读取了一下状态寄存器),
发现就不会再重复进中断了.
好像并不需要关闭中断,这里先这样测试着,后面好好研究一下.
// UART 1 interrupt handler
// it is set at priority level 2
void __ISR(_UART1_VECTOR, ipl2) IntUART1Handler(void)
{
struct rt_uart_pic32 *uart_device = &uart1_device;
// Is this an RX interrupt?
if(INTGetFlag(INT_SOURCE_UART_RX(uart_device->uart)))
{
while( U1STAbits.URXDA )
{
/* Receive Data Available */
uart_device->rx_buffer[uart_device->save_index] = UARTGetDataByte(uart_device->uart);//UARTGetDataByte(UART1);
uart_device->save_index ++;
if (uart_device->save_index >= RT_UART_RX_BUFFER_SIZE)
{
uart_device->save_index = 0;
}
}
/* invoke callback */
if(uart_device->parent.rx_indicate != RT_NULL)
{
rt_size_t length;
if (uart_device->read_index > uart_device->save_index)
{
length = RT_UART_RX_BUFFER_SIZE - uart_device->read_index + uart_device->save_index;
}
else
{
length = uart_device->save_index - uart_device->read_index;
}
if( length )
{
uart_device->parent.rx_indicate(&uart_device->parent, length);
}
}
// Clear the RX interrupt Flag
INTClearFlag(INT_SOURCE_UART_RX(uart_device->uart));
} // Is this an RX interrupt?
// We don't care about TX interrupt
if ( INTGetFlag(INT_SOURCE_UART_TX(uart_device->uart)) )
{
INTClearFlag(INT_SOURCE_UART_TX(uart_device->uart));
}
}
回复【楼主位】flor 独臂老人
在debug和非debug模式都会出现这个问题。
开来要应用到产品中,还是要调试稳定了再说。
-----------------------------------------------------------------------
原因查明为:
rt_thread_switch_interrput_flag 切换完成后忘记清0了.
造成第二次中断中切换时,并不会保存 rt_interrupt_from_thread
此处可能需要探讨:
是否要判断 rt_thread_switch_interrput_flag 不为0才执行切换,
CoreSW0Handler会在rt_hw_context_switch_interrupt中被触发,
rt_hw_context_switch_interrupt中同时会把rt_thread_switch_interrput_flag置1.
主要防止 CoreSW0Handler 被误触发.不过想应该没有这可能.
修改方法:
CoreSW0Handler:
.. SAVE_ALL ..
la k0, rt_thread_switch_interrput_flag
sw zero, 0(k0) /* clear flag */
.. switch to the new thread ..
.. RESTORE_ALL_AND_RET ..
代码已提交,欢迎测试. |
|