这个项目的mian函数的整体结构是初始化+while循环结构的,不知道中断是轮询还是中断子涵那种呢?下面来看下while循环部分吧:
while (1)
{
#ifndef IMU_SW // 没有定义宏就执行
#ifdef DEBUG_NEW_CTRL_PRD
if(anyCnt>=7) //这是计数指针吧?
#else
if(anyCnt>=5) //看注释好像是计时还有采集姿态角数据用的。
#endif
{
anyCnt=0;
realExecPrd[0]=micros()-startTime[0];
startTime[0]=micros();
DMP_Routing(); //DMP 运行程序
DMP_getYawPitchRoll(); //运行dmp后会有结果输出吧,获得这个值吧?
execTime[0]=micros()-startTime[0]; //测量任务执行时间,CPU占用率
}
#endif
//100Hz Loop
//Crazepony默认使用100Hz的控制频率
if(loop100HzCnt>=10) //每个循环10赫兹吧?
{
loop100HzCnt=0;
realExecPrd[1]=micros()-startTime[1]; //记录起始时间用
startTime[1]=micros();
#ifdef IMU_SW
IMUSO3Thread(); //有软件算和硬解算区分吗?
#else
IMU_Process();
#endif
accUpdated=1;
//气压读取
#ifndef FBM320
MS5611_ThreadNew(); //气压传感器的读取,程序中似乎没有定义啊
#else
if(okFbm320)
{
updateFBM320();
}
#endif
//imu校准
if(imuCaliFlag) //每周期还要校准啊?eeprom是记录请求用的?
{
if(IMU_Calibrate())
{
imuCaliFlag=0;
gParamsSaveEEPROMRequset=1; //请求记录到EEPROM
imu.caliPass=1;
}
}
CtrlAttiRate(); //点进去看到pid,应该是pid控制姿态用的
CtrlMotor();//看名字应该控制马达的吧,点进去看看,对头
execTime[1]=micros()-startTime[1];
}
//Need to recieve 2401 RC instantly so as to clear reg.
Nrf_Irq();//中断是轮询方式查询的啊
//50Hz Loop
if(loop50HzFlag)//50hz的循环干嘛用的?
{
loop50HzFlag=0; //刚开始还是计时间啊!
realExecPrd[3]=micros()-startTime[3];
startTime[3]=micros();
RCDataProcess(); //点进去看下注释是处理遥控器数据的
FlightModeFSMSimple(); // 点进去看注释是飞行与着陆模式转换用的
if(altCtrlMode==LANDING) //看名字是自动着陆
{
AutoLand();
}
//高度融合 是做什么呢?
AltitudeCombineThread();
CtrlAlti();//名字是控制高度
CtrlAttiAng();//看名字是控制角度
//PC Monitor
#ifndef UART_DEBUG
if(btSrc!=SRC_APP) {
//CommPCUploadHandle(); //tobe improved inside
}
#endif
execTime[3]=micros()-startTime[3];
}
//10Hz loop
if(loop10HzFlag) //10hz循环里面做了什么
{
loop10HzFlag=0;
realExecPrd[2]=micros()-startTime[2];
startTime[2]=micros();
//Check battery every BAT_CHK_PRD ms
if((++batCnt) * 100 >=BAT_CHK_PRD)
{
batCnt=0;
BatteryCheck(); //电池检测,在这呢,看看里咋监测的,硬件还是软件?好像是根据ad采样判断的
}
//手机APP有请求飞控信息,则发送给手机APP
if(flyLogApp)
{
CommAppUpload();//看注释是飞机要发送给app一些参数
flyLogApp=0;
}
//EEPROM Conifg Table request to write.
if(gParamsSaveEEPROMRequset)//eeprom配置表干啥用的?
{
gParamsSaveEEPROMRequset=0;
SaveParamsToEEPROM();//保存参数到eeprom的配置表里面
}
//失控保护,例如侧翻,丢失遥控信号等
FailSafe();
//处理LED闪烁事件
LEDFSM();
execTime[2]=micros()-startTime[2];
}
//pc cmd process. need to return as quickly as ps
#ifndef UART_DEBUG
if(pcCmdFlag)
{
pcCmdFlag=0;
CommPCProcessCmd(); //pc机处理函数,还有地面站的?怎么通信的啊?
}
#endif