这里先学习第8个任务sensorsTask,2,3,6,7任务后面再学,先学重要的。
xTaskCreate(sensorsTask, "SENSORS", 450, NULL, 4, NULL); //传感器处理任务
看一下上面用到的sensors变量的定义: 任务的流程: 先初始化I2C,初始化传感器----->进入循环,等待传感器中断发送二值信号量------>得到信号量后读取传感器数据到buffer数组中---->处理buffer数据得到加速度,陀螺仪,磁力,气压等,然后把它们各自入到自己的队列中。
初始化传感器。创建了一个二值信号量sensorsDataReady,初始化全局变量gyroBiasRunning,初始化全部传感器,初始化PA4为引脚中断EXTI4。当传感器数据准备好时,会产生中断。中断中释放二值信号量。在任务循环中获取二值信号量,然后读取传感器。 (二值信号量与互斥信号量的区别参考: https://www.cnblogs.com/yangguang-it/p/7215858.html)
结构体的名字 Axis3f—表示3轴,每轴的数据是f型,即表示3个f型数据 Axis3i16----表示3轴,3个int16数据
参数是宏 相当于i2cdevInit( &sensorsBus ),变量sensorsBus被定义为I2cDrv类型,看上面typedef,与I2C_Dev 等同 再来看一下I2cDrv是什么类型 这里定义有点复杂: 定义一个I2C结构体变量sensorsBusDef,并对它赋初值----->该变量的地址赋给了结构体变量sensorsBus的def元素------>再把sensorsBus的地址赋给宏I2C1_DEV。所以当I2C1_DEV传递给型参dev时,dev–>def 即是I2C结构体变量sensorsBusDef。 所以i2cdevInit(I2C1_DEV);只是把I2C1的引脚初始化,并初始化DMA和创建了一个二值信号量和一个互斥信号量。