📄 uartsvr.c
字号:
#include <kernel\ros33\ros33.h>
#include <sys\systsk.h>
#include <sys\taskdsp.h>
#include <sys\sysusr.h>
#include <sys\sysmsg.h>
#include <sys\syserr.h>
#include <sys\devmng.h>
// simulator header
#ifdef SIM_ON_PC
#include <simdrv\export\driver.h>
#else
#include <hardware\drball\uart.h>
#endif
#include <sys\sysdebug.h>
#include <asixapp.h>
extern void UartServer( void );
// device id of uart
unsigned long UartID[UART_NUM][2] =
{
{ UART0_ID, UART0 },
{ UART1_ID, UART1 },
};
DWORD uart_server_stk[STACK_SIZE];
TASKDESCRIPTION UartServerDesp =
{"uart_server", ASIX_SERVICE, NOT_IN_ANYGROUP, NULL, STACK_SIZE, 0, 0, 0, UartServer, SERVICE_PRI};
TASKDESCRIPTIONLIST UartServerDespLst =
{NULL, NULL, &UartServerDesp, UARTSERVER_ID, uart_server_stk};
void UartServer()
{
UINT flgptn; // flag pattern
UINT uartflg, waitptn; // wait pattern
DEVUSETBL *uart;
short i;
// initialize all serial port
// InitUart( );
SysWriteDev( UART0_ID, "O", 1, -1 );
for( i = 0; i < UART_NUM; i++ )
{
uartflg |= UartEventFlag[i];
}
waitptn = uartflg | TASKMSG_FLG;
while(1)
{
// initial flgptn
flgptn = 0;
// wait for Interrupt or Tasks' Message
wai_flg( &flgptn, UART_EVENT, waitptn, TWF_ORW);
// check whether uart interrupt happend
if( flgptn & uartflg )
{
unsigned long data_len = 0;
for( i = 0; i < UART_NUM; i++ ) // check all uart port
{
if( flgptn & UartEventFlag[i] )
{
// clear this event
clr_flg( UART_EVENT, ~UartEventFlag[i] );
uart = &gDevUseTbl[UartID[i][0]-1];
set_flg( uart->flgid_rbuf, 0x01 );
if( uart->ownerid != 0 ) // uart is in use
{
if( CheckUartRecvBuf( i, &data_len ) != BUF_EMPTY )
{
if( uart->func == NULL ) // no appointed data process
{
MSG msgsnd; // message to send
msgsnd.message = SM_DATA_RECEIVED;
msgsnd.lparam = UartID[i][1];
msgsnd.wparam = (U16)data_len;
dbgoutput( "received: %d bytes", msgsnd.wparam );
// send message to task
SysSendMessage( uart->ownerid, &msgsnd );
}
else // appointed data process
(*uart->func)( (U16)data_len );
}
}
}
}
}
// check whether tasks' message came
if( flgptn & TASKMSG_FLG )
{
MSG msgrcv; // received message
ID id; // message source task id
ID devid; // device port id
// clear this event
clr_flg( UART_EVENT, ~TASKMSG_FLG);
while(1) // message loop
{
if( SysRecvMessage( &msgrcv, 0 ) != SYS_OK ) // no message, go out of loop
break;
id = msgrcv.lparam;
for( i = 0; i < UART_NUM; i++ )
{
if( msgrcv.wparam == UartID[i][1] )
break;
}
if( i == UART_NUM )
break;
devid = UartID[i][0];
uart = &gDevUseTbl[ devid -1 ];
// message process
switch( msgrcv.message )
{
case SM_OPEN:
// only user task is allowed use this message
//if( id < SHELL_ID )
// break;
if( uart->ownerid == 0 ) // uart is free
{
uart->ownerid = id;
uart->func = (DATAPROC)msgrcv.data;
EnableUartInt( (short)UartID[i][1] );
}
break;
case SM_CLOSE:
// only user task is allowed use this message
//if( id < SHELL_ID )
// break;
if( uart->ownerid == id ) // uart is used by current task
{
uart->ownerid = 0;
uart->func = NULL;
DisableUartInt( (short)UartID[i][1] );
}
break;
default:
break;
}
}
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -