📄 tskprot.c
字号:
if(Syn_Needed==TRUE) Option = BIT_SYN;
else Option = 0;
Err_Cnt = 0;
SendEn = TRUE;//function word, for fear that some unwanted messages received and resend former frame
for(;;){
if(SendEn == TRUE){
//Send one frame
if(Len>=MAX_TX_FRAME_LEN){ //huge data block to be trans.
Option |= BIT_TOBECONTINUE;
SendFrame(ptrF,MAX_TX_FRAME_LEN,port,Option);
}
else{ //normal data block to be trans
SendFrame(ptrF,Len, ActivePort,Option);
}
}
//Waiting for ACK or timeout
pMsg = OSQPend(peventTxProtocol, OS_TICKS_PER_SEC * CurTimeOut, &err);
if(err == OS_TIMEOUT){
SendEn = TRUE;
Err_Cnt++;
if(Err_Cnt >= 3){ // if certain frame timeout 3 times continuesly, transmit fail
OSQPost(peventMCNM, (OS_EVENT *) MSG_MCNM_TXFAIL);
return;
}
}
else if(err == OS_NO_ERR && (INT24U)pMsg<PTR_MAX){
if(((MSG_HEAD *)pMsg)->Msg_ID == MSG_MCNM_TRANSMIT){//if another MCNM data block arrived
OSQPost(peventMCNM,(OS_EVENT *)MSG_MCNM_TXBUSY);
SendEn = FALSE;
}
else if (((MSG_HEAD *)pMsg)->Msg_ID == MSG_PROT_RECEIVE){//if an correct ACK
if(TestACK(((MSG_HEAD *)pMsg)->pMem) == TRUE){
//modify the CurNT , data block length and data pointer
if(Len>=MAX_TX_FRAME_LEN){
Len = Len - MAX_TX_FRAME_LEN;
ptrF = ptrF+MAX_TX_FRAME_LEN;
}
else Len=0;
Err_Cnt = 0;
CurNT++;
CurNT &= 0x3f;
SendEn = TRUE;
}
else SendEn = FALSE;
}
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);
}
if(Len == 0){//if finish sending
OSQPost(peventMCNM, (OS_EVENT *) MSG_MCNM_TXSUCCESS);
return;
}
}
}
/*
void Data_Rx_Proc(INT8U rom * ptrF, INT8U port, OS_MEM *pMem){
INT8U rom * pRxSav;
INT8U rom * pRx;
INT8U rom * pSml;
INT8U len,err,i,type,Waiting;
INT8U rom * pMsg;
INT16U TimeOut;
pRx = NULL_PTR;
TimeOut = (port == PT_HDLC)? 1000:5000; //10s or 50s
len = 0;
Type = *(ptrF+3) & 0x07;
SubType = (*(ptrF+3) & 0xf0)>>4;
SubNet = *(ptrF+4);
if(TestNT(ptrF)== FALSE) Syn_Needed = TRUE; //if the NR in information frame does not agree with local NT,
//resynchronization is needed
pRx = (INT8U rom *)0xffffff;
Waiting = FALSE; //for fear that some unexpected message to introduce error into data
for(;;){
if(Waiting == TRUE){
pMsg = OSQPend(peventRxProtocol, TimeOut, &err);
if(err == OS_TIMEOUT){
OSMemPut(pMem,pRx);
break;
}
else if ((INT24U)pMsg<PTR_MAX && err == OS_NO_ERR){
if (((MSG_HEAD *)pMsg)->Msg_ID == MSG_PROT_RECEIVE){
ptrF = ((MSG_HEAD *)pMsg)->pMem;
pMem = ((MSG_HEAD *)pMsg)->pmemATT;
((MSG_HEAD *)pMsg)->Attached = FALSE;
}
if(((MSG_HEAD *)pMsg)->Attached == TRUE){
OSMemPut(((MSG_HEAD *)pMsg)->pmemATT, ((MSG_HEAD *)pMsg)->pMem);
}
OSMemPut(((MSG_HEAD *)pMsg)->pmemME, pMsg);
}
}
}
if(TestNR(ptrF) != TRUE){
if((INT24U)pRx != 0xffffff){
OSMemPut(pMem,pRx);
}
return;
}
CurNR++;
CurNR &= 0x3f;
if(TestToBeContinue(ptrF)==TRUE){
Waiting = TRUE;
pRx=OSMemGet(pMemHug,&err);
if(err != OS_NO_ERR) break;
pRxSav = pRx;
pMem = pMemHug;
len += *ptrF;
ptrF +=5;
for(i=0; i<len-5; i++){
*pRx++ = *ptrF++;
}
SendACK(port);//no wait here
OSMemPut(pMem,ptrF);
}
else{
if(pRx == NULL_PTR){
pRx=OSMemGet(pMemLge,&err);
if(err != OS_NO_ERR) break;
pSml = OSMemGet(pMemSml,&err);
if(err != OS_NO_ERR) break;
pMem = pMemLge;
pRxSav = pRx;
}
len = len + *ptrF;
ptrF +=5;
pSml = OSMemGet(pMemSml,&err);
if(err != OS_NO_ERR) {
OSMemPut(pMem, pRx);
break;
}
for(i=0; i<len-5; i++){
*pRx++ = *ptrF++;
}
((MSG_HEAD *)pSml)->Msg_ID = MSG_MCNM_RECEIVE;
((MSG_HEAD *)pSml)->Origin = peventRxProtocol;
((MSG_HEAD *)pSml)->pmemME = pMemSml;
((MSG_HEAD *)pSml)->Attached = TRUE;
((MSG_HEAD *)pSml)->LenOfAttach = len-5;
((MSG_HEAD *)pSml)->pMem = pRxSav;
((MSG_HEAD *)pSml)->pmemATT = pMem;
((MSG_HEAD *)pSml)->LenOfBody = 0;
((MSG_PROTOCOL *)pSml)->Type = Type;
((MSG_PROTOCOL *)pSml)->SubType = SubType;
((MSG_PROTOCOL *)pSml)->SubNet = SubNet;
OSQPost(peventMCNM, pSml);
OSTimeDly(len/32+1); // the worst situation is to write "len" bytes in MCNM, so cost about len/32 *10 ms
SendACK(port);
break;
}
}
}
*/
INT8U TestNR(INT8U rom *ptrF){
INT8U NT;
NT = ((FRAME_STRUCT *)ptrF)->NT;
if((NT & 0x3f)==CurNR) return (0);
else{
if((NT & BIT_SYN) != 0){
CurNR = NT & 0x3f;
return (1);
}
return(2);
}
}
INT8U TestNT(INT8U rom *ptrF){
INT8U NR;
NR = ((FRAME_STRUCT *)ptrF)->NR;
if((NR & 0x3f)==CurNT) return (TRUE);
else{
return(FALSE);
}
}
//if the frame is an ACK and the NR byte agree with the CurNT(point to (CurNT+1)mod 64 )
INT8U TestACK(INT8U rom *ptrF){
INT8U NR;
if(((((FRAME_STRUCT *)ptrF)->Type) & 0xf0) == 0x10){
NR = ((FRAME_STRUCT *)ptrF)->NR;
if((NR & 0x3f)== ((CurNT+1)&0x3f)) return (TRUE);
else return(FALSE);
}
else return (FALSE);
}
INT8U TestToBeContinue(INT8U rom *ptrF){
if(((((FRAME_STRUCT *)ptrF)->NT) & BIT_TOBECONTINUE) != 0) return (TRUE);
else return (FALSE);
}
void SendACK(INT8U port){
INT8U rom * pT0;
INT8U rom * pT1;
INT8U err;
INT8U Type;
Type = FC_ACK;
Type = Type<<4;
if(port == PT_HDLC) Type |= 0x08;
Type = Type | 0x04;
pT0 = OSMemGet( pMemSml, &err);
if(err == OS_NO_ERR){
pT1 = OSMemGet( pMemLge, &err);
if(err == OS_NO_ERR){
((MSG_HEAD *)pT0)->Msg_ID = MSG_PROT_TRANSMIT;
((MSG_HEAD *)pT0)->Origin = peventRxProtocol;
((MSG_HEAD *)pT0)->pmemME = pMemSml;
((MSG_HEAD *)pT0)->Attached = TRUE;
((MSG_HEAD *)pT0)->LenOfAttach = 5;
((MSG_HEAD *)pT0)->pMem = pT1;
((MSG_HEAD *)pT0)->pmemATT = pMemSml;
((MSG_HEAD *)pT0)->LenOfBody = 0;
((FRAME_STRUCT *)pT1)->Len = 5;
((FRAME_STRUCT *)pT1)->NT = CurNT;
CurNR++;
CurNR &= 0x3f;
((FRAME_STRUCT *)pT1)->NR = CurNR;
((FRAME_STRUCT *)pT1)->Type = Type;
((FRAME_STRUCT *)pT1)->SubNet = 1;
if(port== PT_HDLC){
OSQPost(peventDEBUG, pT0);
}
else OSQPost(peventWICCmd, pT0);
}
}
}
void SendFrame(INT8U rom * ptrD, INT16U len, INT8U port, INT8U option){
INT8U rom * pT0;
INT8U rom * pT1;
INT8U err;
INT8U Type,i;
if(port == PT_HDLC) Type = 0x0c;
else Type = 0x04;
pT0 = OSMemGet( pMemSml, &err);
if(err == OS_NO_ERR){
pT1 = OSMemGet( pMemLge, &err);
if(err == OS_NO_ERR){
((MSG_HEAD *)pT0)->Msg_ID = MSG_PROT_TRANSMIT;
((MSG_HEAD *)pT0)->Origin = peventTxProtocol;
((MSG_HEAD *)pT0)->pmemME = pMemSml;
((MSG_HEAD *)pT0)->Attached = TRUE;
((MSG_HEAD *)pT0)->LenOfAttach = len+5;
((MSG_HEAD *)pT0)->pMem = pT1;
((MSG_HEAD *)pT0)->pmemATT = pMemSml;
((MSG_HEAD *)pT0)->LenOfBody = 0;
((FRAME_STRUCT *)pT1)->Len = len+5;
((FRAME_STRUCT *)pT1)->NT = CurNT | option;
((FRAME_STRUCT *)pT1)->NR = CurNR;
((FRAME_STRUCT *)pT1)->Type = Type;
((FRAME_STRUCT *)pT1)->SubNet = 0;
pT1 += 5;
for(i=0; i<len; i++){
*pT1 = *ptrD;
pT1++;
ptrD++;
}
if(port== PT_HDLC){
OSQPost(peventDEBUG, pT0);
}
else OSQPost(peventWICCmd, pT0);
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -