硬汉嵌入式论坛

 找回密码
 立即注册
查看: 3122|回复: 4
收起左侧

[有问必答] 咨询下V5开发板的串口FIFO例程

[复制链接]

62

主题

77

回帖

263

积分

高级会员

积分
263
发表于 2018-3-2 10:28:59 | 显示全部楼层 |阅读模式
  1.   while (1)
  2.                 {
  3.                         uint16_t usCount;

  4.                         DISABLE_INT();
  5.                         usCount = _pUart->usTxCount;
  6.                         ENABLE_INT();

  7.                         if (usCount < _pUart->usTxBufSize)
  8.                         {
  9.                                 break;
  10.                         }
  11.                 }                       
复制代码
记得V4开发板代码还有注释有BUG,V5代码没改呀。
1519957645339.jpg

回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117586
QQ
发表于 2018-3-2 10:34:44 | 显示全部楼层
这个不用管,只要你发的数据没有超过FIFO大小,就不会卡在里面。
回复

使用道具 举报

62

主题

77

回帖

263

积分

高级会员

积分
263
 楼主| 发表于 2018-3-2 14:43:23 | 显示全部楼层
eric2013 发表于 2018-3-2 10:34
这个不用管,只要你发的数据没有超过FIFO大小,就不会卡在里面。

好的
回复

使用道具 举报

57

主题

909

回帖

1080

积分

至尊会员

积分
1080
发表于 2018-3-3 18:00:44 | 显示全部楼层


















/*
************linux2.4里面提取精简测试过的fifo模块********************************************************
*
*
*                         (c) Copyright 2007-2020; , Inc.; , FL
*
*               All rights reserved.  Protected by international copyright laws.
*               Knowledge of the source code may NOT be used to develop a similar product.
*               Please help us continue to provide the Embedded community with the finest
*               software available.  Your honesty is greatly appreciated.
*********************************************************************************************************
*/

/*
*********************************************************************************************************
*                                        includes
* Description :
* Note(s)     :
*********************************************************************************************************
*/

#include <kfifo.h>




int __kfifo_init(struct __kfifo *fifo, void *buffer, unsigned int size)
{
    fifo->in = 0;
    fifo->out = 0;
    fifo->mask = 0;
    fifo->data = buffer;

    if (size < 2) {
        return -1;
    }

    if ((size & (size-1)) != 0)
    {
        return -2;            /*** Must be a power of 2 (2,4,8,16,32,64,128,256,512,...) ***/
    }

    fifo->mask = size - 1;

    return 0;
}





unsigned int __kfifo_push_char(struct __kfifo *fifo,  const char *p)
{

    if(( ( fifo->in - fifo->out ) & ( ~fifo->mask ) ) == 0 )
    {
        *( (char*)fifo->data + (fifo->in++ & fifo->mask) ) = *p;

        return 1;
    }

    return 0;
}





unsigned int __kfifo_pop_char(struct __kfifo *fifo, char* p )
{
    if( fifo->in != fifo->out )
    {
        *p =  *(  (char*)fifo->data + (fifo->out++ &  fifo->mask) ) ;

        return 1;
    }

    return 0;
}















/*
*********************************************************************************************************
*
*
*                         (c) Copyright 2007-2020; , Inc.; , FL
*
*               All rights reserved.  Protected by international copyright laws.
*               Knowledge of the source code may NOT be used to develop a similar product.
*               Please help us continue to provide the Embedded community with the finest
*               software available.  Your honesty is greatly appreciated.
*********************************************************************************************************
*/

#ifndef  KFIFO_PRESENT                                    /* See Note #1.                                         */
#define  KFIFO_PRESENT


#ifdef    KFIFO_MODULE
#define   KFIFO_EXT
#else
#define   KFIFO_EXT  extern
#endif

#ifdef __cplusplus
extern "C"
{
#endif

#include <cpu.h>
//typedef  unsigned  short       CPU_INT16U;                      /* 16-bit unsigned integer                              */


/*
in out

必须为有符号数,

push() 中的这句         fifo->in 否则到了0xffff后,变为0x0000,再也不会增加
if(( ( fifo->in - fifo->out ) & ~fifo->mask ) == 0 )

*/
struct __kfifo {
    int                in;
    int                out;
    int                mask;
    void        *data;
};


#if defined ( __ICCARM__ )
#pragma inline
KFIFO_EXT          CPU_INT16U  kfifo_unused(struct __kfifo *fifo)
#else
KFIFO_EXT __inline CPU_INT16U  kfifo_unused(struct __kfifo *fifo)
#endif
{
    return (fifo->mask + 1) - (fifo->in - fifo->out);
}




KFIFO_EXT int __kfifo_init(struct __kfifo *fifo, void *buffer, unsigned int size);


KFIFO_EXT unsigned int __kfifo_push_char(struct __kfifo *fifo, const char *p);
KFIFO_EXT unsigned int __kfifo_pop_char(struct __kfifo *fifo, char *p );



#ifdef __cplusplus
}
#endif





/*
*********************************************************************************************************
*                                              PRESENT END
*
* Note(s) : See 'PRESENT  Note #1'.
*********************************************************************************************************
*/

#endif


回复

使用道具 举报

57

主题

909

回帖

1080

积分

至尊会员

积分
1080
发表于 2018-3-3 18:03:28 | 显示全部楼层
希望对硬汉有帮助。 用linux成熟的东东替换。
另外看到用dwt实现us延时。   看硬汉能不能搞一个经过严格测试的delay模块。支持裸奔和rtos ms us,不同主频的配置。  
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2025-8-17 06:46 , Processed in 0.043631 second(s), 27 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表