嵌入式MCU编程除了对硬件和协议的应用之外,更多的是赋予设备完整的运行逻辑。在实现功能的过程中,没有完备的逻辑类型抽象,往往会陷入逻辑混乱逻辑漏洞和复杂化的泥潭中,对需求功能进行抽丝剥茧尽量往常见逻辑类型靠,能够有效优化逻辑的复杂程度,避免被功能逻辑牵着走,减少逻辑漏洞(也就是bug的产生),减少复杂逻辑编写后的验证过程。
bool Model_IsSlipping(GPSDataAnalyzer *pstAnalyzer, gps_raw_data *pstgps_raw_data, Gearbox gear_orientation)
{
return_value_if_fail(pstAnalyzer != NULL, FALSE);
return_value_if_fail(pstgps_raw_data != NULL, FALSE);
static Gearbox pre_gearbox = {0};
static int slipping_distance = {0};
static Position node_position = {0};
int heading_angle;
Position *pRecent_data, *pPre_data;
heading_angle = model_gps_convert_angle((int)pstgps_raw_data->heading);
// printf("angle:%f,heading_angle:%d\r\n",pstgps_raw_data->heading, heading_angle);
model_gps_analyzer_push(pstAnalyzer, pstgps_raw_data);
model_gps_analyzer_adjacentData_get(pstAnalyzer, &pRecent_data, 0);
model_gps_analyzer_adjacentData_get(pstAnalyzer, &pPre_data, 1);
model_gps_calculateProjection(*pPre_data, *pRecent_data, heading_angle, &pPre_data->stDisplacement);
model_gps_isVehicleSlidingOnSlope(pRecent_data, gear_orientation);
slipping_distance += pRecent_data->stDisplacement.positiveDirection;
// printf("slipe:%d\r\n", slipping_distance);
if (pre_gearbox != gear_orientation)
{
memcpy(&node_position, pRecent_data, sizeof(Position));
slipping_distance = 0;
// printf("------gear------\r\n");
}
pre_gearbox = gear_orientation;
if (pRecent_data->stDisplacement.positiveDirection > 20)
{
memcpy(&node_position, pRecent_data, sizeof(Position));
slipping_distance = 0;
// printf("@@@@@@ speed @@@@@@\r\n");
}
if (pstgps_raw_data->QF != 3 || pstgps_raw_data->QF_tra != 4)
{
memcpy(&node_position, pRecent_data, sizeof(Position));
slipping_distance = 0;
// printf("******QF******\r\n");
}
if (model_gps_calculate_time_difference(pPre_data->utc, pRecent_data->utc) > 1000)
{
memcpy(&node_position, pRecent_data, sizeof(Position));
slipping_distance = 0;
// printf("^^^^^^time^^^^^^\r\n");
}
if (pRecent_data->Whether_slide == FALSE && pPre_data->Whether_slide == FALSE)
{
memcpy(&node_position, pRecent_data, sizeof(Position));
slipping_distance = 0;
// printf("######not_slide######\r\n");
}
if(((pRecent_data->x - node_position.x)*(pRecent_data->x - node_position.x) + (pRecent_data->y - node_position.y)*(pRecent_data->y - node_position.y)) > (SLIDING_DISTANCE_THRESHOLD*SLIDING_DISTANCE_THRESHOLD))
{
memcpy(&node_position, pRecent_data, sizeof(Position));
slipping_distance = 0;
// printf("!!!!!!slide!!!!!!\r\n");
return TRUE;
}
return FALSE;
}
程度临界值逻辑是一个比较常见的逻辑类型:
1.程度累加值
2.累加值积累,定性型加一,定量型加定量值;
3.程度累加值清零,常见清零逻辑有:
1)数据自身不满足逻辑条件,数据不满足累加条件,累加值清零。
2)输入状态发生变化,当前累加值失效。
3)数据不连续,或者填充数据超时,当前累加值作用时间失效。
4.判断程度临界值
总结:嵌入式MCU编程更注重程序运行的逻辑,对功能需求抽象套用标准逻辑类型,能够快速有效实现功能的同时,减少逻辑漏洞,避免陷入逻辑泥潭中,另外把串行逻辑改为并列逻辑,是降低逻辑复杂程度,减少逻辑耦合和逻辑漏洞的有效方法。
————————————————
版权声明:本文为CSDN博主「嵌入式小宁」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_53592457/article/details/131752049
|