既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上物联网嵌入式知识点,真正体系化!
由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、电子书籍、讲解视频,并且后续会持续更新
// Check that the buffer size is a power of two.
if (!IS_POWER_OF_TWO(buf_size))
{
return 0;
}
p_fifo->p_buf = p_buf;
p_fifo->buf_size_mask = buf_size - 1;
p_fifo->read_pos = 0;
p_fifo->write_pos = 0;
return 1;
}
uint32_t cola_fifo_put(cola_fifo_t * p_fifo, uint8_t byte)
{
if (FIFO_LENGTH() <= p_fifo->buf_size_mask)
{
fifo_put(p_fifo, byte);
return 1;
}
return 0;
}
uint32_t cola_fifo_get(cola_fifo_t * p_fifo, uint8_t * p_byte)
{
if (FIFO_LENGTH() != 0)
{
fifo_get(p_fifo, p_byte);
return 1;
}
return 0;
}
uint32_t cola_fifo_peek(cola_fifo_t * p_fifo, uint16_t index, uint8_t * p_byte)
{
if (FIFO_LENGTH() > index)
{
fifo_peek(p_fifo, index, p_byte);
return 1;
}
return 0;
}
uint32_t cola_fifo_flush(cola_fifo_t * p_fifo)
{
p_fifo->read_pos = p_fifo->write_pos;
return 1;
}
uint32_t cola_fifo_read(cola_fifo_t * p_fifo, uint8_t * p_byte_array, uint32_t p_size)
{
//VERIFY_PARAM_NOT_NULL(p_fifo);
//VERIFY_PARAM_NOT_NULL(p_size);
if(p_fifo == NULL)
{
return 0;
}
if(p_size == 0)
{
return 0;
}
const uint32_t byte_count = fifo_length(p_fifo);
const uint32_t requested_len = (p_size);
uint32_t index = 0;
uint32_t read_size = MIN(requested_len, byte_count);
(p_size) = byte_count;
// Check if the FIFO is empty.
if (byte_count == 0)
{
return 0;
}
// Check if application has requested only the size.
if (p_byte_array == NULL)
{
return 0;
}
// Fetch bytes from the FIFO.
while (index < read_size)
{
fifo_get(p_fifo, &p_byte_array[index++]);
}
(p_size) = read_size;
return p_size;
}
uint32_t cola_fifo_write(cola_fifo_t * p_fifo, uint8_t const * p_byte_array, uint32_t p_size)
{
//VERIFY_PARAM_NOT_NULL(p_fifo);
//VERIFY_PARAM_NOT_NULL(p_size);
if(p_fifo == NULL)
{
return 0;
}
if(p_size == 0)
{
return 0;
}
const uint32_t available_count = p_fifo->buf_size_mask - fifo_length(p_fifo) + 1;
const uint32_t requested_len = (p_size);
uint32_t index = 0;
uint32_t write_size = MIN(requested_len, available_count);
(p_size) = available_count;
// Check if the FIFO is FULL.
if (available_count == 0)
{
return 0;
}
// Check if application has requested only the size.
if (p_byte_array == NULL)
{
return 0;
}
//Fetch bytes from the FIFO.
while (index < write_size)
{
fifo_put(p_fifo, p_byte_array[index++]);
}
(p_size) = write_size;
return p_size;
}
**三、引申**
环形串口缓冲器的缺点是同一块buffer中只能有一个缓冲器工作,如果当前申请的缓冲区没有在使用那么也会占用内存,因此在这将缓冲器的设计思想做一下引申,一个可以同时多个缓冲器共用同一个buffer的例子。
![img](https://img-blog.csdnimg.cn/img_convert/93794e216edbfee4683169aeb137dc14.png)
![img](https://img-blog.csdnimg.cn/img_convert/c13b0f77380e50dc079ce2c94b8da39a.png)
**既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上物联网嵌入式知识点,真正体系化!**
**由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、电子书籍、讲解视频,并且后续会持续更新**
**[如果你需要这些资料,可以戳这里获取](https://bbs.csdn.net/topics/618679757)**
,涵盖了95%以上物联网嵌入式知识点,真正体系化!**
**由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、电子书籍、讲解视频,并且后续会持续更新**
**[如果你需要这些资料,可以戳这里获取](https://bbs.csdn.net/topics/618679757)**