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

📄 commrtos.lst

📁 《uC/os-II 内核分析.移植与驱动程序开发》随书光盘中的全部源代码
💻 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 + -