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

📄 mcnmtst.c

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

extern OS_MEM			*pMemSml;
extern OS_MEM			*pMemLge;
extern OS_EVENT	*rom peventDEBUG;
extern OS_EVENT	*rom peventWICResp;
extern OS_EVENT	*rom peventHardware;
extern OS_EVENT	*rom peventDVS;
extern OS_EVENT	*rom peventMCNM;

INT8U MCNMFrameProc(INT8U rom * ptrD, INT16U Len);

#pragma romdata EXTRAM
SYS_FILE	SystemFile;
INT16U rom DomainOffset[64];

#pragma code MYCODE

void tskMCNM(void * data){
	void rom * pMsg;
	INT8U err;
	
	//load eeprom data index here
	Load_SysFile();
	if(Test_SysFileValid == FALSE){//the domain length table is corrupted
		MCNMStt = MS_DATA_CORRUPTED;
	}
	else{
		Make_SysFileIndex();
		MCNMStt = MS_OK;
	}
	for(;;){
		pMsg = OSQPend(peventMCNM, 0, &err);
		if(err == OS_NO_ERR){
			if((INT24U)pMsg >= PTR_MAX){
				switch ((INT24U)pMsg){
					
				}
			}
			else{
				switch (((MSG_HEAD *)pMsg)->Msg_ID){
					case MSG_MCNM_RECEIVE:
						if(MCNMFrameProc(((MSG_HEAD *)pMsg)->pMem, ((MSG_HEAD *)pMsg)->LenOfAttach) == 0){
						}
						break;
				}
				if(((MSG_HEAD *)pMsg)->Attached == TRUE){
					OSMemPut(((MSG_HEAD *)pMsg)->pmemATT, ((MSG_HEAD *)pMsg)->pMem);
				}
				OSMemPut(((MSG_HEAD *)pMsg)->pmemME, pMsg);
			}
		}
	}
} 

INT16U GetMCNMFileLen(void){
	return(0x200);
}


#pragma romdata EXTRAM
INT24U rom MF_Pos_Tbl[64];
INT16U rom DomainLen[64];	//The length table of domains. This parameters need to be download to the terminal

#pragma code MYCODE
void Make_MF_Index_Tbl(void){
	MCNM_FILE * ptrM;
	INT8U i;
	INT24U Temp;
	Temp = 0;
	for(i=0;i<64;i++){
		MF_Pos_Tbl[i] = Temp;
		if(i != 39) Temp += DomainLen[i];
	}
}

#pragma code MYCODE
INT8U rom * ProcessDomain(INT8U rom *ptr, INT8U domain, INT8U *err);

INT8U MCNMFrameProc(INT8U rom * ptrD, INT16U Len){ //return if the frame is currupted, "1" for error, "0" for OK
	INT8U rom *ptrTemp;
	INT8U err,i,j,k;
	
	ptrD += 5;
	ptrTemp = ptrD;
	if(Len< 13) return (1);
	for(i = 0; i<8; i++){
		k = 0b00000001;
		for(j = 0; j<8; j++){
			if((k & *ptrD) != 0){
				ptrTemp = ProcessDomain(*ptrTemp, i*8+j, &err);
				if(err != 0) return (1);
			}
			k = k << 1;
		}
	}
	return (0);
}


INT8U FileSave(INT8U FileID, INT16U Position, INT8U rom * ptrData, INT16U DataLen)

#pragma code MYCODE
INT8U rom * ProcessDomain(INT8U rom *ptr, INT8U domain, INT8U type, INT8U *err){
	//if there is error, err = 0xff
	*err = 0;
	if(domain > 63){
		* err = 1;
		return (0xffffff); //local error but no frame err, just throw it away
	}
	if(domain == 63){	//the polling domain
		domain = *ptr;
		if(SystemFile.DomainLen[domain] == 0) return(ptr+1);
		pSml = OSMemGet(pMemSml, &err);
		if(err == OS_NO_ERR){
			if(DomainLen[domain]>(255-13){
				pInf = OSMemGet(pMemHug,&err);
				pMem = pMemHug;
				if(err != OS_NO_ERR) return(0xffffff);
			}
			else{
				pInf = OSMemGet(pMemLge,&err);
				pMem = pMemLge;
				if(err != OS_NO_ERR) return(0xffffff);
			}
		}
		((MSG_HEAD *)pSml)->Msg_ID = MSG_MCNM_TRANSMIT;
		((MSG_HEAD *)pSml)->Origin = peventMCNM;
		((MSG_HEAD *)pSml)->pmemME = pMemSml;
		((MSG_HEAD *)pSml)->Attached = TRUE;
		((MSG_HEAD *)pSml)->LenOfAttach = SystemFile.DomainLen[domain]+8;
		((MSG_HEAD *)pSml)->pMem = pInf;
		((MSG_HEAD *)pSml)->pmemATT = pMem;
		((MSG_HEAD *)pSml)->LenOfBody = 0;

		Make_BitMap(domain, pInf);
		pInf +=8;
		Read_Domain(domain, pInf);
		OSQPost(peventTxProtocol, pSml);
		return(ptr+1);
	}
	else{ //save the frame
		if(SystemFile.DomainLen[domain] == 0) return (ptr);
		if(Check_Authorization(type, domain) != 0) return (ptr+SystemFile.DomainLen[domain]);
		else {
			Save_Domain(domain,ptr);
			return(ptr+SystemFile.DomainLen[domain]);
		}
	}
	return (ptr);
}



INT8U Test_SysFileValid(void){
	INT8U ChkSum,j,k;
	INT8U rom * ptrD;
	ChkSum = 0;
	j=0;
	k=0;
	ptrD =(INT8U rom *)&SystemFile.DomainLen[0];
	for(i=0; i<64*2+64; i++){
		if(*ptrD == 0xff) j++;
		if(*ptrD == 0) k++;
		ChkSum ^= *ptrD++;
	}
	if(ChkSum != SystemFile.CheckSum) return(FALSE);
	else return (TRUE);
}

void Make_SysFileIndex(void){
	Offset = 0;
	for(i=0; i<64; i++){
		DomainOffset[i] = Offset;
		Offset += SystemFile.DomainLen[i];
	}
}

INT8U Check_Authorization(INT8U type, INT8U domain){
	if(type>SystemFile.DomainAuth[domain]) return (1);
	else return(0);
}

INT8U Save_Domain(INT8U domain, INT8U rom * ptrData){
	Pos = DomainOffset[domain];
	Len = SystemFile.DomainLen[domain];
	OSSemPend(EepromSem, 0, &err);
	if (err != OS_NO_ERR) return(1);
	if(FileSave(SYS_FILE_ID, Pos, ptrData, Len)!=0){
		OSSemPost(EepromSem);
		return (2);
	}
	OSSemPost(EepromSem);
	return (0);
}

INT8U Read_Domain(INT8U domain, INT8U rom * ptrData){
	Pos = DomainOffset[domain];
	Len = SystemFile.DomainLen[domain];
	OSSemPend(EepromSem, 0, &err);
	if (err != OS_NO_ERR) return(1);
	if(FileRead(SYS_FILE_ID, Pos, ptrData, Len)!=0){
		OSSemPost(EepromSem);
		return (2);
	}
	OSSemPost(EepromSem);
	return (0);
}

#pragma romdata CCODE
INT8U rom BipMap[]={0b00000001,0b00000010,0b00000100,0b00001000,
					0b00010000,0b00100000,0b01000000,0b10000000};
#pragma code MYCODE
INT8U Make_BitMAP(INT8U domain, INT8U rom * ptrBuf){
	INT8U i;
	if(domain>63) return(1);
	for(i=0; i<domain/8; i++){
		*ptrBuf++ = 0;
	}
	*ptrBuf++ = BipMap[domain%8];
	for(i=0; i<8-domain/8-1;i++){
		*ptrBuf++ = 0;
	}
	return(0);
}

void Load_SysFile(void){
	INT8U err;
	OSSemPend(EepromSem, 0, &err);
	if (err != OS_NO_ERR) return(1);
	if(FileRead(SYS_FILE_ID, 0, &SystemFile,sizeof(SYS_FILE))!=0){
		OSSemPost(EepromSem);
		return;
	}
	OSSemPost(EepromSem);
	return;
}

⌨️ 快捷键说明

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