打印
[应用相关]

逻辑类型抽象

[复制链接]
405|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
tpgf|  楼主 | 2023-11-14 09:21 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
嵌入式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

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1953

主题

15682

帖子

12

粉丝