📄 at91irq_c_handler.c
字号:
//*----------------------------------------------------------------------------
//* File Name : irq_handlers.c
//*
//* Description : IRQ handler functions for AT91.
//*
//* George Zhang : 08/25/2000
//*----------------------------------------------------------------------------
#include "drivers\terminal\terminal.h"
#include "tx_api.h"
extern TX_QUEUE queue_0;
extern TX_EVENT_FLAGS_GROUP event_flags_0;
//*----------------------------------------------------------------------------
//* Function Name : irq0_c_handler
//* Object :
//* Input Parameters : None
//* Output Parameters : None
//* Functions called :
//*----------------------------------------------------------------------------
void irq0_c_handler (void)
{
u_int status;
static ULONG messages_0;
/* Send message to queue 0. */
status = tx_queue_send(&queue_0, &messages_0, TX_NO_WAIT);
/* Increment the message sent. */
messages_0++;
}
//*----------------------------------------------------------------------------
//* Function Name : terminal_c_handler
//* Object :
//* Input Parameters : terminal descriptor
//* Output Parameters : None
//* Functions called :
//*----------------------------------------------------------------------------
void terminal_c_handler ( TerminalDesc *term_desc )
{
u_int status ;
u_int x ;
StructUSART *usart = term_desc->usart_desc->usart_base ;
TerminalDataDesc *data = term_desc->term_data ;
/* Set event flag 0 */
status = tx_event_flags_set(&event_flags_0, 0x1, TX_OR);
while (( status = ( usart->US_CSR & usart->US_IMR )) != 0 )
{
//* If a reception error occured
if (( status & US_MASK_IRQ_ERROR ) != 0 )
{
status &= ~US_RXRDY ;
usart->US_CR = US_RSTSTA ;
x = usart->US_RHR ;
}
//* RXRDY interrupt
if (( status & US_RXRDY ) != 0 )
{
if ((u_int)data->rx_cnt == TERMINAL_SIZE_BUFFER)
{
data->error |= TERMINAL_ERROR_RX_OVF ;
}
else
{
data->rx_cnt++;
//* reception
*(data->rx_in_pt) = usart->US_RHR ;
//* transmission
usart->US_THR = *(data->rx_in_pt);
data->rx_in_pt++;
if ((u_int)data->rx_in_pt >= (u_int)data->rx_buf + TERMINAL_SIZE_BUFFER)
{
data->rx_in_pt = data->rx_buf ;
}
}
}
//* TXRDY interrupt
if (( status & US_TXRDY ) != 0 )
{
if ((u_int)data->tx_cnt > 0)
{
data->tx_cnt--;
//* transmission
usart->US_THR = *(data->tx_out_pt)++ ;
if ((u_int)data->tx_out_pt >= (u_int)data->tx_buf + TERMINAL_SIZE_BUFFER)
{
data->tx_out_pt = data->tx_buf ;
data->tx_cnt = 0;
}
}
else
{
//* reset tx pointer
data->tx_in_pt = data->tx_buf;
data->tx_out_pt = data->tx_buf;
//* Disable the TXRDY interrupt
usart->US_IDR = 0x02;
}
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -