⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 uartsvr.c

📁 一个操作系统源代码 用于嵌入式设备 在Vc++环境下仿真 成功移植到多款处理器上
💻 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 + -