一、说明
本文为作者在阅读atbf源码的过程中,对atbf中imu数据的读取和处理方式的个人理解,可能存在不对之处,意在抛砖引玉,请各位老师多多指正;
二、数据读取流程图
1、target
NEUTRONRCF435SE
不同的target所定义的一些功能稍有不同,比如是否使用外部中断,是否使用dma等
2、imu型号
icm42688
与target同理,不同的imu的型号也会有不同的处理方式,所以这里说明指定的型号;
3、imu读取流程图
三、存在的疑问
(1)后台程序是否知道imu数据被更新?
推断:否
由于dataReady的这个标志位没有程序在check,所以后台程序并不知道imu数据被更新;
(2)后台程序是否每次在imu触发中断之后获取imu数据?
推断:否
下面是mpuGyroReadSPI函数的部分截图,也是每次后台任务调度器最终调取imu read函数,这个函数只是从内存拷贝了imu的原始数据;
而调度器调用imu read与imu触发中断完全是异步的;
(3)每次pid循环过程中,是否获取最新的imu数据;
推断:是
虽然中断和read是异步,但是内存中时刻存放的都是最新的imu数据;
每次任务调度器需要运行pid时,就去内存中捞取imu数据;
而捞取到的imu数据的时间戳,就是距离运行pid时间最近的一次时间戳,从而保证了控制的实时性;
(4)如何实现imu数据的内存保护?
补充:imu数据的内存一方面被dma填充新的数据,另一方面又会被imu read函数去读取数据;
那么如何保证一方在操作同一块内存地址时完成之前,被另一方打断呢?