上篇文章我们介绍了结合通义千问和plantuml为c代码生成序列图,这篇文章我结合用用通义千问,为c代码生成程序流程图,使用的工具是通义千问和mermaid( Mermaid 是一个基于 JavaScript 的图表工具,可以用 Markdown 语法定义和修改图表,可以自行百度一下),操作步骤如下:

提示词:

#include <stdint.h>
#include <stdbool.h>

// 假定的宏定义和类型定义,实际项目中这些应该来源于相应的头文件
#define PowerMode_ON         (1)
#define Door_Sts_Close       (0x0)
#define ICC_AutolockSts_Enable (0x1)
#define CentralLockingReq_Lock (0x2)
#define BMS_HVBattThermRunaway_Warning (0x1)
#define VehicleSpeed_Valid   (0x0)

// 假定的输入输出接口宏
#define RTE_Get_PowerMode()           /* 实际函数调用来获取电源状态 */
#define RTE_Get_LHFdoorSts()          /* 获取左前门状态 */
#define RTE_Get_LHRdoorSts()          /* 获取左后门状态 */
#define RTE_Get_RHFdoorSts()          /* 获取右前门状态 */
#define RTE_Get_RHRdoorSts()          /* 获取右后门状态 */
#define RTE_Get_ICC_AutolockSts()     /* 获取自动落锁设置状态 */
#define RTE_Get_Config_AutoLock()     /* 获取配置字车速自动上锁状态 */
#define RTE_Get_BMS_HVBattThermRunaway() /* 获取热失控状态 */
#define RTE_Get_VehicleSpeedVSOSig()  /* 获取车速信号 */
#define RTE_Get_VehicleSpeedVSOSigValidData() /* 获取车速信号有效性 */
#define RTE_Set_CentralLockingReq(val) /* 设置中央门锁请求信号 */

// 初始化函数
void AutoLock_Init(void);

// 模块运行函数,每200ms运行一次,符合题目要求的执行周期
void AutoLock_runnable_200ms(void);

bool isDoorClosed(void);
bool isAutoLockEnabled(void);
bool isVehicleSpeedAboveThreshold(void);

void AutoLock_Init(void) {
    // 这里可以放置任何必要的初始化逻辑
}

void AutoLock_runnable_200ms(void) {
    // 获取各个条件的状态
    bool powerOn = RTE_Get_PowerMode() == PowerMode_ON;
    bool doorsClosed = isDoorClosed();
    bool autoLockEnabled = isAutoLockEnabled();
    bool configAutoLockSet = RTE_Get_Config_AutoLock() == 0x1;
    bool thermRunawayNotWarning = RTE_Get_BMS_HVBattThermRunaway() != BMS_HVBattThermRunaway_Warning;
    bool vehicleSpeedValid = RTE_Get_VehicleSpeedVSOSigValidData() == VehicleSpeed_Valid;
    bool speedAbove15kmh = isVehicleSpeedAboveThreshold();

    // 检查使能条件
    if (powerOn && doorsClosed && autoLockEnabled && configAutoLockSet && thermRunawayNotWarning) {
        // 检查触发条件
        if (vehicleSpeedValid && speedAbove15kmh) {
            // 执行输出
            RTE_Set_CentralLockingReq(CentralLockingReq_Lock);
            // 这里假设直接通过CAN发送信号,实际可能需要更复杂的CAN消息构建逻辑
            // 注意:驱动电机的逻辑未包含,因为这通常涉及到硬件控制细节,且未给出具体接口
            // 实际应用中,可能需要调用特定的电机驱动函数或设置硬件寄存器
            // 假设驱动电机逻辑已封装在其他地方处理
        }
    }
}

bool isDoorClosed(void) {
    return (RTE_Get_LHFdoorSts() & RTE_Get_LHRdoorSts() & 
            RTE_Get_RHFdoorSts() & RTE_Get_RHRdoorSts()) == Door_Sts_Close;
}

bool isAutoLockEnabled(void) {
    return RTE_Get_ICC_AutolockSts() == ICC_AutolockSts_Enable;
}

bool isVehicleSpeedAboveThreshold(void) {
    // 假定车速有效时,获取车速并判断是否大于15km/h
    uint16_t vehicleSpeed = RTE_Get_VehicleSpeedVSOSig();
    // 这里简化处理,实际转换依据具体车速单位和传感器特性
    return vehicleSpeed > 15; // 假定单位已转换为合适的值
}

为以上代码生成流程图,可以使用mermaid格式

千问回复如下:

graph TD;
    A[AutoLock_Init()] --> B{Power On?};
    B -- No --> E[End];
    B -- Yes --> C{Doors Closed?};
    C -- No --> E;
    C -- Yes --> D{Auto Lock Enabled?};
    D -- No --> E;
    D -- Yes --> F{Config Auto Lock Set?};
    F -- No --> E;
    F -- Yes --> G{Therm. Runaway Not Warning?};
    G -- No --> E;
    G -- Yes --> H{Vehicle Speed Valid?};
    H -- No --> E;
    H -- Yes --> I{Speed > 15km/h?};
    I -- No --> E;
    I -- Yes --> J[RTE_Set_CentralLockingReq(Lock)];
    J --> K[End];

    subgraph Helper Functions
        L(isDoorClosed())
        M(isAutoLockEnabled())
        N(isVehicleSpeedAboveThreshold())
    end

    C -->|No| L
    D -->|No| M
    I -->|No| N

这段Mermaid语法描述了上述代码的流程图。它从初始化开始,然后按照条件分支判断电源状态、车门关闭状态、自动落锁启用状态、配置自动上锁设定、热失控警告状态、车速信号有效性,直至判断车速是否超过15km/h,最终决定是否发送中央门锁锁定请求。同时,流程图中包含了三个辅助函数:isDoorClosed()、isAutoLockEnabled()、isVehicleSpeedAboveThreshold(),它们代表了判断车门状态、自动落锁状态和车速是否达标的功能。

将mermaid脚本代码copy到mermaid编辑器中,在线工具见以下网页:

代码copy进去以后,会提示错误,应为那几个括号不符合语法,修改下把括号去掉。

修改后可以正常显示右边的截图了。

清晰地图如下:

也可以把将英文修改为中文描述,更容易理解,只需在千问中编写提示词,将图修改为中文,回复如下:

graph TD;
    A[自动上锁初始化] --> B{电源开启?};
    B -- 否 --> E[结束];
    B -- 是 --> C{车门关闭?};
    C -- 否 --> E;
    C -- 是 --> D{自动上锁已启用?};
    D -- 否 --> E;
    D -- 是 --> F{自动上锁配置设定?};
    F -- 否 --> E;
    F -- 是 --> G{未警告热失控?};
    G -- 否 --> E;
    G -- 是 --> H{车速有效?};
    H -- 否 --> E;
    H -- 是 --> I{速度>15km/h?};
    I -- 否 --> E;
    I -- 是 --> J[RTE_设置中央门锁请求(上锁)];
    J --> K[结束];

    subgraph 辅助函数
        L(检查车门是否关闭)
        M(检查自动上锁是否启用)
        N(检查车速是否超过阈值)
    end

    C -->|否| L
    D -->|否| M
    I -->|否| N

之后copy生图,如下:

清晰大图如下:

好了,今天我们就介绍完了怎么结合千问和mermaid生成流程图,后边在给大家介绍更多的应用场景。

更多推荐