📄 commrtos.c
字号:
/*
*********************************************************************************************************
* Embedded Systems Building Blocks
* Complete and Ready-to-Use Modules in C
*
* Asynchronous Serial Communications
* Buffered Serial I/O
* (RTOS)
*
* (c) Copyright 1999, Jean J. Labrosse, Weston, FL
* All Rights Reserved
*
* Filename : COMMRTOS.C
* Programmer : Jean J. Labrosse
* Translated by : Won-Ho, Sung
*********************************************************************************************************
*/
/*
*********************************************************************************************************
* 牢农风靛
*********************************************************************************************************
*/
#include "c:\\IC96\\Work\\ucos_ii\\includes.h"
#include "CommRtos.h"
/*$PAGE*/
/*
*********************************************************************************************************
* 惑荐
*********************************************************************************************************
*/
/*
*********************************************************************************************************
* 单捞磐 鸥涝
*********************************************************************************************************
*/
typedef struct {
INT16U RingBufRxCtr; /* Rx 傅 滚欺俊 历厘等 单捞磐 荐 */
OS_EVENT *RingBufRxSem; /* 荐脚 技付器绢狼 器牢磐 */
INT8U *RingBufRxInPtr; /* 促澜 单捞磐甫 历厘且 镑阑 啊府虐绰 器牢磐 */
INT8U *RingBufRxOutPtr; /* 促澜俊 佬绢哎 单捞磐甫 啊府虐绰 器牢磐 */
INT8U RingBufRx[COMM_RX_BUF_SIZE]; /* 荐脚侩 傅 滚欺 历厘康开(Rx) */
INT16U RingBufTxCtr; /* Tx 傅 滚欺俊 历厘等 单捞磐 荐 */
OS_EVENT *RingBufTxSem; /* 价脚 技付器绢狼 器牢磐 */
INT8U *RingBufTxInPtr; /* 促澜 单捞磐甫 历厘且 镑阑 啊府虐绰 器牢磐 */
INT8U *RingBufTxOutPtr; /* 促澜俊 佬绢哎 单捞磐甫 啊府虐绰 器牢磐 */
INT8U RingBufTx[COMM_TX_BUF_SIZE]; /* 价脚侩 傅 滚欺 历厘康开(Tx) */
} COMM_RING_BUF;
/*
*********************************************************************************************************
* 傈开函荐
*********************************************************************************************************
*/
COMM_RING_BUF ComBuf;
COMM_RING_BUF *pbuf;
void RxIntHandler(void)
{
INT8U c;
c = sbuf; /* Process received character */
if (pbuf->RingBufRxCtr < COMM_RX_BUF_SIZE) { /* See if buffer is full */
pbuf->RingBufRxCtr++; /* No, increment character count */
*pbuf->RingBufRxInPtr++ = c; /* Put character into buffer */
if (pbuf->RingBufRxInPtr == &pbuf->RingBufRx[COMM_RX_BUF_SIZE]) { /* Wrap IN pointer */
pbuf->RingBufRxInPtr = &pbuf->RingBufRx[0];
}
OSSemPost(pbuf->RingBufRxSem); /* Indicate that character was received */
}
}
void TxIntHandler(void)
{
INT8U c, err;
c = CommGetTxChar(&err); /* Get next character to send. */
if (err != COMM_TX_EMPTY) { /* Do we have anymore characters to send ? */
sbuf = c; /* Yes, Send character */
}
}
/*$PAGE*/
/*
*********************************************************************************************************
* 傅 滚欺 单捞磐 佬扁
*
*
* 汲疙 : 览侩橇肺弊伐篮 烹脚 盲澄肺何磐 单捞磐甫 佬绢郴扁 困秦 捞 窃荐甫 龋免茄促.
* 捞 窃荐绰 烹脚盲澄俊 单捞磐啊 荐脚登芭唱 鸥烙酒眶捞 父丰瞪 锭 鳖瘤 措扁茄促.
*
* 傈崔牢磊 : 'ch' COMM 器飘 盲澄 锅龋. 促澜苞 鞍篮 蔼阑 爱绰促:
* COMM1
* COMM2
* 'to' 单捞磐啊 荐脚登扁甫 扁促府绰 鸥烙酒眶阑 努钒 平 窜困肺 瘤沥茄促.
* 捞 蔼阑 0栏肺 瘤沥窍搁 窃荐绰 单捞磐啊 荐脚瞪 锭 鳖瘤 公茄沥 措扁茄促.
*
* 'err' 俊矾内靛啊 历厘瞪 函荐甫 啊府虐绰 器牢磐. 促澜苞 鞍篮 蔼捞 汲沥等促:
* COMM_NO_ERR : 滚欺俊辑 单捞磐甫 佬绢 辰 版快
* COMM_RX_TIMEOUT : 鸥烙酒眶捞 父丰等 版快
* COMM_BAD_CH : 公瓤 盲澄阑 瘤沥茄 版快
* 府畔蔼 : 滚欺俊辑 佬绢辰 单捞磐(鸥烙酒眶捞 父丰等 版快绰 NUL阑 府畔茄促)
*********************************************************************************************************
*/
INT8U CommGetChar (INT16U to, INT8U *err)
{
INT8U c;
INT8U oserr;
OSSemPend(pbuf->RingBufRxSem, to, &oserr); /* 单捞磐啊 荐脚登扁甫 扁促赴促 */
if (oserr == OS_TIMEOUT) { /* 鸥烙酒眶捞 父丰登菌绰啊? */
*err = COMM_RX_TIMEOUT; /* 抗, 俊矾内靛甫 府畔茄促 */
return (NUL);
} else {
OS_ENTER_CRITICAL();
pbuf->RingBufRxCtr--; /* 酒聪坷, 单捞磐 墨款磐甫 皑家矫挪促 */
c = *pbuf->RingBufRxOutPtr++; /* 滚欺俊辑 单捞磐甫 佬绢辰促 */
if (pbuf->RingBufRxOutPtr == &pbuf->RingBufRx[COMM_RX_BUF_SIZE]) { /* 器牢磐 版拌 贸府 */
pbuf->RingBufRxOutPtr = &pbuf->RingBufRx[0];
}
OS_EXIT_CRITICAL();
*err = COMM_NO_ERR;
return (c);
}
}
/*$PAGE*/
/*
*********************************************************************************************************
* 价脚 傅 滚欺 单捞磐 佬扁
*
*
* 汲疙 : 价脚 ISR篮 滚欺肺何磐 促澜 价脚 单捞磐甫 佬绢 郴扁 困秦辑 捞 窃荐甫 龋免茄促.
* 捞 窃荐绰 滚欺俊辑 单捞磐甫 佬绢辰 饶 滚欺啊 后促搁 FALSE甫 府畔茄促.
* 蝶扼辑 价脚 ISR篮 捞 窃荐啊 FALSE甫 府畔窍搁 滚欺啊 厚绢乐绰 巴阑 狼固窍骨肺
* 价脚 牢磐反飘甫 厚劝己拳 茄促.
* 傈崔牢磊 : 'ch' COMM 器飘 盲澄 锅龋. 促澜苞 鞍篮 蔼阑 爱绰促:
* COMM1
* COMM2
* 'err' 俊矾内靛啊 历厘瞪 函荐甫 啊府虐绰 器牢磐:
* 'err' 俊矾内靛啊 历厘瞪 函荐甫 啊府虐绰 器牢磐:
* COMM_NO_ERR : 窍唱 捞惑狼 单捞磐啊 滚欺俊 粮犁窍绰 版快
* COMM_TX_EMPTY : 滚欺啊 厚绢 乐绰 版快
* COMM_BAD_CH : 公瓤 盲澄阑 瘤沥茄 版快
* 府畔蔼 : 价脚滚欺俊辑 佬绢辰 单捞磐. 滚欺啊 后 版快绰 NUL阑 府畔茄促.
*********************************************************************************************************
*/
INT8U CommGetTxChar (INT8U *err)
{
INT8U c;
if (pbuf->RingBufTxCtr > 0) { /* 滚欺俊 单捞磐啊 乐绰啊? */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -