📄 commrtos.lst
字号:
C51 COMPILER V7.50 COMMRTOS 11/21/2006 00:19:41 PAGE 1
C51 COMPILER V7.50, COMPILATION OF MODULE COMMRTOS
OBJECT MODULE PLACED IN COMMRTOS.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE COMMRTOS.C LARGE BROWSE DEBUG OBJECTEXTEND PRINT(.\DeBug\COMMRTOS.lst) SRC(
-.\DeBug\COMMRTOS.SRC)
line level source
1 /*
2 *********************************************************************************************************
3 * 基于uC/OS-II的串口驱动及应用程序接口函数
4 * 版权所有
5 *
6 * 文件名 : COMMRTOS.C
7 * 作者 : 陈是知 csz-mail@126.com 北京中软 2005。3。11
8 *********************************************************************************************************
9 */
10
11
12 #include "includes.h"
13
14 INT8U FirstCharFlag=0x01; //注意:此为串口发送第一个字符的标志,必须定义。
15
16 typedef struct {
17 INT16U RingBufRxCtr; /* Number of characters in the Rx ring buffer */
18 OS_EVENT *RingBufRxSem; /* Pointer to Rx semaphore */
19 INT8U *RingBufRxInPtr; /* Pointer to where next character will be inserted */
20 INT8U *RingBufRxOutPtr; /* Pointer from where next character will be extracted */
21 INT8U RingBufRx[COMM_RX_BUF_SIZE]; /* Ring buffer character storage (Rx) */
22 INT16U RingBufTxCtr; /* Number of characters in the Tx ring buffer */
23 OS_EVENT *RingBufTxSem; /* Pointer to Tx semaphore */
24 INT8U *RingBufTxInPtr; /* Pointer to where next character will be inserted */
25 INT8U *RingBufTxOutPtr; /* Pointer from where next character will be extracted */
26 INT8U RingBufTx[COMM_TX_BUF_SIZE]; /* Ring buffer character storage (Tx) */
27 } COMM_RING_BUF;
28
29
30 COMM_RING_BUF CommBuf;
31
32
33 void CommBufInit (void) reentrant
34 {
35 1 COMM_RING_BUF *pbuf;
36 1
37 1 pbuf = &CommBuf; /* Initialize the ring buffer for COMM1 */
38 1 pbuf->RingBufRxCtr = 0;
39 1 pbuf->RingBufRxInPtr = &pbuf->RingBufRx[0];
40 1 pbuf->RingBufRxOutPtr = &pbuf->RingBufRx[0];
41 1 pbuf->RingBufRxSem = OSSemCreate(0);
42 1 pbuf->RingBufTxCtr = 0;
43 1 pbuf->RingBufTxInPtr = &pbuf->RingBufTx[0];
44 1 pbuf->RingBufTxOutPtr = &pbuf->RingBufTx[0];
45 1 pbuf->RingBufTxSem = OSSemCreate(COMM_TX_BUF_SIZE);
46 1
47 1 }
48
49
50
51 INT8U CommPutChar (INT8U c, INT16U to) reentrant
52 {
53 1 INT8U oserr;
54 1 COMM_RING_BUF *pbuf;
C51 COMPILER V7.50 COMMRTOS 11/21/2006 00:19:41 PAGE 2
55 1 extern INT8U FirstCharFlag;
56 1 pbuf=&CommBuf;
57 1 OSSemPend(pbuf->RingBufTxSem, to, &oserr); /* Wait for space in Tx buffer */
58 1 if (oserr == OS_TIMEOUT) {
59 2 return (COMM_TX_TIMEOUT); /* Timed out, return error code */
60 2 }
61 1 OS_ENTER_CRITICAL();
62 1 pbuf->RingBufTxCtr++; /* No, increment character count */
63 1 *pbuf->RingBufTxInPtr++ = c; /* Put character into buffer */
64 1 if (pbuf->RingBufTxInPtr == &pbuf->RingBufTx[COMM_TX_BUF_SIZE]) { /* Wrap IN pointer */
65 2 pbuf->RingBufTxInPtr = &pbuf->RingBufTx[0];
66 2 }
67 1 if (pbuf->RingBufTxCtr == 1) { /* See if this is the first character */
68 2 if(FirstCharFlag==0x01)
69 2
70 2 TI=1; /* Yes, Enable Tx interrupts */
71 2
72 2 }
73 1 OS_EXIT_CRITICAL();
74 1 return (COMM_NO_ERR);
75 1 }
76
77 void CommPutRxChar (INT8U c) reentrant
78 {
79 1 COMM_RING_BUF *pbuf;
80 1 pbuf=&CommBuf;
81 1
82 1 if (pbuf->RingBufRxCtr < COMM_RX_BUF_SIZE) { /* See if buffer is full */
83 2 pbuf->RingBufRxCtr++; /* No, increment character count */
84 2 *pbuf->RingBufRxInPtr++ = c; /* Put character into buffer */
85 2 if (pbuf->RingBufRxInPtr == &pbuf->RingBufRx[COMM_RX_BUF_SIZE]) { /* Wrap IN pointer */
86 3 pbuf->RingBufRxInPtr = &pbuf->RingBufRx[0];
87 3 }
88 2 OSSemPost(pbuf->RingBufRxSem); /* Indicate that character was received */
89 2 }
90 1 }
91
92 INT8U CommGetChar (INT16U to, INT8U *err) reentrant
93 {
94 1 INT8U c;
95 1 INT8U oserr;
96 1 COMM_RING_BUF *pbuf;
97 1 pbuf=&CommBuf;
98 1 OSSemPend(pbuf->RingBufRxSem, to, &oserr); /* Wait for character to arrive */
99 1 if (oserr == OS_TIMEOUT) { /* See if characters received within timeout*/
100 2 *err = COMM_RX_TIMEOUT; /* No, return error code */
101 2 return (NUL);
102 2 } else {
103 2 OS_ENTER_CRITICAL();
104 2 pbuf->RingBufRxCtr--; /* Yes, decrement character count */
105 2 c = *pbuf->RingBufRxOutPtr++; /* Get character from buffer */
106 2 if (pbuf->RingBufRxOutPtr == &pbuf->RingBufRx[COMM_RX_BUF_SIZE]) { /* Wrap OUT pointer */
107 3 pbuf->RingBufRxOutPtr = &pbuf->RingBufRx[0];
108 3 }
109 2 OS_EXIT_CRITICAL();
110 2 *err = COMM_NO_ERR;
111 2 return (c);
112 2 }
113 1 }
114
115 INT8U CommGetTxChar (INT8U *err) reentrant
116 {
C51 COMPILER V7.50 COMMRTOS 11/21/2006 00:19:41 PAGE 3
117 1 INT8U c;
118 1 COMM_RING_BUF *pbuf;
119 1 pbuf=&CommBuf;
120 1
121 1 if (pbuf->RingBufTxCtr > 0) { /* See if buffer is empty */
122 2 pbuf->RingBufTxCtr--; /* No, decrement character count */
123 2 c = *pbuf->RingBufTxOutPtr++; /* Get character from buffer */
124 2 if (pbuf->RingBufTxOutPtr == &pbuf->RingBufTx[COMM_TX_BUF_SIZE]) { /* Wrap OUT pointer */
125 3 pbuf->RingBufTxOutPtr = &pbuf->RingBufTx[0];
126 3 }
127 2 OSSemPost(pbuf->RingBufTxSem); /* Indicate that character will be sent */
128 2 *err = COMM_NO_ERR;
129 2 return (c); /* Characters are still available */
130 2 } else {
131 2 *err = COMM_TX_EMPTY;
132 2 return (NUL); /* Buffer is empty */
133 2 }
134 1 }
135
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 1530 ----
CONSTANT SIZE = ---- ----
XDATA SIZE = 151 ----
PDATA SIZE = ---- ----
DATA SIZE = ---- ----
IDATA SIZE = ---- ----
BIT SIZE = ---- ----
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -