[NXP ARM] LPC2300串口驱动程序 是不是有点问题?

[复制链接]
3605|6
 楼主| 精益求精 发表于 2009-10-14 13:41 | 显示全部楼层 |阅读模式
数组定义是这样的:INT8U   RingBufTx[COMM_TX_BUF_SIZE];
if (pbuf->RingBufTxOutPtr == &pbuf->RingBufTx[COMM_TX_BUF_SIZE])

数组是不是操作超界了?
不知道实际应用中有没有问题?
谢谢。。。
华荣汇FAE3 发表于 2009-10-14 17:04 | 显示全部楼层
能有更详细的相关代码吗?这样看不出什么问题。
 楼主| 精益求精 发表于 2009-10-15 10:31 | 显示全部楼层
/*
*********************************************************************************************************
* Filename   : COMM_FW.C
* Programmer :
* 描述:      串行口通信程序
* DATE:        2007.11.18
****************************************************************************************
*/
#define COMM_GLOBALS
#include "..\includes\includes.H"
DEFINE_THIS_MODULE(COMM_FK)

typedef struct {
    INT16U  RingBufRxCtr;                  
    INT8U  *RingBufRxInPtr;                 
    INT8U  *RingBufRxOutPtr;               
    INT8U   RingBufRx[COMM_RX_BUF_SIZE];   
    INT16U  RingBufTxCtr;                  
    INT8U  *RingBufTxInPtr;                 
    INT8U  *RingBufTxOutPtr;               
    INT8U   RingBufTx[COMM_TX_BUF_SIZE];   
} COMM_RING_BUF;

/*
*********************************************************************************************************
*                                            GLOBAL VARIABLES
*********************************************************************************************************
*/

COMM_RING_BUF  Comm1Buf;
COMM_RING_BUF  Comm2Buf;
COMM_RING_BUF  Comm3Buf;
COMM_RING_BUF  Comm4Buf;

void  CommInit (void)
{
    COMM_RING_BUF *pbuf;

    pbuf                  = &Comm1Buf;                     
    pbuf->RingBufRxCtr    = 0;
    pbuf->RingBufRxInPtr  = &pbuf->RingBufRx[0];
    pbuf->RingBufRxOutPtr = &pbuf->RingBufRx[0];
    pbuf->RingBufTxCtr    = 0;
    pbuf->RingBufTxInPtr  = &pbuf->RingBufTx[0];
    pbuf->RingBufTxOutPtr = &pbuf->RingBufTx[0];

    pbuf                  = &Comm2Buf;                     
    pbuf->RingBufRxCtr    = 0;
    pbuf->RingBufRxInPtr  = &pbuf->RingBufRx[0];
    pbuf->RingBufRxOutPtr = &pbuf->RingBufRx[0];
    pbuf->RingBufTxCtr    = 0;
    pbuf->RingBufTxInPtr  = &pbuf->RingBufTx[0];
    pbuf->RingBufTxOutPtr = &pbuf->RingBufTx[0];
   
    pbuf                  = &Comm3Buf;                     
    pbuf->RingBufRxCtr    = 0;
    pbuf->RingBufRxInPtr  = &pbuf->RingBufRx[0];
    pbuf->RingBufRxOutPtr = &pbuf->RingBufRx[0];
    pbuf->RingBufTxCtr    = 0;
    pbuf->RingBufTxInPtr  = &pbuf->RingBufTx[0];
    pbuf->RingBufTxOutPtr = &pbuf->RingBufTx[0];

    pbuf                  = &Comm4Buf;                     
    pbuf->RingBufRxCtr    = 0;
    pbuf->RingBufRxInPtr  = &pbuf->RingBufRx[0];
    pbuf->RingBufRxOutPtr = &pbuf->RingBufRx[0];
    pbuf->RingBufTxCtr    = 0;
    pbuf->RingBufTxInPtr  = &pbuf->RingBufTx[0];
    pbuf->RingBufTxOutPtr = &pbuf->RingBufTx[0];
}
/*
*********************************************************************************************************
清接收缓冲区
********************************************************************************************************
*/
void CommClrRxBuf(INT8U ch)
{
        INT8U err;
    if(!CommIsRxEmpty(ch)){           //如果接收缓冲区不空
        while(!CommIsRxEmpty(ch)){
             CommGetRxChar(ch,&err);
        }
    }
}

/*
*********************************************************************************************************
*中断中发送数据调用,从TX缓冲区取数
********************************************************************************************************
*/

INT8U  CommGetTxChar (INT8U ch, INT8U *err)
{
    INT8U          c;
    COMM_RING_BUF *pbuf;


    switch (ch) {                                         
        case COMM1:
             pbuf = &Comm1Buf;
             break;
        case COMM2:
             pbuf = &Comm2Buf;
             break;
        case COMM3:
             pbuf = &Comm3Buf;
             break;
        case COMM4:
             pbuf = &Comm4Buf;
             break;
        default:
             *err = COMM_BAD_CH;
             return (NUL);
    }
    if (pbuf->RingBufTxCtr > 0) {                          
        pbuf->RingBufTxCtr--;                              
        c = *pbuf->RingBufTxOutPtr++;                     
        if (pbuf->RingBufTxOutPtr == &pbuf->RingBufTx[COMM_TX_BUF_SIZE]) {     
            pbuf->RingBufTxOutPtr = &pbuf->RingBufTx[0];
        }
        *err = COMM_NO_ERR;
        return (c);                                       
    } else {
        *err = COMM_TX_EMPTY;
        return (NUL);                                    
    }
}
 楼主| 精益求精 发表于 2009-10-15 10:33 | 显示全部楼层
华荣汇MCU发表于 2009-8-5 14:38 | 只看该作者 回复 引用 订阅 报告 收藏 分享 评分楼主: [NXP ARM] LPC2300串口驱动程序LPC, 程序, 驱动LPC2300串口驱动程序
LPC2300串口驱动程序.pdf (102.75 KB)
下载次数:72

2009-8-5 14:38



本主题由 华荣汇MCU 于 2009-8-24 16:47 解除精华
开源共享 发表于 2009-10-15 14:42 | 显示全部楼层
实际应用没有问题
 楼主| 精益求精 发表于 2009-10-15 15:25 | 显示全部楼层
if (pbuf->RingBufTxOutPtr == &pbuf->RingBufTx[COMM_TX_BUF_SIZE])

上面的操作不报错?
请解释一下原因?
谢谢。。
开源共享 发表于 2009-10-16 09:00 | 显示全部楼层
pbuf->RingBufTxOutPtr ++
if (pbuf->RingBufTxOutPtr == &pbuf->RingBufTx[COMM_TX_BUF_SIZE])
上面的if语句如果成立,说明pbuf->RingBufTxOutPtr ++出界了,则有
    pbuf->RingBufTxOutPtr = &pbuf->RingBufTx[0];
指针回到头指针,也就是指针移出界外,是为判断,但没有引用当前指针指向的内容,
所以没有问题。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

19

主题

364

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部