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

📄 tskdebug.c

📁 本人编写的无线电话程序,给予PIC18C801设计,包括了uCOS的移植以及菜单,自己设计的拼音注入法,完整地一级汉字库,希望对大家有所帮助
💻 C
字号:
#include <p18cxxx.h>
#include "includes.h"
#include "event.h"

extern OS_MEM			*pMemSml;
extern OS_MEM			*pMemLge;

extern unsigned char DebugContent[48];


void Process_DBG_RData(INT8U rom * ptrData, INT16U Len);
void Process_DBG_TData(INT8U rom * ptrData, INT16U Len);

typedef struct Pack_Result{
	INT16U PacLen;	//the length of packet
	INT16U RemLem;	//how many byte remain unpacked
	INT8U rom * ptrCur;	//unpacked data start address
}PACKRESULT;


#define DBGWORKBUFLEN 	512
#define F_ESC  			0x7d
#define F_FLAG 			0x7e
#define F_START 		2
#define F_END   		3


#pragma romdata EXTRAM
INT8U rom chrDBGWorkBuf[DBGWORKBUFLEN];
INT16U rom DBGWorkBufPtr;
INT8U rom FrameStt;
INT8U rom ESC_Found;
INT8U rom LinkStt;		//the state of the link, waiting answer or idle

void tskDebug(void * data){
	void rom * pMsg;
	INT8U err;
	INT8U rom * pSml;
	INT8U rom * pLge;
	INT8U chrTemp,i;
	INT8U rom * pTemp1;
	INT8U rom * pTemp2;
	
	DBGWorkBufPtr = 0;
	FrameStt = F_END;
	ESC_Found = FALSE;
	
	for(;;){
		pMsg = OSQPend(peventDEBUG, 0, &err);
		if(err == OS_NO_ERR){
			if((INT24U)pMsg >= PTR_MAX){
				switch ((INT24U)pMsg){
					
				}
			}
			else{
				switch (((MSG_HEAD *)pMsg)->Msg_ID){
					case MSG_DEBUG_RECEIVE:
						Process_DBG_RData(((MSG_HEAD *)pMsg)->pMem, ((MSG_HEAD *)pMsg)->LenOfAttach);
						break;
					default:
					//case MSG_MCNM_TRANSMIT:
						Process_DBG_TData(((MSG_HEAD *)pMsg)->pMem, ((MSG_HEAD *)pMsg)->LenOfAttach);
					//	break;
					//case MSG_PROT_TRANSMIT:
					//	Process_DBG_TData(((MSG_HEAD *)pMsg)->pMem, ((MSG_HEAD *)pMsg)->LenOfAttach);
						break;
				}
				Func_Clear_Msg(pMsg);
				//if(((MSG_HEAD *)pMsg)->Attached == TRUE){
				//	OSMemPut(((MSG_HEAD *)pMsg)->pmemATT, ((MSG_HEAD *)pMsg)->pMem);
				//}
				//OSMemPut(((MSG_HEAD *)pMsg)->pmemME, pMsg);
			}
		}
	}
} 


