[ { "node_id": "Function:ZKCtrlCmdInit", "name": "ZKCtrlCmdInit", "summary": "`ZKCtrlCmdInit`函数旨在初始化航天器姿态控制系统的关键参数,确保系统在启动时处于一个已知且安全的状态。该过程首先通过将变量`i`设为0x00,并将指针`tmpAtt`, `pCmdDsp`, 和`pMt`初始化为NULL开始。接着,`tmpAtt`被设置指向位于`ATTCLT_DATA1_ADDR`地址处的`sAttPriData`实例;如果此时`tmpAtt`为空,则立即返回,终止函数执行。随后,利用`tmpAtt`获取到`AttCmdDsp_t`类型的`pCmdDsp`和`MtPara_t`类型的`pMt`指针。对于飞轮控制部分,此函数清零了力矩命令(`WheelD_MomOfForce_Cmd`)与转速命令(`WheelD_RotatSpd_Cmd`),并通过调用`memset`函数来初始化`Wheel_TwcCmd`、`Wheel_LJCmd`以及`Whl_Torque`数组至全零状态。此外,针对每个磁力矩器(循环范围从0到`MT_NUM-1`),将其开关状态设置为关闭(`MTOnOff[i] = MT_OFF`),控制输出初始值置为0.0 (`MTCtrlOutP0[i] = 0.0`),同时指定其方向为正向(`MTDirect[i] = MT_DIRECT_POS`)。此函数不接受任何输入参数,也没有返回值。它依赖于`memset`函数来完成某些内存区域的清零工作,并作为`ZKCmdDspAct`函数的一部分被调用。此外,为了正确编译和运行,本函数需要引用来自`\\PrjCommon\\CommonDef.h`, `\\PrjCommon\\DevDefine.h`, `\\PrjTelCtrlMng\\TelCtrlMng.h`, `AttMath.h`, 和`AttCtrlMain.h`头文件中的定义。", "file": "M:/研二上/静态分析问题单过滤/gs-zk和扫描结果/PrjAttCtrlMng\\AttCmdAct.c", "calls": [ "memset" ], "called_by": [ "ZKCmdDspAct" ] }, { "node_id": "Function:ZKPPUCmdDsp", "name": "ZKPPUCmdDsp", "summary": "该函数`ZKPPUCmdDsp`主要负责在轨道控制期间根据当前时间和电推进状态来决定是否关闭PPU。首先,它初始化了几个关键变量,包括用于发送PPU关闭命令的数组`PPUOff`、存储卫星时间的数组`SatTime`以及一个命令数据缓冲区`cmdDataBuff`。接着定义并初始化了一系列指向不同结构体的指针,这些结构体包含了姿态控制所需的数据,并从特定内存地址获取姿态控制相关的信息。如果任何必要的结构体为空,则函数立即返回。随后,通过这些指针进一步获取更多关于姿态控制的具体参数。之后,函数会获取当前的任务信息,并清空命令数据缓冲区,同时获取最新的卫星时间。接下来,判断当前的工作模式是否为轨道控制模式。如果电推进系统不可用,函数将设置一系列标志位和计数器,并向CAN总线发送关闭PPU的命令后退出。当轨道数据输入有效时,检查当前时间是否位于预定的轨道控制时间段内;若不在该时间段内,同样执行一系列操作以确保PPU被关闭,并更新相应的标志位。最后,再次确认轨道数据的有效性和工作模式,如果条件不满足则重复上述关闭PPU的操作。此过程涉及调用多个辅助函数如`dev_can_write`等来完成具体任务,并且与多个头文件中的定义相互关联,确保整个系统的协调运作。", "file": "M:/研二上/静态分析问题单过滤/gs-zk和扫描结果/PrjAttCtrlMng\\AttCmdAct.c", "calls": [ "dev_can_write", "DoSetInt32To8", "CheckBlockRing", "GetTime", "GetTaskInfoBT", "BlockRingAdd", "memset" ], "called_by": [ "ZKCmdDspAct" ] }, { "node_id": "Function:SetWheel", "name": "SetWheel", "summary": "该函数`SetWheel`主要用于根据给定的飞轮ID、命令类型及数值生成相应的飞轮控制命令,并通过串口发送出去(当满足特定条件时)。同时,它还会基于命令类型更新相关的遥测数据。首先,初始化一系列变量如`i`, `sum`, `tmpLen`, `WhlLen`, `tmpI`以及一个用于存储飞轮控制指令的数组`tmpWhl_order`。接着定义并初始化指向多个结构体的指针,包括`sAttPriData`, `AttCtrlConst_t`, `sAttDataPrePara_t`, `AttCmdDsp_t`, `sDevInfo`和`WhlPara_t`。从指定地址获取`sAttPriData`和`AttCtrlConst_t`实例,如果任一为`NULL`则直接返回。随后,获取指向`sAttDataPrePara_t`和`AttCmdDsp_t`结构体的指针,并通过`GETDEVINFO`函数获取与特定飞轮ID关联的设备信息。根据传入的`WheelId`设置`tmpWhl_order[0]`值。接下来,依据`CmdType`判断是转速、力矩还是电流指令,对于转速或符合条件的力矩/电流指令,将相应转换后的值填充到`tmpWhl_order`中,计算校验和并通过UART发送命令;若不满足条件,则仅更新飞轮状态而不发送命令。此外,对于力矩或转速类型的命令,还会更新遥测数据记录。此过程涉及对输入参数的有效性检查、命令包的构建、校验和计算、命令发送以及遥测数据的更新等关键步骤。该函数接受三个输入参数:`WheelId` (UINT8, 指示目标飞轮编号), `Value` (TYPE_CAL, 表示要设定的具体数值), 和 `CmdType` (UINT8, 定义了命令类型)。虽然没有明确指出返回值,但可以推断其主要通过修改全局状态来反映执行结果。在实现过程中,调用了诸如`UartWrite`, `ZERO_TO_ONE`, `DoSetInt16To8`, `POSE_ABSF`, `GETDEVINFO`, `DoSetFloatTo8`等辅助函数,并且被`ZKWhlCmdDsp`, `ZKWhlDCmdDsp`, `ActuatorCmdDsp`, `ZKCtrlReinitBK`, `ZKMiniPowerOn`等多个函数所调用。此外,该函数还引用了来自不同头文件如`\\PrjCommon\\CommonDef.h`, `\\PrjCommon\\DevDefine.h`, `\\PrjTelCtrlMng\\TelCtrlMng.h`, `AttMath.h`, `AttCtrlMain.h`中的定义和声明。", "file": "M:/研二上/静态分析问题单过滤/gs-zk和扫描结果/PrjAttCtrlMng\\AttCmdAct.c", "calls": [ "UartWrite", "ZERO_TO_ONE", "DoSetInt16To8", "POSE_ABSF", "GETDEVINFO", "DoSetFloatTo8" ], "called_by": [ "ZKWhlCmdDsp", "ZKWhlDCmdDsp", "ActuatorCmdDsp", "ZKCtrlReinitBK", "ZKMiniPowerOn" ] }, { "node_id": "Function:ZKWhlCmdDsp", "name": "ZKWhlCmdDsp", "summary": "该函数`ZKWhlCmdDsp`主要负责根据当前航天器姿态控制系统的工作模式及飞轮状态,计算并发送飞轮控制指令。首先初始化多个变量,包括飞轮分配矩阵`tmpCu`和`tmpCp`、控制指令数组`tmpTwc`等,并从指定地址获取指向`sAttPriData`结构体的指针`tmpAtt`和指向`AttCtrlConst_t`结构体的指针`tmpConst`。如果任一指针为空,则直接返回。接着检查当前工作模式是否为特定几种(如`ATTMOD_RATEDMP`),如果是则直接返回。随后初始化并更新`pREcheck->WhlUseState`以反映哪些飞轮可用,如果可用飞轮数量少于三个,则直接返回。基于`pREcheck->WhlUseState`的不同值,通过复制操作填充飞轮分配矩阵`tmpCu`,同时确定哪个飞轮不被使用(`UnUseWheelId`)。调用`InvsymMatrix3`函数计算逆矩阵`tmpCp`,如果矩阵不可逆则直接返回。利用`MatrixProductHL`函数基于`tmpCp`和`pCtl->WheelCtrlResult`计算飞轮控制指令`tmpTwc`,并对`tmpTwc`中的最大绝对值进行限幅处理,确保其不超过0.1。将处理后的`tmpTwc`复制到`pCmdDsp->Wheel_TwcCmd`中。如果有飞轮未被使用(`UnUseWheelId != 0`),则遍历所有飞轮(除了未使用的那个),根据其工作模式调整`tmpTwc`值,并调用`SetWheel`发送最终的飞轮控制指令。此函数无输入参数,也不返回任何值,但依赖于`InvsymMatrix3`, `SetWheel`, `memcpy`, `count_onebit`, `MatrixProductHL`, `POSE_ABSF`等函数完成其任务,并且由`ActuatorCmdDsp`函数调用。此外,它还与跨文件关联的函数(头文件)`\\PrjCommon\\CommonDef.h`, `\\PrjCommon\\DevDefine.h`, `\\PrjTelCtrlMng\\TelCtrlMng.h`, `AttMath.h`, `AttCtrlMain.h`有交互。", "file": "M:/研二上/静态分析问题单过滤/gs-zk和扫描结果/PrjAttCtrlMng\\AttCmdAct.c", "calls": [ "InvsymMatrix3", "SetWheel", "memcpy", "count_onebit", "MatrixProductHL", "POSE_ABSF" ], "called_by": [ "ActuatorCmdDsp" ] }, { "node_id": "Function:ZKWhlDCmdDsp", "name": "ZKWhlDCmdDsp", "summary": "该函数`ZKWhlDCmdDsp`主要用于航天器飞轮D的控制指令处理。首先,它初始化一系列变量和指针,包括设置整型变量`i`为0x00,定义并初始化数组`tmpT`和`tmpWhlM`以及浮点数`tmpWhlRate`为0.0,并将多个指针如`tmpAtt`, `tmpConst`, `pCmdDsp`, `pWhl`, `pData`, 和 `pREcheck`初始化为NULL。接着,通过将`tmpAtt`指向`ATTCLT_DATA1_ADDR`地址处的数据,`tmpConst`指向`ATTCLT_DATA2_ADDR`地址处的数据来获取必要的系统参数信息;如果这两个指针任一为空,则直接返回,结束函数执行。随后,使用一个循环从`tmpConst->AttCmdFlashPara.M_Wheel[i][3]`中读取数据填充`tmpWhlM`数组。之后,设置几个关键结构体指针:`pCmdDsp`指向`tmpAtt`中的`sCmdDspPara`,`pWhl`指向`tmpAtt`中的`sPerPara.WhlPara`,`pData`指向`tmpAtt`中的`sPerPara`,而`pREcheck`则指向`tmpAtt`中的`sErrCtlPara`。检查`pREcheck->WhlUseState`是否等于0x0f,如果不等则直接返回。接下来,判断飞轮D当前转速与标称转速之间的差值绝对值是否小于设定的误差阈值,若满足条件,则设置`pCmdDsp->WheelD_RotatSpd_Cmd`为`tmpConst->WheelD_NomSpeed`(即标称转速),并发送飞轮D转速指令;否则进入力矩指令计算流程,先设`pCmdDsp->WheelD_MomOfForce_Cmd`为默认值`tmpConst->WheelD_Default`,然后对于每个轴向(i=0,1,2)计算临时扭矩`tmpT[i]`,一旦其绝对值超过预设的最大允许值就重置`pCmdDsp->WheelD_MomOfForce_Cmd`为0并跳出循环。最后,基于当前转速、调整方向及力矩指令计算新的飞轮D转速命令值`pCmdDsp->WheelD_RotatSpd_Cmd`,并发送更新后的飞轮D转速指令。此函数无输入参数也无返回值,但被`SetWheel`和`POSE_ABSF`调用,并由`ActuatorCmdDsp`函数触发执行。此外,它还依赖于跨文件定义的一些类型和常量,这些定义位于..\\PrjCommon\\CommonDef.h, ..\\PrjCommon\\DevDefine.h, ..\\PrjTelCtrlMng\\TelCtrlMng.h, AttMath.h, AttCtrlMain.h头文件中。", "file": "M:/研二上/静态分析问题单过滤/gs-zk和扫描结果/PrjAttCtrlMng\\AttCmdAct.c", "calls": [ "SetWheel", "POSE_ABSF" ], "called_by": [ "ActuatorCmdDsp" ] }, { "node_id": "Function:ActuatorCmdDsp", "name": "ActuatorCmdDsp", "summary": "`ActuatorCmdDsp`函数主要负责根据当前航天器姿态控制模块的工作模式来调整飞轮的行为。首先,它初始化指针变量`tmpAtt`, `pMod`, `pWhl`, 和 `pCmdDsp`为NULL,并将`tmpAtt`指向`ATTCLT_DATA1_ADDR`地址处的数据;如果该地址为空,则直接返回。接着,通过`tmpAtt`初始化`pMod`、`pWhl`和`pCmdDsp`指针,分别指向模式参数、轮子参数以及命令显示参数。在定义了`MINMODULE_TYPE`的情况下,根据工作模式`WorkMode`执行不同的逻辑:如果工作模式是`ATTMOD_MagTOSUN`或`ATTMOD_RATEDMP`,则检查并递增`Wheel_Cmd_Cnt`计数器(上限60000),当`Wheel_Cmd_Cnt`小于等于3时,设置所有四个轮子的命令代码为`WHL_CMD_CODE_CURR`。若未定义`MINMODULE_TYPE`,同样基于`WorkMode`选择不同路径:对于多种特定的工作模式(如`ATTMOD_WhlTOSUN`, `ATTMOD_ONLTOEARTH`等),如果轮子使用次数`Whl_UseCnt`大于等于3,则调用`ZKWhlCmdDsp()`和`ZKWhlDCmdDsp()`函数;当工作模式为`ATTMOD_NOCOLL`且轮子使用次数达到条件时,仅调用`ZKWhlCmdDsp()`;对于`ATTMOD_RATEDMP`或`ATTMOD_MagTOSUN`模式,处理方式与之前相同。对于其他未列出的工作模式,不做任何操作。此函数没有输入参数,也不返回值,但会调用`ZKWhlCmdDsp`, `SetWheel`, 和 `ZKWhlDCmdDsp`函数,并被`ZKCmdDspAct`函数所调用。此外,该函数还涉及到跨文件关联的头文件,包括..\\PrjCommon\\CommonDef.h, ..\\PrjCommon\\DevDefine.h, ..\\PrjTelCtrlMng\\TelCtrlMng.h, AttMath.h, AttCtrlMain.h。", "file": "M:/研二上/静态分析问题单过滤/gs-zk和扫描结果/PrjAttCtrlMng\\AttCmdAct.c", "calls": [ "ZKWhlCmdDsp", "SetWheel", "ZKWhlDCmdDsp" ], "called_by": [ "ZKCmdDspAct" ] }, { "node_id": "Function:MTOcOutProc", "name": "MTOcOutProc", "summary": "该函数`MTOcOutProc`主要用于处理航天器姿态控制系统中的磁矩输入数据,通过一系列逻辑判断来调整输出参数,确保系统能够根据当前状态做出适当响应。首先初始化变量`i`为0,`tmpMagMoment`为0.0,并将特定内存地址的内容分别赋给指针`tmpAtt`和`tmpConst`,这两个指针指向的数据结构包含了执行后续操作所需的关键信息。如果任一指针为空,则立即退出函数以避免潜在错误。对于从0到`MT_NUM-1`范围内的每个索引`i`,函数会读取`MTIn[i]`的值并存储在`tmpMagMoment`中,随后基于`tmpMagMoment`与预设限制`tmpConst->MTOutXYZLimit[i]`之间的比较结果决定如何设置`MTOnOff[i]`(表示是否开启)、`MTDirect[i]`(指示方向)以及计算`MTOut[i]`的具体数值。当`tmpMagMoment`超出限制时,不仅会激活相关设备还会设定其工作模式;反之,在未超过阈值的情况下也会激活设备但采用不同的控制策略。此外,若计算出的`MTOut[i]`低于100.0,则认为没有必要继续运行相应组件而将其关闭。此过程涉及调用POSE_ABSF函数获取绝对值,并且整个流程由ZKMtCmdDsp函数触发,同时依赖于多个跨文件定义的数据类型和常量,这些定义位于..\\PrjCommon\\CommonDef.h, ..\\PrjCommon\\DevDefine.h, ..\\PrjTelCtrlMng\\TelCtrlMng.h, AttMath.h, AttCtrlMain.h等头文件中。", "file": "M:/研二上/静态分析问题单过滤/gs-zk和扫描结果/PrjAttCtrlMng\\AttCmdAct.c", "calls": [ "POSE_ABSF" ], "called_by": [ "ZKMtCmdDsp" ] }, { "node_id": "Function:ZKMtCmdDsp", "name": "ZKMtCmdDsp", "summary": "该函数`ZKMtCmdDsp`主要用于根据当前的姿态控制需求调整卫星上磁力矩器的工作状态。首先,它初始化一系列变量,包括计数器、通道号、方向标志、延迟时间、脉冲宽度等,并定义并初始化多个用于存储磁力矩器相关数据的数组和结构体指针。接着,从指定地址获取姿态主要数据和控制常量数据,并检查这些数据是否有效;如果无效则直接返回。随后,根据IMPT参数中的MT使用状态填充临时磁力矩控制器矩阵`tmpM_MAGCtrl`,并计算其转置矩阵`tmpM_MAGCtrlFP1`。利用这两个矩阵进一步计算得到中间矩阵`tmpM_MAGAA`,并对`tmpM_MAGAA`求逆得到`tmpM_MAGAANI`,同时检查该矩阵是否可逆;若不可逆,则函数提前结束。之后,通过`tmpM_MAGCtrlFP1`与`tmpM_MAGAANI`相乘的结果更新`tmpM_MAGCtrlFP`,再通过`tmpM_MAGCtrlFP`与当前磁控结果相乘来更新`tmpMTin`,并将`tmpMTin`的数据复制到`pCtrl->MagCtrlXYZZ`中。调用`MTOcOutProc`对磁力矩器输出进行限幅处理后,计算一个基于时间的计数值`tmpCNT`。如果`tmpCNT`落在特定范围内(即大于等于1且小于等于`tmpConst->MTCtrlTIME`),则根据每个磁力矩器的状态设置其对应的通道号、方向及脉冲宽度,并调用`magnetic_out`函数输出控制信号;否则,将所有磁力矩器的输出设为零。此过程涉及到了矩阵运算、条件判断以及对外部设备的具体操作。该函数无输入参数,也不返回任何值,但会调用如`MatrixTransposeHL`, `InvsymMatrix3`, `magnetic_out`, `MatrixProductHL`, `MTOcOutProc`, 和`memset`等函数,并被`ZKCmdDspAct`函数所调用。此外,它还依赖于来自`\\PrjCommon\\CommonDef.h`, `\\PrjCommon\\DevDefine.h`, `\\PrjTelCtrlMng\\TelCtrlMng.h`, `AttMath.h`, 和`AttCtrlMain.h`头文件中的定义或声明。", "file": "M:/研二上/静态分析问题单过滤/gs-zk和扫描结果/PrjAttCtrlMng\\AttCmdAct.c", "calls": [ "MatrixTransposeHL", "InvsymMatrix3", "magnetic_out", "MatrixProductHL", "MTOcOutProc", "memset" ], "called_by": [ "ZKCmdDspAct" ] }, { "node_id": "Function:ZKCmdDspAct", "name": "ZKCmdDspAct", "summary": "`ZKCmdDspAct`函数根据编译时是否定义了`MINMODULE_TYPE`宏来决定其执行路径。如果定义了`MINMODULE_TYPE`,则该函数首先通过调用`ZKCtrlCmdInit()`初始化控制命令,随后处理与磁力矩器相关的命令(`ZKMtCmdDsp()`),最后分配飞轮指令(`ActuatorCmdDsp()`)。反之,在未定义`MINMODULE_TYPE`的情况下,虽然同样以`ZKCtrlCmdInit()`开始初始化过程,但接下来的步骤顺序调整为先管理飞轮指令(`ActuatorCmdDsp()`),接着是磁力矩器的操作(`ZKMtCmdDsp()`),并最终处理与PPU相关的命令(`ZKPPUCmdDsp()`)。此函数的主要目的是确保航天器控制系统能够依据特定配置灵活地初始化和调度不同类型的执行器命令,从而支持更广泛的航天任务需求。它不接受任何输入参数,并且没有返回值。在程序结构中,`ZKCmdDspAct`被`ZKAction`函数调用,并依赖于几个关键函数如`ZKPPUCmdDsp`, `ActuatorCmdDsp`, `ZKCtrlCmdInit`, 和 `ZKMtCmdDsp`来完成其任务。此外,为了实现上述功能,该函数还引用了来自多个头文件如..\\PrjCommon\\CommonDef.h, ..\\PrjCommon\\DevDefine.h, ..\\PrjTelCtrlMng\\TelCtrlMng.h, AttMath.h, 以及AttCtrlMain.h中的定义或声明。", "file": "M:/研二上/静态分析问题单过滤/gs-zk和扫描结果/PrjAttCtrlMng\\AttCmdAct.c", "calls": [ "ZKPPUCmdDsp", "ActuatorCmdDsp", "ZKCtrlCmdInit", "ZKMtCmdDsp" ], "called_by": [ "ZKAction" ] }, { "node_id": "Function:ZKDptPowerOnPrc", "name": "ZKDptPowerOnPrc", "summary": "该函数`ZKDptPowerOnPrc`主要用于在卫星成功分离后,根据特定条件逐步激活一系列关键设备的电源供应,确保卫星姿态控制系统能够正常启动。首先初始化两个指针`tmpAtt`和`tmpTaskMngDataRcd`为NULL,随后将它们分别指向`ATTCLT_DATA1_ADDR`与`ST_TASKMNG_ADDR`地址处的数据。如果任一指针为空,则直接返回。接着检查硬件分离标志`bSHDepart`是否不等于0x55,若不等则设置软件分离标志`ZKPowOnFirst`为0x55,并重置计数器`WModCnt1`为0;反之,当`bSHDepart`等于0x55且计数器值小于或等于60000时,递增计数器。一旦满足卫星已分离、软件分离标志连续有效时间达到5秒以及从未分离状态变为分离状态这三个条件,便进入加电流程。此过程依据`ZKPowOnStep`的不同取值分阶段执行相应的加电操作,包括对星敏感器、陀螺仪、磁强计及飞轮等组件依次供电,并更新`ZKPowOnStep`以指示下一步动作。该函数无输入参数,也不返回任何值,但其运行依赖于`OCOut`函数提供的支持,并被`ZKCtrlReinitBK`与`ZKMiniPowerOn`调用。此外,它还涉及到跨文件引用,特别是`AttCtrlMain.h`和`\\PrjTelmMng\\TelmMng.h`中的定义。", "file": "M:/研二上/静态分析问题单过滤/gs-zk和扫描结果/PrjAttCtrlMng\\AttCtrlMain.c", "calls": [ "OCOut" ], "called_by": [ "ZKCtrlReinitBK", "ZKMiniPowerOn" ] }, { "node_id": "Function:AttCtrlInit", "name": "AttCtrlInit", "summary": "该函数`AttCtrlInit`主要用于航天器姿态控制系统的初始化。首先,它初始化变量`i`, `j`, `k`为0,并定义并初始化数组`PPUOff`,同时设置结果变量`result`为`TRUE`。在非`MINMODULE_TYPE`编译条件下,通过调用`GetTaskInfoBT`获取任务信息`m_pZKTaskInfo`,如果获取失败则返回`FALSE`。接着,定义多个指针变量并将它们初始化为`NULL`,然后将这些指针指向特定地址的数据结构,若任一指针为空,则返回`FALSE`。使用`memset`函数清零部分指针所指向的结构体。随后,为`PStar`、`PGyro`等指针分配具体的内存地址,并调用一系列初始化函数(如`ZKModInit()`、`ZKEnvInit()`)进行模块初始化。通过`memcpy`从全局变量复制数据到`tmpConst`中的相应字段,并设置互校验阈值和其他常量参数。接下来,初始化模拟太敏、陀螺、星敏、磁强计、飞轮等相关参数,在非`MINMODULE_TYPE`编译条件下,还初始化了PPU相关参数。此外,初始化磁力矩器、帆板、轨道计算、PD控制、PID控制器、轨道控制、目标定向、定姿、导引律、姿控、磁力矩器输出、帆板flash数据等参数。读取flash区间数据并进行三取二设置后,发送异常PPU关动作,并设置电推指令开关标志为关,最后输出磁力矩占控比为0,返回结果`result`。此函数被`AttCtrlMng`调用,并且与`dev_can_write, memcpy, magnetic_out, ZKPosCtlInit, ZKDPInit, GetTaskInfoBT, ZKEnvInit, ATTRestoreFromFlash, ZKModInit, ZKREInit, memset, ZKDYInit, ATTImportDataBackup`等多个函数存在关联关系,同时涉及到跨文件的头文件`AttCtrlMain.h`和`\\PrjTelmMng\\TelmMng.h`。\n\n**函数目的**: 实现航天器姿态控制系统启动时的全面初始化,确保所有传感器(如陀螺仪、星敏感器、磁强计)、执行机构(如飞轮、磁力矩器)及控制算法相关的参数均处于正确状态,从而保证系统能够安全稳定地运行。\n\n**输入参数**: (UINT8 taskID) - 任务标识符,用于获取对应的任务信息。\n\n**返回值**: (BOOL) - 初始化成功返回`TRUE`,否则返回`FALSE`。\n\n**与其他函数的关联关系**:\n- 被调用的函数: dev_can_write, memcpy, magnetic_out, ZKPosCtlInit, ZKDPInit, GetTaskInfoBT, ZKEnvInit, ATTRestoreFromFlash, ZKModInit, ZKREInit, memset, ZKDYInit, ATTImportDataBackup\n- 调用此函数的函数: AttCtrlMng\n\n**与跨文件关联的函数(头文件)**: AttCtrlMain.h, ..\\PrjTelmMng\\TelmMng.h", "file": "M:/研二上/静态分析问题单过滤/gs-zk和扫描结果/PrjAttCtrlMng\\AttCtrlMain.c", "calls": [ "dev_can_write", "memcpy", "magnetic_out", "ZKPosCtlInit", "ZKDPInit", "GetTaskInfoBT", "ZKEnvInit", "ATTRestoreFromFlash", "ZKModInit", "ZKREInit", "memset", "ZKDYInit", "ATTImportDataBackup" ], "called_by": [ "AttCtrlMng" ] }, { "node_id": "Function:ZKCmdResolve", "name": "ZKCmdResolve", "summary": "`ZKCmdResolve` 函数主要负责从命令缓冲区中读取并解析各种姿态控制命令,根据不同的指令码执行相应的操作。首先,它初始化多个变量,包括命令缓冲区、数据长度、校验和等。接着,获取任务管理和姿态控制相关的指针,并检查这些指针是否为空,如果为空则直接返回。随后,进入一个循环,从命令缓冲区中获取命令并处理每个命令。在处理过程中,从命令中提取指令码,并根据指令码进行不同的操作:对于安全模式软指令,设置相关标志和参数,清空轨道包和目标定向包;对于模式控制指令,根据当前工作模式和条件设置新的工作模式;对于轨道控制数据包上注,解析数据包,验证数据长度和校验和,更新轨道控制参数;对于目标定向数据包上注,同样解析数据包,验证数据长度和校验和,更新目标定向参数;其他指令则根据指令码执行相应的操作,如设置阈值、注入安装矩阵、更新控制器参数等。在处理完每个命令后,更新命令结果和计数器,然后继续处理下一个命令,直到命令缓冲区为空。该函数的目的是确保姿态控制系统能够根据接收到的指令进行正确的状态更新和控制。输入参数无,因为这是一个void类型的函数。返回值类型也是void,意味着此函数不直接返回任何值。此函数调用了多个辅助函数,例如`dev_can_write`, `DoGetInt32From8`, `memcpy`, `GETPKGSTRUCT`, `DoGetFloatFrom8`, `BlockRingGet`, `DoGetInt16From8`, `GetTaskInfoBT`, `GetTime`, `DoGetCheckSum`, `BlockRingAdd`, `ZKModDoSet`, 和`memset`来完成其复杂的功能。同时,`ZKCmdResolve`被`AttCtrlMng`函数调用以实现姿态控制管理。此外,该函数与跨文件关联的函数通过头文件`AttCtrlMain.h`和`\\PrjTelmMng\\TelmMng.h`进行交互。", "file": "M:/研二上/静态分析问题单过滤/gs-zk和扫描结果/PrjAttCtrlMng\\AttCtrlMain.c", "calls": [ "dev_can_write", "DoGetInt32From8", "memcpy", "GETPKGSTRUCT", "DoGetFloatFrom8", "BlockRingGet", "DoGetInt16From8", "GetTaskInfoBT", "GetTime", "DoGetCheckSum", "BlockRingAdd", "ZKModDoSet", "memset" ], "called_by": [ "AttCtrlMng" ] }, { "node_id": "Function:ZKMINICmdResolve", "name": "ZKMINICmdResolve", "summary": "该函数`ZKMINICmdResolve`主要用于解析并处理来自外部的航天器姿态控制命令。首先,它初始化一系列变量,包括指令码、偏移量和数据指针等。接着,检查关键结构体指针是否为空,如果为空则直接返回,以避免后续操作中的潜在错误。然后,从输入的`tmpCmd`中提取指令码,并更新任务信息中的相关字段。根据不同的指令码,函数进入相应的处理逻辑:对于模式控制指令(如速率阻尼、磁控对日定向等),设置相应的工作模式或参数;对于单机使用状态和重构状态注入指令,更新IMU和其他设备的状态;对于安装矩阵注入指令(星敏、太敏、磁强计、陀螺、反作用轮、磁力矩器等),根据选择的设备和矩阵类型,更新相应的安装矩阵;对于控制器参数注入指令(如磁阻尼控制器、磁控对日控制器等),更新相关的控制参数;对于陀螺零偏和标度因数注入指令,更新陀螺的相关参数;对于磁强计标定系数注入指令,更新磁强计的标定系数;对于磁力矩器分配-磁矩限值指令,更新磁力矩器的输出限值。如果指令码不匹配任何已知命令,则可能设置错误代码。此函数通过识别不同的指令码来执行对应的操作,确保所有接收到的命令都能被正确解析并应用到系统中,从而实现对航天器姿态的有效控制。其输入参数为一个指向UINT8类型的指针`tmpCmd`,用于传递待解析的命令数据。虽然没有明确指定返回值类型,但基于上下文可以推测该函数可能不会直接返回特定值,而是通过修改全局或局部状态来反映处理结果。此外,该函数依赖于其他几个函数完成特定任务,比如`DoGetInt16From8`用于从字节序列中获取整数值,`memset`用于内存初始化,`ZKModDoSet`用于设置模块状态,以及`DoGetFloatFrom8`用于从字节序列中获取浮点数值。最后,此函数与跨文件关联的头文件包括`AttCtrlMain.h`和`\\PrjTelmMng\\TelmMng.h`,表明了它在更大项目架构中的位置及其与其他组件之间的交互方式。", "file": "M:/研二上/静态分析问题单过滤/gs-zk和扫描结果/PrjAttCtrlMng\\AttCtrlMain.c", "calls": [ "DoGetInt16From8", "memset", "ZKModDoSet", "DoGetFloatFrom8" ], "called_by": [] }, { "node_id": "Function:ZKPowerState", "name": "ZKPowerState", "summary": "此函数`ZKPowerState`主要用于检测航天器上多个关键姿态控制设备(包括星敏、陀螺、飞轮、磁强计及电推)的加电状态,并根据这些设备的实际加电情况更新相关状态标志与维护一个持续时间不超过60000次循环的加电计数器。首先,初始化变量`i`为0,并定义并初始化指针`tmpAtt`、`pREcheck`和`tmpDevInfo`。接着,将`tmpAtt`指向`ATTCLT_DATA1_ADDR`地址处的数据,如果`tmpAtt`为空则直接返回;否则,通过`tmpAtt`获取`pREcheck`的值。对于星敏、陀螺、飞轮和磁强计等设备,将其加电状态初始化为`POSE_NO`。随后,依次检查星敏A至C、陀螺A至C、飞轮A至D、磁强计A和B以及电推是否已加电,如果是,则更新其加电状态为`POSE_OK`并增加相应的加电计数器;否则,重置该计数器。此过程中调用了`GETDEVINFO`函数来获取特定设备的信息。此外,该函数被`ZKPreAction`调用,并且与跨文件关联的头文件包括`AttCtrlMain.h`和`\\PrjTelmMng\\TelmMng.h`。", "file": "M:/研二上/静态分析问题单过滤/gs-zk和扫描结果/PrjAttCtrlMng\\AttCtrlMain.c", "calls": [ "GETDEVINFO" ], "called_by": [ "ZKPreAction" ] }, { "node_id": "Function:ZKReModBK", "name": "ZKReModBK", "summary": "该函数`ZKReModBK`主要负责根据当前姿态控制数据中的工作模式以及轨道数据的有效性来决定航天器的新工作模式,并在确定新模式后调用特定函数完成模式切换及相关参数的初始化。首先,它将变量`tmpNewMod`初始化为`ATTMOD_RATEDMP`,同时将指针`tmpAtt`和`tmpOrbit`设置为`NULL`。接着,通过强制类型转换,将`ORBIT_BASE_ADDR`地址赋值给`tmpOrbit`,而`ATTCLT_DATA1_ADDR`地址则被赋值给`tmpAtt`。如果发现`tmpAtt`或`tmpOrbit`任一为`NULL`,则立即退出函数。随后,更新`tmpNewMod`为`tmpAtt->sModePara.WorkMode`的值,并基于此值执行不同的逻辑分支:对于星箭分离前模式(`ATTMOD_BREAKPRE`),设置`tmpNewMod`为`ATTMOD_NOCOLL`;无控模式(`ATTMOD_UNCTL`)下,保持`tmpNewMod`为`ATTMOD_RATEDMP`;针对对目标定向、定向前调姿、对地定向及稳态对地等模式,在轨道输出数据有效时维持当前模式,否则调整至`ATTMOD_RATEDMP`;而对于定向前调姿准备阶段与轨道控制模式,则会重置一些PPU相关的标志位和计数器,并依据轨道数据有效性选择新的模式;其他几种特定模式如无碰撞模式、轮控向日模式等则直接保留现有模式不变;未明确列出的情况默认采用`ATTMOD_RATEDMP`作为新工作模式。最后,通过调用`ZKModDoSet(tmpNewMod)`实现模式切换,并清零相关计数器。此过程由`ZKCtrlReinitBK`触发,并依赖于`AttCtrlMain.h`和`..\\PrjTelmMng\\TelmMng.h`中定义的数据结构与宏定义。", "file": "M:/研二上/静态分析问题单过滤/gs-zk和扫描结果/PrjAttCtrlMng\\AttCtrlMain.c", "calls": [ "ZKModDoSet" ], "called_by": [ "ZKCtrlReinitBK" ] }, { "node_id": "Function:ZKREFlashBK", "name": "ZKREFlashBK", "summary": "该函数`ZKREFlashBK`的主要任务是在航天器切换到新模式后,根据特定内存地址中的数据更新轮子ID。首先,它将`ATTCLT_DATA2_ADDR`和`ST_WHEEL_ID_ARRAY_ADDR`这两个地址分别转换为`AttCtrlConst_t`类型和`sWheelIdArray`类型的指针`tmpConst`与`tmpBKStr`。如果任一指针为空,则函数立即返回,以避免后续操作中可能出现的空指针异常。接着,函数会检查`tmpBKStr->WHEEL_ID_ARRAY`数组中四个预设位置(索引0至3)的第一个元素是否分别为`0X11`, `0X22`, `0X33`, 和`0X44`。对于每个匹配的情况,相应的第二个元素值会被复制到`tmpConst->Whl_ID`数组对应的位置上。此过程确保了在模式切换时,基于存储于指定内存区域的数据,能够正确地初始化或更新轮子ID信息。该函数不接受任何输入参数,也没有返回值。它被`ZKCtrlReinitBK`和`ZKMiniPowerOn`两个函数调用,并且其定义依赖于`AttCtrlMain.h`以及位于`\\PrjTelmMng\\`目录下的`TelmMng.h`头文件。", "file": "M:/研二上/静态分析问题单过滤/gs-zk和扫描结果/PrjAttCtrlMng\\AttCtrlMain.c", "calls": [], "called_by": [ "ZKCtrlReinitBK", "ZKMiniPowerOn" ] }, { "node_id": "Function:ATTGet2Base3FromBuff", "name": "ATTGet2Base3FromBuff", "summary": "该函数`ATTGet2Base3FromBuff`旨在从三个字节的数据中选取任意两个相同的数据作为输出结果,实现了一种简单的三取二逻辑。首先,它会检查输入参数`pSDATA`(指向源数据的指针)和`pTDATA`(指向目标数据的指针)是否为NULL,如果是,则直接返回不做任何处理。接着,通过异或操作判断`pSDATA[0]`与`pSDATA[1]`的值是否相等,如果相等,则将`pSDATA[0]`的值赋给`*pTDATA`;如果不满足此条件,则继续使用同样的方法比较`pSDATA[0]`与`pSDATA[2]`,以及`pSDATA[1]`与`pSDATA[2]`,只要发现有两组数据相等,就将相等的那个值赋给`*pTDATA`。当且仅当至少有两个输入数据相同时,才会更新输出指针指向的数据;否则,保持原状不变。此函数没有调用其他函数,但被`ATTGetImportDataFromBuff`函数所调用,并且在`AttCtrlMain.h`和`\\PrjTelmMng\\TelmMng.h`这两个头文件中有声明。该函数不返回任何值,其主要目的是确保只有在多数表决原则下才更新输出数据,这在航天领域对于提高系统可靠性和容错能力至关重要。", "file": "M:/研二上/静态分析问题单过滤/gs-zk和扫描结果/PrjAttCtrlMng\\AttCtrlMain.c", "calls": [], "called_by": [ "ATTGetImportDataFromBuff" ] }, { "node_id": "Function:ATTSetBase3ToBuff", "name": "ATTSetBase3ToBuff", "summary": "该函数`ATTSetBase3ToBuff`主要用于航天软件系统中数据处理环节,其核心任务是将一个给定指针`pTDATA`所指向的数据值复制到另一个指定数组`pSDATA`的前三个位置上。在执行此操作之前,函数会先检查两个输入参数`pSDATA`和`pTDATA`是否为NULL,如果任一为NULL,则直接返回而不进行任何数据复制操作,以此确保程序的安全性和稳定性。具体来说,当确认了输入的有效性后,它会将`pTDATA`指向的数据值依次赋给`pSDATA`数组的第一个、第二个以及第三个元素,实现特定数据的三重备份或初始化。此过程对于保证航天器姿态控制(ATT)相关数据的一致性和可靠性至关重要。从参数角度来看,该函数接受两个类型为`UINT8*`的指针作为输入:`pTDATA`用于指向待复制的数据源,而`pSDATA`则指向目标存储区域。值得注意的是,`ATTSetBase3ToBuff`本身不返回任何值,即其返回类型为`void`。此外,在整个软件架构中,这个函数被`ATTImportDataBackup`调用以完成更复杂的数据管理任务,并且与跨文件关联的头文件包括`AttCtrlMain.h`和`\\PrjTelmMng\\TelmMng.h`,表明了它在整个项目中的重要地位及其与其他模块间的紧密联系。", "file": "M:/研二上/静态分析问题单过滤/gs-zk和扫描结果/PrjAttCtrlMng\\AttCtrlMain.c", "calls": [], "called_by": [ "ATTImportDataBackup" ] }, { "node_id": "Function:ATTGetImportDataFromBuff", "name": "ATTGetImportDataFromBuff", "summary": "该函数`ATTGetImportDataFromBuff`主要负责从指定内存地址读取姿态控制相关的多种参数值,并通过调用`ATTGet2Base3FromBuff`函数将这些参数值及其相关联的备份信息从缓冲区中提取出来,存储到结构体`sAttPriData`的一个成员`AttData3T2Para`内。整个过程涉及到了对多个不同类型传感器数据(包括但不限于星敏感器误差、磁力计误差、陀螺仪误差等)的处理与备份。具体而言,它首先初始化变量`i`为0,并声明并初始化指针`tmpAtt`和`tmpConst`为NULL;然后,将`tmpAtt`指向`ATTCLT_DATA1_ADDR`地址处的数据,并将`tmpConst`指向`ATTCLT_DATA2_ADDR`地址处的数据;接着检查这两个指针是否为空,如果任一为空则直接返回;之后,调用`ATTGet2Base3FromBuff`函数从缓冲区获取工作模式数据,并将其备份到`tmpAtt->AttData3T2Para.WorkModeBK[0]`;随后,通过循环调用`ATTGet2Base3FromBuff`函数依次从缓冲区获取各种传感器误差数据以及不同传感器的使用状态信息,并进行相应的数据备份;此外,对于一些特定参数如陀螺仪组合分辨率权重、磁力计组合分辨率权重等也进行了类似的处理。此函数无输入参数,也不返回任何值,但其执行结果直接影响到姿态控制系统中关键参数的状态更新。在程序架构上,`ATTGetImportDataFromBuff`被`ZKCtrlReinitBK`函数调用以完成姿态控制参数的重新初始化或恢复操作,并且依赖于`ATTGet2Base3FromBuff`来实现具体的缓冲区数据读取任务。同时,该函数还涉及到跨文件引用,特别是与`AttCtrlMain.h`及`\\PrjTelmMng\\TelmMng.h`中的定义有关。", "file": "M:/研二上/静态分析问题单过滤/gs-zk和扫描结果/PrjAttCtrlMng\\AttCtrlMain.c", "calls": [ "ATTGet2Base3FromBuff" ], "called_by": [ "ZKCtrlReinitBK" ] }, { "node_id": "Function:ATTImportDataBackup", "name": "ATTImportDataBackup", "summary": "该函数`ATTImportDataBackup`主要用于航天器姿态控制系统中关键数据的备份工作。首先,它初始化变量`i`为0,并声明并初始化指针`tmpAtt`和`tmpConst`为NULL。接着,将`tmpAtt`指向`ATTCLT_DATA1_ADDR`地址处的数据,而`tmpConst`则指向`ATTCLT_DATA2_ADDR`地址处的数据。如果`tmpAtt`或`tmpConst`任一为空,则直接返回,以避免后续操作中的潜在错误。随后,通过调用`ATTSetBase3ToBuff`函数,该函数依次执行了多个步骤来备份各种重要参数至指定的备份缓冲区,包括但不限于工作模式、自动切换工作模式参数、星敏感器、磁力计、陀螺仪、飞轮等传感器的误差控制参数以及它们的使用状态信息等。此外,还特别备份了PPU相关的误差参数及其使用状态信息。整个过程中,多次利用循环结构配合`ATTSetBase3ToBuff`函数完成对不同设备或参数的具体备份任务。此函数无输入参数,也不返回任何值,但其执行结果对于确保系统能够在需要时恢复这些重要配置至关重要。在软件架构上,`ATTImportDataBackup`依赖于`ATTSetBase3ToBuff`函数进行实际的数据复制操作,并且通常由`AttCtrlInit`或`AttCtrlMng`函数调用来初始化或管理姿态控制系统。此外,该函数与跨文件关联,涉及到`AttCtrlMain.h`及`\\PrjTelmMng\\TelmMng.h`头文件中的定义。", "file": "M:/研二上/静态分析问题单过滤/gs-zk和扫描结果/PrjAttCtrlMng\\AttCtrlMain.c", "calls": [ "ATTSetBase3ToBuff" ], "called_by": [ "AttCtrlInit", "AttCtrlMng" ] }, { "node_id": "Function:ZKDataBackUp", "name": "ZKDataBackUp", "summary": "该函数`ZKDataBackUp`主要负责将姿态控制系统当前的工作模式、各种传感器的错误状态、使用状态以及一些配置参数备份到一个专门用于备份的结构体中,以确保系统在遇到故障时能够恢复关键数据。首先初始化变量`i`为0,并声明多个指针变量;接着,它将`tmpAtt`指向`ATTCLT_DATA1_ADDR`地址处的数据,将`tmpConst`指向`ATTCLT_DATA2_ADDR`地址处的数据。如果`tmpAtt`或`tmpConst`任一为空,则直接返回。通过`tmpAtt`初始化多个指针变量,分别指向其内部的不同结构体成员后,开始从`pWMod`和`tmpConst`复制工作模式相关参数到备份结构体`pBK`中。随后,利用循环遍历并复制星敏感器、磁力计、陀螺仪、轮子等传感器的错误状态信息从`pREcheck`到`pBK`,同时处理PPU错误状态信息的复制。继续通过循环遍历并复制这些传感器的使用状态信息从`pImpt`到`pBK`,根据`pImpt`中的PPU使用状态和安全状态更新`pBK`中的PPU使用状态标志位。此外,还涉及MT设备使用状态信息的复制,以及从`tmpConst`复制陀螺仪和磁力计的补偿分辨率设置、星敏感器与陀螺仪优先级信息至`pBK`。最后,从`pREcheck`复制诊断信息到`pBK`,并从`tmpConst`复制允许开启/关闭特定传感器的状态及几个允许进行特定类型诊断的标志位到`pBK`。此函数无输入参数,不返回任何值,被`ZKCtrlDataBackUp`调用,并且与跨文件关联的头文件包括`AttCtrlMain.h`和`\\PrjTelmMng\\TelmMng.h`。", "file": "M:/研二上/静态分析问题单过滤/gs-zk和扫描结果/PrjAttCtrlMng\\AttCtrlMain.c", "calls": [], "called_by": [ "ZKCtrlDataBackUp" ] }, { "node_id": "Function:ZKDoActDataTer", "name": "ZKDoActDataTer", "summary": "该函数`ZKDoActDataTer`主要负责从指定内存地址读取态度控制相关参数,并将其备份至另一预定义的内存区域。首先,初始化指针`tmpAddr`为0,`tmpPCInfo`和`tmpAtt`为NULL。接着,将`tmpAtt`指向`ATTCLT_DATA1_ADDR`地址处的数据,并检查其是否为空,若为空则直接返回。通过`tmpAtt`获取`AttBKPara_t`类型的结构体指针`tmpPCInfo`后,定义并初始化另一个`AttBKPara_t`类型的指针`tmpBKStr`为NULL。计算电源备份数据存储区域(第9块)的起始地址,并将结果赋值给`tmpAddr`;如果`tmpAddr`为空,则函数返回。随后,将`tmpBKStr`设置为指向`tmpAddr`所指向的内存位置,并使用`memcpy`将`tmpPCInfo`的内容复制到`tmpBKStr`中。之后,设置`tmpBKStr`中的`sBKHead.iDataLength`字段值为`AttBKPara_t`大小减去`sSaveDataHead`的大小,同时设定`sBKHead.iDataType`字段值为`BACKUP_TYPE_ATTFIFO`。此外,还将`tmpBKStr`中的`iVldFlag`字段设置为`0x55555555`。调用`DoGetCheckSum`函数计算校验和,并将其结果存入`tmpBKStr->sBKHead.iDataCheck`。最后,更新位于`ST_IMPDATA_ADDR`地址处的特定偏移量`ST_IMPDATA_ATTMNG_OFFSET`上的字节值为`0x55`以标记数据已更新的状态。此函数无输入参数,也不返回任何值,但被`ZKCtrlDataBackUp`函数调用,并且与`memcpy`和`DoGetCheckSum`函数紧密关联。此外,它还涉及到跨文件的头文件`AttCtrlMain.h`和`\\PrjTelmMng\\TelmMng.h`。", "file": "M:/研二上/静态分析问题单过滤/gs-zk和扫描结果/PrjAttCtrlMng\\AttCtrlMain.c", "calls": [ "memcpy", "DoGetCheckSum" ], "called_by": [ "ZKCtrlDataBackUp" ] }, { "node_id": "Function:ZKCtrlReinitBK", "name": "ZKCtrlReinitBK", "summary": "该函数`ZKCtrlReinitBK`主要负责在特定条件下(如重启、切机、复位)重新初始化姿态控制系统的关键参数。首先,它初始化局部变量,包括指针和数据结构,并检查`tmpAtt`和`tmpConst`是否为NULL,如果是则直接返回。接着,获取双机FIFO数据地址并将其转换为`AttBKPara_t`类型指针`tmpBKStr`,随后调用`ATTGetImportDataFromBuff()`获取关键变量的数据,并执行首次卫星加电操作`ZKDptPowerOnPrc()`。如果`m_pZKTaskInfo->iReInit`等于0x55U,则重置`iReInit`为0,并设置`tmpAtt->sModePara.ReDataBK`为POSE_NO。之后,从本地FLASH获取飞轮ID的装订参数`ZKREFlashBK()`,并将所有飞轮的转速电流设置为0。接下来,校验备份区数据的有效性,若通过则设置`tmpAtt->sModePara.ReDataBK`为POSE_OK;否则再次尝试校验。如果两次校验均失败,根据太阳翼展开状态决定进入速率阻尼模式或碰撞规避模式并返回。当数据校验通过时,恢复各种工作模式和参数,包括工作模式、星敏感器、磁强计、陀螺仪、飞轮等设备的状态和错误信息、PPU使用状态和安全状态以及其他允许标志和诊断标志。最后,根据恢复后的工作模式调用`ZKReModBK()`进行相应处理。此函数无输入参数,也不返回任何值,但被`SetWheel, ZKReModBK, ZKREFlashBK, DoCheckSaveData, ZKDptPowerOnPrc, POSE_ABSF, GETDEVINFO, ZKModDoSet, ATTGetImportDataFromBuff`等函数调用,并且由`AttCtrlMng`函数触发。此外,该函数与跨文件关联的函数存在于`AttCtrlMain.h`和`..\\PrjTelmMng\\TelmMng.h`头文件中。", "file": "M:/研二上/静态分析问题单过滤/gs-zk和扫描结果/PrjAttCtrlMng\\AttCtrlMain.c", "calls": [ "SetWheel", "ZKReModBK", "ZKREFlashBK", "DoCheckSaveData", "ZKDptPowerOnPrc", "POSE_ABSF", "GETDEVINFO", "ZKModDoSet", "ATTGetImportDataFromBuff" ], "called_by": [ "AttCtrlMng" ] }, { "node_id": "Function:ZKCtrlDataBackUp", "name": "ZKCtrlDataBackUp", "summary": "`ZKCtrlDataBackUp`函数首先检查成员变量`m_pZKTaskInfo->iReInit`的值是否不等于`POSE_OK`,这一步骤用于判断当前系统状态是否需要进行重新初始化。如果发现确实存在重新初始化的需求(即`m_pZKTaskInfo->iReInit`不等于`POSE_OK`),则该函数将触发一系列操作来确保数据的安全性和系统的稳定性:它会先调用`ZKDataBackUp()`执行关键数据的备份工作,以防止在后续可能发生的重置过程中丢失重要信息;紧接着,通过调用`ZKDoActDataTer()`函数,进一步处理或终止任何正在进行中的活动数据相关任务,为即将开始的初始化过程做准备。此函数没有显式的输入参数,也不返回任何值,其主要目的是保证在航天器软件遇到需要重启的情况时能够安全地保存现有数据并妥善结束所有未完成的任务。此外,`ZKCtrlDataBackUp`由`AttCtrlMng`函数调用,并且与`ZKDoActDataTer`和`ZKDataBackUp`这两个被调用函数紧密协作,共同维护着整个系统的稳定运行。从代码结构上看,该函数定义于包含`AttCtrlMain.h`以及位于`..\\PrjTelmMng\\TelmMng.h`路径下的头文件中,表明了它在整个项目架构中的位置及其与其他模块之间的联系。", "file": "M:/研二上/静态分析问题单过滤/gs-zk和扫描结果/PrjAttCtrlMng\\AttCtrlMain.c", "calls": [ "ZKDoActDataTer", "ZKDataBackUp" ], "called_by": [ "AttCtrlMng" ] }, { "node_id": "Function:ATTRestoreFromFlash", "name": "ATTRestoreFromFlash", "summary": "此函数`ATTRestoreFromFlash`主要负责从Flash中恢复姿态控制系统相关的配置信息。首先,它定义了一个`AttBackupFlash_t`类型的变量`AttBackupFlashPara`,并初始化了指向固定数据区的指针`tmpAddr`和`tmpBackup`,以及指向姿态控制私有数据区、常量数据区和命令Flash参数的指针`tmpAtt`、`tmpConst`与`PFlash`。在确认这些指针非空后,函数会检查固定数据区的数据是否有效(即数据类型匹配且通过校验)。如果固定数据区的数据有效,则将其存储到本地Flash;反之,若测控单机数据无效,则清空固定数据区,并尝试从本地Flash加载备份数据至该区域。对于从Flash读取的数据,还需进一步验证其类型、长度及有效性标志位,只有当所有条件均满足时才会继续执行恢复过程。随后,将`tmpBackup`的内容复制到`AttBackupFlashPara`,再从中提取姿控Flash参数更新给`PFlash`,同时帆板Flash参数也被复制给`tmpAtt->ATSFlashPara`。此过程中调用了如`memcpy`用于内存拷贝,`DoCheckSaveData`来验证数据完整性,`FixDataStorFlashByType`和`FixDataLoadFlashByType`分别用于向Flash写入或从中读取特定类型的数据,而`memset`则用来初始化内存。此外,`ATTRestoreFromFlash`通常由`AttCtrlInit`或`ZKMiniPowerOn`等初始化或上电处理函数触发,并依赖于`AttCtrlMain.h`和`\\PrjTelmMng\\TelmMng.h`中的定义。", "file": "M:/研二上/静态分析问题单过滤/gs-zk和扫描结果/PrjAttCtrlMng\\AttCtrlMain.c", "calls": [ "memcpy", "DoCheckSaveData", "FixDataStorFlashByType", "memset", "FixDataLoadFlashByType" ], "called_by": [ "AttCtrlInit", "ZKMiniPowerOn" ] }, { "node_id": "Function:ATTBackupToFlash", "name": "ATTBackupToFlash", "summary": "该函数`ATTBackupToFlash`主要用于将姿态控制系统相关的Flash数据备份至指定的固定数据存储区,并在完成备份后清除相应的更新标志。首先,定义了`AttBackupFlash_t`类型的变量`AttBackupFlashPara`,并初始化指向固定数据区的指针`tmpAddr`和`tmpBackup`,以及指向姿态控制相关数据结构的指针`tmpAtt`、`tmpConst`及`PFlash`。接着检查`tmpBackup`、`tmpConst`和`tmpAtt`是否为NULL,若任一为空,则直接返回;同时,如果姿态控制数据中的`ATTFlashSwitch`标志不是`POSE_OK`,也直接返回。随后,从`PFlash`复制姿态控制Flash参数到`AttBackupFlashPara`中,并从`tmpAtt`复制SADA Flash参数到`AttBackupFlashPara`中。之后,将`AttBackupFlashPara`的内容复制到`tmpBackup`所指向的内存区域,并设置其有效标志位为`0x55555555`。此外,还需更新`tmpBackup`头部信息,包括数据长度、类型及校验和。最后,通过调用`FixDataStorFlashByType`函数将更新后的数据写入Flash,并清除姿态控制数据中的`ATTFlashSwitch`更新标志。此过程确保了备份数据的一致性和完整性。该函数无输入参数,也不返回任何值。它被`AttCtrlMng`函数调用,并依赖于`memcpy`、`FixDataStorFlashByType`等函数来完成具体操作。与跨文件关联的头文件包括`AttCtrlMain.h`和`\\PrjTelmMng\\TelmMng.h`。", "file": "M:/研二上/静态分析问题单过滤/gs-zk和扫描结果/PrjAttCtrlMng\\AttCtrlMain.c", "calls": [ "memcpy", "FixDataStorFlashByType", "DoGetCheckSum" ], "called_by": [ "AttCtrlMng" ] }, { "node_id": "Function:ZKPreAction", "name": "ZKPreAction", "summary": "`ZKPreAction`函数主要负责在执行主动作之前准备必要的数据,包括但不限于更新轨道信息、帆板控制状态及磁力计状态等。首先,该函数初始化变量`i`为0x00,并将`tmpAddr`指向`MAG_BASE_ADDR`。接着定义并初始化一系列指针,如`tmpAtt`指向`ATTCLT_DATA1_ADDR`,而`tmpSadaCtlInfo`则指向`SADACTR_BASE_ADDR`。如果`tmpSadaCtlInfo`或`tmpAtt`为空,则直接返回以避免后续操作中的潜在错误。随后,通过这些指针获取到轨道参数结构体、模式参数结构体以及周期参数结构体的地址。利用从`ORBIT_BASE_ADDR`获取的轨道数据结构体`tmpOrbit`,函数通过一个for循环三次迭代来读取姿态使用轨道的角位置和角速度数据至`pOrbit`对应的字段中,并进一步读取GAST、MJC、MJCLv以及轨道有效性标志到`pOrbit`对应字段。此外,它还更新了帆板展开前的状态`pWMod->WModSadaOpenPre`为当前帆板状态`pWMod->WModSadaOpen`,然后根据`tmpSadaCtlInfo`中的帆板展开标志更新`pWMod->WModSadaOpen`。磁力计状态寄存器值也被读取并通过位与操作赋给`pMt->MTStatus`。最后,调用`ZKPowerState()`函数检查单机加电状态。此函数无输入参数且不返回任何值,但被`ZKAction`函数调用,并依赖于`ZKPowerState`和`ReadReg`函数完成其任务。同时,该函数与跨文件关联的头文件包括`AttCtrlMain.h`和`\\PrjTelmMng\\TelmMng.h`。", "file": "M:/研二上/静态分析问题单过滤/gs-zk和扫描结果/PrjAttCtrlMng\\AttCtrlMain.c", "calls": [ "ZKPowerState", "ReadReg" ], "called_by": [ "ZKAction" ] }, { "node_id": "Function:ZKOCOrbitCtl", "name": "ZKOCOrbitCtl", "summary": "该函数`ZKOCOrbitCtl`主要用于处理卫星姿态控制中的轨道控制逻辑。首先,它初始化一系列变量,包括数据校验和、命令数据缓冲区、卫星时间数组以及PPU开机与关机指令。接着,获取指向姿态控制主要数据结构的指针,并检查这些指针的有效性,若无效则直接退出。随后,从姿态控制数据中提取模式参数、轨道控制信息等,并初始化命令数据缓冲区。之后,获取当前卫星时间并验证轨道控制数据包的有效性,如果数据包无效或当前轨道控制包ID大于等于50,则设置相关标志并退出。对于有效的轨道控制数据包,根据其ID与前一个ID的关系及数据校验和进行进一步验证,不匹配时重置标志和计数器并发送特定命令后退出;否则,将当前轨道控制包的数据复制到相应结构体中。基于工作模式和卫星时间判断是否进入轨道控制预处理阶段或实际控制阶段,设置相应的命令并添加至命令缓冲区,在实际控制阶段还需依据电推使用状态决定是否开启PPU。当轨道控制流程正常结束时,根据不同的轨道控制模式执行后续操作,如更新轨道控制包索引、设置下一拍关闭PPU电源等,并发送对应命令。最后,无论何种情况,均会设置PPU输出状态为关闭并发送PPU关机指令。此函数通过调用`dev_can_write, DoSetInt32To8, CheckBlockRing, memcpy, GetTime, GetTaskInfoBT, DoGetCheckSum, BlockRingAdd, memset`等函数实现其复杂的功能,并被`ZKAction`函数所调用。此外,该函数还涉及到跨文件引用,特别是`AttCtrlMain.h`和`\\PrjTelmMng\\TelmMng.h`头文件中的定义。", "file": "M:/研二上/静态分析问题单过滤/gs-zk和扫描结果/PrjAttCtrlMng\\AttCtrlMain.c", "calls": [ "dev_can_write", "DoSetInt32To8", "CheckBlockRing", "memcpy", "GetTime", "GetTaskInfoBT", "DoGetCheckSum", "BlockRingAdd", "memset" ], "called_by": [ "ZKAction" ] }, { "node_id": "Function:ZKOCTarCtl", "name": "ZKOCTarCtl", "summary": "该函数`ZKOCTarCtl`主要负责处理卫星的姿态控制命令。首先,它初始化一系列变量,包括数据校验和、命令数据缓冲区以及卫星时间数组等,并从指定地址获取姿态控制相关数据结构的指针,同时检查这些指针的有效性。接着,获取当前任务信息并验证目标定向数据包的有效性;如果数据包无效或当前目标控制包ID大于等于30,则直接返回。随后,清空命令数据缓冲区并获取当前星上时间。当目标定向数据包有效时,进一步检查其与前一个包的关系及接收标志位,通过计算数据校验和并与存储值对比来确认数据完整性。若校验通过且接收标志正确,则更新当前控制包结构;反之,则设置指令模式为对地定向,更新状态并将命令添加到命令缓冲区中。此外,在满足特定条件下(如有效的目标定向数据包和正确的接收标志),根据当前工作模式和星上时间设定相应的工作模式(例如调整姿态或对目标定向),并生成相应的命令加入缓冲区。最后,如果当前处于对目标定向模式但不在预定时间段内,同样会切换至对地定向模式。此过程中涉及调用多个辅助函数如`memcpy`, `DoSetInt32To8`, `CheckBlockRing`, `GetTime`, `GetTaskInfoBT`, `DoGetCheckSum`, `BlockRingAdd`, 和`memset`以完成具体操作。该函数被`ZKAction`调用,并依赖于`AttCtrlMain.h`和`\\PrjTelmMng\\TelmMng.h`头文件中的定义。", "file": "M:/研二上/静态分析问题单过滤/gs-zk和扫描结果/PrjAttCtrlMng\\AttCtrlMain.c", "calls": [ "memcpy", "DoSetInt32To8", "CheckBlockRing", "GetTime", "GetTaskInfoBT", "DoGetCheckSum", "BlockRingAdd", "memset" ], "called_by": [ "ZKAction" ] }, { "node_id": "Function:ZKMiniPowerOn", "name": "ZKMiniPowerOn", "summary": "该函数`ZKMiniPowerOn`主要用于最小模式下单机加电时执行一系列初始化与配置工作。首先,它初始化指针`tmpAddr`为0,并声明并初始化`sAttPriData`类型的指针`tmpAtt`和`AttCtrlConst_t`类型的指针`tmpConst`为NULL。接着,将`tmpAtt`指向地址`ATTCLT_DATA1_ADDR`,将`tmpConst`指向地址`ATTCLT_DATA2_ADDR`。如果`tmpAtt`或`tmpConst`任一为NULL,则直接返回,结束函数执行。然后,计算并设置`tmpAddr`指向双机FIFO数据的特定偏移地址。之后,调用`ZKDptPowerOnPrc()`函数执行首次卫星加电操作。若`tmpAtt->sModePara.MiniDataSet`等于`POSE_OK`,则继续执行以下步骤:设置`m_pZKTaskInfo->iReInit`为0;将`tmpAtt->sModePara.MiniDataSet`设为`POSE_NO`;将`tmpAtt->sModePara.ReDataBK`设为`POSE_NO`。随后,通过调用`ZKREFlashBK()`获取本地FLASH中的飞轮ID装订参数,并通过`ATTRestoreFromFlash()`从flash中恢复数据。对四个飞轮分别调用`SetWheel()`函数,设置其转速电流为0。最后,调用`ZKModDoSet(ATTMOD_RATEDMP)`完成模式设定。此过程确保了系统在单机加电后处于正确的初始状态。该函数无输入参数,也无返回值。它被`ZKAction`函数调用,并且依赖于`SetWheel`, `ZKREFlashBK`, `ZKDptPowerOnPrc`, `ATTRestoreFromFlash`, 和`ZKModDoSet`等函数来完成其任务。此外,该函数还涉及到跨文件关联,如`AttCtrlMain.h`和`..\\PrjTelmMng\\TelmMng.h`头文件中的定义。", "file": "M:/研二上/静态分析问题单过滤/gs-zk和扫描结果/PrjAttCtrlMng\\AttCtrlMain.c", "calls": [ "SetWheel", "ZKREFlashBK", "ZKDptPowerOnPrc", "ATTRestoreFromFlash", "ZKModDoSet" ], "called_by": [ "ZKAction" ] }, { "node_id": "Function:ZKAction", "name": "ZKAction", "summary": "该函数`ZKAction`主要负责执行一系列航天器控制系统相关的操作,其核心流程包括初始化指针`tmpAtt`和`pMt`为NULL,并声明但未初始化`tmpTaskMngDataRcd`,随后将`tmpTaskMngDataRcd`指向`ST_TASKMNG_ADDR`地址处的数据结构,同时`tmpAtt`被设置为指向`ATTCLT_DATA1_ADDR`地址处的数据结构。如果`tmpAtt`或`tmpTaskMngDataRcd`任一为空,则函数直接返回,不做进一步处理;否则,通过`tmpAtt`获取其成员`sPerPara.MtPara`的地址并赋值给`pMt`。当检测到`tmpAtt->sModePara.ModeSwitchFlg`等于`POSE_OK`时,调用`ZKModChgInit()`进行模式切换初始化。接着,函数准备原始轨道数据并通过调用`ZKPreAction()`实现,同时增加`m_pZKTaskInfo->iRunPos`计数器。根据是否定义了`MINMODULE_TYPE`宏,函数会选择性地执行不同的控制逻辑序列,包括但不限于迷你电源开启、模式管理、环境模型计算、姿态确定与控制等步骤,在每一步骤完成后均会更新任务运行状态计数器`m_pZKTaskInfo->iRunPos`以跟踪任务进度。此函数无输入参数且不返回任何值,它由`AttCtrlMng`函数调用,并依赖于多个其他函数如`ZKPosCtlAct`, `ZKCmdDspAct`等来完成具体任务。此外,该函数还涉及到跨文件引用,特别是`AttCtrlMain.h`和`\\PrjTelmMng\\TelmMng.h`头文件中的定义。", "file": "M:/研二上/静态分析问题单过滤/gs-zk和扫描结果/PrjAttCtrlMng\\AttCtrlMain.c", "calls": [ "ZKPosCtlAct", "ZKCmdDspAct", "ZKDYAction", "ZKDPAction", "ZKEnvAct", "ZKMiniPowerOn", "ZKDoModeAct", "ZKOCTarCtl", "ZKModChgInit", "ZKPGAct", "ZKREAction", "ZKOCOrbitCtl", "ZKPreAction" ], "called_by": [ "AttCtrlMng" ] }, { "node_id": "Function:AttCtrlMng", "name": "AttCtrlMng", "summary": "该函数`AttCtrlMng`旨在实现航天器姿态控制系统的管理,通过一系列步骤确保系统能够正确初始化、响应外部信号并执行必要的操作直至接收到停止指令。首先,它获取指向任务管理数据记录的指针`tmpTaskMngDataRcd`,接着尝试初始化姿态控制模块;如果此过程失败,则设置错误代码和状态为失败后退出。成功初始化后,进入一个无限循环,在这里,函数会调用`OSSemPend`等待特定信号量被触发,使当前任务暂停直到被唤醒。一旦唤醒,将依次执行启动任务动作、重新初始化后台操作、递增运行位置计数器等步骤。此外,当检测到分离标志等于0x55时,还会额外进行姿态控制动作,并再次更新计数器。之后,解析处理接收到的命令、备份控制数据至内存及Flash存储中、从备份恢复数据等一系列维护性操作也会被执行。最后,根据是否允许停止任务来决定是否结束整个流程。此过程中涉及到多个辅助函数如`ZKCtrlDataBackUp`, `StartTaskAction`等的支持,且需引用`AttCtrlMain.h`与`\\PrjTelmMng\\TelmMng.h`头文件以完成其使命。该函数不接受任何输入参数,也没有返回值,表明其设计目的是作为一个独立的任务或线程持续运行于系统之中。", "file": "M:/研二上/静态分析问题单过滤/gs-zk和扫描结果/PrjAttCtrlMng\\AttCtrlMain.c", "calls": [ "ZKCtrlDataBackUp", "StartTaskAction", "ZKCtrlReinitBK", "ATTImportDataBackup", "OSSemPend", "ZKAction", "ATTBackupToFlash", "StopTaskAction", "AttCtrlInit", "ZKCmdResolve" ], "called_by": [] }, { "node_id": "Function:ZKDYInit", "name": "ZKDYInit", "summary": "该函数`ZKDYInit`主要用于在航天器姿态控制系统初始化时,对特定的数据结构进行必要的初始化设置。首先,它定义了一个指向`sAttPriData`类型的指针`tmpAtt`,并将其指向位于`ATTCLT_DATA1_ADDR`地址处的数据。接着,通过这个指针访问其内部的`sGuidLawPara`成员,并将指向该成员的指针命名为`pGuide`。如果`tmpAtt`为空,则直接退出函数,避免后续操作引发错误。随后,使用`memset`函数将`pGuide`中的`TargAng`和`TargAngRat`数组的所有元素清零,这两个数组分别代表目标角度和目标角速度。最后,将`pGuide`中的`AttGuid_Type`字段设置为0,表示选择了某种特定的导引律模式。此过程确保了系统开始运行前,所有关键参数都处于一个已知且安全的状态。该函数没有输入参数也不返回任何值,但被`AttCtrlInit`和`ZKDYAction`等函数调用,并依赖于`memset`来执行内存清理任务。此外,为了正确编译和链接,需要包含来自`..\\PrjCommon\\CommonDef.h`, `AttCtrlMain.h`, 和 `AttMath.h`头文件中的定义。", "file": "M:/研二上/静态分析问题单过滤/gs-zk和扫描结果/PrjAttCtrlMng\\AttDaoYing.c", "calls": [ "memset" ], "called_by": [ "AttCtrlInit", "ZKDYAction" ] }, { "node_id": "Function:ZKDYDirSun", "name": "ZKDYDirSun", "summary": "该函数`ZKDYDirSun`主要用于根据当前环境参数及确定性参数调整卫星的姿态角速率,特别是为了寻找太阳而进行的姿态调整。首先初始化指针`tmpAtt`, `pDeter`, `pEnv`, 和 `pGuide`为NULL,接着将`tmpAtt`指向`ATTCLT_DATA1_ADDR`地址的数据,如果`tmpAtt`为空,则直接返回。通过`tmpAtt`初始化`pDeter`, `pEnv`, 和 `pGuide`指针后,检查`pDeter->CLPAttValid`是否为0,如果是则直接返回。当`pEnv->bInOutShadow`等于0x55时,将`pDeter->CLPAttAng`的值复制到`pGuide->TargAng`中并返回。若`pDeter->AngToSun_ValidFlg`等于0x55,则增加`pGuide->CaptureSunCnt`计数器(但不超过200),当该计数器大于等于5时,清零`pGuide->TargAng`和`pGuide->TargAngRat`数组后返回;否则根据`pDeter->CLPAttAngRatPre[0]`的正负设置`pGuide->TargAngRat[0]`的值以控制卫星旋转搜索太阳。反之,重置`pGuide->CaptureSunCnt`为0,并基于`pDeter->CLPAttAngRatPre[0]`的符号来设定`pGuide->TargAngRat[0]`的值用于调整卫星姿态。此函数无输入参数,也不返回任何值,但它依赖于`memset`和`memcpy`函数来操作内存,并且被`ZKDYAction`函数调用。此外,它还与跨文件中的函数相关联,这些函数定义在头文件`\\PrjCommon\\CommonDef.h`, `AttCtrlMain.h`, 和 `AttMath.h`中。", "file": "M:/研二上/静态分析问题单过滤/gs-zk和扫描结果/PrjAttCtrlMng\\AttDaoYing.c", "calls": [ "memset", "memcpy" ], "called_by": [ "ZKDYAction" ] }, { "node_id": "Function:ZKDYTarget", "name": "ZKDYTarget", "summary": "该函数`ZKDYTarget`主要负责根据航天器当前的姿态控制模式调整目标角度参数。首先,它将`ATTCLT_DATA1_ADDR`地址强制转换为`sAttPriData`类型的指针`tmpAtt`,并通过这个指针获取到`sGuidLawPara`成员的地址,将其赋值给`sAttGuidLawPara_t`类型的指针`pGuide`。如果`tmpAtt`为空,则直接返回,结束执行。接着,函数会检查当前的工作模式是否属于`ATTMOD_MagTOSUN`, `ATTMOD_WheelToEarth`, `ATTMOD_AttaJustPre`, `ATTMOD_OrbitCtl`或`ATTMOD_AttaJust`之一,如果是这些模式中的任何一个,那么就将`pGuide`指向结构体中的`TargAng[0]`, `TargAng[1]`和`TargAng[2]`全部设置为0,意味着在这些特定模式下重置所有目标角度。此外,若工作模式是`ATTMOD_OnlToEarth`或再次是`ATTMOD_AttaJust`,则仅更新`pGuide->TargAng[2]`为目标角度的第三个分量`tmpAtt->sDeterPara.CLPAttAng[2]`的值。此函数没有输入参数,也不返回任何值。它被`ZKDYAction`函数调用,并且与位于`..\\PrjCommon\\CommonDef.h`, `AttCtrlMain.h`, 和`AttMath.h`头文件中的定义相关联。", "file": "M:/研二上/静态分析问题单过滤/gs-zk和扫描结果/PrjAttCtrlMng\\AttDaoYing.c", "calls": [], "called_by": [ "ZKDYAction" ] }, { "node_id": "Function:ZKDYAction", "name": "ZKDYAction", "summary": "`ZKDYAction`函数首先将`ATTCLT_DATA1_ADDR`地址转换为`sAttPriData`类型的指针`tmpAtt`,然后获取`tmpAtt`中的`sGuidLawPara`成员的地址,并将其赋值给`sAttGuidLawPara_t`类型的指针`pGuide`。如果`tmpAtt`为空,则函数直接返回,以避免后续操作中可能出现的空指针异常。接着,通过调用`ZKDYInit()`函数来初始化必要的数据结构或状态。根据`tmpAtt->sModePara.WorkMode`的值是否等于`ATTMOD_WhlTOSUN`,该函数决定姿态导引类型:若工作模式是对日定向,则设置`pGuide->AttGuid_Type`为1,并调用`ZKDYDirSun()`执行对日定向导引律;反之,若为其他模式,则设置`pGuide->AttGuid_Type`为2,并调用`ZKDYTarget()`执行固定目标导引律。此函数的主要目的是基于当前航天器的工作模式选择并执行相应的姿态导引策略。它不接受任何输入参数,也没有返回值。在程序架构中,`ZKDYAction`被`ZKAction`函数调用,并且自身会调用`ZKDYTarget`, `ZKDYInit`, 和`ZKDYDirSun`这三个函数来完成特定任务。此外,为了确保正确访问和处理相关数据结构,该函数依赖于定义在`..\\PrjCommon\\CommonDef.h`, `AttCtrlMain.h`, 以及`AttMath.h`头文件中的声明。", "file": "M:/研二上/静态分析问题单过滤/gs-zk和扫描结果/PrjAttCtrlMng\\AttDaoYing.c", "calls": [ "ZKDYTarget", "ZKDYInit", "ZKDYDirSun" ], "called_by": [ "ZKAction" ] }, { "node_id": "Function:ZKDPInit", "name": "ZKDPInit", "summary": "该函数`ZKDPInit`主要用于初始化航天器姿态控制系统中涉及的各种传感器和执行机构的相关参数,确保系统在启动时这些组件处于已知且安全的状态。首先,它通过将变量`tmpAtt`指向`ATTCLT_DATA1_ADDR`地址来开始,并检查其是否为NULL,如果是则直接返回。如果`tmpAtt`非空,则进一步初始化多个指针分别指向`tmpAtt`中的不同结构体成员。接着,对星敏感器、陀螺仪、模拟太阳敏感器、磁强计以及飞轮等设备的参数进行初始化,包括设置状态标志、数据状态、校验标志等字段,并将相关向量和四元数清零或设为默认值。此外,在非最小模块配置下,还会对电推进单元(PPU)的参数进行初始化。整个过程中,通过遍历并重置关键参数,为后续的姿态控制算法提供了干净的初始条件。此函数不接受任何输入参数,也没有返回值。它使用了`memset`函数来清零某些数据结构,并被`AttCtrlInit`和`ZKDPAction`函数调用。同时,该函数与跨文件关联的头文件包括..\\PrjCommon\\CommonDef.h, ..\\PrjCommon\\DevDefine.h, AttMath.h, AttCtrlMain.h, 和..\\PrjTelCtrlMng\\TelCtrlMng.h。", "file": "M:/研二上/静态分析问题单过滤/gs-zk和扫描结果/PrjAttCtrlMng\\AttDataPre.c", "calls": [ "memset" ], "called_by": [ "AttCtrlInit", "ZKDPAction" ] }, { "node_id": "Function:Ss_DataGet", "name": "Ss_DataGet", "summary": "该函数`Ss_DataGet`主要负责从三个星敏感器设备中读取姿态数据(包括四元数和角速度),并对这些数据的有效性进行一系列验证。首先,初始化多个变量如`sum`, `i`, `j`等,并为一些数组和结构体分配内存。接着检查`tmpAtt`指针是否为空,如果为空则直接返回。通过调用`GETDEVINFO`函数获取三个星敏感器设备的信息并存储在`tmpDevInfo`数组中,同时将`tmpAtt`中的`SsPara`成员地址赋值给`PStar`数组。复制前次原包数据到`ssIn_Qpre`,并初始化当前的四元数`ssIn_Q`。然后,从每个星敏感器的数据缓冲区读取包头信息并存储在`tmpHEAD`数组中,以及读取信息字并存储在`tmpINFIN`数组中。对于星敏感器A和B,检查其数据更新标志、包头及ID号是否正确,如果不正确,则设置相应的状态标志;否则继续校验数据的校验和以及状态字1。如果上述所有检查都通过了,解析星敏感器A和B的四元数和角速度数据,并进行必要的单位转换。对于星敏感器C,执行类似的检查流程:验证数据更新标志、包头及ID号、校验和以及状态字1。如果星敏感器C的数据有效,解析其四元数和角速度数据,并进行单位转换。此函数无输入参数,也不返回任何值,但依赖于`DoGetInt32From8`, `memcpy`, `ZERO_TO_ONE`, `DoGetInt16From8`, `GETDEVINFO`等函数来完成其任务,并且被`ZKDPAction`函数调用。此外,它还与跨文件关联的函数(头文件)如..\\PrjCommon\\CommonDef.h, ..\\PrjCommon\\DevDefine.h, AttMath.h, AttCtrlMain.h, ..\\PrjTelCtrlMng\\TelCtrlMng.h有交互。", "file": "M:/研二上/静态分析问题单过滤/gs-zk和扫描结果/PrjAttCtrlMng\\AttDataPre.c", "calls": [ "DoGetInt32From8", "memcpy", "ZERO_TO_ONE", "DoGetInt16From8", "GETDEVINFO" ], "called_by": [ "ZKDPAction" ] }, { "node_id": "Function:Ss_DataPre", "name": "Ss_DataPre", "summary": "该函数`Ss_DataPre`主要负责处理来自多个星敏感器的数据,确保姿态估计的一致性和准确性。首先初始化变量`i`和`j`为0,并定义并初始化了数组`tmpRbs`、`tmpRsi`、`tmpRbi`以及三维数组`tmp_SS`用于存储星敏安装矩阵。接着,通过将指针`tmpAtt`指向`sAttPriData`结构体(位于`ATTCLT_DATA1_ADDR`地址)及`tmpConst`指向`AttCtrlConst_t`结构体(位于`ATTCLT_DATA2_ADDR`地址),获取必要的数据源。如果任一指针为空,则直接返回以避免后续操作中的潜在错误。随后,从`tmpAtt`中提取三个星敏参数的指针存入`PStar`数组。使用`memcpy`从`tmpConst`复制特定数据到`tmp_SS`数组里,对应M_SSA, M_SSB, M_SSC矩阵。对于每个星敏(共`STAR_NUM`个),当其姿态验证状态为`POSE_OK`时,进一步检查当前与前一次四元数之间的差异是否小于预设阈值`SENSOR_ZERO`,若满足条件且曝光计数未达上限(255),则增加曝光计数;否则重置曝光计数。当曝光计数达到或超过5时,设置姿态验证状态为无效(`POSE_NO`)并通过位操作更新数据状态标志。此外,根据四元数计算姿态角,执行矩阵乘法得到新的姿态角,并将其转换回四元数格式存储于`ssExpose_Qbi`。最后确认姿态验证状态仍为有效。此过程中调用了包括`Q2Att`, `MatrixProductHL`, `Att2Q`等在内的多个辅助函数完成具体运算任务。整个过程旨在通过连续监测星敏感器输出的变化情况来动态调整姿态估计过程中的关键参数,从而提高航天器姿态控制系统的精度与可靠性。", "file": "M:/研二上/静态分析问题单过滤/gs-zk和扫描结果/PrjAttCtrlMng\\AttDataPre.c", "calls": [ "memcpy", "Q2Att", "ZERO_TO_ONE", "MatrixProductHL", "Att2Q", "POSE_ABSF" ], "called_by": [ "ZKDPAction" ] }, { "node_id": "Function:Gyro_DataGet", "name": "Gyro_DataGet", "summary": "该函数`Gyro_DataGet`主要负责从三个不同来源的陀螺仪接收原始数据,并经过一系列验证、解析及处理,最终确定每组数据的有效性并据此更新相关状态信息。首先,初始化多个变量,包括计数器、临时数据存储数组和指向陀螺仪参数结构体的指针。接着,从指定内存地址获取姿态主数据和常量数据的指针,并检查这些指针是否为空,如果为空则直接返回。为每个陀螺仪设置对应的参数结构体指针,并通过设备信息函数获取各自的设备信息。然后,读取并解析每个陀螺仪的数据包头和长度,同时记录前一次的陀螺仪速度数据,并初始化当前的速度数据为0。对于每个陀螺仪,根据其信号变化标志判断是否需要处理新数据。如果是,则进一步验证数据包头与预期是否一致以及校验和是否正确。如果数据有效且校验通过,对于前两个陀螺仪,从接收到的数据中提取XYZ轴角速度和温度值,并应用转换矩阵及偏移修正;对于第三个陀螺仪,采用不同的方法解码数据。最后,对所有陀螺仪的数据进行有效性检查,包括比较前后两次的速度差异以检测异常情况,并更新状态标志。此过程旨在确保所收集到的姿态控制所需陀螺仪数据准确可靠。该函数没有明确列出输入参数或返回值,但显然依赖于全局定义的内存地址来获取必要的数据。此外,它调用了如`DoGetInt32From8`, `memcpy`, `ZERO_TO_ONE`, `MatrixProductHL`, `PoseGetInt32From24`, `POSE_ABSF`, `GETDEVINFO`, `POSE_POW`, 和 `memset`等函数完成具体任务,并被`ZKDPAction`函数调用。在实现过程中,还引用了来自`\\PrjCommon\\CommonDef.h`, `\\PrjCommon\\DevDefine.h`, `AttMath.h`, `AttCtrlMain.h`, 和 `\\PrjTelCtrlMng\\TelCtrlMng.h`等多个头文件中的定义和声明。", "file": "M:/研二上/静态分析问题单过滤/gs-zk和扫描结果/PrjAttCtrlMng\\AttDataPre.c", "calls": [ "DoGetInt32From8", "memcpy", "ZERO_TO_ONE", "MatrixProductHL", "PoseGetInt32From24", "POSE_ABSF", "GETDEVINFO", "POSE_POW", "memset" ], "called_by": [ "ZKDPAction" ] }, { "node_id": "Function:Gyro_DataPre", "name": "Gyro_DataPre", "summary": "该函数`Gyro_DataPre`主要负责预处理来自多个陀螺仪的数据,包括验证陀螺仪数据的有效性、选择有效的陀螺仪数据进行矩阵变换以得到最终的角速度输出。此外,当没有单独的陀螺仪可用时,它还会尝试基于配置信息组合不同陀螺仪的数据来生成综合角速度输出。具体来说,首先初始化变量`tmpRbs`为9个0.0的数组,`tmpRbi`为3个0.0的数组,并定义其他局部变量。接着将`ATTCLT_DATA1_ADDR`和`ATTCLT_DATA2_ADDR`地址转换为`sAttPriData`和`AttCtrlConst_t`指针,并检查这些指针是否为空,如果为空则直接返回。从`tmpAtt`中获取`AttIMPTPara_t`结构体指针`pIMU`后,获取三个陀螺仪参数结构体指针并存储在`PGyro`数组中。若任意一个陀螺仪的有效性标志为0x55,则进入下一步处理,遍历每个陀螺仪,初始化`tmpGyro`为POSE_NO,如果当前陀螺仪有效(`GyroIn_AttVld`为POSE_OK),则将该陀螺仪的速度数据复制到`tmpRbi`中,并设置`tmpGyro`为POSE_OK。随后,从`tmpConst`中复制对应陀螺仪的矩阵数据到`tmpRbs`。如果`tmpGyro`为POSE_OK,调用`MatrixProductHL`函数计算矩阵乘积并将结果存入相应陀螺仪的`Gyro_Wi`中。最后,检查所有陀螺仪使用状态是否都为POSE_NO,如果是,则根据`Gyro_ComRESW`中的值选择合适的陀螺仪速度数据及对应的矩阵元素填充`tmpRbs`和`tmpRbi`,同时设置`tmpComTHUse`数组的相应位置为0x55;如果`tmpComTHUse`数组的所有元素都被设置为0x55,表示组合成功,设置`GyroIn_Comb`为POSE_OK,并调用`MatrixProductHL`计算组合后的角速度;否则,设置`GyroIn_Comb`为POSE_NO。此函数无输入参数,也不返回任何值,但会调用`MatrixProductHL`和`memcpy`函数,并被`ZKDPAction`函数所调用。与跨文件关联的头文件包括..\\PrjCommon\\CommonDef.h, ..\\PrjCommon\\DevDefine.h, AttMath.h, AttCtrlMain.h, ..\\PrjTelCtrlMng\\TelCtrlMng.h。", "file": "M:/研二上/静态分析问题单过滤/gs-zk和扫描结果/PrjAttCtrlMng\\AttDataPre.c", "calls": [ "MatrixProductHL", "memcpy" ], "called_by": [ "ZKDPAction" ] }, { "node_id": "Function:Ass_DataGet", "name": "Ass_DataGet", "summary": "该函数`Ass_DataGet`主要用于从特定的AD设备中读取模拟太敏传感器的数据,并将处理后的数据填充到结构体`AssPara_t`中。首先,初始化一系列变量和指针,包括用于索引的`i`和`j`、临时存储整数数据的`tmpDtInt`以及指向不同数据结构的指针`pAss16`, `tmpDevInfo`, `tmpAtt`, 和 `pAss`。接着,通过将`tmpAtt`设置为指向`ATTCLT_DATA1_ADDR`地址处的数据来获取`pAss`的地址,如果`tmpAtt`为空,则直接退出函数。定义了一个包含六个元素的数组`ID`,每个元素对应于特定传感器编号减一的位置。随后调用`GETDEVINFO(DEV_NO_AD)`以获取AD设备信息并将其存储在`tmpDevInfo`中,同时让`pAss16`指向`cDevYCBuffer`缓冲区的一个偏移位置。检查`cDevYCBuffer[0]`是否等于`INFO_SIG_CHANGE`来判断信号是否有变化;若有变化,则进入一个双重循环:外层循环遍历`ASS_NUM`次,内层循环四次,每次迭代时从`pAss16`加上当前`ID[i]`和`j`值所指向的位置读取数据至`tmpDtInt`,然后根据一定公式转换该值后存入`pAss->AssIn_sensor[i][j]`。当检测到信号变化时,设置`pAss->ADIn_Date`为`POSE_OK`表示成功采集数据;反之则设为`POSE_NO`表示失败。此过程旨在确保航天器姿态控制系统能够准确地基于最新的传感器数据进行调整。此外,该函数依赖于`GETDEVINFO`提供的设备信息,并且被`ZKDPAction`函数调用来执行其任务。涉及到跨文件引用的头文件包括`\\PrjCommon\\CommonDef.h`, `\\PrjCommon\\DevDefine.h`, `AttMath.h`, `AttCtrlMain.h`, 和 `\\PrjTelCtrlMng\\TelCtrlMng.h`。", "file": "M:/研二上/静态分析问题单过滤/gs-zk和扫描结果/PrjAttCtrlMng\\AttDataPre.c", "calls": [ "GETDEVINFO" ], "called_by": [ "ZKDPAction" ] }, { "node_id": "Function:Ass_DataPre", "name": "Ass_DataPre", "summary": "该函数`Ass_DataPre`主要负责航天器姿态控制系统中太阳敏感器数据的预处理工作。首先,它初始化了多个变量,包括循环计数器、临时数组和结构体指针。接着,从指定地址获取`tmpAtt`和`tmpConst`的值,如果任一为空则直接返回。随后,获取指向`AssPara`、`sIMPTPara`和`sModePara`的指针。当`ADIn_Date`状态为`POSE_OK`时,对前四个传感器数据进行累加,并根据累加结果设置其有效性标志;接着对剩余的传感器执行相同操作,但使用不同的阈值。若特定模式条件满足,则将第五个模拟太敏的状态设为无效。遍历所有模拟太敏(除最后一个外),寻找信号强度最大且状态有效的那个,同时更新一个临时数组以记录哪些太敏被考虑过。如果没有找到任何有效的太敏,则标记太阳矢量计算为无效;否则,基于选定的最大信号强度太敏的数据,通过一系列数学运算确定太阳矢量的方向角和仰角,并利用矩阵乘法转换坐标系,最终确认太阳矢量有效。对于帆板模拟太敏,重复类似的处理过程来计算其太阳矢量参数,如果成功则标记相关字段为有效,否则标记为无效。此函数无返回值,但会修改传入的结构体中的某些字段。在执行过程中,调用了如`POSE_ATAN2F`、`memcpy`等辅助函数完成具体任务,并由`ZKDPAction`函数触发。此外,该函数依赖于来自`\\PrjCommon\\CommonDef.h`等多个头文件定义的数据类型及常量。", "file": "M:/研二上/静态分析问题单过滤/gs-zk和扫描结果/PrjAttCtrlMng\\AttDataPre.c", "calls": [ "POSE_ATAN2F", "memcpy", "POSE_ATANF", "MatrixProductHL", "POSE_SQRTF", "POSE_SINF", "fabs", "POSE_COSF" ], "called_by": [ "ZKDPAction" ] }, { "node_id": "Function:Mag_DataGet", "name": "Mag_DataGet", "summary": "该函数`Mag_DataGet`主要负责从AD采集设备读取磁强计原始数据,并基于预定义的补偿参数对这些数据进行处理以得到校正后的磁场强度值。首先,初始化变量`tmpMag_Bb_Limit`为55000.0,随后定义并初始化多个局部变量,包括指针和数组。接着,从指定地址获取指向`sAttPriData`结构体的指针`tmpAtt`和指向`AttCtrlConst_t`结构体的指针`tmpConst`,如果任一为空则直接返回。之后,获取指向`MagPara_t`结构体的指针`pMag`,并通过调用`GETDEVINFO(DEV_NO_AD)`函数获取设备信息存储在`tmpDevInfo`中。将`tmpDevInfo`中的数据缓冲区地址转换为`INT16`类型的指针`pMag16`。如果`tmpDevInfo`的数据缓冲区首字节等于`INFO_SIG_CHANGE`,则进入磁强计补偿矩阵计算逻辑:对于每个磁强计(共两个),遍历其三个轴向分量,根据AD采集值及预设参数计算补偿后的磁场强度`tmpVm`。检查第一个磁强计的各轴向分量是否超过阈值`tmpMag_Bb_Limit`,若超过,则更新状态标志`MagIn_DataSta`相应位,并设置有效性标志`MagIn_Valid[0]`为无效;否则,将计算结果复制到`pMag->Mag_Bc_MeaAB[0]`,并将`MagIn_Valid[0]`设置为有效。对第二个磁强计执行与上述相同的检查和处理流程。若`tmpDevInfo`的数据缓冲区首字节不等于`INFO_SIG_CHANGE`,则标记所有数据为未更新状态,并设置两个磁强计的有效性标志`MagIn_Valid[0]`和`MagIn_Valid[1]`为无效。此过程确保了只有当数据信号发生变化时才会执行上述操作,从而保证了系统的响应性和安全性。该函数无输入参数,也无返回值,但会调用`ZERO_TO_ONE, POSE_ABSF, GETDEVINFO, memcpy`等函数,并被`ZKDPAction`函数所调用。此外,它还涉及到跨文件关联的头文件如..\\PrjCommon\\CommonDef.h, ..\\PrjCommon\\DevDefine.h, AttMath.h, AttCtrlMain.h, ..\\PrjTelCtrlMng\\TelCtrlMng.h。", "file": "M:/研二上/静态分析问题单过滤/gs-zk和扫描结果/PrjAttCtrlMng\\AttDataPre.c", "calls": [ "ZERO_TO_ONE", "POSE_ABSF", "GETDEVINFO", "memcpy" ], "called_by": [ "ZKDPAction" ] }, { "node_id": "Function:Mag_DataPre", "name": "Mag_DataPre", "summary": "该函数`Mag_DataPre`主要用于航天器姿态控制系统中磁强计数据的预处理。首先,它初始化了包括`tmKm`矩阵、`tmpMag_Bc_MeaAB`向量和`tmpComTHUse`数组在内的多个变量,并声明了指向`sAttPriData`和`AttCtrlConst_t`结构体的指针。接着,将`tmpAtt`设置为指向`ATTCLT_DATA1_ADDR`地址的数据,而`tmpConst`则指向`ATTCLT_DATA2_ADDR`地址的数据;如果这两个指针任一为空,则直接返回,不执行后续操作。通过`tmpAtt`获取到`MagPara_t`和`AttIMPTPara_t`类型的指针`pMag`与`pIMU`后,根据磁强计A的有效性标志`pMag->MagIn_Valid[0]`是否为`POSE_OK`来决定是否复制`M_MAG[0]`至`tmKm[0]`并调用`MatrixPlusVectorN`函数进行数据处理;对于磁强计B也执行类似的操作。当两个IMU磁传感器状态均不可用时(即`pIMU->MagUseState[0]`和`pIMu->MagUseState[1]`均为`POSE_NO`),则针对每个维度i (0-2),依据`Mag_ComRESW[i]`选择相应的磁强计数据填充`tmKm`矩阵及`tmpMag_Bc_MeaAB`向量,并设定`tmpComTHUse[i]`为`0x55`。若所有三个维度的`tmpComTHUse`值都被设为`0x55`,则再次利用`MatrixPlusVectorN`基于`tmKm`和`tmpMag_Bc_MeaAB`计算综合磁矢量,并标记`pMag->MagIn_Valid[2]`为有效;反之,则将其标记为无效。此过程旨在确保从不同来源获得最准确可靠的磁矢量信息用于姿态控制。该函数没有显式的输入参数或返回值,但依赖于全局定义的内存地址以及外部提供的数学运算支持如`MatrixPlusVectorN`等。此外,`Mag_DataPre`由`ZKDPAction`调用,并且涉及到跨文件引用,比如使用了来自`\\PrjCommon\\CommonDef.h`, `\\PrjCommon\\DevDefine.h`, `AttMath.h`, `AttCtrlMain.h`, 和`\\PrjTelCtrlMng\\TelCtrlMng.h`中的定义。", "file": "M:/研二上/静态分析问题单过滤/gs-zk和扫描结果/PrjAttCtrlMng\\AttDataPre.c", "calls": [ "MatrixPlusVectorN", "memcpy" ], "called_by": [ "ZKDPAction" ] }, { "node_id": "Function:Whl_DataGet", "name": "Whl_DataGet", "summary": "`Whl_DataGet`函数主要负责从指定地址读取飞轮相关数据,并进行数据完整性校验,进而更新飞轮的状态信息。该函数首先初始化一系列变量,包括用于存储中间结果的`sum`, `i`, `j`, `tmpU16`, `tmpI16`等以及特定于飞轮头部、尾部和ID的临时变量。接着定义并初始化指向`sAttPriData`和`AttCtrlConst_t`结构体的指针`tmpAtt`与`tmpConst`,分别指向预设的数据地址`ATTCLT_DATA1_ADDR`和`ATTCLT_DATA2_ADDR`。如果任一指针为空,则立即返回以避免后续操作中的潜在错误。通过`tmpAtt`获取到`WhlPara_t`类型的指针`PWhl`后,从`tmpConst`中复制飞轮ID至`tmpWhlHEADID`数组内。随后,将`PWhl`中的`Whl_Rate`和`Whl_Time`字段值分别复制到`Whl_RatePre`和`Whl_TimePRE`中作为前一次记录。对于每个飞轮(循环次数由`WHEEL_NUM`决定),函数会获取当前飞轮设备信息`tmpDevInfo`,然后读取飞轮数据包头、包头校验值及包尾。当检测到飞轮数据信号发生变化时(`INFO_SIG_CHANGE`),计算数据包的校验和,并验证包尾、包头校验值及飞轮ID是否正确;若验证失败,则设置飞轮数据无效标志`POSE_NO`并更新错误状态;反之,解析飞轮的时间、转速、电流和温度等参数,并标记数据为有效(`POSE_OK`)。若飞轮数据信号未变化,则直接设置飞轮数据无效标志`POSE_NO`并更新错误状态。此过程中,函数依赖于`DoGetInt32From8`, `memcpy`, `DoGetFloatFrom8`, `ZERO_TO_ONE`, 和`GETDEVINFO`等辅助函数来完成具体任务,并且它本身是由`ZKDPAction`函数调用来执行的。此外,`Whl_DataGet`还涉及到跨文件引用,如`\\PrjCommon\\CommonDef.h`, `\\PrjCommon\\DevDefine.h`, `AttMath.h`, `AttCtrlMain.h`, 以及`\\PrjTelCtrlMng\\TelCtrlMng.h`等头文件中的定义或声明。", "file": "M:/研二上/静态分析问题单过滤/gs-zk和扫描结果/PrjAttCtrlMng\\AttDataPre.c", "calls": [ "DoGetInt32From8", "memcpy", "DoGetFloatFrom8", "ZERO_TO_ONE", "GETDEVINFO" ], "called_by": [ "ZKDPAction" ] }, { "node_id": "Function:Whl_DataPre", "name": "Whl_DataPre", "summary": "`Whl_DataPre`函数主要负责对存储在特定地址`ATTCLT_DATA1_ADDR`处的轮子相关数据进行预处理。首先,它初始化变量`i`为0,并声明并初始化指针`tmpAtt`和`PWhl`为NULL。接着,将`tmpAtt`指向`ATTCLT_DATA1_ADDR`地址处的数据,并检查其是否为空,若为空则直接返回。通过`tmpAtt`获取`PWhl`的地址后,该函数开始一个从0到`WHEEL_NUM-1`的循环,在此过程中,对于每个轮子,如果其状态`PWhl->WhlIn_Valid[i]`为`POSE_OK`,则进一步判断当前轮子的速度变化量(即`PWhl->Whl_Rate[i]`与`PWhl->Whl_RatePre[i]`之差的绝对值)是否大于阈值`100 * RADS2RPM`。如果速度变化量超过阈值,则更新该轮子的数据状态位`PWhl->WhlIn_DataSta[i]`并将有效性标志设置为`POSE_NO`;否则,保持或设置该轮子的有效性标志为`POSE_OK`。此过程旨在确保只有那些速度变化处于合理范围内的轮子数据被标记为有效,从而提高系统整体数据的可靠性。该函数无输入参数且不返回任何值,但其执行依赖于`ZERO_TO_ONE`和`POSE_ABSF`等辅助函数提供的支持,并作为`ZKDPAction`函数的一部分被调用。此外,为了正确实现其功能,`Whl_DataPre`还引用了来自多个头文件如`\\PrjCommon\\CommonDef.h`, `\\PrjCommon\\DevDefine.h`, `AttMath.h`, `AttCtrlMain.h`, 以及`\\PrjTelCtrlMng\\TelCtrlMng.h`中的定义和声明。", "file": "M:/研二上/静态分析问题单过滤/gs-zk和扫描结果/PrjAttCtrlMng\\AttDataPre.c", "calls": [ "ZERO_TO_ONE", "POSE_ABSF" ], "called_by": [ "ZKDPAction" ] }, { "node_id": "Function:PPU_DataPre", "name": "PPU_DataPre", "summary": "该函数`PPU_DataPre`主要负责处理来自推进单元(PPU)的数据。首先,它初始化多个变量如`tmpPPUHEAD`, `tmpPPSUM`, `sum`, `i`, `TempSatTime`数组等,并声明指向不同结构体的指针。接着,将`ATTCLT_DATA1_ADDR`和`ATTCLT_DATA2_ADDR`地址转换为`sAttPriData`和`AttCtrlConst_t`类型的指针并赋值给`tmpAtt`和`tmpConst`;如果任一指针为空,则直接返回。通过`tmpAtt`获取模式参数、PPU参数及轨道控制信息的指针后,利用设备信息缓冲区计算`tmpPPUHEAD`与`tmpPPSUM`。调用`GetTime`函数更新卫星时间`TempSatTime`。检查设备信息缓冲区首字节是否表示信号变化;如果是,则进入数据校验流程,即计算从指定偏移开始的数据段的校验和并与`tmpPPSUM`比较,同时验证`tmpPPUHEAD`是否等于`PPU_CMD_LEN`以确保数据有效性。若数据有效,更新PPU请求计数器的当前值与前一值,并据此判断PPU数据的有效性状态。对于有效的数据,基于常量调整电压和电流值,并更新点火标志。反之,若数据校验失败或没有信号变化,则设置相关标志表明PPU数据无效。最后,根据当前与之前的点火状态更新总点火次数、连续点火计数以及特定轨道控制包下的点火开始/结束时间记录。此函数无输入参数且不返回任何值,但依赖于`ZERO_TO_ONE`, `DoGetInt16From8`, `GetTime`, `GETDEVINFO`等函数提供的支持,并被`ZKDPAction`函数调用。此外,该函数还引用了跨文件定义的一些类型和常量,这些定义位于`\\PrjCommon\\CommonDef.h`, `\\PrjCommon\\DevDefine.h`, `AttMath.h`, `AttCtrlMain.h`, 和`\\PrjTelCtrlMng\\TelCtrlMng.h`头文件中。", "file": "M:/研二上/静态分析问题单过滤/gs-zk和扫描结果/PrjAttCtrlMng\\AttDataPre.c", "calls": [ "ZERO_TO_ONE", "DoGetInt16From8", "GetTime", "GETDEVINFO" ], "called_by": [ "ZKDPAction" ] }, { "node_id": "Function:SSABC_CC", "name": "SSABC_CC", "summary": "该函数`SSABC_CC`主要用于航天器姿态控制系统中星敏感器(Star Sensor, SS)数据的一致性检查。首先,它初始化一系列变量,包括计数器`tmpCheckCnt`、用于存储计算结果的数组`tmpLb`、`tmpLi`、`tmpRbs`、`tmpRsi`、`tmpRis`等,以及一些浮点型变量如`tmpAab_b`、`tmpAbc_b`等和标志位`ssA_CCFlg`、`ssB_CCFlg`、`ssC_CCFlg`。接着,从指定地址获取姿态数据和常量数据指针,并确保这些指针非空;随后访问特定的姿态参数结构体`SsPara_t`实例`ssA`、`ssB`、`ssC`,并将每个星敏感器的有效性状态存入数组`Valid`中。之后,从常量数据中复制星敏感器本体系下的旋转矩阵到`tmpRbs`,并计算星敏感器在本体系下的光轴矢量存储于`tmpLb`,利用`CalVecArc`函数计算星敏感器之间在本体系下光轴矢量的夹角。同时,转换每个星敏感器的姿态四元数为惯性系下的旋转矩阵及其转置矩阵,从中提取出光轴矢量存入`tmpLi`,再次使用`CalVecArc`来计算惯性系下星敏感器间光轴矢量的夹角。根据有效性状态设置初始校验标志后,通过比较不同星敏感器对之间的角度差值与预设阈值更新相应星敏感器的校验标志为正确,并增加校验计数器`tmpCheckCnt`。如果至少有一个星敏感器被标记为校验正确,则将所有仍处于不确定状态的星敏感器的校验标志改为错误。最后,将最终确定的校验标志写回各自的`SsPara_t`结构体中。此过程旨在基于星敏感器提供的姿态信息,在考虑了它们各自的有效性之后,通过比较本体系与惯性系下光轴矢量间的夹角差异执行一致性检查,从而更新每个星敏感器的状态标志以反映其数据的一致性水平。该函数不接受任何输入参数,也不返回任何值,但依赖于多个其他函数如`MatrixTransposeHL`、`memcpy`、`Q2Att`、`CalVecArc`及`POSE_ABSF`完成其任务,并由`Att_CrossCheck`调用。此外,它还引用了来自`..\\PrjCommon\\CommonDef.h`、`..\\PrjCommon\\DevDefine.h`、`AttMath.h`、`AttCtrlMain.h`及`..\\PrjTelCtrlMng\\TelCtrlMng.h`头文件中的定义或实现。", "file": "M:/研二上/静态分析问题单过滤/gs-zk和扫描结果/PrjAttCtrlMng\\AttDataPre.c", "calls": [ "MatrixTransposeHL", "memcpy", "Q2Att", "CalVecArc", "POSE_ABSF" ], "called_by": [ "Att_CrossCheck" ] }, { "node_id": "Function:StarSun_CC", "name": "StarSun_CC", "summary": "该函数`StarSun_CC`主要用于基于星敏感器数据和辅助传感器信息来校验并更新太阳矢量的有效性状态。首先,初始化一系列变量包括`ssA_CCFlg`, `ssB_CCFlg`, `ssC_CCFlg`, 和 `Sun_CCFlg`等,并将它们设置为不确定状态。接着,从指定地址获取姿态数据指针`tmpAtt`与常量数据指针`tmpConst`,如果任一为空则直接返回。通过`tmpAtt`进一步初始化星敏感器参数指针`ssA`, `ssB`, `ssC`以及太阳矢量有效性标志`pASS`和轨道参数`pOrbit`。随后,检查是否满足一系列校验条件(如星敏感器校正标志、太阳矢量有效性和姿态有效性),若不满足这些条件,则函数提前返回。接下来,计算每个星敏感器在本体系下的太阳矢量`tmpSb`,并对每个星敏感器计算其太阳矢量与太敏太阳矢量之间的夹角。根据夹角值及星敏感器的姿态有效性更新相应的校正标志(`ssA_CCFlg`, `ssB_CCFlg`, `ssC_CCFlg`)和太阳矢量校正标志`Sun_CCFlg`。如果至少有一个星敏感器的校正成功,则将未被校正的星敏感器标记为错误;如果没有一个星敏感器能够成功校正太阳矢量,则将太阳矢量校正标志设为不确定。最后,更新各星敏感器的校正标志字段以及太阳矢量校正标志。此函数无输入参数且无返回值,但依赖于`MatrixProductHL`, `Q2Att`, `CalVecArc`等函数进行必要的数学运算,并由`Att_CrossCheck`调用以完成整个姿态交叉验证过程。此外,它还引用了多个跨文件定义的数据结构和常量,涉及头文件包括..\\PrjCommon\\CommonDef.h, ..\\PrjCommon\\DevDefine.h, AttMath.h, AttCtrlMain.h, ..\\PrjTelCtrlMng\\TelCtrlMng.h。", "file": "M:/研二上/静态分析问题单过滤/gs-zk和扫描结果/PrjAttCtrlMng\\AttDataPre.c", "calls": [ "MatrixProductHL", "Q2Att", "CalVecArc" ], "called_by": [ "Att_CrossCheck" ] }, { "node_id": "Function:StarCheckSun", "name": "StarCheckSun", "summary": "该函数`StarCheckSun`主要用于基于当前卫星的姿态数据和环境参数,检查并验证太阳矢量是否符合预期。首先定义并初始化一系列变量,包括四元数`tmpQbi`、旋转矩阵`tmpRbi`、本体系下的太阳矢量`tmpSb`、角度`tmpAsm`以及指向结构体的指针`tmpAtt`, `tmpConst`, `ssA`, `ssB`, `ssC`, `pASS`, 和`pOrbit`。接着将`tmpAtt`设置为指向`ATTCLT_DATA1_ADDR`地址的数据,并将`tmpConst`设置为指向`ATTCLT_DATA2_ADDR`地址的数据;如果任一为空,则直接返回。随后,分别设置`ssA`, `ssB`, `ssC`指向`tmpAtt`中的特定太阳传感器参数,`pASS`指向姿态控制辅助参数,`pOrbit`指向轨道参数。若辅助太阳矢量验证标志`Ass_SunVecVld`为0x00或者主要姿态控制级别`MJCLv`不处于有效状态(即等于`POSE_NO`),则设置`AssCrCheckFlg`为`NO_CC`后返回。根据星敏感器校正标志`ssCrCheckFlg`选择正确的四元数`ssExpose_Qbi`复制到`tmpQbi`中,如果没有任何一个星敏感器的状态是`CC_CORRECT`,则直接返回。使用`Q2Att`函数将四元数`tmpQbi`转换成旋转矩阵`tmpRbi`,利用`MatrixProductHL`计算本体系下的太阳矢量`tmpSb`,并通过调用`CalVecArc`来计算`tmpSb`与`pASS->Ass_SunVecb`之间的夹角,存储结果于`tmpAsm`。最后,根据`tmpAsm`与预设阈值`SS_ASS_CThr`比较的结果更新`pASS->AssCrCheckFlg`:若小于阈值,则设置为`CC_CORRECT`;否则设置为`CC_ERROR`。此过程中涉及到被调用的函数有`MatrixProductHL`, `memcpy`, `Q2Att`, `CalVecArc`,而调用此函数的是`Att_CrossCheck`。此外,该函数还引用了来自多个头文件如`\\PrjCommon\\CommonDef.h`, `\\PrjCommon\\DevDefine.h`, `AttMath.h`, `AttCtrlMain.h`, `\\PrjTelCtrlMng\\TelCtrlMng.h`中的定义或声明。", "file": "M:/研二上/静态分析问题单过滤/gs-zk和扫描结果/PrjAttCtrlMng\\AttDataPre.c", "calls": [ "MatrixProductHL", "memcpy", "Q2Att", "CalVecArc" ], "called_by": [ "Att_CrossCheck" ] }, { "node_id": "Function:StarCheckGyro", "name": "StarCheckGyro", "summary": "该函数`StarCheckGyro`主要用于航天器上陀螺仪数据的准确性检查与校正。首先,它定义了局部变量包括两个整型变量`i, j`,一个三维数组`deltaA`用于存储三轴角速度偏差,以及指向`sAttPriData`、`AttCtrlConst_t`和`SsPara_t`结构体的指针。接着,将`tmpAtt`设置为指向地址`ATTCLT_DATA1_ADDR`处的数据,并将`tmpConst`设置为指向地址`ATTCLT_DATA2_ADDR`处的数据;如果这两个指针任一为空,则直接返回,不执行后续操作。然后初始化指向`SsPara_t`类型的三个指针`ssA`, `ssB`, `ssC`,分别对应于`tmpAtt->sPerPara.SsPara`数组中的前三个元素,同时初始化指向`GyroPara_t`类型的三个指针`pGyro[0]`, `pGyro[1]`, `pGyro[2]`,分别对应于`tmpAtt->sPerPara.GyroPara`数组中的前三个元素。根据`ssA`, `ssB`, 或`ssC`中哪个的`ssCrCheckFlg`字段值等于`CC_CORRECT`来决定使用哪一个作为参考,计算每个陀螺仪在X、Y、Z三个轴上的角速度偏差,并存储到`deltaA`数组中;如果这三个都不满足条件,则函数直接返回。最后,遍历所有陀螺仪(数量由`GYRO_NUM`定义),根据其当前状态及与设定阈值`tmpConst->SS_GYRO_CThr`比较后的结果更新每个陀螺仪的状态标志`GyroCrCheckFlg`:如果陀螺仪数据无效则设为`NO_CC`;如果所有轴上的偏差都小于阈值则设为`CC_CORRECT`;否则设为`CC_ERROR`。此过程旨在确保航天器姿态控制系统能够基于准确可靠的陀螺仪数据进行工作。该函数没有显式的输入参数或返回值,但依赖于全局或静态内存中的特定位置的数据。此外,`POSE_ABSF`函数被调用以计算绝对差值,而`StarCheckGyro`本身则被`Att_CrossCheck`函数调用。涉及的跨文件关联包括..\\PrjCommon\\CommonDef.h, ..\\PrjCommon\\DevDefine.h, AttMath.h, AttCtrlMain.h, ..\\PrjTelCtrlMng\\TelCtrlMng.h等头文件。", "file": "M:/研二上/静态分析问题单过滤/gs-zk和扫描结果/PrjAttCtrlMng\\AttDataPre.c", "calls": [ "POSE_ABSF" ], "called_by": [ "Att_CrossCheck" ] }, { "node_id": "Function:StarCheckMag", "name": "StarCheckMag", "summary": "该函数`StarCheckMag`主要用于基于星敏感器数据验证磁强计读数的有效性。首先,它定义了局部变量包括数组`deltaA`、`tmpQbi`、`tmpRbi`和`tmpSb`。接着声明并初始化指向结构体的指针`tmpAtt`、`tmpConst`、`ssA`、`ssB`、`ssC`、`pMag`、`pEnv`和`pObtIn`。将`tmpAtt`设置为指向`ATTCLT_DATA1_ADDR`地址处的数据,并将`tmpConst`设置为指向`ATTCLT_DATA2_ADDR`地址处的数据;如果任一指针为空,则函数直接返回。通过`tmpAtt`获取轨道参数`pObtIn`和其他相关参数。检查`pObtIn->OrbitVld`是否为0x00,如果是,则设置磁强计校验标志`MagCrCheckFlg`为`NO_CC`后返回。根据星敏感器的状态(`ssCrCheckFlg`)选择合适的四元数`tmpQbi`进行复制。如果没有找到合适的状态,则函数返回。使用`Q2Att`函数将四元数`tmpQbi`转换为旋转矩阵`tmpRbi`。利用`MatrixProductHL`计算本体系下的太阳矢量`tmpSb`。遍历所有磁强计(数量由`MAG_NUM`定义),对于每个有效的磁强计输入:计算当前磁强计测量值与太阳矢量之间的角度差`deltaA[i]`。如果该角度小于预设阈值`SS_MAG_CThr`,则标记此磁强计状态为`CC_CORRECT`;否则标记为`CC_ERROR`。对于无效的磁强计输入,将其状态标记为`NO_CC`。此函数无输入参数,也不返回任何值,但其执行依赖于被调用的函数如`MatrixProductHL`、`memcpy`、`Q2Att`及`CalVecArc`,同时它自身被`Att_CrossCheck`函数调用。此外,该函数还引用了多个跨文件关联的头文件,包括`\\PrjCommon\\CommonDef.h`、`\\PrjCommon\\DevDefine.h`、`AttMath.h`、`AttCtrlMain.h`以及`\\PrjTelCtrlMng\\TelCtrlMng.h`。", "file": "M:/研二上/静态分析问题单过滤/gs-zk和扫描结果/PrjAttCtrlMng\\AttDataPre.c", "calls": [ "MatrixProductHL", "memcpy", "Q2Att", "CalVecArc" ], "called_by": [ "Att_CrossCheck" ] }, { "node_id": "Function:Gyro_CC", "name": "Gyro_CC", "summary": "该函数`Gyro_CC`主要用于航天器姿态控制系统中陀螺仪数据的一致性校验。首先,它初始化了几个关键变量,包括索引`i`、有效性数组`Valid[3]`以及计数器`tmpCnt`,并声明了两个指针`tmpAtt`和`tmpConst`分别指向特定地址处的数据结构。如果这两个指针中的任何一个为空,则函数立即返回,避免后续操作。接着,通过`tmpAtt`初始化了一个包含三个陀螺仪参数结构体指针的数组`pGyro[3]`。对于每个陀螺仪(共`GYRO_NUM`个),函数将其一致性检查标志`GyroCrCheckFlg`设置为`NO_CC`,然后根据其有效性标志`GyroIn_AttVld`是否等于`0x55`来决定是否将该标志改为`CC_UNCERTAIN`。接下来,函数比较每对陀螺仪之间的角速度差值是否在预设阈值内,并据此更新它们的一致性检查标志为`CC_CORRECT`或保持不变,同时使用`tmpCnt`记录满足条件的陀螺仪数量。最后,对于那些仍标记为`NO_CC`或`CC_UNCERTAIN`但未被确认正确的陀螺仪,如果至少有一个陀螺仪被认为是正确的(`tmpCnt > 0`),则将其状态更改为`CC_ERROR`。此过程有助于识别出可能存在问题的陀螺仪数据,从而提高整个姿态控制系统的可靠性和准确性。此外,该函数与`POSE_ABSF`函数紧密相关,后者用于计算角度差异的绝对值;而`Gyro_CC`本身则是由`Att_CrossCheck`函数调用执行的。为了实现上述功能,`Gyro_CC`依赖于多个跨文件定义的数据结构和常量,这些定义位于`\\PrjCommon\\CommonDef.h`, `\\PrjCommon\\DevDefine.h`, `AttMath.h`, `AttCtrlMain.h` 和 `\\PrjTelCtrlMng\\TelCtrlMng.h`等头文件中。", "file": "M:/研二上/静态分析问题单过滤/gs-zk和扫描结果/PrjAttCtrlMng\\AttDataPre.c", "calls": [ "POSE_ABSF" ], "called_by": [ "Att_CrossCheck" ] }, { "node_id": "Function:Mag_CC", "name": "Mag_CC", "summary": "该函数`Mag_CC`主要用于评估航天器磁力计的校准状态。首先,它定义了局部变量`i`、数组`deltaA`及指针`tmpAtt`、`tmpConst`和`pMag`。接着,将`tmpAtt`指向地址`ATTCLT_DATA1_ADDR`,而`tmpConst`则指向`ATTCLT_DATA2_ADDR`。如果任一指针为`NULL`,函数立即返回。随后,通过`pMag`访问`tmpAtt`中的`MagPara`结构体。函数检查`pMag->MagIn_Valid[0]`与`pMag->MagIn_Valid[1]`是否都等于`POSE_OK`,若条件满足,则对每个维度(共三个)计算两个磁场测量值之间的绝对差,并将结果存储于`deltaA`数组中。之后,判断所有维度上的差值是否均小于阈值`tmpConst->MAG_MAG_CThr`。如果所有差值都小于阈值,设置`pMag->MagCrCheckFlg[0]`和`pMag->MagCrCheckFlg[1]`为`CC_CORRECT`;否则,设为`CC_UNCERTAIN`。当步骤5的条件不满足时(即至少有一个`MagIn_Valid`不为`POSE_OK`),则将`pMag->MagCrCheckFlg[0]`和`pMag->MagCrCheckFlg[1]`设置为`NO_CC`。此过程旨在基于两次磁场测量数据的有效性和差异性来更新磁力计读数的可靠性标志位。该函数没有显式输入参数或返回值,但依赖于全局内存位置的数据。在执行过程中,调用了`POSE_ABSF`函数以计算绝对值,并且自身被`Att_CrossCheck`函数调用。此外,`Mag_CC`还引用了多个跨文件定义的数据类型和常量,这些定义位于`..\\PrjCommon\\CommonDef.h`, `..\\PrjCommon\\DevDefine.h`, `AttMath.h`, `AttCtrlMain.h`, 和`..\\PrjTelCtrlMng\\TelCtrlMng.h`头文件中。", "file": "M:/研二上/静态分析问题单过滤/gs-zk和扫描结果/PrjAttCtrlMng\\AttDataPre.c", "calls": [ "POSE_ABSF" ], "called_by": [ "Att_CrossCheck" ] }, { "node_id": "Function:Att_CrossCheck", "name": "Att_CrossCheck", "summary": "该函数`Att_CrossCheck`主要用于航天器姿态控制系统中,通过星敏感器的有效性状态来选择合适的校验流程。首先,它将`ATTCLT_DATA1_ADDR`地址转换为`sAttPriData`类型的指针`tmpAtt`,如果`tmpAtt`为空则直接返回。接着初始化指向`SsPara_t`类型的三个指针`ssA`, `ssB`, `ssC`以及指向`AssPara_t`类型的指针`pASS`,分别指向`tmpAtt`中对应的数据结构。计算三个星敏感器有效性的总和`tmpValidSum`后,根据其值决定后续操作:当有两个或三个星敏感器有效时(`tmpValidSum`等于`0xAA`或`0xFF`),先进行星敏感器间的互校验`SSABC_CC()`,若至少有一个星敏感器校验正确,则使用正常工作的星敏感器依次校准太阳传感器、陀螺仪和磁强计;若无星敏感器校验正确但太阳矢量数据有效,则执行星敏感器与太阳传感器之间的互校验`StarSun_CC()`,并基于结果继续校准其他设备;若太阳矢量数据也无效,则仅校准陀螺仪和磁强计。当只有一个星敏感器有效且太阳矢量数据有效时,同样执行星敏感器与太阳传感器的互校验逻辑;反之,则直接校准陀螺仪和磁强计。最后,在没有任何有效的星敏感器情况下,直接对陀螺仪和磁强计进行校准。此过程中调用了多个辅助函数如`Gyro_CC, StarCheckSun, StarCheckMag, Mag_CC, SSABC_CC, StarSun_CC, StarCheckGyro`等,并被`ZKDPAction`函数所调用。此外,该函数还涉及到跨文件引用,包括了来自`..\\PrjCommon\\CommonDef.h, ..\\PrjCommon\\DevDefine.h, AttMath.h, AttCtrlMain.h, ..\\PrjTelCtrlMng\\TelCtrlMng.h`头文件中的定义。", "file": "M:/研二上/静态分析问题单过滤/gs-zk和扫描结果/PrjAttCtrlMng\\AttDataPre.c", "calls": [ "Gyro_CC", "StarCheckSun", "StarCheckMag", "Mag_CC", "SSABC_CC", "StarSun_CC", "StarCheckGyro" ], "called_by": [ "ZKDPAction" ] }, { "node_id": "Function:ZKDPAction", "name": "ZKDPAction", "summary": "`ZKDPAction`函数主要负责航天器姿态控制系统中各类传感器数据的获取与预处理工作。首先,它从`ATTCLT_DATA2_ADDR`地址处获取一个指向`AttCtrlConst_t`类型的指针`tmpConst`;如果该指针为空,则立即返回,终止执行。接着,通过调用`ZKDPInit()`完成初始化步骤。随后,针对星敏感器、陀螺仪、模拟太敏、磁强计以及飞轮这几种关键的姿态控制传感器,分别调用相应的`DataGet`和`DataPre`函数来获取并预处理它们的数据。在非`MINMODULE_TYPE`定义的情况下,还会额外调用`PPU_DataPre()`对电推系统数据进行预处理,并且当`tmpConst->Allow_Sensor_CThr`字段值为0x55时,进一步执行`Att_CrossCheck()`以实现不同传感器间的数据一致性校验。此函数无输入参数,也不返回任何值。它被`ZKAction`函数所调用,并依赖于多个来自不同头文件如`\\PrjCommon\\CommonDef.h`, `\\PrjCommon\\DevDefine.h`, `AttMath.h`, `AttCtrlMain.h`, 和`\\PrjTelCtrlMng\\TelCtrlMng.h`中的函数来完成其任务。", "file": "M:/研二上/静态分析问题单过滤/gs-zk和扫描结果/PrjAttCtrlMng\\AttDataPre.c", "calls": [ "Ss_DataGet", "Ass_DataGet", "ZKDPInit", "PPU_DataPre", "Mag_DataPre", "Ass_DataPre", "Whl_DataPre", "Mag_DataGet", "Whl_DataGet", "Gyro_DataGet", "Gyro_DataPre", "Ss_DataPre", "Att_CrossCheck" ], "called_by": [ "ZKAction" ] }, { "node_id": "Function:ZKEnvInit", "name": "ZKEnvInit", "summary": "`ZKEnvInit`函数主要负责初始化卫星姿态控制环境参数。首先,它定义并初始化了两个指针:一个是指向`sAttPriData`结构体的`tmpAtt`,其值设为`ATTCLT_DATA1_ADDR`;另一个是指向`AttCtrlConst_t`结构体的`tmpConst`,其值设为`ATTCLT_DATA2_ADDR`。接着,该函数检查这两个指针是否为空,如果任一为空则直接返回,以避免后续操作中可能出现的空指针异常。随后,定义了一个指向`sAttEnvPara_t`结构体的指针`pEnv`并初始化为`NULL`,然后将其设置为`tmpAtt->sEnvPara`的地址。接下来,将`pEnv`中的`BetaAngCntIn`成员设为0,并将`OrbAttRate_Wo`成员设为9.6466E-4f,用于表示轨道角速度。此外,还初始化了与地影判断相关的成员变量,包括将`BetaAng`设为0.0f,`BetaShadow`设为0x55(其中0x55代表阴影区,而0代表阳照区),同时将`BetaAngCntIn`和`BetaAngCntOut`均设为0,用作卫星进出影状态转换时的计数器。进一步地,设置了`tmpConst`中的`BetaAngLimit`成员为57.5度转换成弧度后的值,作为卫星进出影判断的标准角度阈值。最后,将`pEnv`中的`SatTime_s`和`SatTime_ms`成员分别设为0,初始化星上时间。此函数没有输入参数也不返回任何值,但它是被`AttCtrlInit`函数调用来完成初始化过程的一部分,并且涉及到跨文件引用如`AttCtrlMain.h`和`AttMath.h`中的定义或声明。", "file": "M:/研二上/静态分析问题单过滤/gs-zk和扫描结果/PrjAttCtrlMng\\AttEnvMod.c", "calls": [], "called_by": [ "AttCtrlInit" ] }, { "node_id": "Function:ZKEnvCycInit", "name": "ZKEnvCycInit", "summary": "`ZKEnvCycInit`函数主要负责初始化航天器姿态控制模块中的环境参数,特别是与太阳矢量及磁场相关的数据。该函数首先定义了一个UINT8类型的变量i并将其初始化为0,接着将指向`sAttPriData`结构体的指针`tmpAtt`设置为`ATTCLT_DATA1_ADDR`地址处的数据,并检查`tmpAtt`是否为空,如果为空则直接返回,结束函数执行。随后,通过`tmpAtt`获取指向`sAttEnvPara_t`结构体的指针`pEnv`。根据预处理器指令`MINMODULE_TYPE`是否存在,选择性地初始化环境参数:如果定义了`MINMODULE_TYPE`,则仅将太阳矢量(`SunVecI`和`SunPosVecI`)的三个分量分别初始化为0.0f;否则,除了初始化太阳矢量外,还设置`bInOutShadow`标志位为0x00,并进一步初始化磁场相关的五个三元数组(`fvBe`, `fvBi`, `fvBo`, `fvBb`, `fLonLat`)的所有元素为0.0f,同时设置`fvIn_Valid`字段为`POSE_OK`。此函数没有输入参数,也不返回任何值。它被`ZKEnvAct`函数调用以确保在每次循环开始时环境参数都被正确初始化。此外,该函数依赖于`AttCtrlMain.h`和`AttMath.h`头文件中定义的数据结构和其他相关声明。", "file": "M:/研二上/静态分析问题单过滤/gs-zk和扫描结果/PrjAttCtrlMng\\AttEnvMod.c", "calls": [], "called_by": [ "ZKEnvAct" ] }, { "node_id": "Function:MJD_CAL_ATT", "name": "MJD_CAL_ATT", "summary": "该函数`MJD_CAL_ATT`旨在将给定的卫星时间(以秒为单位)转换成修正儒略日(MJD)格式,这一过程对于航天器的时间同步和任务规划至关重要。首先,它接收一个无符号32位整数类型的参数`sat_time`(代表自某一参考时刻以来经过的秒数),将其转换为`TYPE_CAL`类型,并除以86400.0F(一天的秒数),然后加上7304.5F来调整到正确的MJD基准点。最终结果被存储在由`pMjd`指针指向的位置,这里`pMjd`是一个指向`TYPE_CAL`类型的指针,用于输出计算后的MJD值。此函数不直接调用其他任何函数,但它是`ZKEnvAct`函数的一部分工作流程中不可或缺的一环。此外,为了确保整个系统的一致性和功能性,`MJD_CAL_ATT`与`AttCtrlMain.h`及`AttMath.h`这两个头文件中的定义和声明保持紧密联系。", "file": "M:/研二上/静态分析问题单过滤/gs-zk和扫描结果/PrjAttCtrlMng\\AttEnvMod.c", "calls": [], "called_by": [ "ZKEnvAct" ] }, { "node_id": "Function:MJC_CAL_ATT", "name": "MJC_CAL_ATT", "summary": "该函数`MJC_CAL_ATT`主要用于航天器姿态控制系统中,根据输入的时间参数`mjd`(以修正儒略日表示)计算一个修正后的数值,并将其存储于指针`pMjc`所指向的位置。首先,它将`mjd`除以36525.0F的结果赋值给`*pMjc`;接着初始化状态标志`*MJCLv`为`POSE_NO`,表示初始状态下未达到特定条件。随后,通过检查`*pMjc`是否大于0.24来决定是否更新`*MJCLv`至`POSE_OK`,这一步骤用于标识当修正后的数值超过预设阈值时,系统状态从默认的不满足条件转变为满足条件。此过程对于确保航天器在执行关键任务前其时间基准正确无误至关重要。该函数接受三个参数:`mjd`(类型为`TYPE_CAL`,代表输入的时间)、`pMjc`(类型为`TYPE_CAL*`,用于输出修正后的数值)以及`MJCLv`(类型为`UINT8*`,用来指示最终的状态)。虽然本函数没有直接调用其他函数,但它被`ZKEnvAct`函数调用,并且与`AttCtrlMain.h`和`AttMath.h`这两个头文件中的定义或声明有关联。", "file": "M:/研二上/静态分析问题单过滤/gs-zk和扫描结果/PrjAttCtrlMng\\AttEnvMod.c", "calls": [], "called_by": [ "ZKEnvAct" ] }, { "node_id": "Function:ObtSunVecI", "name": "ObtSunVecI", "summary": "该函数`ObtSunVecI`主要用于根据给定的儒略世纪数(JulC),通过一系列天文计算公式,求解出指定时刻太阳相对于地球的位置向量。首先,初始化临时变量`tmpM`, `tmpL`, `tmpeps`, 和 `tmpZodR`为0.0f,并检查指针`pSunVI`和`pSunPVI`是否为空,如果任一为空则直接返回。接着,基于输入的儒略世纪数`JulC`计算平近点角`tmpM`,并设置平黄赤交角`tmpeps`为固定值0.4090928f。然后,根据`JulC`和平近点角`tmpM`进一步计算平春分点的几何平黄经`tmpL`。之后,依据`tmpM`及一些常量来确定黄道半径`tmpZodR`(以米为单位)。利用`tmpL`与`tmpeps`计算惯性系下的太阳矢量,并存储于数组`pSunVI`中。最后,将黄道半径`tmpZodR`乘以惯性系太阳矢量`pSunVI`的每个分量,得到的结果保存在`pSunPVI`中。此过程涉及到了天体运动的基本原理应用,包括但不限于平近点角、平黄赤交角等关键天文参数的使用。该函数不直接返回任何值,而是通过修改传入的指针所指向的数据来输出结果。它依赖于外部提供的数学辅助函数POSE_SINF和POSE_COSF进行正弦和余弦运算,并且被更高级别的控制或环境激活函数如ZKEnvAct调用。此外,该函数定义及相关类型声明可能位于AttCtrlMain.h或AttMath.h头文件中,确保了跨文件的功能实现与调用。", "file": "M:/研二上/静态分析问题单过滤/gs-zk和扫描结果/PrjAttCtrlMng\\AttEnvMod.c", "calls": [ "POSE_SINF", "POSE_COSF" ], "called_by": [ "ZKEnvAct" ] }, { "node_id": "Function:Cal_OrbAttRate_Wo", "name": "Cal_OrbAttRate_Wo", "summary": "该函数`Cal_OrbAttRate_Wo`的主要任务是基于航天器的轨道位置和速度信息来计算特定的姿态角速率,并将结果存储在环境参数结构体中。首先,它初始化一个长度为3的`TYPE_CAL`类型数组`tmpWoi`并将所有元素设为0.0f。接着,通过将`ATTCLT_DATA1_ADDR`地址强制转换为`sAttPriData*`指针并赋值给`tmpAtt`来获取主要数据结构。如果`tmpAtt`为空,则立即返回,结束执行。随后定义两个指针变量`pOrbit`和`pEnv`,初始设置为NULL,然后分别指向`tmpAtt`中的`sOrbitPara`成员和`sEnvPara`成员。若`pOrbit->OrbitVld`等于0,表明轨道数据无效,此时也直接返回。之后,调用`AglSpdOofICal`函数,利用`pOrbit->JPos`(轨道位置)与`pOrbit->JVel`(轨道速度)以及之前准备好的`tmpWoi`数组作为输入进行计算。最后,将`tmpWoi[1]`的结果值赋予`pEnv->OrbAttRate_Wo`,完成姿态角速率的更新。此过程对于确保航天器能够准确地根据其当前轨道状态调整姿态至关重要。此外,该函数被`ZKEnvAct`调用,并且依赖于`AglSpdOofICal`函数执行关键计算。涉及的相关头文件包括`AttCtrlMain.h`和`AttMath.h`。", "file": "M:/研二上/静态分析问题单过滤/gs-zk和扫描结果/PrjAttCtrlMng\\AttEnvMod.c", "calls": [ "AglSpdOofICal" ], "called_by": [ "ZKEnvAct" ] }, { "node_id": "Function:ShadowFlgCal", "name": "ShadowFlgCal", "summary": "该函数`ShadowFlgCal`主要用于判断卫星是否位于地球阴影区内,并更新环境参数中的标志位`bInOutShadow`。首先,它初始化一系列`TYPE_CAL`类型的变量为0.0f。接着,将指向`sAttPriData`结构体的指针`tmpAtt`设置为`ATTCLT_DATA1_ADDR`地址,并将指向`AttCtrlConst_t`结构体的指针`tmpConst`设置为`ATTCLT_DATA2_ADDR`地址。如果`tmpAtt`或`tmpConst`任一为空,则直接返回。随后,通过`tmpAtt`获取轨道参数、环境参数及确定性参数的指针。若轨道参数中的`OrbitVld`字段值为0,设置环境参数中的`bInOutShadow`字段为0x00并返回。调用`CalNormal`函数计算位置向量`JPos`和速度向量`JVel`的归一化值,分别存储于`tmpR`与`tmpV`中。之后,计算`tmpRXV`的值,如果其绝对值大于`POSE_ZERO`,则继续执行;否则,直接返回。根据`tmpRXV`非零的情况,进一步计算`tmpa`,并基于`tmpa`计算`tmpLamd0`。若`tmpa`的绝对值不大于`POSE_ZERO`,则直接返回。对`pDeter->SunVeco`向量进行单位化处理后,计算太阳矢量与Z轴夹角`tmpLamd`。最后,根据`tmpLamd`与`tmpLamd0`的关系更新`bInOutShadow`字段:如果`tmpLamd`小于`tmpLamd0`,设置`bInOutShadow`为0x55(表示卫星处于阴影区);否则,设置为0x00(表示卫星不在阴影区)。此过程中,函数依赖于`POSE_ACOSF`, `unitary`, `CalNormal`, `POSE_ASINF`, `POSE_ABSF`等函数提供的数学支持,并被`ZKEnvAct`函数调用以实现更广泛的航天器环境监测功能。此外,该函数还涉及到跨文件关联,包括`AttCtrlMain.h`和`AttMath.h`头文件中的定义。", "file": "M:/研二上/静态分析问题单过滤/gs-zk和扫描结果/PrjAttCtrlMng\\AttEnvMod.c", "calls": [ "POSE_ACOSF", "unitary", "CalNormal", "POSE_ASINF", "POSE_ABSF" ], "called_by": [ "ZKEnvAct" ] }, { "node_id": "Function:BetaShadowCal", "name": "BetaShadowCal", "summary": "该函数`BetaShadowCal`首先初始化一系列变量,包括数组`tmpVecN`、`tmpRXV`及多个浮点数变量。接着,它从指定地址获取指向`sAttPriData`和`AttCtrlConst_t`结构体的指针`tmpAtt`与`tmpConst`,并检查这两个指针是否为NULL,如果是则直接返回。随后,函数获取轨道参数`pOrbit`和环境参数`pEnv`的引用,并在轨道数据无效时提前退出。接下来,计算位置向量`JPos`和速度向量`JVel`的模长,存储于`tmpR`和`tmpV`中,然后使用`cross`函数求得这两个向量的叉积存入`tmpRXV`。如果`tmpR*tmpV`的绝对值小于预设极小值`POSE_ZERO`,则函数再次提前返回。对于每个维度i (0到2),将`tmpRXV[i]`除以`tmpR*tmpV`的结果赋给`tmpVecN[i]`。之后,计算`tmpVecN`与太阳矢量`SunVecI`之间的点积保存在`tmpNS`中,同时得到这两个向量各自的模长。若`tmpVecNMod`乘以`tmpSunVecI`的绝对值小于`POSE_ZERO`,则函数又一次提前返回。基于上述计算结果得出Beta角,并将其存储在`pEnv->BetaAng`中。根据Beta角度大小更新卫星进出阴影状态计数器`BetaAngCntIn`或`BetaAngCntOut`,当连续进入阴影时间超过一定阈值时,设置`pEnv->BetaShadow`标志位表示卫星当前位于阴影内或外。此函数旨在通过分析卫星相对于太阳的位置关系(即Beta角)来判断卫星是否进入了地球阴影区,并据此更新相关环境参数。其输入隐含于全局或局部定义的数据结构中,无显式输入参数,也无返回值。该函数依赖于`POSE_ACOSF`, `CalNormal`, `POSE_ABSF`, `Posedot`, 和 `cross`等函数完成特定数学运算,并被`ZKEnvAct`调用执行。此外,`BetaShadowCal`与跨文件关联的函数主要涉及`AttCtrlMain.h`和`AttMath.h`头文件中的声明。", "file": "M:/研二上/静态分析问题单过滤/gs-zk和扫描结果/PrjAttCtrlMng\\AttEnvMod.c", "calls": [ "POSE_ACOSF", "CalNormal", "POSE_ABSF", "Posedot", "cross" ], "called_by": [ "ZKEnvAct" ] }, { "node_id": "Function:MagMath", "name": "MagMath", "summary": "该函数`MagMath`主要用于根据给定的位置坐标`rLonLat`(包含径向距离`r`、经度`Lon`和纬度`Lat`)以及常数`cgst`,计算地球磁场在指定位置的北向、东向及地向分量。首先,它会检查输入参数`rLonLat`是否为空,若为空则直接返回;接着从`rLonLat`中提取所需值,并调整经度`Lon`使其位于-π到π之间。随后,通过一系列数学变换包括但不限于角度转换、让德拉函数及其导数的计算等步骤,初始化并填充用于后续计算的关键数组如`Sintp`、`Costp`、`Psin_mLon`与`Pcos_mLon`。核心计算部分采用双重循环结构,外层遍历至最大阶数`nMax`,内层则覆盖当前阶数的所有可能项,以此累加得到最终的磁场分量`B_north`、`B_east`和`B_earth`。这些结果最后被存储于输出数组`B`中,分别代表北向、东向和垂直方向上的磁场强度。此过程中调用了多个数学库函数如`cos`, `POSE_SINF`, `POSE_POW`, `sin`, 和`POSE_COSF`来辅助完成复杂的数值运算任务。此外,`MagMath`函数由`ZKEnvAct`调用,并且依赖于`AttCtrlMain.h`和`AttMath.h`这两个头文件提供的定义或声明。", "file": "M:/研二上/静态分析问题单过滤/gs-zk和扫描结果/PrjAttCtrlMng\\AttEnvMod.c", "calls": [ "cos", "POSE_SINF", "POSE_POW", "sin", "POSE_COSF" ], "called_by": [ "ZKEnvAct" ] }, { "node_id": "Function:EarthLonLatCal", "name": "EarthLonLatCal", "summary": "该函数`EarthLonLatCal`主要用于基于给定的空间坐标数据`cuR`计算对应的地球经纬度信息,并将这些信息填充进输出数组`clonlat`中。首先,初始化两个临时变量`tmpNor`和`tmpUse`为0.0f,并设置结果标志`result`为TRUE。接着,检查输入参数`cuR`和`clonlat`是否为空,如果任一为空则返回FALSE。随后,通过调用`CalNormal`函数来计算归一化值并存储于`tmpNor`中,然后将此值赋给`clonlat[2]`。之后,利用`CalPFlag`函数验证`cuR[0]`与`tmpNor`的有效性,若任一无效则返回FALSE。使用`POSE_ATAN2F`函数基于`cuR[0]`和`cuR[1]`的值来计算赤经,并将其存入`clonlat[0]`。接下来,计算`tmpUse`作为`cuR[2]`除以`tmpNor`的结果;如果`tmpUse`的绝对值大于1.0F,则根据`CalPFlag`对`tmpUse`的判断调整其值至-1.0F或1.0F。最后,利用`POSE_ASINF`函数基于调整后的`tmpUse`值计算赤纬,并保存到`clonlat[1]`。整个过程中包括了对输入数据有效性及数值范围的校验,确保最终得到的地理坐标是合理且有效的。此函数接受两个`TYPE_CAL*`类型的指针作为输入参数,分别是空间坐标数据`cuR`和用于存放计算结果的数组`clonlat`,并返回一个布尔值表示操作是否成功。在执行过程中,它依赖于`POSE_ATAN2F`, `CalNormal`, `CalPFlag`, `POSE_ASINF`, 和`POSE_ABSF`等函数的支持。此外,`EarthLonLatCal`函数被`ZKEnvAct`函数调用,并且与`AttCtrlMain.h`和`AttMath.h`这两个头文件中的定义相关联。", "file": "M:/研二上/静态分析问题单过滤/gs-zk和扫描结果/PrjAttCtrlMng\\AttEnvMod.c", "calls": [ "POSE_ATAN2F", "CalNormal", "CalPFlag", "POSE_ASINF", "POSE_ABSF" ], "called_by": [ "ZKEnvAct" ] }, { "node_id": "Function:TransMatrixIE", "name": "TransMatrixIE", "summary": "该函数`TransMatrixIE`主要负责根据给定的地理坐标(纬度和经度)生成一个9元素的矩阵`cAie`,用于描述基于这些坐标的某种空间变换关系。首先初始化临时变量`tempSla`, `tempSra`, `tempSl`, `tempCl`, `tempSr`, 和 `tempCr`为0.0f。接着检查指针`cAie`和`clonlat`是否为空,如果任一为空则直接返回。从`clonlat`数组中获取纬度值赋给`tempSla`,并直接将`clonlat[0]`的值赋给`tempSra`作为经度调整前的值。如果`tempSra`大于`POSE_PI`,则通过减去`POSE_2PI`将其转换到[-π, π]范围内;若小于`-POSE_PI`,则加上`POSE_2PI`实现同样的范围限制。使用`POSE_SINF()`计算纬度`tempSla`的正弦值存入`tempSl`,使用`POSE_COSF()`计算其余弦值存入`tempCl`。同样地,对经度`tempSra`执行正弦与余弦运算,结果分别存储于`tempSr`和`tempCr`。最后,根据上述计算出的三角函数值填充`cAie`数组,构建一个特定形式的矩阵,该矩阵由纬度和经度的正弦、余弦值组合而成,可能用于表示某种坐标变换或姿态调整。此函数的主要目的是为了在航天器的姿态控制过程中,依据地球上的指定位置信息来生成相应的惯性系到地心系的转换矩阵。输入参数包括指向包含经纬度信息的数组`clonlat`以及用于存储结果的数组`cAie`。没有明确的返回值类型说明,但可以推断其为void,即不返回任何值。此外,该函数依赖于`POSE_SINF`和`POSE_COSF`这两个数学函数来完成角度到正弦和余弦值的转换,并且它本身被`ZKEnvAct`函数调用以参与更复杂的姿态控制流程。跨文件关联方面,`TransMatrixIE`函数定义涉及到了`AttCtrlMain.h`和`AttMath.h`两个头文件中的声明或实现。", "file": "M:/研二上/静态分析问题单过滤/gs-zk和扫描结果/PrjAttCtrlMng\\AttEnvMod.c", "calls": [ "POSE_SINF", "POSE_COSF" ], "called_by": [ "ZKEnvAct" ] }, { "node_id": "Function:ZKEnvAct", "name": "ZKEnvAct", "summary": "该函数`ZKEnvAct`主要用于更新卫星的姿态环境参数,特别是关于太阳位置、磁场方向等关键信息。首先,它初始化了两个数组`SatTime`和多个3x3矩阵`Aie`, `AieT`, `Aoi`以及一个9元素数组`tmpRbo`,所有这些都初始化为0或其浮点数等价。接着定义并初始化指向`sAttPriData`结构体的指针`tmpAtt`,如果该指针为空,则函数直接返回。通过`tmpAtt`获取指向其他几个结构体(`sAttOrbitGetPara_t`, `sAttEnvPara_t`, `sAttDeterPara_t`)的指针后,调用`ZKEnvCycInit()`进行环境周期初始化,并调用`GetTime(SatTime)`来获取当前卫星时间。根据是否定义了`MINMODULE_TYPE`宏,执行不同的逻辑分支:如果定义了`MINMODULE_TYPE`,则计算儒略日(`MJD`)、儒略世纪(`MJC`)及其级别(`MJCLv`),然后使用`ObtSunVecI`函数基于`MJC`计算惯性系中的太阳位置向量;否则,设置环境参数中的卫星时间和太阳位置向量,标记姿态无效状态,再次调用`ObtSunVecI`但这次是基于轨道参数中的`MJC`值,接着计算阴影标志和Beta角;如果轨道数据无效,则函数提前返回。之后,计算轨道系下的轨道角速度,并使用地球经度纬度计算函数`EarthLonLatCal`更新环境参数中的经纬度信息,若此操作失败,则函数提前结束。随后,执行一系列坐标转换与磁场相关计算,包括从惯性系到北东地地理系的转换矩阵计算、磁场数学模型应用、矩阵转置及矢量加法运算以得到不同坐标系下的磁矢量。检查确定参数的有效性,如果四元数无效,则函数提前返回。最后,将四元数转换成姿态矩阵,并利用该矩阵进一步转换磁矢量至本体系下,同时将姿态有效性的标志设置为`POSE_OK`。此函数无输入参数,也不返回任何值,但它依赖于多个外部函数如`MatrixTransposeHL`, `MJD_CAL_ATT`, `EarthLonLatCal`等完成其任务,并且被`ZKAction`函数所调用。此外,该函数还涉及到跨文件关联的头文件`AttCtrlMain.h`和`AttMath.h`。", "file": "M:/研二上/静态分析问题单过滤/gs-zk和扫描结果/PrjAttCtrlMng\\AttEnvMod.c", "calls": [ "MatrixTransposeHL", "MJD_CAL_ATT", "EarthLonLatCal", "Q2Att", "ShadowFlgCal", "MagMath", "GetTime", "CalTransMatrix_IO", "TransMatrixIE", "BetaShadowCal", "ObtSunVecI", "ZKEnvCycInit", "MatrixPlusVectorN", "Cal_OrbAttRate_Wo", "MJC_CAL_ATT" ], "called_by": [ "ZKAction" ] }, { "node_id": "Function:PoseLimitInOne", "name": "PoseLimitInOne", "summary": "该函数`PoseLimitInOne`的主要作用是确保输入值X被限制在-1.0f到1.0f之间。其工作流程首先检查X是否超过了上限1.0f,如果确实如此,则直接返回1.0f作为结果;接着,它会判断X是否低于下限-1.0f,若满足条件,则输出-1.0f;最后,对于那些既不超出也不低于指定范围的X值,函数将原样返回这些数值。这种处理方式特别适用于航天领域中需要对姿态或某些物理量进行边界控制的应用场景,比如卫星的姿态调整过程中可能遇到的角度或速度限制问题。此函数接受一个名为X的参数,类型为`TYPE_CAL`,代表待处理的数据点。函数最终返回同样类型的值,表示经过裁剪后的X值。值得注意的是,`PoseLimitInOne`并不依赖于其他任何函数来完成其任务,同时也没有明确指出哪些具体函数会调用它。不过,根据提供的信息,我们知道这个函数定义位于或者引用了两个外部文件:`\\PrjCommon\\CommonDef.h` 和 `AttMath.h`,这表明它可能是更大系统的一部分,用于执行特定数学运算或数据处理任务。", "file": "M:/研二上/静态分析问题单过滤/gs-zk和扫描结果/PrjAttCtrlMng\\AttMath.c", "calls": [], "called_by": [] }, { "node_id": "Function:CalPFlag", "name": "CalPFlag", "summary": "该函数`CalPFlag`主要用于根据输入参数`Data`与预定义常量`POSE_ZERO`之间的关系来确定一个标志值。首先,它初始化一个字符型变量`tmpRes`为0。接着,通过一系列条件判断来更新`tmpRes`的值:如果`Data`大于`POSE_ZERO`,则将`tmpRes`设为1;若`Data`小于负的`POSE_ZERO`,则`tmpRes`被设置为-1;对于所有其他情况,即`Data`介于正负`POSE_ZERO`之间时,`tmpRes`保持初始值0不变。最终,函数返回`tmpRes`作为结果。此过程实质上是对航天器姿态或位置数据的一种简化分类方法,有助于后续处理中快速识别特定状态。其输入参数为`Data`(类型为`TYPE_CAL`),代表待分析的数据点;而输出是一个`char`类型的值,表示基于阈值比较后的分类结果。虽然`CalPFlag`本身不调用任何外部函数,但它被多个关键计算函数如`EarthLonLatCal`, `CalVecArc`, `Att2Q`, `Matrix2Eul312A`, 和`QuatDiffCal`所使用,表明了它在航天软件系统中的重要性。此外,为了确保正确性和一致性,该函数依赖于两个跨文件定义的头文件——`\\PrjCommon\\CommonDef.h`和`AttMath.h`,这些文件可能包含了`POSE_ZERO`等常量的具体定义以及其他相关数学工具。", "file": "M:/研二上/静态分析问题单过滤/gs-zk和扫描结果/PrjAttCtrlMng\\AttMath.c", "calls": [], "called_by": [ "EarthLonLatCal", "CalVecArc", "Att2Q", "Matrix2Eul312A", "QuatDiffCal" ] }, { "node_id": "Function:Posedot", "name": "Posedot", "summary": "该函数`Posedot`主要用于执行两个数组`x1`和`x2`的点乘运算,其核心流程包括初始化一个名为`fReturn`的变量为0.0,然后通过一个for循环遍历从0到`ucN-1`范围内的每个索引`i`,在每次迭代中将`x1[i]`与`x2[i]`相乘的结果累加至`fReturn`。最终,计算得到的总和被存储于指针`pRes`所指向的位置。此操作对于航天器姿态控制中的向量运算至关重要,比如在计算力矩、角速度或方向余弦矩阵时,这样的点积运算能够帮助确定航天器相对于参考坐标系的方向变化情况。输入参数包括两个类型为`TYPE_CAL`的指针`x1`和`x2`(分别代表参与运算的两个向量),一个`UINT8`类型的整数`ucN`(表示向量长度),以及另一个`TYPE_CAL`类型的指针`pRes`(用于接收结果)。本函数不直接返回任何值,而是通过修改`pRes`指向的数据来传递计算结果。虽然`Posedot`本身并不调用其他函数,但它被多个关键过程如BetaShadowCal, CalVecArc, MagSunMomentCal, CtrlWheelReleaseProc等调用来支持更复杂的航天任务需求。此外,为了确保跨文件间的一致性和可访问性,该函数依赖于..\\PrjCommon\\CommonDef.h 和 AttMath.h 头文件中定义的数据类型和其他相关声明。", "file": "M:/研二上/静态分析问题单过滤/gs-zk和扫描结果/PrjAttCtrlMng\\AttMath.c", "calls": [], "called_by": [ "BetaShadowCal", "CalVecArc", "MagSunMomentCal", "CtrlWheelReleaseProc" ] }, { "node_id": "Function:cross", "name": "cross", "summary": "该函数实现了向量叉乘运算,通过给定两个三维向量`x1`和`x2`作为输入,计算它们的叉积,并将结果存储在第三个向量`x3`中。具体地,它首先计算`x3[0]`的值,该值等于`x1[1]*x2[2]`减去`x1[2]*x2[1]`;接着计算`x3[1]`的值,该值等于`x1[2]*x2[0]`减去`x1[0]*x2[2]`;最后计算`x3[2]`的值,该值等于`x1[0]*x2[1]`减去`x1[1]*x2[0]`。此过程对于航天器姿态控制中的矢量变换至关重要,比如在确定卫星相对于地球或太阳的位置时,需要频繁使用到向量之间的叉乘来获取正交于两已知方向的新方向。函数接受三个参数:`x1` (TYPE_CAL*) 和 `x2` (TYPE_CAL*) 分别代表参与叉乘运算的两个三维向量,而 `x3` (TYPE_CAL*) 用于存储计算得到的结果向量。本函数不返回任何值,其主要作用在于修改传入的输出向量`x3`。尽管自身并不调用其他函数,但它是多个关键算法如BetaShadowCal, CalTransMatrix_IO等实现的基础组件之一。此外,为了确保类型定义的一致性以及数学操作的有效执行,该函数依赖于..\\PrjCommon\\CommonDef.h与AttMath.h这两个头文件提供的支持。", "file": "M:/研二上/静态分析问题单过滤/gs-zk和扫描结果/PrjAttCtrlMng\\AttMath.c", "calls": [], "called_by": [ "BetaShadowCal", "CalTransMatrix_IO", "AglSpdOofICal", "MagDmpMomentCal", "MagSunMomentCal", "WheelCalc_PD", "WheelCalc_PID", "CtrlWheelReleaseProc" ] }, { "node_id": "Function:CalNormal", "name": "CalNormal", "summary": "该函数`CalNormal`主要用于计算输入数组`x`中所有元素的平方和后再开方,从而得到一个向量的欧几里得范数(即向量的模)。此过程首先初始化两个变量`ftmp`和`tmpX`为0.0;接着通过一个for循环遍历从0到`ucN-1`(`ucN`代表数组`x`的长度)的所有元素,在每次迭代中将当前索引`Li`对应的`x[Li]`值赋给`tmpX`,然后计算`tmpX*tmpX`并将结果累加至`ftmp`。当循环完成后,使用`POSE_SQRTF()`函数来求解`ftmp`的平方根,并将最终结果转换成`TYPE_CAL`类型后存储于指针`pRes`所指向的位置。在航天领域,这种操作常用于确定姿态控制、轨道调整等场景下的矢量大小或距离测量。其输入包括一个`TYPE_CAL`类型的数组`x`(表示待处理的数据序列)、一个`UINT8`类型的整数`ucN`(指定数组`x`的维度),以及一个`TYPE_CAL`类型的指针`pRes`(用来接收计算后的结果)。本函数不直接返回任何值,而是通过修改`pRes`指向的内容来传递输出。此外,`CalNormal`依赖于`POSE_SQRTF`进行平方根运算,并被多个其他函数如`ShadowFlgCal`, `BetaShadowCal`, `EarthLonLatCal`等调用以支持更复杂的计算任务。这些函数定义及相关的数据类型声明位于跨文件引用的头文件`\\PrjCommon\\CommonDef.h`与`AttMath.h`中。", "file": "M:/研二上/静态分析问题单过滤/gs-zk和扫描结果/PrjAttCtrlMng\\AttMath.c", "calls": [ "POSE_SQRTF" ], "called_by": [ "ShadowFlgCal", "BetaShadowCal", "EarthLonLatCal", "CalVecArc", "unitary", "AglSpdOofICal", "MagSunMomentCal", "Whl_Momentum_Count", "CtrlWheelReleaseProc", "AttExJudge" ] }, { "node_id": "Function:CalMakeCrossMatrix", "name": "CalMakeCrossMatrix", "summary": "该函数`CalMakeCrossMatrix`的主要任务是根据给定的长度`iLen`和输入向量`inLine`生成一个对角线矩阵`outMatrix`。首先,它使用`memset`函数将输出矩阵`outMatrix`的所有元素初始化为0,确保矩阵大小为`iLen * iLen`。接着,通过一个for循环遍历从0到`iLen-1`的每个索引`i`,在每次迭代中,将`inLine`中的第`i`个元素放置到`outMatrix`的主对角线上对应位置(即`outMatrix[i * iLen + i]`),从而形成一个只有对角线含有非零值(这些值来自`inLine`)而其余部分均为0的特殊矩阵。此过程对于航天领域中的数据处理尤为重要,比如在姿态控制算法中可能需要构造特定形式的转换或权重矩阵来优化计算效率或准确性。该函数接受三个参数:`inLine`(类型为`TYPE_CAL*`,指向待转换成对角线形式的数据向量)、`outMatrix`(同样类型为`TYPE_CAL*`,用于存储结果的矩阵指针)以及`iLen`(类型为`UINT16`,指定矩阵/向量的维度)。本函数不返回任何值,其作用完全体现在修改传入的`outMatrix`上。此外,`CalMakeCrossMatrix`直接调用了标准库中的`memset`函数以实现内存清零操作,并且自身被定义于包含路径..\\PrjCommon\\CommonDef.h, AttMath.h下的头文件中,表明了它与项目其他部分特别是数学运算相关组件之间的紧密联系。", "file": "M:/研二上/静态分析问题单过滤/gs-zk和扫描结果/PrjAttCtrlMng\\AttMath.c", "calls": [ "memset" ], "called_by": [] }, { "node_id": "Function:MatrixProductHL", "name": "MatrixProductHL", "summary": "该函数`MatrixProductHL`主要用于执行两个矩阵`A1` (尺寸 HxL) 和 `A2` (尺寸 LxF) 的乘法运算,结果存储于矩阵`A3` (尺寸 HxF)中。首先,它初始化三个循环变量`i`, `j`, 和 `k`,接着使用`memset`函数将输出矩阵`A3`的所有元素清零,分配的内存大小为`H*F*4`字节。随后,通过三层嵌套循环结构实现矩阵乘法:外层循环遍历行索引`i`从0到`H-1`;中层循环遍历列索引`k`从0到`F-1`;内层循环则遍历中间维度索引`j`从0到`L-1`,并在每次迭代中更新`A3`矩阵对应位置的值,即当前`A3[F*i + k]`的值加上`A1[L*i + j]`与`A2[F*j+k]`的乘积。此过程确保了按照标准矩阵乘法规则进行计算。在航天应用背景下,这种类型的矩阵操作可能用于姿态控制算法中的数据预处理或变换,比如卫星姿态确定、动量轮控制等任务中对传感器数据(如陀螺仪、星敏感器)的处理。输入参数包括指向待乘矩阵`A1`和`A2`以及结果矩阵`A3`的指针,还有定义这些矩阵维度的整型变量`H`, `L`, 和 `F`。该函数不返回任何值,其主要作用是修改传入的结果矩阵`A3`。此外,`MatrixProductHL`依赖于`memset`函数来初始化矩阵,并且被多个与航天器姿态控制相关的函数调用,例如`ZKWhlCmdDsp`, `Gyro_DataPre`, `AttDeterOrbCtrl`等。同时,该函数还涉及到跨文件引用,特别是`\\PrjCommon\\CommonDef.h`和`AttMath.h`这两个头文件,表明其在更大范围内的项目架构中有重要作用。", "file": "M:/研二上/静态分析问题单过滤/gs-zk和扫描结果/PrjAttCtrlMng\\AttMath.c", "calls": [ "memset" ], "called_by": [ "ZKWhlCmdDsp", "ZKMtCmdDsp", "Ss_DataPre", "Gyro_DataGet", "Gyro_DataPre", "Ass_DataPre", "StarSun_CC", "StarCheckSun", "StarCheckMag", "WheelCalc_PD", "WheelCalc_PID", "Whl_Momentum_Count", "SsGyro_AttDeter", "Cal_AngToSun", "AttDeterOrb", "AttDeterOrbCtrl", "AttDeterTarRe" ] }, { "node_id": "Function:MatrixTransposeHL", "name": "MatrixTransposeHL", "summary": "该函数`MatrixTransposeHL`旨在实现对给定二维数组(矩阵)的转置操作,这在航天器姿态控制、轨道确定等场景中尤为重要,因为它能够帮助调整数据结构以适应不同的计算需求或优化算法性能。通过初始化两个局部变量`m`和`n`为UINT8类型,外层循环使用`m`从0迭代至小于矩阵的列数`L`,而内层循环则利用`n`从0迭代至小于行数`H`。在此过程中,原矩阵`A1`中的每个元素`A1[n*L+m]`被重新定位并赋值给新矩阵`A2`中的对应位置`A2[m*H+n]`,从而完成整个矩阵的转置过程。此函数接受四个输入参数:指向原始矩阵的指针`A1(TYPE_CAL *)`、用于存储结果的矩阵指针`A2(TYPE_CAL *)`以及表示矩阵维度的整数`H(UINT8)`和`L(UINT8)`。值得注意的是,本函数不返回任何值,其主要作用在于修改传入的输出矩阵`A2`。此外,虽然`MatrixTransposeHL`本身并不直接调用其他函数,但它却是多个关键航天软件组件如ZKMtCmdDsp, SSABC_CC, ZKEnvAct, AttDeterOrb, AttDeterOrbCtrl, 和AttDeterTarRe执行任务时不可或缺的一部分。为了确保跨文件的一致性和可访问性,该函数依赖于..\\PrjCommon\\CommonDef.h与AttMath.h这两个头文件提供的定义和支持。", "file": "M:/研二上/静态分析问题单过滤/gs-zk和扫描结果/PrjAttCtrlMng\\AttMath.c", "calls": [], "called_by": [ "ZKMtCmdDsp", "SSABC_CC", "ZKEnvAct", "AttDeterOrb", "AttDeterOrbCtrl", "AttDeterTarRe" ] }, { "node_id": "Function:InvsymMatrix3", "name": "InvsymMatrix3", "summary": "InvsymMatrix3函数主要用于航天器姿态控制软件中对3x3对称矩阵进行求逆操作。该函数首先从输入参数`cI`(指向待求逆的原始3x3矩阵)中复制数据到局部二维数组`A`,并初始化状态标志`*cs`为`POSE_OK`表示初始状态良好。接着,通过特定算法计算矩阵`A`的行列式值`n`,此过程包括两次遍历:第一次累加某些元素乘积以形成初步的行列式估计;第二次则根据不同的索引`j`值减去另一组元素乘积的结果来调整`n`。随后,函数检查所得行列式的绝对值是否大于给定阈值`tmpef`(由`ef`指针传递),以此判断矩阵是否可逆。如果行列式的绝对值足够大,则继续执行逆矩阵的计算,并将结果存储于`cO`所指向的位置;反之,若行列式接近于零表明矩阵不可逆时,将状态标志`*cs`设置为`POSE_NO`指示操作失败。此函数依赖于memcpy和POSE_ABSF等辅助函数完成部分任务,并且是ZKWhlCmdDsp与ZKMtCmdDsp这两个更高级别姿态处理函数的重要组成部分。此外,InvsymMatrix3还引用了..\\PrjCommon\\CommonDef.h及AttMath.h头文件中的定义或声明,确保了跨文件间的数据类型一致性以及数学运算的准确性。", "file": "M:/研二上/静态分析问题单过滤/gs-zk和扫描结果/PrjAttCtrlMng\\AttMath.c", "calls": [ "memcpy", "POSE_ABSF" ], "called_by": [ "ZKWhlCmdDsp", "ZKMtCmdDsp" ] }, { "node_id": "Function:CalVecArc", "name": "CalVecArc", "summary": "该函数`CalVecArc`主要用于计算两个三维向量之间的夹角,并将结果以弧度形式返回。首先,它会检查输入参数`VecX`, `VecY`, 和`pRet`是否为NULL,如果任一为NULL则返回错误码1。接着,通过调用`CalNormal`函数分别计算向量`VecX`和`VecY`的模长,并将结果存储在临时变量`tmpModL1`和`tmpModL2`中。之后,利用`Posedot`函数来获取这两个向量间的点积值并保存至`tmpDot`。若两向量模长乘积小于预设阈值`POSE_ZERO`,则直接返回错误码1。随后,基于上述计算出的数据,求得`tmpUse`作为`tmpDot`除以`tmpModL1`与`tmpModL2`乘积的结果。当`tmpUse`的绝对值超出1.0F时,使用`CalPFlag`函数判断其正负性,并据此调整`tmpUse`为1.0F或-1.0F。最后一步是调用`POSE_ACOSF`函数根据调整后的`tmpUse`值计算角度(以弧度表示),并将结果存入由`pRet`指向的位置。整个过程中,此函数不仅实现了从向量到角度转换的核心逻辑,还包含了对潜在异常情况的有效处理机制。此外,`CalVecArc`被多个航天相关函数如`SSABC_CC`, `StarSun_CC`, `StarCheckSun`, 和`StarCheckMag`所调用,同时依赖于定义在`..\\PrjCommon\\CommonDef.h`和`AttMath.h`中的辅助函数完成其任务。", "file": "M:/研二上/静态分析问题单过滤/gs-zk和扫描结果/PrjAttCtrlMng\\AttMath.c", "calls": [ "POSE_ACOSF", "CalNormal", "CalPFlag", "POSE_ABSF", "Posedot" ], "called_by": [ "SSABC_CC", "StarSun_CC", "StarCheckSun", "StarCheckMag" ] }, { "node_id": "Function:unitary", "name": "unitary", "summary": "该函数`unitary`的主要目标是将一个给定的向量单位化,即保持其方向不变但将其长度调整为1。首先,它通过调用`CalNormal`函数来计算输入向量`pVector`的模,并将结果存储在变量`ftemp`中。接着,函数检查`ftemp`是否大于预定义的阈值`POSE_ZERO`,以判断输入向量是否为非零向量。如果`ftemp`确实大于`POSE_ZERO`,则表明输入向量不是零向量,此时函数进入下一步操作:遍历从0到`ucN-1`范围内的每个索引`i`,并更新`pVector[i]`为其原始值除以`ftemp`的结果,从而完成向量的单位化过程。若`ftemp`不大于`POSE_ZERO`,则认为输入向量接近于零向量或就是零向量,在这种情况下,函数直接结束执行而不做任何修改。此过程确保了只有有效的、非零的向量才会被转换成单位向量。该函数接受两个参数:一个是类型为`TYPE_CAL*`的指针`pVector`,指向待处理的向量;另一个是类型为`UINT8`的整数`ucN`,表示向量的维度。函数本身没有返回值。此外,`unitary`函数依赖于`CalNormal`来进行向量模的计算,并且被多个其他函数如`ShadowFlgCal`, `CalTransMatrix_IO`, 和 `DertCalcBb`所调用。为了支持这些操作,相关的定义和声明位于跨文件头文件`\\PrjCommon\\CommonDef.h`和`AttMath.h`中。", "file": "M:/研二上/静态分析问题单过滤/gs-zk和扫描结果/PrjAttCtrlMng\\AttMath.c", "calls": [ "CalNormal" ], "called_by": [ "ShadowFlgCal", "CalTransMatrix_IO", "DertCalcBb" ] }, { "node_id": "Function:SortUint16", "name": "SortUint16", "summary": "该函数`SortUint16`旨在对一个无符号16位整数数组`cd`执行降序排序,这在航天软件工程中可能用于处理传感器数据、任务优先级列表或其他需要按数值大小逆序排列的数据集。首先,初始化两个局部变量`Li`和`Lj`为UINT8类型,以及一个临时变量`tmpf`为UINT16类型。接着,通过外层for循环遍历数组`cd`的每个元素,从第一个元素到倒数第二个未排序的元素(由`Li < n`控制)。在外层循环内部,使用内层for循环比较当前元素与它后面的相邻元素(由`Lj < n - Li - 1`控制),确保每次迭代只处理尚未完全排序的部分。如果发现当前元素`cd[Lj]`小于其后一个元素`cd[Lj+1]`,则交换这两个元素的位置:将`cd[Lj]`的值暂存于`tmpf`中,然后更新`cd[Lj]`为`cd[Lj+1]`的值,最后设置`cd[Lj+1]`为`tmpf`中的原始值。内层循环结束后,外层循环继续下一次迭代,直到整个数组被完全排序。此过程不依赖于其他函数调用,并且自身也不调用任何外部函数。然而,为了定义使用的数据类型如UINT8和UINT16,该函数引用了..\\PrjCommon\\CommonDef.h, AttMath.h头文件。输入参数包括一个指向无符号16位整数数组的指针`cd`(表示待排序的数据)和一个UINT8类型的整数`n`(指定数组长度)。该函数没有返回值,直接修改传入的数组以实现排序效果。", "file": "M:/研二上/静态分析问题单过滤/gs-zk和扫描结果/PrjAttCtrlMng\\AttMath.c", "calls": [], "called_by": [] }, { "node_id": "Function:MatrixPlusVectorN", "name": "MatrixPlusVectorN", "summary": "该函数`MatrixPlusVectorN`主要用于执行矩阵与向量之间的乘法运算,特别适用于航天器姿态控制或轨道计算等场景中需要高效处理数学运算的情况。根据其逻辑流程,首先初始化两个循环变量`i`和`j`,随后通过外层循环遍历从0到M-1的每个行索引`i`,对于每一个外层循环迭代,将`pReturn[i]`设置为0.0F作为累加起点;接着内层循环遍历从0到N-1的列索引`j`,在每次内层循环中,利用给定的`pMatrix`(一个MxN大小的矩阵)与`pVector`(长度为N的向量)对应位置元素相乘,并将结果累加至`pReturn[i]`。最终,此过程生成了一个新的长度为M的向量`pReturn`,其中包含了原始矩阵与向量相乘的结果。该函数直接服务于航天软件中的多个关键模块,包括但不限于磁数据预处理(Mag_DataPre)、环境作用力计算(ZKEnvAct)、长时间积分算法(AttLongKutaCal),以及四元数差异计算(QuatDiffCal)等功能实现。此外,它依赖于项目通用定义文件..\\PrjCommon\\CommonDef.h及特定数学库AttMath.h提供的类型定义和其他辅助函数来完成任务。输入参数包括指向待处理矩阵的指针`pMatrix` (TYPE_CAL*)、指向参与运算向量的指针`pVector` (TYPE_CAL*)、用于存储结果的输出向量指针`pReturn` (TYPE_CAL*),以及表示矩阵行数M和列数N的无符号8位整型变量(UINT8 M, UINT8 N)。此函数本身不返回任何值(void),而是通过修改传入的`pReturn`参数来传递计算结果。", "file": "M:/研二上/静态分析问题单过滤/gs-zk和扫描结果/PrjAttCtrlMng\\AttMath.c", "calls": [], "called_by": [ "Mag_DataPre", "ZKEnvAct", "AttLongKutaCal", "QuatDiffCal" ] }, { "node_id": "Function:Q2Att", "name": "Q2Att", "summary": "该函数`Q2Att`通过一系列基于输入数组`cq`中元素的数学运算,生成一个表示某种转换或变换后的输出数组`ca`。具体来说,它执行了从四元数到方向余弦矩阵(DCM)的转换,这是航天器姿态控制中常见的操作之一。其主要目的是将描述航天器姿态的四元数转换为更直观的方向余弦矩阵形式,以便于后续的姿态控制算法使用。此过程包括计算`cq[0]`的平方减去`cq[1]`、`cq[2]`的平方再加上`cq[3]`的平方等步骤,并将结果存储在`ca`的不同位置上,从而构建出完整的DCM。函数接受两个参数:`cq`(类型为`TYPE_CAL*`),代表输入的四元数;以及`ca`(同样类型为`TYPE_CAL*`),用于存放转换后得到的方向余弦矩阵数据。值得注意的是,本函数不返回任何值,而是直接修改传入的`ca`指针所指向的数据结构。此外,`Q2Att`被多个与航天器姿态确定及控制相关的函数调用,如`Ss_DataPre`, `SSABC_CC`, `StarSun_CC`等,表明其在航天器姿态管理流程中的核心地位。最后,为了实现上述功能,该函数依赖于定义在`..\\PrjCommon\\CommonDef.h`和`AttMath.h`这两个头文件中的某些常量或宏定义。", "file": "M:/研二上/静态分析问题单过滤/gs-zk和扫描结果/PrjAttCtrlMng\\AttMath.c", "calls": [], "called_by": [ "Ss_DataPre", "SSABC_CC", "StarSun_CC", "StarCheckSun", "StarCheckMag", "ZKEnvAct", "SsGyro_AttDeter", "Cal_AngToSun", "AttDeterOrb", "AttDeterOrbCtrl", "AttDeterTarRe" ] }, { "node_id": "Function:Att2M", "name": "Att2M", "summary": "该函数`Att2M`的主要任务是根据给定的姿态角数组`att`(假设为欧拉角),通过一系列数学运算生成一个3x3的方向余弦矩阵`A`,实现从姿态角到旋转矩阵的转换。首先定义六个局部变量`s0, c0, s1, c1, s2, c2`用于存储中间计算结果;接着利用`POSE_SINF()`和`POSE_COSF()`函数分别计算出`att`中每个角度的正弦与余弦值,并将这些值依次赋给相应的变量;最后,基于上述得到的正弦和余弦值,按照特定公式构建方向余弦矩阵`A`,其中`A[0]`至`A[8]`分别代表了矩阵的第一行至第三行元素。此过程对于航天器姿态控制至关重要,因为它允许从更直观的角度表示转换为可用于进一步计算或显示的姿态变换矩阵。输入参数包括两个指针:`att`指向包含三个姿态角(通常为绕X、Y、Z轴的旋转)的数组,而`A`则指向一个预分配的空间,用于存放输出的3x3矩阵。虽然此函数本身不返回任何值(即其类型为void),但它通过修改传入的`A`指针所指向的数据来间接提供结果。此外,`Att2M`依赖于外部提供的`POSE_SINF`和`POSE_COSF`函数来进行三角函数计算,并且它被`AttDeterOrbCtrl`和`AttDeterTarRe`等其他函数调用以完成更复杂的姿态确定任务。为了确保跨文件的一致性和可访问性,`Att2M`及相关定义位于`\\PrjCommon\\CommonDef.h`和`AttMath.h`头文件中。", "file": "M:/研二上/静态分析问题单过滤/gs-zk和扫描结果/PrjAttCtrlMng\\AttMath.c", "calls": [ "POSE_SINF", "POSE_COSF" ], "called_by": [ "AttDeterOrbCtrl", "AttDeterTarRe" ] }, { "node_id": "Function:Att2Q", "name": "Att2Q", "summary": "该函数`Att2Q`旨在将给定的姿态矩阵转换为对应的单位四元数表示,以支持航天器姿态控制中的数学运算。首先,它基于输入的姿态矩阵`iM3`(一个3x3的旋转矩阵)计算四个临时变量`tmpCp[0]`到`tmpCp[3]`,每个都是特定元素组合加上1后的绝对值。接着,通过遍历这四个临时变量找到其中的最大值`Ltmp`及其对应的索引`tmpNO`。随后,利用最大值`Ltmp`来计算一个中间结果,并通过调用`CalPFlag`函数检查该结果的有效性;如果无效,则直接设置输出四元数`cq`为(0, 0, 0, 1)。若步骤3中得到的结果有效,则根据`tmpNO`的不同取值(从0到3),分别采用不同的公式计算并填充输出四元数`cq`的各个分量。最后一步是检查`cq`的最后一个分量是否小于0,如果是,则将整个四元数的所有分量取反,确保四元数的正确性和一致性。此过程不仅保证了数值稳定性还优化了计算效率。该函数接受两个参数:一个是类型为`TYPE_CAL*`的姿态矩阵`iM3`作为输入,另一个是同样类型的指针`cq`用于存储计算出的四元数结果。虽然`Att2Q`本身不返回任何值,但其执行结果直接影响后续姿态处理算法的表现。此外,该函数依赖于`POSE_SQRTF`, `POSE_ABSF`, 和`CalPFlag`等辅助函数完成关键计算,并且被`Ss_DataPre`函数所调用,体现了在航天器数据预处理流程中的重要角色。同时,为了实现上述功能,`Att2Q`与定义在`..\\PrjCommon\\CommonDef.h`和`AttMath.h`头文件中的其他相关函数紧密关联。", "file": "M:/研二上/静态分析问题单过滤/gs-zk和扫描结果/PrjAttCtrlMng\\AttMath.c", "calls": [ "POSE_SQRTF", "POSE_ABSF", "CalPFlag" ], "called_by": [ "Ss_DataPre" ] }, { "node_id": "Function:CalTransMatrix_IO", "name": "CalTransMatrix_IO", "summary": "该函数`CalTransMatrix_IO`通过一系列向量运算,基于输入的两个向量`cuR`和`cuV`构建了一个转换矩阵,并将其结果填充到了输出参数`cAoi`指定的位置。首先,初始化三个数组`uvec[3]`, `vec[3]`, 和 `rvec[3]`。接着,将输入参数`cuR`的每个元素取反后赋值给`uvec`数组,然后对`uvec`进行单位化处理,并将结果复制到`cAoi+6`位置。之后,计算`cuR`与`cuV`的叉积(注意:这里提到叉乘顺序反向,意味着实际计算的是`cuR x cuV`),结果存储在`vec`中;再对`vec`进行单位化处理,并将结果复制到`cAoi+3`位置。最后,计算`vec`与`uvec`的叉积,结果存储在`rvec`中,并将`rvec`的内容复制到`cAoi`的起始位置。此过程的主要目的是根据给定的方向向量生成一个正交基底,用于坐标变换,在航天领域中,这种转换对于姿态控制、轨道确定等任务至关重要。该函数接受三个`TYPE_CAL`类型的指针作为输入参数,分别是表示参考方向的`cuR`、表示速度或另一个方向的`cuV`以及用于存放结果的`cAoi`。虽然没有明确返回值,但通过修改`cAoi`实现了数据的传出。此外,它依赖于`unitary`、`memcpy`和`cross`这三个辅助函数来完成其核心操作,并且被`ZKEnvAct`和`AttDeterOrb`这两个函数调用。为了实现这些功能,该函数还引用了来自`..\\PrjCommon\\CommonDef.h`和`AttMath.h`头文件中的定义和声明。", "file": "M:/研二上/静态分析问题单过滤/gs-zk和扫描结果/PrjAttCtrlMng\\AttMath.c", "calls": [ "unitary", "memcpy", "cross" ], "called_by": [ "ZKEnvAct", "AttDeterOrb" ] }, { "node_id": "Function:CalQuatInv", "name": "CalQuatInv", "summary": "该函数`CalQuatInv`的主要目的是计算给定四元数`Qb1`的逆。其核心流程包括四个步骤:首先,将`Qb1[0]`(即四元数的x分量)的相反数赋值给结果四元数`Qres[0]`;接着,执行相同的操作于`Qb1[1]`(y分量)和`Qres[1]`之间;然后,对`Qb1[2]`(z分量)及其对应的结果位置`Qres[2]`也进行同样的处理;最后,直接将`Qb1[3]`(w分量)的值复制到`Qres[3]`中。这种操作基于四元数逆的基本数学定义,即通过改变原四元数除标量部分外的所有分量符号来获得其逆,这对于航天器姿态控制中的旋转表示转换至关重要。此函数接受两个参数,均为指向`TYPE_CAL`类型的指针,其中`Qb1`代表输入的四元数,而`Qres`用于存储计算得到的逆四元数。值得注意的是,该函数不返回任何值,而是直接修改传入的`Qres`数组以反映计算结果。此外,尽管当前描述表明它既不调用也不被其他特定函数调用,但考虑到其在航天软件工程中的应用背景,可以推测它可能作为更大姿态控制系统的一部分发挥作用。最后,为了确保类型定义的一致性和访问必要的数学工具或常量,该函数依赖于外部头文件..\\PrjCommon\\CommonDef.h 和 AttMath.h。", "file": "M:/研二上/静态分析问题单过滤/gs-zk和扫描结果/PrjAttCtrlMng\\AttMath.c", "calls": [], "called_by": [] }, { "node_id": "Function:DoGetCrcCheckU8", "name": "DoGetCrcCheckU8", "summary": "该函数`DoGetCrcCheckU8`旨在通过给定的数据起始地址和长度,利用预定义的CRC表对数据进行逐字节处理以计算并返回一个8位的CRC校验码。其核心流程包括初始化变量`result`为0xFF;随后,使用for循环遍历从`BeginAddr`开始的`CheckLength`个字节,在每次循环中,先计算`result`与当前地址指向的字节(`BeginAddr[i]`)的异或值,并用此异或结果作为索引查找`CRC_TABLE_8`数组中的对应值来更新`result`;当所有字节处理完毕后,最终的`result`即为所求的CRC校验码。此过程对于确保航天器通信数据完整性至关重要,能够有效检测出传输过程中可能出现的数据错误。输入参数包括`UINT8 * BeginAddr`(指向待检查数据块起始位置的指针)和`UINT8 CheckLength`(指定要检查的数据长度)。函数执行完毕后返回类型为`UINT8`的结果,代表了根据输入数据计算得到的8位CRC校验值。尽管当前描述未明确指出`DoGetCrcCheckU8`直接调用了其他函数或被哪些具体函数调用,但可以推测它可能在更广泛的系统级数据验证逻辑中扮演关键角色。此外,该函数依赖于外部定义的`CRC_TABLE_8`数组以及来自头文件`..\\PrjCommon\\CommonDef.h`和`AttMath.h`中的相关声明或宏定义。", "file": "M:/研二上/静态分析问题单过滤/gs-zk和扫描结果/PrjAttCtrlMng\\AttMath.c", "calls": [], "called_by": [] }, { "node_id": "Function:PoseGetInt32From24", "name": "PoseGetInt32From24", "summary": "该函数`PoseGetInt32From24`旨在从给定的三字节数据中解析出一个有符号的24位整数,并将其转换为浮点数返回,特别适用于航天器姿态控制系统中的数据处理。首先定义了两个无符号32位整数变量`L24`和`tmpL24`以及一个初始化为0.0的浮点数`tmp_f`。接着,从指针`Ldata`指向的数据中提取前三个字节并组合成一个24位整数值存储于`L24`中。如果`Ldata`的第一个字节设置了最高位(0x80),则通过取反`L24`得到`tmpL24`,再与0xffffff进行按位与操作后加1,最终将结果作为负浮点数赋值给`tmp_f`;若未设置,则直接将`L24`转换为正浮点数赋给`tmp_f`。此过程确保了即使在表示负数时也能准确地完成从24位整数到浮点数的转换。该函数接受一个类型为`UINT8*`的参数`Ldata`,用于指向待解析的数据起始位置。其返回值是一个`float`类型的数值,代表了解析并转换后的结果。此函数被`Gyro_DataGet`调用以处理来自陀螺仪的数据。此外,它依赖于..\\PrjCommon\\CommonDef.h和AttMath.h这两个头文件提供的定义或宏来支持其运行。", "file": "M:/研二上/静态分析问题单过滤/gs-zk和扫描结果/PrjAttCtrlMng\\AttMath.c", "calls": [], "called_by": [ "Gyro_DataGet" ] }, { "node_id": "Function:AglSpdOofICal", "name": "AglSpdOofICal", "summary": "该函数`AglSpdOofICal`主要用于基于两个输入向量`cuR`(位置向量)和`cuV`(速度向量),计算出一个新的向量`Woi`,其核心目的是在航天器姿态控制中确定角速度分量。首先定义了几个局部变量包括整型`i`、浮点型`RR`、数组`tmpw[3]`、`tmpwo`以及`tmpRXV[3]`。接着通过调用`CalNormal`函数获取`cuR`的模长并将其平方值存储于`RR`中;然后利用`cross`函数求得`cuR`与`cuV`之间的叉积,并将结果保存至`tmpRXV`。如果`RR`大于预设阈值`POSE_ZERO`,则对`tmpRXV`中的每个元素除以`RR`后存入`tmpw`,随后再次使用`CalNormal`标准化`tmpw`得到`tmpwo`。当`RR`不大于`POSE_ZERO`时,直接给`Woi[1]`赋一个特定数值`-0.00096466`并立即退出函数。最后,无论哪种情况发生,都会先清零`Woi`数组的所有元素,再将`-tmpwo`或上述特定值设置为`Woi`的第二个元素。此过程涉及到`memset`用于初始化数组,`CalNormal`用于计算向量长度及归一化处理,而`cross`则负责执行向量间的叉乘运算。此外,`AglSpdOofICal`被`Cal_OrbAttRate_Wo`和`AttDeterOrb`这两个函数所调用,并且依赖于来自`..\\PrjCommon\\CommonDef.h`和`AttMath.h`头文件中定义的相关函数实现其功能。", "file": "M:/研二上/静态分析问题单过滤/gs-zk和扫描结果/PrjAttCtrlMng\\AttMath.c", "calls": [ "memset", "CalNormal", "cross" ], "called_by": [ "Cal_OrbAttRate_Wo", "AttDeterOrb" ] }, { "node_id": "Function:AttLongKutaCal", "name": "AttLongKutaCal", "summary": "该函数`AttLongKutaCal`实现了四阶龙格-库塔算法,用于航天器姿态控制中的微分方程数值解。首先,它初始化一个名为`tmpOmg`的数组,根据输入参数`pWbxl`的值填充特定位置。接着,通过一系列步骤计算出四个中间变量K1至K4:K1是将`tmpOmg`与`pQbxl`相加的结果除以2得到;K2基于`pQbxl`加上K1的一半来更新临时数组`tmpUse`后再次执行类似操作获得;K3和K4遵循相似逻辑但分别基于前一步骤的结果进行调整。最终,利用这些K值及预设的时间步长`ATTPERIOD_S`更新状态向量`pQbx`。此过程旨在精确估计给定时间间隔内航天器姿态的变化情况。函数接受三个`TYPE_CAL`类型的指针作为输入参数,分别是表示角速度的`pWbxl`、当前姿态四元数`pQbxl`以及待更新的姿态四元数`pQbx`。虽然没有明确返回值,但其主要作用在于修改传入的姿态四元数`pQbx`。在实现过程中,`AttLongKutaCal`依赖于`MatrixPlusVectorN`函数完成矩阵与向量间的加法运算,并且自身被`Gyro_AttDeter`函数调用以参与更广泛的姿态确定流程。此外,该函数还涉及到跨文件引用,特别是从`..\\PrjCommon\\CommonDef.h`和`AttMath.h`中引入了必要的定义或辅助函数。", "file": "M:/研二上/静态分析问题单过滤/gs-zk和扫描结果/PrjAttCtrlMng\\AttMath.c", "calls": [ "MatrixPlusVectorN" ], "called_by": [ "Gyro_AttDeter" ] }, { "node_id": "Function:Eul312A2Quat", "name": "Eul312A2Quat", "summary": "该函数`Eul312A2Quat`实现了从给定的3-1-2顺序(即绕Z轴、X轴、Y轴依次旋转)的欧拉角到四元数表示的姿态转换过程。首先,它计算输入数组`ca`中每个元素除以2后的正弦值与余弦值,其中`ca[0]`、`ca[1]`和`ca[2]`分别代表绕Z轴、X轴、Y轴旋转的角度。接着,利用这些正弦值与余弦值,根据特定的四元数转换公式来确定输出四元数`cq`的各个分量:`cq[0]`通过`POSE_SINF(ca[0]/2.0)*POSE_COSF(ca[1]/2.0)*POSE_COSF(ca[2]/2.0) - POSE_COSF(ca[0]/2.0)*POSE_SINF(ca[1]/2.0)*POSE_SINF(ca[2]/2.0)`得到;类似地,`cq[1]`、`cq[2]`及`cq[3]`也依据相应的公式被逐一计算出来。最终,原始的欧拉角信息被成功转换为四元数格式,并存储于`cq`数组内。此函数的主要目的是为了在航天器姿态控制领域提供一种高效且准确的方法,将更直观但可能遭遇万向锁问题的欧拉角表示法转变为更加适合进行连续姿态变换描述的四元数形式。其接受两个参数,分别是类型为`TYPE_CAL*`的指针`ca`用于接收输入的欧拉角数据,以及同样类型的指针`cq`用来存放转换结果。值得注意的是,该函数本身不返回任何值,而是直接修改了传入的`cq`数组内容。此外,在执行过程中会调用外部定义的`POSE_SINF`和`POSE_COSF`函数来完成必要的三角函数运算。而`Eul312A2Quat`则通常会被更高层次的姿态确定算法如`AttDeterOrb`所调用。最后,为了确保所有相关数学操作的一致性和正确性,本函数依赖于包含在`..\\PrjCommon\\CommonDef.h`和`AttMath.h`这两个头文件中的定义与声明。", "file": "M:/研二上/静态分析问题单过滤/gs-zk和扫描结果/PrjAttCtrlMng\\AttMath.c", "calls": [ "POSE_SINF", "POSE_COSF" ], "called_by": [ "AttDeterOrb" ] }, { "node_id": "Function:Matrix2Eul312A", "name": "Matrix2Eul312A", "summary": "该函数`Matrix2Eul312A`主要用于将一个给定的方向余弦矩阵`M`转换为一组欧拉角数组`ca`,特别适用于航天器姿态确定过程中。首先,它会检查矩阵`M`的第6个元素(索引为5)的绝对值是否超过1;如果确实如此,则依据`CalPFlag(M[5])`的结果调整`M[5]`至1.0或-1.0,以确保后续计算的有效性。接着,通过计算`M[5]`的反正弦值得到`ca[0]`。随后,程序判断`ca[0]`的绝对值与π/2之间的差距是否小于预定义的小阈值`POSE_ZERO`;若满足条件,则直接设定`ca[1]`和`ca[2]`为0并结束执行,以此方式处理接近±90度时可能出现的奇异点问题。反之,当不处于上述特殊情况时,利用`POSE_ATAN2F`函数分别基于`-M[2]`与`M[8]`、`-M[3]`与`M[4]`的比例来求得`ca[1]`和`ca[2]`。此过程依赖于几个辅助数学函数如`POSE_ATAN2F`, `POSE_ASINF`, `POSE_ABSF`以及逻辑判定函数`CalPFlag`。此外,`Matrix2Eul312A`被多个关键的姿态确定相关函数如`AttDeterOrb`, `AttDeterOrbCtrl`, 和`AttDeterTarRe`调用,并且其定义涉及到跨文件引用,包括了来自`..\\PrjCommon\\CommonDef.h`和`AttMath.h`中的声明。输入参数包括方向余弦矩阵`M`(类型为`TYPE_CAL*`)及用于存储结果的欧拉角数组`ca`(同样为`TYPE_CAL*`类型)。本函数没有显式的返回值,而是通过修改传入的`ca`指针指向的数据来传递计算结果。", "file": "M:/研二上/静态分析问题单过滤/gs-zk和扫描结果/PrjAttCtrlMng\\AttMath.c", "calls": [ "POSE_ATAN2F", "POSE_ASINF", "POSE_ABSF", "CalPFlag" ], "called_by": [ "AttDeterOrb", "AttDeterOrbCtrl", "AttDeterTarRe" ] }, { "node_id": "Function:DeviAngleLimit", "name": "DeviAngleLimit", "summary": "`DeviAngleLimit`函数旨在确保角度值`*Ang`保持在-90到+90度(以弧度表示)的范围内,这对于航天器的姿态控制至关重要,因为这有助于维持姿态计算中的数值稳定性与准确性。首先,该函数通过调用`POSE_ABSF`函数检查输入的角度`*Ang`(类型为`TYPE_CAL`指针,代表需要调整的角度值)的绝对值是否超过了270度(转换成弧度)。如果条件满足且`*Ang`大于0,则从`*Ang`中减去360度(同样转换为弧度),反之若`*Ang`小于或等于0,则向其加上等量的弧度值。此过程保证了即使原始角度超出预期范围,也能被正确地映射回-90至+90度区间内。值得注意的是,虽然`DeviAngleLimit`本身不返回任何值,但通过对`*Ang`直接修改实现了其核心目标。此外,该函数紧密关联于多个关键算法模块如`WheelCalc_PD`, `WheelCalc_PID`, `AttExJudge`, 和`AttUnStaJudge`,这些模块依赖于经过规范化处理后的角度数据来进行更精确的姿态控制决策。最后,为了支持上述操作,`DeviAngleLimit`引用了定义在`..\\PrjCommon\\CommonDef.h`和`AttMath.h`头文件中的宏定义及辅助函数,特别是用于角度单位转换的常数`ANG2RADIAN`。", "file": "M:/研二上/静态分析问题单过滤/gs-zk和扫描结果/PrjAttCtrlMng\\AttMath.c", "calls": [ "POSE_ABSF" ], "called_by": [ "WheelCalc_PD", "WheelCalc_PID", "AttExJudge", "AttUnStaJudge" ] }, { "node_id": "Function:count_onebit", "name": "count_onebit", "summary": "该函数`count_onebit`旨在计算给定8位无符号整数`n`在其二进制表示形式下前`eff_bit`位中1的数量,这在航天软件工程中可以用于数据校验、编码解码或特定信号处理场景。首先,它初始化一个名为`count`的计数器为0;接着,通过一个for循环从0迭代至小于`eff_bit`的值,每次迭代使用位移操作符将`n`右移当前迭代次数`i`位,并与1执行按位与操作以检测移动后的最低位是否为1。如果检测结果为真,则递增`count`。当所有指定的有效位都被检查完毕后,函数返回`count`作为最终结果,即有效位范围内1的总数。此函数接受两个参数:`n`(UINT8类型, 待分析的整数值) 和 `eff_bit`(UINT8类型, 指定要检查的位数)。其返回值也是一个UINT8类型的整数,代表了在`n`的二进制表示中前`eff_bit`位里1出现的次数。值得注意的是,虽然`count_onebit`本身不直接调用其他任何函数,但它被`ZKWhlCmdDsp`函数所调用,表明其可能参与到了更复杂的命令解析或数据处理流程中。此外,为了确保跨文件的一致性和可访问性,该函数依赖于..\\PrjCommon\\CommonDef.h和AttMath.h这两个头文件中的定义或声明。", "file": "M:/研二上/静态分析问题单过滤/gs-zk和扫描结果/PrjAttCtrlMng\\AttMath.c", "calls": [], "called_by": [ "ZKWhlCmdDsp" ] }, { "node_id": "Function:ZKModChgInit", "name": "ZKModChgInit", "summary": "`ZKModChgInit`函数主要负责在航天器切换到新的工作模式时初始化一系列关键参数和计数器,确保系统从一个干净的状态开始运行。首先,该函数获取指向`sAttPriData`结构体的指针`tmpAtt`,其地址为`ATTCLT_DATA1_ADDR`;如果`tmpAtt`为空,则直接返回。接着,初始化指向`AttCmdDsp_t`类型的指针`pCmdDsp`,使其指向`tmpAtt->sCmdDspPara`。根据预处理器指令`MINMODULE_TYPE`的存在与否,选择性地将`tmpAtt->sModePara`中的多个计数器清零,但无论该宏定义是否存在,至少会将`WModCnt2[0]`和`WModCnt2[1]`设置为0。若未定义`MINMODULE_TYPE`,则进一步清零更多与控制模式相关的计数器(如`WModCnt3`至`WModCntA`),以及飞轮电流指令发送计数`Wheel_Cmd_Cnt`。此外,此函数还清零了与控制参数相关的计数器`PD2PIDCnt`、`CtrlPD2PID`,并将积分器数组`SumAerrPre`的所有元素设为0.0。最后,它将错误控制参数结构体`sErrCtlPara`内的多个字段重置为初始值或0,包括但不限于`AttLoseCnt`、`AttExCnt`等。通过这些操作,`ZKModChgInit`帮助维持了航天器姿态控制系统内部状态的一致性和准确性。此函数没有输入参数也不返回任何值,但它依赖于`memset`来执行部分内存清理任务,并且被`ZKAction`函数调用以完成模式切换过程中的初始化步骤。此外,`ZKModChgInit`与跨文件关联的函数涉及到了..\\PrjCommon\\CommonDef.h, ..\\PrjCommon\\DataStorDefine.h, ..\\PrjCommon\\DevDefine.h, AttMath.h, AttCtrlMain.h等多个头文件中定义的数据结构和常量。", "file": "M:/研二上/静态分析问题单过滤/gs-zk和扫描结果/PrjAttCtrlMng\\AttModeSel.c", "calls": [ "memset" ], "called_by": [ "ZKAction" ] }, { "node_id": "Function:ZKModDoSet", "name": "ZKModDoSet", "summary": "该函数`ZKModDoSet`主要用于更新航天器的工作模式。首先,它将`ATTCLT_DATA1_ADDR`地址转换为`sAttPriData`类型的指针`tmpAtt`。如果`tmpAtt`为空,则直接返回,不做任何操作。接着,函数会检查传入的新工作模式`newWMode`是否与当前存储的工作模式相同;如果相同,则直接返回,不做任何更改。若新旧工作模式不同,函数将保存当前的工作模式到`WorkModePre`字段中,然后更新`sModePara`结构体中的`WorkMode`字段为新的工作模式`newWMode`。最后,设置`ModeSwitchFlg`标志为`POSE_OK`,表明模式切换成功。此过程确保了只有当提供的新工作模式不同于现有模式时,才会执行实际的更新操作,并且在更新前保存了旧的工作模式值。此外,通过设置一个标志来指示模式切换的状态,便于后续处理或状态监控。该函数没有调用其他函数,但被多个函数如`ZKCmdResolve`, `ZKMINICmdResolve`, `ZKReModBK`, `ZKCtrlReinitBK`, `ZKMiniPowerOn`, 和`ZKModeSel_Auto`所调用。同时,它依赖于定义在`..\\PrjCommon\\CommonDef.h`, `..\\PrjCommon\\DataStorDefine.h`, `..\\PrjCommon\\DevDefine.h`, `AttMath.h`, 和`AttCtrlMain.h`头文件中的数据类型和常量。\n\n输入参数: (UINT8 newWMode) - 新的工作模式值,用于更新当前的工作模式。\n\n返回值: 无 - 此函数不返回任何值,其主要作用是修改内部状态并设置相关标志。", "file": "M:/研二上/静态分析问题单过滤/gs-zk和扫描结果/PrjAttCtrlMng\\AttModeSel.c", "calls": [], "called_by": [ "ZKCmdResolve", "ZKMINICmdResolve", "ZKReModBK", "ZKCtrlReinitBK", "ZKMiniPowerOn", "ZKModeSel_Auto" ] }, { "node_id": "Function:ZKModInit", "name": "ZKModInit", "summary": "该函数`ZKModInit`主要负责初始化姿态控制模块的相关参数及状态变量。首先,它定义并初始化了两个指针:一个是指向`sAttPriData`结构体的`tmpAtt`,指向地址`ATTCLT_DATA1_ADDR`;另一个是指向`AttCtrlConst_t`结构体的`tmpConst`,指向地址`ATTCLT_DATA2_ADDR`。如果这两个指针中的任何一个为`NULL`,则函数立即返回,不执行后续操作。接着,通过这两个指针进一步初始化了指向`sAttModPara_t`和`AttCmdDsp_t`结构体的指针`pWMod`与`pCmdDsp`。根据预处理器指令`MINMODULE_TYPE`是否被定义,设置`pWMod->WorkMode`为`ATTMOD_RATEDMP`或`ATTMOD_NOCOLL`。随后,对`pWMod`中多个字段如`ReDataBK`, `ATTFlashSwitch`, `Mod2UnctlFirst`, `WorkModePre`, `ModeSwitchFlg`, `ZKPowOnFirst`, 和`ZKPowOnStep`等进行赋值,并将`tmpConst->AttCmdFlashPara.WorkModeChangeAuto`设为`POSE_NO`。此外,还初始化了一系列用于判断的时间阈值(例如`judge_time1`至`judge_timeB`)、角度和角速度阈值(如`RateThr_2T3`, `HWHLThr_2T3`, `AngThr_3TB`等)以及与工作模式相关的计数器(比如`WModCnt2[0]`至`WModCntB`),并将`pCmdDsp->Wheel_Cmd_Cnt`置零。此函数无输入参数,也不返回任何值,但它是`AttCtrlInit`函数调用的一部分,且依赖于几个跨文件定义的数据结构和常量,这些定义位于..\\PrjCommon\\CommonDef.h, ..\\PrjCommon\\DataStorDefine.h, ..\\PrjCommon\\DevDefine.h, AttMath.h, AttCtrlMain.h等头文件中。", "file": "M:/研二上/静态分析问题单过滤/gs-zk和扫描结果/PrjAttCtrlMng\\AttModeSel.c", "calls": [], "called_by": [ "AttCtrlInit" ] }, { "node_id": "Function:ZKDoModCal", "name": "ZKDoModCal", "summary": "该函数`ZKDoModCal`首先从指定地址`ATTCLT_DATA1_ADDR`和`ATTCLT_DATA2_ADDR`获取`sAttPriData`结构体指针`tmpAtt`与`AttCtrlConst_t`结构体指针`tmpConst`。如果这两个指针中任一为NULL,则函数立即返回,避免后续操作中的潜在错误。接着,初始化指向`tmpAtt`内不同子结构的指针:`pWMod`用于访问模式参数,`pDeter`用于确定参数,而`PWhl`则指向轮参数。根据编译时定义的宏`MINMODULE_TYPE`选择执行不同的逻辑分支。在每个选定的路径下,基于当前工作模式(如`ATTMOD_RATEDMP`、`ATTMOD_WhlTOSUN`等),通过一系列条件判断来更新相关计数器,这些条件包括但不限于姿态角速率是否处于阈值范围内、反作用轮卸载角动量是否低于设定值以及帆板展开状态等。此过程对于支持航天器根据其当前状态做出适当的模式切换决策至关重要。该函数无输入参数,也不返回任何值,但其内部调用了POSE_ABSF函数以计算绝对值,并且自身被ZKDoModeAct函数所调用。此外,它还依赖于多个跨文件定义的数据结构和常量,这些定义位于..\\PrjCommon\\CommonDef.h, ..\\PrjCommon\\DataStorDefine.h, ..\\PrjCommon\\DevDefine.h, AttMath.h, 和AttCtrlMain.h头文件中。", "file": "M:/研二上/静态分析问题单过滤/gs-zk和扫描结果/PrjAttCtrlMng\\AttModeSel.c", "calls": [ "POSE_ABSF" ], "called_by": [ "ZKDoModeAct" ] }, { "node_id": "Function:ZKModeSel_Auto", "name": "ZKModeSel_Auto", "summary": "该函数`ZKModeSel_Auto`主要负责基于当前航天器的工作模式及其内部状态自动选择下一个合适的工作模式。首先,它初始化变量`tmpNewMod`为0,并定义指向`sAttPriData`和`AttCtrlConst_t`结构体的指针`tmpAtt`与`tmpConst`,同时初始化指向模式参数和轮参数的指针`pWMod`与`PWhl`。接着检查`tmpAtt`和`tmpConst`是否为空,如果任一为空则直接返回。然后将`pWMod`设置为`tmpAtt->sModePara`的地址,将`PWhl`设置为`tmpAtt->sPerPara.WhlPara`的地址,并将`tmpNewMod`设为当前工作模式`pWMod->WorkMode`。根据预处理器指令`MINMODULE_TYPE`的存在与否选择不同的逻辑分支:若定义了`MINMODULE_TYPE`,则进入一个switch-case结构处理`ATTMOD_RATEDMP`模式下的特定条件,当满足条件时更新`tmpNewMod`至`ATTMOD_MagTOSUN`并重置计数器;否则,执行另一个更复杂的switch-case结构来处理多种工作模式(如`ATTMOD_NOCOLL`, `ATTMOD_RATEDMP`, `ATTMOD_WhlTOSUN`, `ATTMOD_UNCTL`, `ATTMOD_ONLTOEARTH`),依据每个模式下不同的条件判断是否需要切换到新的工作模式,并相应地更新`tmpNewMod`及可能的其他相关变量。之后,设置`tmpAtt->sModePara.ModeSwitchFlg`为`POSE_NO`。最后,调用`ZKModDoSet(tmpNewMod)`函数以应用新的工作模式。此函数无输入参数,也不返回任何值,但其运行依赖于被`ZKDoModeAct`调用,并且在执行过程中会调用`ZKModDoSet`函数。此外,该函数还涉及到跨文件关联的头文件包括..\\PrjCommon\\CommonDef.h, ..\\PrjCommon\\DataStorDefine.h, ..\\PrjCommon\\DevDefine.h, AttMath.h, AttCtrlMain.h等。", "file": "M:/研二上/静态分析问题单过滤/gs-zk和扫描结果/PrjAttCtrlMng\\AttModeSel.c", "calls": [ "ZKModDoSet" ], "called_by": [ "ZKDoModeAct" ] }, { "node_id": "Function:ZKDoModeAct", "name": "ZKDoModeAct", "summary": "`ZKDoModeAct`函数主要负责执行与航天器工作模式相关的计算及自动选择/调整任务。该函数原本设计中包含了一段通过指针`tmpConst`访问位于`ATTCLT_DATA2_ADDR`地址的数据以检查其有效性的代码,但这段代码已被注释掉,因此当前实现直接跳过了数据有效性验证步骤。接下来,它依次调用两个子函数:首先是`ZKDoModCal()`,用于执行模式相关的计算操作;随后是`ZKModeSel_Auto()`,旨在根据先前的计算结果自动选择或调整航天器的工作模式。此过程对于确保航天器能够基于最新的环境参数和内部状态信息做出适当响应至关重要。从输入角度来看,`ZKDoModeAct`不接受任何显式参数,并且作为一个void类型函数,它也不返回任何值。在程序结构上,`ZKDoModeAct`被`ZKAction`函数所调用,同时自身又依赖于`ZKModeSel_Auto`和`ZKDoModCal`这两个函数来完成其核心职责。此外,为了支持这些功能,`ZKDoModeAct`还引用了来自多个头文件如..\\PrjCommon\\CommonDef.h, ..\\PrjCommon\\DataStorDefine.h, ..\\PrjCommon\\DevDefine.h, AttMath.h, 和AttCtrlMain.h中的定义和声明。", "file": "M:/研二上/静态分析问题单过滤/gs-zk和扫描结果/PrjAttCtrlMng\\AttModeSel.c", "calls": [ "ZKModeSel_Auto", "ZKDoModCal" ], "called_by": [ "ZKAction" ] }, { "node_id": "Function:ZKPosCtlInit", "name": "ZKPosCtlInit", "summary": "`ZKPosCtlInit`函数主要负责初始化航天器姿态控制相关的参数,特别是PD和PID控制算法中的增益系数及其他关键参数。首先,该函数从预定义地址`ATTCLT_DATA1_ADDR`获取指向`sAttPriData`结构体的指针`tmpAtt`,同时从`ATTCLT_DATA2_ADDR`获取指向`AttCtrlConst_t`结构体的指针`tmpConst`。如果任一指针为NULL,则函数立即返回,以避免后续操作中可能出现的错误。接着,对于PD控制算法,函数设置了包括但不限于`kp_ToSun_PD`、`kd_ToSun_PD`以及`w0max_PD`在内的多个参数值;同样地,也对非朝向太阳模式下的相应参数进行了配置。此外,针对PID控制算法,通过设定如`kp_PID`、`kd_PID`等参数来完成其初始化过程。此函数没有直接接收任何输入参数,并且不返回任何值。它被`AttCtrlInit`函数调用作为姿态控制系统初始化的一部分。在实现过程中,`ZKPosCtlInit`依赖于来自`..\\PrjCommon\\CommonDef.h`, `..\\PrjCommon\\DevDefine.h`, `AttMath.h`, 和 `AttCtrlMain.h`头文件中定义的数据类型和其他辅助函数。", "file": "M:/研二上/静态分析问题单过滤/gs-zk和扫描结果/PrjAttCtrlMng\\AttPosCtrl.c", "calls": [], "called_by": [ "AttCtrlInit" ] }, { "node_id": "Function:ZKPosCtlOutInit", "name": "ZKPosCtlOutInit", "summary": "该函数`ZKPosCtlOutInit`主要用于在航天器姿态控制系统中初始化特定变量至零状态,确保这些关键参数在新的控制周期开始前处于已知的初始值。首先,它将`ATTCLT_DATA1_ADDR`地址强制转换为`sAttPriData*`类型指针并赋值给`tmpAtt`。接着,定义一个指向`sAttCtlPara_t`类型的指针`pWCtrl`并初始化为`NULL`。如果`tmpAtt`为`NULL`,则直接返回,结束函数执行;否则,通过`tmpAtt->sCtlPara`获取控制参数结构体,并将其地址赋给`pWCtrl`。随后,使用`memset`函数将`pWCtrl`中的`Mag_DeltBb`数组(长度为3个`TYPE_CAL`类型的元素)和`WheelCtrlResult`数组(同样包含3个`TYPE_CAL`类型的元素)清零。此过程对于保证磁力计偏差调整及轮控结果相关数据的准确性至关重要。该函数没有输入参数,也不返回任何值。它调用了标准库函数`memset`来实现内存清零操作,并且被`ZKPosCtlAct`函数所调用。此外,为了正确编译和运行,该函数依赖于几个跨文件定义的数据结构和常量,这些定义位于..\\PrjCommon\\CommonDef.h, ..\\PrjCommon\\DevDefine.h, AttMath.h, 和AttCtrlMain.h头文件中。", "file": "M:/研二上/静态分析问题单过滤/gs-zk和扫描结果/PrjAttCtrlMng\\AttPosCtrl.c", "calls": [ "memset" ], "called_by": [ "ZKPosCtlAct" ] }, { "node_id": "Function:MagDataDeltaProc", "name": "MagDataDeltaProc", "summary": "`MagDataDeltaProc`函数主要用于航天器姿态控制系统中,通过计算两个连续时刻点之间磁矢量的变化率来辅助姿态调整。该函数首先初始化一个名为`i`的无符号32位整数变量并设其值为0。接着,它会检查给定的时间间隔`cDeltaT`的绝对值是否大于零,这是为了确保时间间隔有效且非零,从而避免除以零的情况发生。如果`cDeltaT`满足条件,则进入一个循环,此循环迭代处理三个维度(通常指X、Y、Z轴)的数据。在每次循环中,函数计算当前时刻(`cMagBb`)与前一时刻(`cMagBbPre`)磁矢量在每个维度上的差值,并将这个差值除以`cDeltaT`,得到的结果表示单位时间内磁矢量变化的速度或加速度,然后将这些结果存储于`cMagDelta`数组对应的位置。此过程对于理解航天器周围磁场环境及其随时间的变化至关重要,有助于更精确地控制航天器的姿态。输入参数包括:`cMagBb` (TYPE_CAL*) - 当前时刻的磁矢量数据;`cMagBbPre` (TYPE_CAL*) - 上一时刻的磁矢量数据;`cMagDelta` (TYPE_CAL*) - 用于存储计算出的磁矢量变化率;以及`cDeltaT` (TYPE_CAL) - 时间间隔。该函数没有返回值。`MagDataDeltaProc`被`MagDmpMomentCal`和`MagSunMomentCal`这两个函数调用,而它自身则依赖于`POSE_ABSF`函数来判断时间间隔的有效性。此外,该函数还涉及到跨文件引用,具体来说是包含了来自`\\PrjCommon\\CommonDef.h`, `\\PrjCommon\\DevDefine.h`, `AttMath.h`, 和 `AttCtrlMain.h`头文件中的定义和声明。", "file": "M:/研二上/静态分析问题单过滤/gs-zk和扫描结果/PrjAttCtrlMng\\AttPosCtrl.c", "calls": [ "POSE_ABSF" ], "called_by": [ "MagDmpMomentCal", "MagSunMomentCal" ] }, { "node_id": "Function:CtrlMagBdotDamp", "name": "CtrlMagBdotDamp", "summary": "该函数`CtrlMagBdotDamp`首先初始化一个名为`i`的变量为0,并定义了一个长度为3的数组`tmpBdot`,所有元素均被初始化为0。接着,它将指针`ATTCLT_DATA1_ADDR`转换为`sAttPriData`类型的指针并赋值给`tmpAtt`;同时,将`ATTCLT_DATA2_ADDR`转换为`AttCtrlConst_t`类型的指针并赋值给`tmpConst`。如果`tmpAtt`或`tmpConst`任一为空,则直接返回,结束函数执行。随后,使用`memcpy`函数将输入参数`cDeltBb`中的前12个字节复制到`tmpBdot`中。通过一个for循环遍历索引`i`从0到2(处理三维向量的每个分量),对于每一个分量,检查其绝对值是否小于`Mag_DampBdotMin`的绝对值,如果是,则将该分量在`tmpBdot`中的对应位置设置为0。根据`tmpBdot[i]`的正负情况来决定输出控制力矩`cMagT[i]`的值:若`tmpBdot[i]`大于零,则`cMagT[i]`被设为`-Mag_Bb_CtrlMax`;若`tmpBdot[i]`小于零,则`cMagT[i]`被设为`Mag_Bb_CtrlMax`;否则,`cMagT[i]`保持为0。此函数的主要目的是实现基于磁控速率阻尼算法的控制逻辑,通过对输入磁场变化率`cDeltBb`进行死区处理后,调整输出控制力矩`cMagT`的方向与大小,以达到对航天器姿态的有效控制。该函数接受两个`TYPE_CAL`类型的指针作为输入参数,分别是表示磁场变化率的`cDeltBb`和用于存储计算结果的`cMagT`。函数本身没有返回值。在执行过程中,会调用`memcpy`和`POSE_ABSF`函数,并且该函数是由`MagDmpMomentCal`函数调用来完成更复杂的姿态控制任务的一部分。此外,为了正确编译和运行,需要包含来自..\\PrjCommon\\CommonDef.h, ..\\PrjCommon\\DevDefine.h, AttMath.h, AttCtrlMain.h等文件的定义。", "file": "M:/研二上/静态分析问题单过滤/gs-zk和扫描结果/PrjAttCtrlMng\\AttPosCtrl.c", "calls": [ "memcpy", "POSE_ABSF" ], "called_by": [ "MagDmpMomentCal" ] }, { "node_id": "Function:MagDmpMomentCal", "name": "MagDmpMomentCal", "summary": "该函数`MagDmpMomentCal`主要用于根据当前及前一时刻的磁场数据选择合适的Bdot(磁场变化率)计算方法,并据此计算出用于姿态控制的磁控阻尼力矩。首先,初始化变量`tmpCNT`为0,并定义指向`sAttPriData`结构体的指针`tmpAtt`,将其设置为指向`ATTCLT_DATA1_ADDR`地址;如果`tmpAtt`为空,则直接返回。接着,定义并初始化多个指针变量,分别指向`tmpAtt`中的不同成员,如磁参数、控制参数、确定参数等。然后,通过将`pMt->MTCtrlTime`对10取模来计算`tmpCNT`值。当`PMag->Mag_Use`和`pDeter->Wi_Vld`都不等于`POSE_NO`时,进一步检查`tmpCNT`是否等于1或者`pMag->MagUseSwich`是否等于0x88;满足条件时,调用`cross()`函数计算向量叉积,并通过`CtrlMagBdotDamp()`函数计算磁控阻尼控制力矩。若上述条件不成立但`PMag->Mag_Use`和`PMag->Mag_UsePre`均不等于`POSE_NO`,则再次基于`tmpCNT`或`pMag->MagUseSwich`的值判断是否使用`MagDataDeltaProc()`基于前后拍差来计算Bdot,并同样调用`CtrlMagBdotDamp()`进行后续处理。最后,如果所有条件均未满足,则将`pWCtrl->MagCtrlResult`数组的所有元素设为0.0f。此函数被`ZKPosCtlAct`调用,并依赖于`MagDataDeltaProc`, `CtrlMagBdotDamp`, 和 `cross`这三个函数完成其核心任务。此外,它还与跨文件关联的头文件`\\PrjCommon\\CommonDef.h`, `\\PrjCommon\\DevDefine.h`, `AttMath.h`, 和 `AttCtrlMain.h`有紧密联系。", "file": "M:/研二上/静态分析问题单过滤/gs-zk和扫描结果/PrjAttCtrlMng\\AttPosCtrl.c", "calls": [ "MagDataDeltaProc", "CtrlMagBdotDamp", "cross" ], "called_by": [ "ZKPosCtlAct" ] }, { "node_id": "Function:MagSunMomentCal", "name": "MagSunMomentCal", "summary": "摘要生成失败。", "file": "M:/研二上/静态分析问题单过滤/gs-zk和扫描结果/PrjAttCtrlMng\\AttPosCtrl.c", "calls": [ "POSE_ACOSF", "CalNormal", "Posedot", "cross", "MagDataDeltaProc" ], "called_by": [ "ZKPosCtlAct" ] }, { "node_id": "Function:WheelCalc_PD", "name": "WheelCalc_PD", "summary": "摘要生成失败。", "file": "M:/研二上/静态分析问题单过滤/gs-zk和扫描结果/PrjAttCtrlMng\\AttPosCtrl.c", "calls": [ "memcpy", "MatrixProductHL", "POSE_ABSF", "cross", "DeviAngleLimit" ], "called_by": [ "CtrlModPD2PID", "ZKPosCtlAct" ] }, { "node_id": "Function:WheelCalc_PID", "name": "WheelCalc_PID", "summary": "摘要生成失败。", "file": "M:/研二上/静态分析问题单过滤/gs-zk和扫描结果/PrjAttCtrlMng\\AttPosCtrl.c", "calls": [ "memcpy", "MatrixProductHL", "POSE_ABSF", "cross", "DeviAngleLimit" ], "called_by": [ "CtrlModPD2PID" ] }, { "node_id": "Function:Whl_Momentum_Count", "name": "Whl_Momentum_Count", "summary": "摘要生成失败。", "file": "M:/研二上/静态分析问题单过滤/gs-zk和扫描结果/PrjAttCtrlMng\\AttPosCtrl.c", "calls": [ "MatrixProductHL", "memcpy", "CalNormal" ], "called_by": [ "ZKPosCtlAct" ] }, { "node_id": "Function:CtrlWheelReleaseProc", "name": "CtrlWheelReleaseProc", "summary": "摘要生成失败。", "file": "M:/研二上/静态分析问题单过滤/gs-zk和扫描结果/PrjAttCtrlMng\\AttPosCtrl.c", "calls": [ "POSE_ACOSF", "CalNormal", "Posedot", "cross", "memset" ], "called_by": [ "ZKPosCtlAct" ] }, { "node_id": "Function:CtrlModPD2PID", "name": "CtrlModPD2PID", "summary": "该函数`CtrlModPD2PID`首先从指定内存地址`ATTCLT_DATA1_ADDR`和`ATTCLT_DATA2_ADDR`分别获取`sAttPriData`结构体指针`tmpAtt`与`AttCtrlConst_t`结构体指针`tmpConst`。如果任一指针为空,则立即返回,避免后续操作出错。接着定义两个临时变量`tmpAng`和`tmpAngRat`,用于存储5.0度及0.1度转换成弧度后的值。随后,通过`tmpAtt`获得控制参数`sCtlPara`的指针`pCtrl`以及确定参数`sDeterPara`的指针`pDeter`。接下来,检查`pDeter`中的`CLPAttValid`字段是否为0x55,并且其`CLPAttAng`数组所有元素绝对值小于`tmpAng`(即5.0度),同时`CLPAttAngRat`数组所有元素绝对值小于`tmpAngRat`(即0.1度)。若上述条件满足,则进一步判断`pCtrl->PD2PIDCnt`是否小于60000,是则递增此计数器;否则将`pCtrl->PD2PIDCnt`重置为零。当`pCtrl->PD2PIDCnt`达到或超过20时,设置`pCtrl->CtrlPD2PID`状态为`POSE_OK`。最后,依据`pCtrl->CtrlPD2PID`的状态决定调用`WheelCalc_PID()`还是`WheelCalc_PD()`来执行相应的姿态控制算法。此过程旨在根据航天器当前的姿态数据及其变化率自动调整控制模式,确保在特定条件下从PD控制平滑过渡到PID控制,从而优化姿态控制性能。该函数不接受任何输入参数,也没有返回值。它被`ZKPosCtlAct`函数调用,并依赖于`POSE_ABSF, WheelCalc_PID, WheelCalc_PD`等函数实现其功能。此外,该函数还引用了来自`\\PrjCommon\\CommonDef.h`, `\\PrjCommon\\DevDefine.h`, `AttMath.h`, 和`AttCtrlMain.h`头文件中定义的数据类型和其他相关声明。", "file": "M:/研二上/静态分析问题单过滤/gs-zk和扫描结果/PrjAttCtrlMng\\AttPosCtrl.c", "calls": [ "POSE_ABSF", "WheelCalc_PID", "WheelCalc_PD" ], "called_by": [ "ZKPosCtlAct" ] }, { "node_id": "Function:ZKPosCtlAct", "name": "ZKPosCtlAct", "summary": "`ZKPosCtlAct`函数主要负责根据航天器当前的工作模式执行相应的姿态控制逻辑。首先,它从全局变量`ATTCLT_DATA1_ADDR`获取指向`sAttPriData`结构体的指针`tmpAtt`,并检查该指针是否为空,如果为空则直接返回。接着,初始化指向控制参数和模式参数的局部指针`pCtrl`和`pWMod`。根据编译时定义的宏`MINMODULE_TYPE`选择执行路径:若定义了`MINMODULE_TYPE`,则将`pCtrl->Mag_DeltBb`数组初始化为0,并调用`Whl_Momentum_Count()`计算飞轮角动量和三轴角动量,随后依据当前工作模式(存储于`pWMod->WorkMode`)调用不同的处理函数,如速率阻尼模式下调用`MagDmpMomentCal()`,磁控对日模式下调用`MagSunMomentCal()`;否则,先调用`ZKPosCtlOutInit()`进行初始化,再计算飞轮角动量和三轴角动量,之后根据工作模式执行不同操作,包括但不限于碰撞规避、速率阻尼、对日定向(磁控或轮控)、对地定向等,可能涉及调用`WheelCalc_PD()`, `CtrlWheelReleaseProc()`, `CtrlModPD2PID()`等函数来完成特定任务,对于某些模式还会清零一些控制结果字段。此函数通过判断不同工作模式能够灵活应对多种姿态调整需求,确保航天器按照预定的方式稳定运行。其输入参数包括指向姿态确定参数、姿态引导律参数及姿态控制参数的指针,但无明确返回值。该函数被`ZKAction`调用,并与多个其他函数如`Whl_Momentum_Count`, `WheelCalc_PD`, `MagDmpMomentCal`, `MagSunMomentCal`, `CtrlWheelReleaseProc`, `memset`, `CtrlModPD2PID`, `ZKPosCtlOutInit`存在调用关系。此外,该函数还引用了来自`..\\PrjCommon\\CommonDef.h`, `..\\PrjCommon\\DevDefine.h`, `AttMath.h`, `AttCtrlMain.h`头文件中的定义。", "file": "M:/研二上/静态分析问题单过滤/gs-zk和扫描结果/PrjAttCtrlMng\\AttPosCtrl.c", "calls": [ "Whl_Momentum_Count", "WheelCalc_PD", "MagDmpMomentCal", "MagSunMomentCal", "CtrlWheelReleaseProc", "memset", "CtrlModPD2PID", "ZKPosCtlOutInit" ], "called_by": [ "ZKAction" ] }, { "node_id": "Function:ZKPGInit", "name": "ZKPGInit", "summary": "该函数`ZKPGInit`主要用于初始化姿态确定参数结构体中的多个字段,确保所有必要的姿态参数被正确地初始化至默认值或特定值,以便后续的姿态控制算法能够基于这些初始条件正常运行。首先,它定义了一个指向`sAttPriData`结构体的指针`tmpAtt`,并将其初始化为`ATTCLT_DATA1_ADDR`地址处的数据;如果`tmpAtt`为空,则直接返回。接着,通过`tmpAtt`获取到一个指向`sAttDeterPara_t`结构体的指针`pDeter`,并将`pDeter->AttDeter_Type`设置为0。根据是否定义了`MINMODULE_TYPE`宏,执行不同的初始化操作:若定义了此宏,则仅对日太阳角相关的变量(如`SunVecb`、`AngToSun`)进行清零,并设置`AngToSun_ValidFlg`标志为0x55表示星敏本体系太阳矢量可用,同时将`CalAngToSun_Source`设为0,以及闭环姿态角相关变量(`CLPAttAng`)清零且设置`CLPAttValid`标志为`POSE_OK`;反之,除了上述操作外,还需额外初始化轨道系姿态(包括`Qo`、`AttRateOrb`等)、目标参考系姿态(如`AttAngTarRe`)及轨控参考系姿态(如`AttAngOrbCtrl`)相关的变量,并相应地设置有效性标志(如`AttOrb_Vld`、`AttTarRe_Vld`、`AttOrbCtrl_Vld`)为`POSE_OK`。此外,此函数使用了`memset`来实现部分数据的清零处理,并由`ZKPGAct`调用以完成初始化工作。与跨文件关联的头文件包括..\\PrjCommon\\CommonDef.h, AttMath.h, AttCtrlMain.h。", "file": "M:/研二上/静态分析问题单过滤/gs-zk和扫描结果/PrjAttCtrlMng\\AttPosGet.c", "calls": [ "memset" ], "called_by": [ "ZKPGAct" ] }, { "node_id": "Function:Gyro_AttChoice", "name": "Gyro_AttChoice", "summary": "该函数`Gyro_AttChoice`主要负责从最多三个可能的陀螺仪传感器中选择一个或多个可用的陀螺仪,并基于其可用性和优先级决定最终使用的角速度数据。首先,初始化变量`i`为0,并将指向`sAttPriData`结构体的指针`tmpAtt`设置为`ATTCLT_DATA1_ADDR`。如果`tmpAtt`为空,则直接返回。接着,将三个陀螺仪参数结构体指针`PGyro[0]`, `PGyro[1]`, 和`PGyro[2]`分别初始化为`tmpAtt`中对应陀螺仪的数据地址,并将指向`sAttDeterPara_t`结构体的指针`pDeter`设置为`tmpAtt`中的`sDeterPara`成员。根据陀螺仪的可用性标志`Gyro_AvailableFlg`判断是否有且仅有一个陀螺仪可用,如果是,则找到该陀螺仪并将其角速度数据复制到`pDeter->Wi`,同时更新`pDeter->Wi_Vld`和`pDeter->AttDeter_Type`。如果有两个陀螺仪可用,则根据优先级选择其中一个陀螺仪的角速度数据进行复制与更新;若三个陀螺仪都可用,则检查它们的优先级是否相同,相同则使用第一个陀螺仪的数据,否则选择优先级最高的陀螺仪的数据,并相应地更新相关参数。最后,将选定的角速度数据复制回`tmpAtt->sPerPara.Gyro_ATTWi`数组。此过程确保了姿态确定参数能够基于最合适的陀螺仪数据得到更新,从而支持航天器的姿态控制需求。该函数不接受任何输入参数,也没有返回值。在实现过程中调用了`memcpy`函数来完成数据复制任务,而它本身被`Gyro_AttDeter`和`SsGyro_AngDeter`这两个函数所调用。此外,该函数还依赖于定义在`..\\PrjCommon\\CommonDef.h`, `AttMath.h`, 和`AttCtrlMain.h`头文件中的类型和常量。", "file": "M:/研二上/静态分析问题单过滤/gs-zk和扫描结果/PrjAttCtrlMng\\AttPosGet.c", "calls": [ "memcpy" ], "called_by": [ "Gyro_AttDeter", "SsGyro_AngDeter" ] }, { "node_id": "Function:Gyro_AttDeter", "name": "Gyro_AttDeter", "summary": "该函数`Gyro_AttDeter`主要用于根据陀螺仪数据的状态选择合适的方法来确定航天器的姿态信息。首先,它初始化两个指针`tmpAtt`和`tmpConst`分别指向特定地址`ATTCLT_DATA1_ADDR`与`ATTCLT_DATA2_ADDR`,并检查这两个指针是否为NULL,如果是则直接退出函数。接着,通过`tmpAtt`初始化一个包含三个元素的数组`PGyro`,每个元素指向一个不同的陀螺仪参数结构体,并且设置另一个指针`pDeter`指向姿态确定参数结构体。随后,函数会判断是否有至少一个陀螺仪可用(依据`Gyro_AvailableFlg`标志),如果有,则调用`Gyro_AttChoice()`进行进一步处理;若没有单个陀螺仪可用但组合陀螺仪数据有效(`GyroIn_Comb`标志为`POSE_OK`)时,将组合陀螺仪角速度复制到`pDeter->Wi`中,同时更新相关状态变量。此外,函数还会检查前一次的姿态四元数是否有效,如果有效,则基于上一次的角速度和四元数使用`AttLongKutaCal`函数计算当前四元数,并管理其有效性及类型标识;反之,若前次姿态无效,则相应地设置当前四元数无效、重置类型位以及清零时间计数器`GyroINT_Time`。此函数无输入参数,也不返回任何值,但它依赖于`Gyro_AttChoice`和`AttLongKutaCal`等函数完成其任务,并被`SsGyro_AttDeter`函数调用。涉及到跨文件引用的头文件包括`\\PrjCommon\\CommonDef.h`, `AttMath.h`, 和 `AttCtrlMain.h`。", "file": "M:/研二上/静态分析问题单过滤/gs-zk和扫描结果/PrjAttCtrlMng\\AttPosGet.c", "calls": [ "Gyro_AttChoice", "AttLongKutaCal", "memcpy" ], "called_by": [ "SsGyro_AttDeter" ] }, { "node_id": "Function:QuatDiffCal", "name": "QuatDiffCal", "summary": "该函数`QuatDiffCal`主要用于基于当前(`pQ_now`)与先前(`pQ_pre`)姿态四元数之间的差异来估计航天器的角速度。首先,它初始化了三个数组`tmpDeltQ`、`tmpMatQuat`和`tmpMatDeltQ`,长度分别为4、12和4,所有元素均被设置为0.0。接着,通过比较`pQ_now[3]`与`pQ_pre[3]`的符号一致性来决定如何计算两个四元数间的差值,并将结果存储于`tmpDeltQ`中;若符号不同,则采取负的`pQ_now`与`pQ_pre`之和作为替代方案。随后,根据`pQ_pre`构建了一个用于后续运算的矩阵`tmpMatQuat`。之后,将`tmpDeltQ`中的每个元素除以常量`ATTPERIOD_S`后的结果存入`tmpMatDeltQ`。利用`MatrixPlusVectorN`函数执行矩阵加向量操作,其中`tmpMatQuat`作为矩阵而`tmpMatDeltQ`作为向量,最终结果保存在`pW`中。最后一步是对`pW`中的前三个元素乘以2.0f,完成整个角速度估计过程。此函数接收三个`TYPE_CAL`类型的指针作为输入参数:`pQ_now`表示当前的姿态四元数,`pQ_pre`代表上一时刻的姿态四元数,而`pW`则用来存储计算得到的角速度估计值。虽然本函数没有明确的返回值类型,但其核心输出是通过修改`pW`实现的。此外,`QuatDiffCal`依赖于`MatrixPlusVectorN`和`CalPFlag`这两个辅助函数来完成其任务,并且自身是由`SsGyro_AngDeter`函数调用的。为了确保正确的编译和链接,需要包含来自..\\PrjCommon\\CommonDef.h, AttMath.h, AttCtrlMain.h头文件中的定义。", "file": "M:/研二上/静态分析问题单过滤/gs-zk和扫描结果/PrjAttCtrlMng\\AttPosGet.c", "calls": [ "MatrixPlusVectorN", "CalPFlag" ], "called_by": [ "SsGyro_AngDeter" ] }, { "node_id": "Function:SsGyro_AngDeter", "name": "SsGyro_AngDeter", "summary": "该函数`SsGyro_AngDeter`首先定义并初始化了指向`sAttPriData`结构体的指针`tmpAtt`,以及分别指向`GyroPara_t`数组和`sAttDeterPara_t`结构体的指针`PGyro`与`pDeter`。如果`tmpAtt`为NULL,则函数直接返回。接着,通过`tmpAtt`初始化`PGyro`数组中的三个元素,使其分别指向三个陀螺仪参数,并初始化`pDeter`以指向姿态确定参数。随后,函数检查是否有至少一个陀螺仪可用(其标志位为`POSE_OK`),若条件满足,则调用`Gyro_AttChoice()`来选择合适的陀螺仪数据用于姿态角速度计算;如果不满足但组合陀螺仪输入有效(即`tmpAtt->sPerPara.GyroIn_Comb`为`POSE_OK`),则将组合陀螺仪角速度数据复制到`pDeter->Wi`中,并设置相关标志位。此外,当且仅当前次姿态有效(`pDeter->QiPre_Vld`为`POSE_OK`)时,函数会计算当前与前次四元数之间的差分以估计角速度,并更新状态标志。此过程旨在根据不同的陀螺仪数据有效性情况选择最合适的方法来确定航天器的姿态角速度信息,确保即使在部分传感器失效的情况下也能尽可能准确地估计姿态变化。该函数不接受任何外部输入参数,也不返回值,而是通过修改内部状态变量来影响后续处理。它依赖于`QuatDiffCal`, `Gyro_AttChoice`, 和`memcpy`等函数完成特定任务,并被`SsGyro_AttDeter`函数调用。此外,为了实现上述功能,该函数还引用了来自`..\\PrjCommon\\CommonDef.h`, `AttMath.h`, 和`AttCtrlMain.h`头文件中的定义或声明。", "file": "M:/研二上/静态分析问题单过滤/gs-zk和扫描结果/PrjAttCtrlMng\\AttPosGet.c", "calls": [ "QuatDiffCal", "Gyro_AttChoice", "memcpy" ], "called_by": [ "SsGyro_AttDeter" ] }, { "node_id": "Function:SsGyro_AttDeter", "name": "SsGyro_AttDeter", "summary": "该函数`SsGyro_AttDeter`主要用于根据星敏感器和陀螺仪的状态及优先级来确定航天器的姿态。首先,它初始化一些必要的变量如`i`和数组`tmpRbi`,并定义了指向结构体的指针`tmpAtt`、`tmpConst`等。接着,检查这些指针是否为空,如果为空则直接返回以避免后续操作中的潜在错误。随后,从`tmpAtt`中提取出陀螺仪参数和星敏感器参数,并将它们分别赋值给`PGyro`和`PStar`数组。同时,获取指向姿态确定参数、IMPT参数、模式参数以及PPU参数的指针。紧接着,记录下前一次的姿态四元数和角速度,并初始化当前的姿态四元数和角速度为0。之后,基于`tmpConst`中的信息设置星敏感器和陀螺仪的优先级到相应的`PStar`和`PGyro`结构体中。依据宏定义`MINMODULE_TYPE`判断星敏感器和陀螺仪的可用性,并据此设置标志位。当没有星敏感器可用但至少有一个陀螺仪可用时,调用`Gyro_AttDeter()`进行姿态确定;反之,则将姿态四元数和角速度的有效性标志置为0。若存在一个或多个星敏感器可用,则根据其优先级选择合适的数据更新姿态四元数和角速度,并通过调用`SsGyro_AngDeter()`进一步确定角速度。此外,在非`MINMODULE_TYPE`的情况下,还会获取卫星时间,并根据当前的工作模式与推力器状态计算加速度。此过程中涉及到的其他函数包括`memcpy`, `Q2Att`, `MatrixProductHL`, `GetTime`, `Gyro_AttDeter`, `memset`, 和 `SsGyro_AngDeter`。而`SsGyro_AttDeter`本身是由`ZKPGAct`函数调用的。最后,为了实现上述功能,该函数依赖于来自`..\\PrjCommon\\CommonDef.h`, `AttMath.h`, 和 `AttCtrlMain.h`头文件中的定义和声明。", "file": "M:/研二上/静态分析问题单过滤/gs-zk和扫描结果/PrjAttCtrlMng\\AttPosGet.c", "calls": [ "memcpy", "Q2Att", "MatrixProductHL", "GetTime", "Gyro_AttDeter", "memset", "SsGyro_AngDeter" ], "called_by": [ "ZKPGAct" ] }, { "node_id": "Function:Cal_AngToSun", "name": "Cal_AngToSun", "summary": "该函数`Cal_AngToSun`首先初始化一个长度为9的`TYPE_CAL`类型数组`tmpRbi`,所有元素均被设置为0。接着,它尝试将`ATTCLT_DATA1_ADDR`地址转换成`sAttPriData`指针并赋值给`tmpAtt`;如果转换失败(即`tmpAtt`为空),则立即退出函数。随后,从`tmpAtt`中提取指向四个不同结构体的指针:`sAttDeterPara_t`, `sAttModPara_t`, `sAttDataPrePara_t`和`sAttOrbitGetPara_t`,分别存储于变量`pDeter`, `pWMod`, `pDataPre`和`pOrbit`中。当星敏感器可用时(通过检查`pDeter->Qi_Vld`与`pOrbit->MJCLv`是否均为`POSE_OK`来判断),使用`Q2Att()`函数将四元数`pDeter->Qi`转换为姿态矩阵,并利用`MatrixProductHL()`计算太阳矢量在本体系下的表示,同时更新相关标志位。若太敏数据有效且校验无误,则直接复制预处理后的太阳矢量到`pDeter->SunVecb`,并相应地调整标志位。对于其他情况,将特定标志位置零。基于当前工作模式(由`pWMod->WorkMode`指示),选择适当的方法来计算航天器相对于太阳的方向角,这可能涉及-Z轴、+Y轴或X轴作为参考方向之一。此过程中,根据`pDeter->AngToSun_ValidFlg`的状态决定是否执行实际的角度计算或是简单地清空结果。整个过程旨在根据航天器的工作状态及传感器信息准确确定其对日角度,以便后续操作能够据此做出响应。此函数不接受任何输入参数,也不返回具体值,但会调用如`MatrixProductHL`, `POSE_ATAN2F`, `Q2Att`等辅助函数完成任务,并且自身是由`ZKPGAct`函数触发执行的。此外,为了实现上述功能,`Cal_AngToSun`依赖于定义在`..\\PrjCommon\\CommonDef.h`, `AttMath.h`, 和 `AttCtrlMain.h`中的跨文件头文件。", "file": "M:/研二上/静态分析问题单过滤/gs-zk和扫描结果/PrjAttCtrlMng\\AttPosGet.c", "calls": [ "MatrixProductHL", "POSE_ATAN2F", "Q2Att", "memcpy" ], "called_by": [ "ZKPGAct" ] }, { "node_id": "Function:DertCalcBb", "name": "DertCalcBb", "summary": "该函数`DertCalcBb`主要用于航天器姿态控制系统中磁场强度的计算与更新。首先,它初始化了几个关键变量和指向特定结构体的指针,包括一个指向`sAttPriData`结构体的指针`tmpAtt`。如果`tmpAtt`为空,则函数立即返回,避免后续操作中的潜在错误。接着,定义并初始化了一系列指针,这些指针分别指向不同类型的数据结构,如磁强计参数、磁力矩控制参数等。通过遍历所有已配置的磁强计(数量由常量`MAG_NUM`指定),根据每个磁强计的状态设置其可用性标志。基于磁力矩控制器的时间周期对10取模的结果来确定`tmpCNT`值。当`tmpCNT`等于1或特定条件满足时,更新磁强计的预处理数据。依据编译选项`MINMODULE_TYPE`的存在与否,选择不同的逻辑路径来决定如何从不同来源复制磁场基准数据到当前使用数据中,并在必要时清零某些字段或设置状态为不可用。最后,如果确认使用的磁场数据有效,则将其复制到另一个数组中并通过调用`unitary()`函数进行归一化处理。此过程确保了即使在复杂的工作模式下也能选取最合适的磁场数据源,从而提高系统整体性能。该函数不接受任何输入参数也不直接返回值,但依赖于全局内存区域中的数据,并且会调用`memset`、`memcpy`以及`unitary`等辅助函数完成任务。此外,`DertCalcBb`被`ZKPGAct`函数所调用,并且涉及到跨文件引用,特别是来自`..\\PrjCommon\\CommonDef.h`, `AttMath.h`, 和 `AttCtrlMain.h`头文件中的定义。", "file": "M:/研二上/静态分析问题单过滤/gs-zk和扫描结果/PrjAttCtrlMng\\AttPosGet.c", "calls": [ "memset", "memcpy", "unitary" ], "called_by": [ "ZKPGAct" ] }, { "node_id": "Function:AttDeterOrb", "name": "AttDeterOrb", "summary": "该函数`AttDeterOrb`主要用于根据输入的姿态参数和轨道参数,计算卫星在轨道坐标系下的姿态角、四元数表示的姿态以及太阳矢量方向,并处理了角速度的转换以确定卫星相对于轨道坐标系的姿态变化率。首先,初始化多个`TYPE_CAL`类型的数组`tmpRbi`, `tmpRoi`, `tmpRio`, `tmpRbo`, `tmpWoi`, 和 `tmpWbo`并将它们的元素设置为0.0;接着,将指针`tmpAtt`指向`ATTCLT_DATA1_ADDR`地址处的数据并将其类型转换为`sAttPriData*`,如果`tmpAtt`为空则直接返回;通过`tmpAtt`获取指向`sDeterPara`和`sOrbitPara`结构体的指针`pDeter`和`pOrbitIn`,若`pDeter->Qi_Vld`或`pOrbitIn->OrbitVld`为0,则将`pDeter->AttOrb_Vld`设为0后返回;随后,设置`pDeter->AttOrb_Vld`为0x55,调用`Q2Att`函数基于`pDeter->Qi`计算得到`tmpRbi`,再利用`CalTransMatrix_IO`函数基于`pOrbitIn->JPos`和`pOrbitIn->JVel`计算出`tmpRoi`,对`tmpRoi`进行转置操作结果存入`tmpRio`,然后计算`tmpRbi`与`tmpRio`的矩阵乘积存储于`tmpRbo`中,从`tmpRbo`提取姿态角信息保存到`pDeter->AttAngOrb`,并据此计算四元数`pDeter->Qo`;此外,还计算了`tmpRoi`与`tmpAtt->sEnvPara.SunVecI`的矩阵乘积结果存储于`pDeter->SunVeco`;当`pDeter->Wi_Vld`不为0时,基于`pOrbitIn->JPos`和`pOrbitIn->JVel`计算轨道系下的角速度`tmpWoi`,计算`tmpRbo`与`tmpWoi`的矩阵乘积结果存储在`tmpWbo`,更新`tmpWbo`使其反映相对于`pDeter->Wi`的变化,最后将更新后的`tmpWbo`复制给`pDeter->AttRateOrb`。此过程中,函数依赖于`MatrixTransposeHL`, `Eul312A2Quat`, `Q2Att`, `Matrix2Eul312A`, `memcpy`, `MatrixProductHL`, `AglSpdOofICal`, `CalTransMatrix_IO`等辅助函数完成特定数学运算,并被`ZKPGAct`函数调用执行。同时,该函数涉及到了跨文件关联,包括引用了..\\PrjCommon\\CommonDef.h, AttMath.h, AttCtrlMain.h头文件中的定义。", "file": "M:/研二上/静态分析问题单过滤/gs-zk和扫描结果/PrjAttCtrlMng\\AttPosGet.c", "calls": [ "MatrixTransposeHL", "Eul312A2Quat", "Q2Att", "Matrix2Eul312A", "memcpy", "MatrixProductHL", "AglSpdOofICal", "CalTransMatrix_IO" ], "called_by": [ "ZKPGAct" ] }, { "node_id": "Function:AttDeterOrbCtrl", "name": "AttDeterOrbCtrl", "summary": "该函数`AttDeterOrbCtrl`主要用于根据当前卫星的工作模式及姿态数据,计算出在特定控制模式下的轨道控制系统所需的目标姿态角度及其角速度。首先,初始化多个临时数组`tmpRbo`, `tmpRCo`, `tmpRoC`, 和 `tmpRbc`为0.0,并定义指向`sAttPriData`结构体的指针`tmpAtt`以及两个空指针`pOrb`和`pDeter`。接着,将`tmpAtt`设置为指向`ATTCLT_DATA1_ADDR`地址的数据,如果`tmpAtt`为空,则直接返回。通过`tmpAtt`初始化`pOrb`和`pDeter`指针后,设置`pDeter->AttOrbCtrl_Vld`为0并将`pDeter->AttAngOrbCtrl`与`pDeter->AttRateOrbCtrl`中的元素清零。检查当前工作模式是否为轨控调姿(0X66)或轨控(0X77),如果不是,则函数直接返回。根据`pDeter->AttOrb_Vld`的值来决定是否继续执行;若其值为0x55,则设置`pDeter->AttOrbCtrl_Vld`为0x55并继续;否则将其设为0x00后返回。从`pOrb->OrbCtrlPackCur.OrbCtrAng`复制目标调姿姿态到`pDeter->AttAngTar`,使用四元数`pDeter->Qo`计算得到转换矩阵`tmpRbo`,利用目标姿态角`pDeter->AttAngTar`生成轨道系到轨控调整角转移矩阵`tmpRCo`,对`tmpRCo`进行转置操作得到`tmpRoC`,计算`tmpRbo`与`tmpRoC`的乘积结果存储于`tmpRbc`中,从`tmpRbc`提取欧拉角至`pDeter->AttAngOrbCtrl`,最后将卫星轨道系角速度`pDeter->AttRateOrb`复制给`pDeter->AttRateOrbCtrl`。此过程涉及调用如MatrixTransposeHL, memcpy, Q2Att等函数以完成数学变换。此外,该函数被ZKPGAct调用,并依赖于..\\PrjCommon\\CommonDef.h, AttMath.h, AttCtrlMain.h等头文件中定义的数据类型和函数。\n\n输入参数:无\n\n返回值:无\n\n与其他函数的关联关系:\n- 被调用的函数: MatrixTransposeHL, memcpy, Q2Att, Matrix2Eul312A, MatrixProductHL, Att2M, memset\n- 调用此函数的函数: ZKPGAct\n\n与跨文件关联的函数(头文件): ..\\PrjCommon\\CommonDef.h, AttMath.h, AttCtrlMain.h", "file": "M:/研二上/静态分析问题单过滤/gs-zk和扫描结果/PrjAttCtrlMng\\AttPosGet.c", "calls": [ "MatrixTransposeHL", "memcpy", "Q2Att", "Matrix2Eul312A", "MatrixProductHL", "Att2M", "memset" ], "called_by": [ "ZKPGAct" ] }, { "node_id": "Function:AttDeterTarRe", "name": "AttDeterTarRe", "summary": "该函数`AttDeterTarRe`主要负责根据卫星当前的工作模式及轨道系姿态信息,计算并更新目标参考系下的姿态角与角速度。首先定义并初始化指向`sAttPriData`结构体的指针`tmpAtt`以及其他相关结构体指针如`pDeter`, `pWMod`和`pTAR`。检查`tmpAtt`是否为空,如果为空则直接返回。接着通过`tmpAtt`获取到姿态确定参数、模式参数和目标控制信息等数据,并初始化一些临时变量用于存储计算过程中的中间结果。将`pDeter->AttAngTarRe`和`pDeter->AttRateTarRe`数组清零,并设置`pDeter->AttTarRe_Vld`为无效状态。判断当前工作模式是否为目标定向调姿或目标定向,如果不是,则直接返回。根据卫星轨道系姿态有效标志来更新`pDeter->AttTarRe_Vld`的有效性;若无效,则设置相应标志后退出函数。从`pTAR`中复制当前的目标控制角度至`pDeter->AttAngTar`。使用四元数转换函数`Q2Att()`由卫星轨道系四元数得到转换矩阵`tmpRbo`,并通过`Att2M()`函数将目标角度转换成旋转矩阵`tmpRCo`。计算`tmpRCo`的转置矩阵`tmpRoC`,然后通过矩阵乘法计算出目标参考系下的转换矩阵`tmpRbc`。从`tmpRbc`中提取欧拉角存入`pDeter->AttAngTarRe`。最后,将卫星轨道系角速度复制给`pDeter->AttRateTarRe`。此过程中,函数依赖于多个数学运算辅助函数,包括`MatrixTransposeHL`, `memcpy`, `Q2Att`, `Matrix2Eul312A`, `MatrixProductHL`, `Att2M`以及`memset`。此外,该函数被`ZKPGAct`调用,并且涉及到跨文件关联的头文件有`\\PrjCommon\\CommonDef.h`, `AttMath.h` 和 `AttCtrlMain.h`。", "file": "M:/研二上/静态分析问题单过滤/gs-zk和扫描结果/PrjAttCtrlMng\\AttPosGet.c", "calls": [ "MatrixTransposeHL", "memcpy", "Q2Att", "Matrix2Eul312A", "MatrixProductHL", "Att2M", "memset" ], "called_by": [ "ZKPGAct" ] }, { "node_id": "Function:LoopAttDeter", "name": "LoopAttDeter", "summary": "该函数`LoopAttDeter`主要负责基于卫星当前的工作模式及其相关参数状态来确定并更新姿态控制所需的关键参数,包括姿态角度和角速度等信息。首先,从`ATTCLT_DATA1_ADDR`地址获取`sAttPriData`结构体指针`tmpAtt`,如果`tmpAtt`为`NULL`则直接返回。接着初始化指向`sAttDeterPara_t`、`sAttModPara_t`和`MagPara_t`类型的指针`pDeter`、`pWMod`和`pMag`,分别指向`tmpAtt`中的相应成员,并将`pDeter->CLPAttValid`设置为0。使用`memset`函数清零`pDeter->CLPAttAngRatPre`、`pDeter->CLPAttAng`和`pDeter->CLPAttAngRat`数组后,复制`pDeter->CLPAttAngRat`的内容到`pDeter->CLPAttAngRatPre`。根据预处理器指令`MINMODULE_TYPE`的存在与否选择不同的工作模式处理逻辑:定义了`MINMODULE_TYPE`时,依据`pWMod->WorkMode`的值判断当前的工作模式,在特定条件下(如磁力计可用或角速度有效)更新`pDeter->CLPAttValid`并复制角速度数据到`pDeter->CLPAttAngRat`;未定义`MINMODULE_TYPE`时执行类似但支持更多工作模式的逻辑,对于某些模式还会额外检查太阳角度的有效性标志以更新姿态角度数据。在所有情况下,当满足条件时,设置`pDeter->CLPAttValid`为0x55表示数据有效,并根据当前工作模式从不同源复制姿态角度和角速度数据到`pDeter`中相应的字段。此过程确保只有在特定条件下才会更新这些关键参数,从而保证姿态控制系统的准确性和可靠性。该函数无输入参数,也不返回任何值,但在其执行过程中会调用`memset`和`memcpy`函数,并且被`ZKPGAct`函数所调用。此外,它还与跨文件关联的函数有关,涉及头文件包括..\\PrjCommon\\CommonDef.h, AttMath.h, AttCtrlMain.h。", "file": "M:/研二上/静态分析问题单过滤/gs-zk和扫描结果/PrjAttCtrlMng\\AttPosGet.c", "calls": [ "memset", "memcpy" ], "called_by": [ "ZKPGAct" ] }, { "node_id": "Function:ZKPGAct", "name": "ZKPGAct", "summary": "`ZKPGAct`函数是航天器姿态控制系统中的关键组成部分,其主要任务是基于星敏感器、陀螺仪以及磁场信息等多种传感器输入来初始化并确定航天器的姿态。该函数首先根据是否定义了`MINMODULE_TYPE`宏选择执行不同的代码路径。无论在哪种情况下,都会先调用`ZKPGInit()`进行姿态变量的初始化,随后使用`SsGyro_AttDeter()`结合星敏感器和陀螺仪数据初步确定姿态,并通过`DertCalcBb()`计算当前环境下的磁场强度。接着,利用`Cal_AngToSun()`函数计算卫星Z轴相对于太阳的角度。如果未定义`MINMODULE_TYPE`,则进一步细化姿态解算过程,包括在轨道系(`AttDeterOrb()`)、目标参考系(`AttDeterTarRe()`)及轨控惯性系(`AttDeterOrbCtrl()`)下分别确定姿态。最后,在所有情况下均会调用`LoopAttDeter()`完成闭环姿态确定过程。此函数直接被`ZKAction`调用,并依赖于多个辅助函数如`ZKPGInit`, `Cal_AngToSun`, `SsGyro_AttDeter`等实现具体功能。此外,它还涉及到跨文件引用,特别是从`..\\PrjCommon\\CommonDef.h`, `AttMath.h`, 和`AttCtrlMain.h`中导入必要的定义与声明。", "file": "M:/研二上/静态分析问题单过滤/gs-zk和扫描结果/PrjAttCtrlMng\\AttPosGet.c", "calls": [ "ZKPGInit", "Cal_AngToSun", "SsGyro_AttDeter", "AttDeterOrbCtrl", "LoopAttDeter", "AttDeterOrb", "AttDeterTarRe", "DertCalcBb" ], "called_by": [ "ZKAction" ] }, { "node_id": "Function:ZKREInit", "name": "ZKREInit", "summary": "该函数 `ZKREInit` 主要负责初始化航天器姿态控制系统中的各种传感器和执行器的状态和参数,确保系统在启动时处于正确的初始状态。首先,它初始化变量 `i` 为0,并定义指向 `sAttPriData` 和 `AttCtrlConst_t` 结构体的指针 `tmpAtt` 和 `tmpConst`,分别指向 `ATTCLT_DATA1_ADDR` 和 `ATTCLT_DATA2_ADDR`。如果任一指针为空,则直接返回。接着,定义并初始化指向 `AttIMPTPara_t` 和 `sAttErrCtlPara_t` 结构体的指针 `pIMU` 和 `pREcheck`,分别指向 `tmpAtt` 中的 `sIMPTPara` 和 `sErrCtlPara`。随后,对陀螺仪、星敏、磁强计、飞轮和PPU等设备进行初始化,包括设置每个设备的状态、计数器、优先级、诊断阈值和其他相关参数。此外,还对姿态基准丢失、姿态超差和姿态不稳定等情况进行了初始化,设置了相应的允许标志、时间阈值和计数器。此函数通过遍历这些设备并设置其状态和参数,确保姿态控制系统能够正常运行。该函数没有输入参数,也不返回任何值。在实现过程中,调用了 `memset` 函数来清零某些结构体成员。此函数被 `AttCtrlInit` 调用,并且与跨文件关联的头文件包括 `..\\PrjCommon\\CommonDef.h`, `..\\PrjCommon\\DevDefine.h`, `AttMath.h` 和 `AttCtrlMain.h`。", "file": "M:/研二上/静态分析问题单过滤/gs-zk和扫描结果/PrjAttCtrlMng\\AttRECheck.c", "calls": [ "memset" ], "called_by": [ "AttCtrlInit" ] }, { "node_id": "Function:ImuPowerOnOff", "name": "ImuPowerOnOff", "summary": "该函数`ImuPowerOnOff`主要用于基于计数器`Cnt1`, `Cnt2`, 和 `Cnt3`的状态以及给定限制条件来控制IMU(惯性测量单元)电源的开关操作,并相应地更新系统状态。初始化时,变量`PulT`被设为16,`Type`设为0。如果当前状态`*state`等于`POSE_NO`,则将`*Cnt1`和`*Cnt3`置零后直接返回。当错误标志`err`等于`POSE_NO`且`*Cnt1`小于60000时,递增`*Cnt1`并将`*Cnt3`置零;反之,若`*Cnt3`小于60000,则递增`*Cnt3`同时将`*Cnt1`置零。一旦`*Cnt1`达到或超过`Cnt1Limt`,并且`*Cnt2`也达到了`Cnt2Limt`,则设置`*state`为`POSE_NO`并重置`*Cnt1`与`*Cnt3`至0后退出函数;否则,检查`*Cnt1`是否位于`Cnt1Limt + Cnt4Limt`到`Cnt1Limt + Cnt4Limt + 1`之间,若是,则重置`*Cnt1`与`*Cnt3`,递增`*Cnt2`(若其值小于60000),然后根据`ONOFF`的值决定调用`OCOut()`关闭还是开启指定通道,并可能更新`*state`状态;如果`*Cnt1`刚好大于等于`Cnt1Limt`但小于`Cnt1Limt + 1`,则调用`OCOut()`关闭指定通道,并将`*state`设为`POSE_IN`。此外,当`*Cnt1`未达到`Cnt1Limt`而`*Cnt3`已达到`Cnt3Limt`时,将`*state`设为`POSE_OK`并重置`*Cnt2`;否则,将`*state`设为`POSE_IN`。此函数通过监控错误标志`err`及当前状态`*state`,能够适时调整计数器值并执行相应的开/关机动作。它接收多个参数包括通道开启关闭编号、计数器指针及其限制值等,并无返回值。该函数被`GyroImuErrJudge, SsImuErrJudge, MagImuErrJudge, WhlImuErrJudge, PPUImuErrJudge`等函数调用,并依赖于`OCOut`函数实现具体的操作。此外,它还引用了来自`..\\PrjCommon\\CommonDef.h, ..\\PrjCommon\\DevDefine.h, AttMath.h, AttCtrlMain.h`头文件中的定义。", "file": "M:/研二上/静态分析问题单过滤/gs-zk和扫描结果/PrjAttCtrlMng\\AttRECheck.c", "calls": [ "OCOut" ], "called_by": [ "GyroImuErrJudge", "SsImuErrJudge", "MagImuErrJudge", "WhlImuErrJudge", "PPUImuErrJudge" ] }, { "node_id": "Function:GyroImuErrJudge", "name": "GyroImuErrJudge", "summary": "该函数`GyroImuErrJudge`主要用于监控航天器中多个陀螺仪的工作状态,确保其正常运行。首先,它初始化一些关键变量和数组,包括设置一个计数器`i`为0,定义电源状态`ONOFF`为开启,并创建两个数组`ChlON`和`ChlOFF`来存储陀螺仪的开启与关闭通道标识。接着,通过指针`tmpAtt`和`tmpConst`分别访问位于`ATTCLT_DATA1_ADDR`和`ATTCLT_DATA2_ADDR`地址处的数据结构;如果任一指针为空,则立即退出函数。随后,初始化指向三个陀螺仪参数的指针数组`PGyro`,以及指向姿态控制相关参数的指针`pIMU`和`pREcheck`。在遍历每个陀螺仪的过程中,检查其开机计数是否达到预设值,同时评估姿态数据的有效性和校验结果以更新错误计数(最大不超过60000),并据此判断是否将陀螺仪标记为故障。当允许对特定陀螺仪执行开关操作时,调用`ImuPowerOnOff`函数调整其电源状态,并根据诊断反馈决定是否更改使用状态;若不允许,则重置所有相关的错误计数并将诊断标志恢复至正常状态。此函数无直接输入参数或返回值,但依赖于`ImuPowerOnOff`函数进行实际的硬件控制,并由`ZKREAction`函数触发执行。此外,它还引用了来自`..\\PrjCommon\\CommonDef.h`, `..\\PrjCommon\\DevDefine.h`, `AttMath.h`, 和 `AttCtrlMain.h`头文件中的定义和声明。", "file": "M:/研二上/静态分析问题单过滤/gs-zk和扫描结果/PrjAttCtrlMng\\AttRECheck.c", "calls": [ "ImuPowerOnOff" ], "called_by": [ "ZKREAction" ] }, { "node_id": "Function:SsImuErrJudge", "name": "SsImuErrJudge", "summary": "该函数`SsImuErrJudge`主要负责监控星敏感器的工作状态,并根据其状态信息(如上电次数、姿态有效性等)决定是否需要对其进行断电处理,以确保航天器姿态控制系统稳定运行。首先,初始化一系列变量包括`i`, `ONOFF`, `ChlON`, `ChlOFF`,同时将指针`tmpAtt`和`tmpConst`分别指向存储在`ATTCLT_DATA1_ADDR`与`ATTCLT_DATA2_ADDR`地址的数据结构。如果这两个指针中任一为`NULL`,则立即退出函数。接着,通过这些指针进一步获取到关于星敏感器参数、IMU参数及错误控制参数的引用。对于每一个星敏感器,在其上电计数达到预设延迟限制后,检查姿态数据的有效性和校验错误标志,基于此更新错误计数并据此判断星敏感器的状态:当错误计数超过诊断阈值两倍时标记为故障(`POSE_NO`),否则视为正常(`POSE_OK`)。若系统允许对特定星敏感器进行开关操作且其被诊断为故障,则不改变其当前使用状态;反之,若不允许开关操作,则重置所有相关计数并将状态设置为正常。此外,该函数还可能调用`ImuPowerOnOff`来实际执行星敏感器的电源控制,并更新相应的计数器。此过程由`ZKREAction`触发,而涉及的数据类型定义位于多个头文件中,包括`\\PrjCommon\\CommonDef.h`, `\\PrjCommon\\DevDefine.h`, `AttMath.h`, 和`AttCtrlMain.h`。", "file": "M:/研二上/静态分析问题单过滤/gs-zk和扫描结果/PrjAttCtrlMng\\AttRECheck.c", "calls": [ "ImuPowerOnOff" ], "called_by": [ "ZKREAction" ] }, { "node_id": "Function:MagImuErrJudge", "name": "MagImuErrJudge", "summary": "该函数`MagImuErrJudge`主要用于监控和管理航天器上多个磁强计的工作状态。首先,它初始化一系列变量如`i`, `ONOFF`, `ChlON`, `ChlOFF`以及指向特定结构体的指针`tmpAtt`, `tmpConst`, `PMag`, `pIMU`, `pREcheck`。如果`tmpAtt`或`tmpConst`为NULL,则立即退出函数执行。接着,使用`tmpAtt`来初始化其他几个指针。对于每一个磁强计(总数由`MAG_NUM`定义),如果其开机计数达到预设阈值,将检查该磁强计的数据是否有效及是否存在校验错误,并据此更新相应的错误或无错误计数;当错误计数超过诊断阈值两倍时,标记此磁强计为无效,反之若无错误计数大于2则视为有效。此外,根据是否允许对当前磁强计进行开关操作,计算出对应的通道号并通过调用`ImuPowerOnOff`函数来控制磁强计电源。不允许开关的情况下,会重置相关错误计数并将磁强计状态设为有效。此过程确保了系统能够及时响应并处理潜在问题,保持整体运行稳定。该函数没有直接返回值,但通过修改全局状态影响后续行为。它被`ZKREAction`函数调用,并且依赖于`ImuPowerOnOff`函数实现具体的硬件控制。涉及到的跨文件关联包括..\\PrjCommon\\CommonDef.h, ..\\PrjCommon\\DevDefine.h, AttMath.h, AttCtrlMain.h等头文件中的定义。", "file": "M:/研二上/静态分析问题单过滤/gs-zk和扫描结果/PrjAttCtrlMng\\AttRECheck.c", "calls": [ "ImuPowerOnOff" ], "called_by": [ "ZKREAction" ] }, { "node_id": "Function:WhlImuErrJudge", "name": "WhlImuErrJudge", "summary": "该函数`WhlImuErrJudge`主要用于根据当前航天器的工作模式对飞轮的状态进行检测和控制。首先,初始化一系列变量如计数器和指针等。接着,检查两个关键结构体`tmpAtt`与`tmpConst`是否为空,若为空则直接退出函数。随后,获取并初始化指向相关结构体的指针,包括错误控制参数、飞轮参数、IMPT参数以及工作模式参数。对于每个飞轮(总数为`WHEEL_NUM`),如果其允许开关状态不是`POSE_OK`,则重置该飞轮的所有错误计数器及诊断标志。基于当前的工作模式(`pWMod->WorkMode`),函数执行不同的逻辑分支:在特定模式下(如`ATTMOD_UNCTL`, `ATTMOD_RATEDMP`, `ATTMOD_MagTOSUN`),统计可用飞轮数量并更新相应计数;而在其他模式中,则进一步检查飞轮上电时间是否超过阈值,并据此判断飞轮输出和温度是否存在异常,进而调整错误计数器或设置飞轮错误标志。当满足条件时,通过调用`ImuPowerOnOff`来控制飞轮电源,并依据诊断结果更新飞轮使用状态。此外,在所有飞轮均被允许操作但可用飞轮少于三个的情况下,会清空命令缓冲区并向系统发送切换至新工作模式的指令。对于未明确列出的工作模式,默认将所有飞轮的相关错误计数器归零。此函数无返回值,但依赖于多个辅助函数如`DoSetInt32To8`, `CheckBlockRing`, `GetTaskInfoBT`, `BlockRingAdd`, `memset`, 和`ImuPowerOnOff`完成其任务,并且由`ZKREAction`函数调用。同时,它还引用了来自不同头文件如`\\PrjCommon\\CommonDef.h`, `\\PrjCommon\\DevDefine.h`, `AttMath.h`, 和`AttCtrlMain.h`中的定义和声明。", "file": "M:/研二上/静态分析问题单过滤/gs-zk和扫描结果/PrjAttCtrlMng\\AttRECheck.c", "calls": [ "DoSetInt32To8", "CheckBlockRing", "GetTaskInfoBT", "BlockRingAdd", "memset", "ImuPowerOnOff" ], "called_by": [ "ZKREAction" ] }, { "node_id": "Function:PPUImuErrJudge", "name": "PPUImuErrJudge", "summary": "该函数`PPUImuErrJudge`主要用于监测和判断电推进单元(PPU)的工作状态,确保其在正常范围内运行,并在检测到异常时采取相应的措施。首先,初始化一系列变量,包括温度数组、电阻值数组及温度中间变量数组等。接着,检查两个关键指针`tmpAtt`与`tmpConst`是否为空,若为空则直接退出函数。随后,获取指向错误控制参数、IMPT参数、PPU参数以及模式参数的指针。从设备信息中读取AD采集数据,特别是四个温度传感器的数据。对每个温度传感器的数据进行处理,计算出对应的电阻值和实际温度,并将这些结果存储于相关结构体字段内。当PPU电源开启计数达到预设阈值时,会进一步检查PPU输出的有效性,无效输出会导致异常计数增加;反之,则重置异常计数。基于点火成功标志,还会检查电流和电压是否超出限制范围,超限时相应计数器递增;否则,重置这些计数器。根据PPU输出的状态更新点火计数。在特定工作模式下,如果四个温度传感器中的任何一个温度超过设定限值,也会导致温度异常计数增加;否则,同样执行计数器重置操作。依据各种异常计数情况及允许开关条件,更新PPU的错误状态,并在必要情况下关闭PPU。此外,在姿态调整或轨道控制模式下,某些错误计数会被重置,并且根据允许开关条件决定是否完全重置所有计数。最后,根据当前PPU错误状态及允许开关条件调用`ImuPowerOnOff`函数来控制PPU电源开关,并更新诊断状态;如果诊断状态指示关闭,则设置PPU使用状态为关闭。此函数通过与其他多个函数如`dev_can_write`, `log`, `POSE_ABSF`, `GETDEVINFO`, `POSE_SQRTF`, 和 `ImuPowerOnOff`协同工作实现其复杂的功能,并依赖于跨文件定义的一些头文件如`\\PrjCommon\\CommonDef.h`, `\\PrjCommon\\DevDefine.h`, `AttMath.h`, 和 `AttCtrlMain.h`提供的支持。", "file": "M:/研二上/静态分析问题单过滤/gs-zk和扫描结果/PrjAttCtrlMng\\AttRECheck.c", "calls": [ "dev_can_write", "log", "POSE_ABSF", "GETDEVINFO", "POSE_SQRTF", "ImuPowerOnOff" ], "called_by": [ "ZKREAction" ] }, { "node_id": "Function:AttLose", "name": "AttLose", "summary": "该函数`AttLose`主要用于航天器姿态控制系统中,通过监测特定数据结构中的姿态有效性标志来判断当前姿态是否丢失,并据此更新一个计数器。具体来说,首先初始化一个名为`result`的变量为0;接着将两个预定义地址`ATTCLT_DATA1_ADDR`和`ATTCLT_DATA2_ADDR`分别转换成指向`sAttPriData`和`AttCtrlConst_t`类型的指针`tmpAtt`与`tmpConst`。如果这两个指针中有任何一个为空,则立即返回0,表示无法继续执行后续逻辑。随后获取`tmpAtt->sErrCtlPara`的地址并存储于`pREcheck`中。当检测到`tmpAtt->sDeterPara.CLPAttValid`字段值为`POSE_OK`时,表明姿态有效,此时重置`pREcheck->AttLoseCnt`计数器为0并直接返回0。反之,若姿态无效且计数器`pREcheck->AttLoseCnt`未达到上限60000,则递增此计数器。最后,根据`pREcheck->AttLoseCnt`是否超过`tmpConst->TimeThr_AttLoseDiag[i]`两倍的时间阈值来决定是否将`result`设置为0x55,以此标记长时间的姿态丢失情况。最终返回`result`作为函数输出。此函数没有直接调用其他函数,但被`AttLoseJudge`函数所调用,并依赖于几个跨文件定义的数据类型和常量,这些定义位于..\\PrjCommon\\CommonDef.h, ..\\PrjCommon\\DevDefine.h, AttMath.h, 和AttCtrlMain.h头文件中。输入参数仅包含一个无符号8位整型变量`i`,用于索引时间阈值数组;而返回值同样是一个无符号8位整型,用来指示是否存在长时间的姿态丢失问题(非零值0x55表示存在)。", "file": "M:/研二上/静态分析问题单过滤/gs-zk和扫描结果/PrjAttCtrlMng\\AttRECheck.c", "calls": [], "called_by": [ "AttLoseJudge" ] }, { "node_id": "Function:AttLoseJudge", "name": "AttLoseJudge", "summary": "`AttLoseJudge`函数主要用于根据当前的姿态控制工作模式判断是否需要切换至另一种模式,并在满足特定条件时更新相关参数。首先,该函数初始化了多个变量,包括命令数据缓冲区`cmdDataBuff`、PPU关闭数组`PPUOff`以及指向不同结构体的指针。接着,它检查关键指针(如`tmpAtt`、`tmpConst`、`tmpOrbCmd`和`tmpTARCCmd`)的有效性,如果任一为空则直接返回。随后,通过地址获取并初始化指向姿态控制相关数据结构的指针。基于当前的工作模式(`pWMod->WorkMode`),函数执行不同的逻辑分支,调用`AttLose()`函数来检测特定条件;若`AttLose()`返回`POSE_OK`,则更新新的工作模式(`tmpNewMod`)和对应的命令ID(`tmpNewModID`)。对于某些模式,还会额外执行一些操作,比如清零某些字段或发送关闭指令等。最后,如果新的工作模式与当前工作模式不同,则准备一个命令缓冲区,并尝试将该命令添加到任务信息中的命令缓冲环中。此函数无输入参数,也不返回任何值,但其内部调用了多个辅助函数,包括`dev_can_write`、`DoSetInt32To8`、`CheckBlockRing`、`GetTaskInfoBT`、`BlockRingAdd`、`memset`及`AttLose`,同时被`ZKREAction`函数所调用。此外,`AttLoseJudge`还引用了来自`\\PrjCommon\\CommonDef.h`、`\\PrjCommon\\DevDefine.h`、`AttMath.h`和`AttCtrlMain.h`头文件中的定义。", "file": "M:/研二上/静态分析问题单过滤/gs-zk和扫描结果/PrjAttCtrlMng\\AttRECheck.c", "calls": [ "dev_can_write", "DoSetInt32To8", "CheckBlockRing", "GetTaskInfoBT", "BlockRingAdd", "memset", "AttLose" ], "called_by": [ "ZKREAction" ] }, { "node_id": "Function:AttExJudge", "name": "AttExJudge", "summary": "该函数`AttExJudge`主要用于航天器姿态控制系统的异常判断与模式切换。首先,它初始化了多个变量和数组,包括命令数据缓冲区`cmdDataBuff`、PPU关闭指令`PPUOff`以及任务信息指针`tmpTaskInfo`等。接着,函数会检查几个关键结构体指针(如`tmpAtt`、`tmpConst`、`tmpOrbCmd`和`tmpTARCCmd`)是否为空,如果发现任一为空则立即退出执行流程。随后,从`tmpAtt`中获取并初始化一系列用于后续处理的结构体指针,比如轮控参数`PWhl`、工作模式参数`pWMod`及错误控制参数`pREcheck`等,并确定当前的工作模式`tmpNewMod`。基于不同的工作模式,函数将执行相应的逻辑来评估姿态角速度或角度偏差是否超出预设范围。对于每种模式,当检测到连续超差时间超过特定阈值时,系统将自动切换至另一种更安全或更适合当前状况的工作模式,并可能伴随有发送新的控制命令给相关硬件的动作,例如关闭PPU电源。此外,根据新旧工作模式之间的差异,还会生成适当的命令数据并将其添加到任务信息的命令缓冲区内。此过程涉及调用多个辅助函数,如`dev_can_write`用于设备通信,`DoSetInt32To8`转换数据格式等。整个函数的设计旨在确保航天器在面对姿态控制问题时能够及时调整策略,保证飞行安全。", "file": "M:/研二上/静态分析问题单过滤/gs-zk和扫描结果/PrjAttCtrlMng\\AttRECheck.c", "calls": [ "dev_can_write", "DoSetInt32To8", "CheckBlockRing", "GetTaskInfoBT", "CalNormal", "BlockRingAdd", "POSE_ABSF", "memset", "DeviAngleLimit" ], "called_by": [ "ZKREAction" ] }, { "node_id": "Function:AttUnStaJudge", "name": "AttUnStaJudge", "summary": "该函数`AttUnStaJudge`主要负责根据当前航天器的姿态控制模式及姿态稳定性判断结果,动态调整航天器的姿态控制模式。首先初始化一系列变量,包括命令数据缓冲区`cmdDataBuff`、任务信息指针`tmpTaskInfo`以及模式和模式ID等。接着检查关键的数据结构如姿态主数据结构`tmpAtt`、常量数据结构`tmpConst`、轨道控制数据结构`tmpOrbCmd`和TARC控制数据结构`tmpTARCCmd`是否为空,若任一为空则直接退出函数。随后从`tmpAtt`中获取关于模式参数、误差控制参数、轮参数、轨道输入参数、TARC输入参数、确定参数和PUP参数的指针。基于当前工作模式`pWMod->WorkMode`的不同,执行相应的处理逻辑:在阻尼模式下增加不稳定计数器,超过阈值时依据轮使用情况切换至对日定向模式;轮控或磁控对日模式中计算姿态角偏差与角速度偏差以评估稳定性,并在连续不稳定时间超出设定值后转换到另一种控制方式;对地定向模式同样通过增加不稳定计数来决定是否返回阻尼模式;而姿态调整预备模式和调整模式则通过累加模式计数器并监测姿态稳定性,在必要时转为对地定向模式同时重置相关设置。如果新旧模式不同,则准备并通过调用`DoSetInt32To8, CheckBlockRing, GetTaskInfoBT, BlockRingAdd, POSE_ABSF, memset, DeviAngleLimit`等辅助函数发送新的模式指令。此函数由`ZKREAction`调用,并且依赖于定义在`\\PrjCommon\\CommonDef.h, \\PrjCommon\\DevDefine.h, AttMath.h, AttCtrlMain.h`中的跨文件头文件内容。它不接受任何外部输入参数,也没有明确的返回值类型。", "file": "M:/研二上/静态分析问题单过滤/gs-zk和扫描结果/PrjAttCtrlMng\\AttRECheck.c", "calls": [ "DoSetInt32To8", "CheckBlockRing", "GetTaskInfoBT", "BlockRingAdd", "POSE_ABSF", "memset", "DeviAngleLimit" ], "called_by": [ "ZKREAction" ] }, { "node_id": "Function:ZKREAction", "name": "ZKREAction", "summary": "该函数`ZKREAction`主要负责执行一系列航天器姿态控制相关的异常检测与处理任务。首先,它初始化指针`tmpAtt`指向`ATTCLT_DATA1_ADDR`,`tmpConst`指向`ATTCLT_DATA2_ADDR`,并检查这两个指针是否为NULL,如果是则直接返回。接着,初始化指针`pREcheck`、`pDeter`和`PPPU`分别指向`tmpAtt`中的相应结构体。随后,依次调用`GyroImuErrJudge()`、`SsImuErrJudge()`、`MagImuErrJudge()`和`WhlImuErrJudge()`对陀螺仪、星敏感器、模拟磁强计及飞轮进行异常诊断,并通过`PPUImuErrJudge()`对PPU(电推进单元)进行异常诊断。根据`PPPU->PPU_OrbitCtl_Quit_Err_Flag`的状态处理电推轨控退出情况:正常退出时,在一定时间后发送关闭PPU电源指令;异常退出时,则在一定时间后发送开启PPPU电源指令;若处于二次点火状态,则依据计数值发送相应的PPU电源指令。此外,基于`tmpConst->AllowAttLoseDiagFlg`的值决定是否允许姿态基准丢失诊断,允许时调用`AttLoseJudge()`,否则重置相关计数器;同样地,根据`tmpConst->AllowAttExDiagFlg`和`pDeter->CLPAttValid`判断是否允许姿态超差诊断,允许则调用`AttExJudge()`,反之重置标志位和计数器;最后,依据`tmpConst->AllowAttStaDiagFlg`和`pDeter->CLPAttValid`确定是否允许姿态不稳定诊断,允许则调用`AttUnStaJudge()`,否则重置相关标志位和计数器。此函数无输入参数,也不返回任何值,但被`ZKAction`调用,并且依赖于多个其他函数如`dev_can_write`, `PPUImuErrJudge`, `AttExJudge`等来完成其任务。同时,该函数还涉及到跨文件引用,包括了来自`..\\PrjCommon\\CommonDef.h`, `..\\PrjCommon\\DevDefine.h`, `AttMath.h`, 和`AttCtrlMain.h`头文件中的定义。", "file": "M:/研二上/静态分析问题单过滤/gs-zk和扫描结果/PrjAttCtrlMng\\AttRECheck.c", "calls": [ "dev_can_write", "PPUImuErrJudge", "AttExJudge", "GyroImuErrJudge", "AttUnStaJudge", "OCOut", "MagImuErrJudge", "SsImuErrJudge", "WhlImuErrJudge", "AttLoseJudge" ], "called_by": [ "ZKAction" ] } ]