环形缓冲区
概念上的环形缓冲区:一个线性的、无起始地址也无结束地址的环形内存。
程序上的环形缓冲区:在一片线性的、有起始地址也有结束地址的内存申请一块空间当作环形缓冲区。
环形缓冲区的基本操作:
- 申请内存空间。
- 读数据、写数据。
申请内存空间时要确定申请的大小和类型。
//环形缓冲区的结构体类型
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模块驱动步骤:
- 初始化UART;
- 封装发送命令/数据函数
- 解析命令返回/网络数据
训练营导航:www.100ask.net