【百问网】7天物联网智能家居实战 Day3

环形缓冲区

概念上的环形缓冲区:一个线性的、无起始地址也无结束地址的环形内存。

程序上的环形缓冲区:在一片线性的、有起始地址也有结束地址的内存申请一块空间当作环形缓冲区。

环形缓冲区的基本操作:

  1. 申请内存空间。
  2. 读数据、写数据。

申请内存空间时要确定申请的大小和类型。

//环形缓冲区的结构体类型
typedef struct{
    uint8_t     *fifo;
    uint16_t    pw;
    uint16_t    pr;
    uint16_t    buf_size;
}RingBuffer, *ptRingBuffer;

//环形缓冲区的初始化函数
int Driver_Buffer_Init(ptRingBuffer buffer, uint16_t size)
{
    if(buffer == NULL || size == 0)
        return -1;
    if(buffer->fifo == NULL)
    {
        buffer->fifo = (uint8_t*)malloc(size);
    }
    buffer->pw = buffer->pr = 0;
    buffer->buf_size = size;
    
    return 0;
}

读数据、写数据,都要判断缓冲区是否为空或缓冲区是否写满。

防止读写操作指针越界,需要对读写指针地址与缓冲区大小取模。

//写函数
int Driver_Buffer_Write(ptRingBuffer buffer, const uint8_t data)
{
    int i = (buffer->pw + 1) % buffer->buf_size;
    if(i != buffer->pr)    // 环形缓冲区没有写满
    {
        buffer->fifo[buffer->pw] = data;
        buffer->pw = i;
        return 0;
    }
    
    return 1;
}

int Driver_Buffer_WriteBytes(ptRingBuffer buffer, const uint8_t *data_stream, uint16_t len)
{
    int i = 0;
    for(i=0; i<len; i++)
    {
        if(Driver_Buffer_Write(buffer, data_stream[i]) != 0)    break;
    }
    
    return i;
}

//读函数

int Driver_Buffer_Read(ptRingBuffer buffer, uint8_t *data)
{
    if(buffer->pr == buffer->pw)
    {
        return 1;
    }
    else
    {
        *data = buffer->fifo[buffer->pr];
        buffer->pr = (buffer->pr + 1) % buffer->buf_size;
        return 0;
    }
}


int Driver_Buffer_ReadBytes(ptRingBuffer buffer, uint8_t *data_stream, uint16_t len)
{
    int i = 0;
    for(i=0; i<len; i++)
    {
        if(Driver_Buffer_Read(buffer, &data_stream[i]) != 0)    break;
    }
    
    return i;
}

判断缓冲区是否为空,只需要判断读写指针地址是否相同。若相同,则缓冲区为空。

判断缓冲区是否写满,需要将写指针自加一后,与缓冲区大小取模。在判断是否与读指针地址是否相同。若相同,则缓冲区已经写满。若缓冲区已经写满,则丢弃最后写入的数据。

半主机模式

半主机模式( Semihosting ):半主机模式是ARM标准提出的一个概念,用于ARM处理器或模拟器与PC主机进行输入输出通讯的一种机制。

当ARM处理器(Target)使用C库的printf()或scanf()函数时,会调用C库的SVC触发一个异常,然后由主机里的一个debugger调试器处理,与Host主机建立一个通信连接,将目标机要输出的信息打印出来。

所谓半主机的意思是,Target目标机是与Host主机直接相连的,而不是连一个键盘或屏幕。

这样一个模式机制是一系列指令的集合,半主机模式下调用一个printf或scanf或其他的接口时,最终调用的是C库的一些代码。

Microlib微库

microlib是一个很小很轻量的C库,但是注意,代码如果使用操作系统,microlib中有些函数无法良好的运行,因此在使用操作系统时,调用microlib中的函数需要小心。如果使用microlib就不需要重新定义_stdin,_stdout等函数,在microlib中已完成定义,只需要重新实现fputc,fgetc函数即可。

WIFI模块驱动步骤:

  1. 初始化UART;
  2. 封装发送命令/数据函数
  3. 解析命令返回/网络数据 

训练营导航:www.100ask.net

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值