栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

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

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

【百问网】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; ipr == 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 

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

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

半主机模式

半主机模式( 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

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/968214.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号