项目需求:
功能1:程序不断获取激光雷达数据(一个浮点型的大小为360的数组)
功能2:将获取到的雷达距离数据存放到一个环形缓冲区,该缓冲区为二维浮点数组
1. 定义二维浮点缓冲区相关变量
/* 激光雷达相关全局变量 */
#define dataLen 360
#define dataNum 10
float_t rplidar_ranges[dataNum][dataLen]; // 激光雷达数据缓冲区
float_t *rplidar_front = rplidar_ranges[0]; // 数据缓冲区头指针
float_t *rplidar_tail = rplidar_ranges[0]; // 数据缓冲区尾指针
定义 rplidar_ranges 二维数组,保存10组数据,每组360个数据
定义 rplidar_front 指针,指向二维数组中的第一个数组,代表存入数据指针
定义 rplidar_tail 指针,指向二维数组中的第一个数组,代表取出数据指针
2. 溢出检测
如果存入数据指针已经等于rplidar_ranges[dataNum - 1],则将存入数据指针赋值为rplidar_ranges[0]
如果不是,则存入数据指针正常后移一个一维数组的长度
/* 缓冲区溢出检测 */
if(rplidar_front == rplidar_ranges[dataNum - 1])
rplidar_front = rplidar_ranges[0];
else
rplidar_front += dataLen;
PS:而在一维数组中则对应使用以下方法
front = (front + 1) % num
3. 检测缓冲区是否已满
如果缓冲区已满,则不继续放入数据,直到有空数组才放入
这里采取牺牲一个存储空间的方式实现,即 front + 1 是否等于 tail
// 溢出检测
#define front_out_check() (rplidar_front == rplidar_ranges[9] ? rplidar_ranges[0] : rplidar_front + 360)
// 缓冲区是否已满
#define full_check() (front_out_check() == rplidar_tail)
if(full_check())
printf("缓冲区已满!!!\n");
这里由于使用的是指针,所以不能采用取余数的方式进行溢出检测,所以我采用宏定义的方式,先进行溢出检测得到 “front” 后移后的值,然后再与 “tail” 进行比较
PS: 如果是一维数组,定义的 front 和 tail 是整型变量,可以直接使用
if((front + 1) % num == tail) 实现