/***************************************************************************************************/
void Process_DBG_RData(INT8U rom * ptrData, INT16U Len){
	INT8U chrTemp,err;
	INT16U i,j;
	INT8U rom * pSml;
	INT8U rom * pLge;
	for(i=0; i<Len; i++){
		if(DBGWorkBufPtr >= DBGWORKBUFLEN-2)	DBGWorkBufPtr = 0;
		chrTemp = *ptrData++;
		switch(chrTemp){
			case F_FLAG:	//flag 0x7e
				if(FrameStt == F_START){ //a frame has began
					if(DBGWorkBufPtr != 0){
						FrameStt = F_END;
						if(DBGWorkBufPtr >256){
							DBGWorkBufPtr = 0; //too long a frame received, throw away
							break;
						}
						if(chrDBGWorkBuf[0] != DBGWorkBufPtr){
							DBGWorkBufPtr = 0; //the frame length is not correct
							break;
						}
						if(chrDBGWorkBuf[3] == FT_DEBUG && DBGWorkBufPtr >= 4){
							//if it's a DEBUG frame
							//add process code here
							DBGWorkBufPtr = 0;
							break;
						}
						//if((chrDBGWorkBuf[3] != FT_MCNM && DBGWorkBufPtr < 14){
						if(DBGWorkBufPtr < 5){
							//if it's not a MCNM frame or the length is illegal
							DBGWorkBufPtr = 0;
							break;
						}
						
						//send data to MCNM
						pSml = OSMemGet( pMemSml, &err);
						if(err == OS_NO_ERR){
							pLge = OSMemGet( pMemLge, &err);
							if(err == OS_NO_ERR){
								((MSG_HEAD *)pSml)->Msg_ID = MSG_PROT_RECEIVE;
								((MSG_HEAD *)pSml)->Origin = peventDEBUG;
								((MSG_HEAD *)pSml)->pmemME = pMemSml;
								((MSG_HEAD *)pSml)->Attached = TRUE;
								((MSG_HEAD *)pSml)->LenOfAttach = DBGWorkBufPtr;
								((MSG_HEAD *)pSml)->pMem = pLge;
								((MSG_HEAD *)pSml)->pmemATT = pMemLge;
								((MSG_HEAD *)pSml)->LenOfBody = 0;
								//((MSG_PROTOCOL *)pSml)->Port = PT_HDLC;
								//((MSG_PROTOCOL *)pSml)->Type = chrDBGWorkBuf[3]&0x07;
								//((MSG_PROTOCOL *)pSml)->SubType = chrDBGWorkBuf[3]&0x
								for(j=0; j<DBGWorkBufPtr; j++){
									*pLge++ = chrDBGWorkBuf[j];
									//DebugContent[j] = chrDBGWorkBuf[j];
								}
								if((chrDBGWorkBuf[3]&0xf0) == 0x10){//an ACK
									OSQPost(peventTxProtocol, pSml);
								}
								else{
									OSQPost(peventRxProtocol, pSml);
								}
							}
						}
						DBGWorkBufPtr = 0;
					}
				}
				else{ //this flag start the frame
					FrameStt = F_START;
					DBGWorkBufPtr = 0;
				}
				break;
			case F_ESC:		//escape symbol 0x7d
				if(FrameStt != F_START) break;
				ESC_Found = TRUE;
				break;
			default:		//other bytes
				if(FrameStt != F_START) break;
				if(ESC_Found == TRUE){//an escape symbol has been found
					ESC_Found = FALSE;
					chrTemp ^= 0x20;
					chrDBGWorkBuf[DBGWorkBufPtr]= chrTemp;
				}
				else{
					chrDBGWorkBuf[DBGWorkBufPtr]= chrTemp;
				}
				DBGWorkBufPtr++;
				break;
		}
	}
}


void Process_DBG_TData(INT8U rom * ptrData, INT16U Len){//packet the MCNM data
	INT8U rom * pSml;
	INT8U rom * pLge;
	INT8U err,chrTemp;
	INT16U i,j;
	
	pSml = OSMemGet(pMemSml,&err);
	if(err == OS_NO_ERR){
		pLge = OSMemGet( pMemLge, &err);
		if(err == OS_NO_ERR){
			((MSG_HEAD *)pSml)->Msg_ID = MSG_COM0_TRANSMIT;
			((MSG_HEAD *)pSml)->Origin = peventDEBUG;
			((MSG_HEAD *)pSml)->pmemME = pMemSml;
			((MSG_HEAD *)pSml)->Attached = TRUE;
			((MSG_HEAD *)pSml)->pMem = pLge;
			((MSG_HEAD *)pSml)->pmemATT = pMemLge;
			((MSG_HEAD *)pSml)->LenOfBody = 0;
			j=0;
			*pLge++ = F_FLAG;
			j++;
			
			for(i=0;i<Len;i++){
				chrTemp = *ptrData++;
				switch(chrTemp){
					case F_FLAG:
						*pLge++ = F_ESC;
						*pLge++ = chrTemp ^ 0x20;
						j +=2;
						break;
					case F_ESC:
						*pLge++ = F_ESC;
						*pLge++ = chrTemp ^ 0x20;
						j +=2;
						break;
					default:
						*pLge++ = chrTemp;
						j++;
						break;
				}
				if(j>250){//too long a data packet
					OSMemPut(pMemSml, pSml);
					OSMemPut(pMemLge, pLge);
				}
			}
			*pLge++ = F_FLAG;
			j++;
			((MSG_HEAD *)pSml)->LenOfAttach = j;
			OSQPost(peventHardware, pSml);
		}
	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -