【问题标题】:State Machine In CC语言中的状态机
【发布时间】:2016-09-02 11:33:10
【问题描述】:

我正在尝试用 C 创建一个状态机。这个状态机依赖于四个相互关联的事件。为了表示它,我想显示一个数组,

StateEventProcess[max_states][no_of_alarm][no_alarm_hsyt][timer_Status];

所有的索引都是一些数字,分别是 5,2,2,2。

我想实现一个可以触发回调函数的状态机表

我只为状态和条件元组实现了它。

enum states
{ 
    en_AI_NO_ALARM_s1, en_AI_LOW_ALARM_s2, en_AI_HIGH_ALARM_s3, en_AI_SENSOR_BREAK_s4, en_AI_UNDER_CALIBRATION_s5 
}
current_state;

enum events 
{ 
    COND_1, COND_2, COND_3, COND_4 
} 
new_cond;

void action_s1_c1 (void);
void action_s1_c2 (void);
void action_s1_c3 (void);
void action_s1_c4 (void);

void action_s2_c1 (void);
void action_s2_c2 (void);
void action_s2_c3 (void);
void action_s2_c4 (void);
.
.
.
.

enum events GetNewCond (void)
{
    if(Val < LowAlarm)
        return COND_1;
    if(val > LowAlarm)
        return COND_2;
    if(Val < HighAlarm)
        return COND_3;
    if(val > HighAlarm)
        return COND_4;
}
void (*const state_table [MAX_STATES][MAX_COND]) (void) = {
    { action_s1_c1, action_s1_c2, action_s1_c3, action_s1_c4}, /* procedures for state 1 */
    { action_s2_c1, action_s2_c2, action_s2_c3, action_s2_c4}, /* procedures for state 2 */
    { action_s3_c1, action_s3_c2, action_s3_c3, action_s3_c4}, /* procedures for state 3 */
    { action_s4_c1, action_s4_c2, action_s4_c3, action_s4_c4}, /* procedures for state 4 */
    { action_s5_c1, action_s5_c2, action_s5_c3, action_s5_c4}, /* procedures for state 5 */ 
};

但是以我在上面处理 2d 数组的方式处理 4d 数组对我来说相当混乱。请帮我实现同样的。

【问题讨论】:

  • 4D 数组几乎肯定不是您想要的。但无论哪种方式,您都没有解释具体问题是什么,即不清楚您在问什么。
  • 我不想使用 for 循环,而是想使用一个可以作为源来触发特定情况下的回调的表。情况可能是:LOW_ALARM、LOW_ALARM、HIGH_HYST、TIMER_OFF

标签: c


【解决方案1】:

你必须打开4大括号

#define MAX_ST 5 // max_states
#define MAX_NA 2 // no_of_alarm
#define MAX_AH 2 // no_alarm_hsyt
#define MAX_TS 2 // timer_Status

void (*const state_table[MAX_ST][MAX_NA][MAX_AH][MAX_TS]) (void) = {
    {
        {
            { st0_na0_ah0_ts0, st0_na0_ah0_ts1 }, // state 0, alarm 0, history 0, status 0
            { st0_na0_ah1_ts0, st0_na0_ah1_ts1 }, // state 0, alarm 0, history 0, status 1
        },
        {
            { st0_na1_ah0_ts0, st0_na1_ah0_ts1 },
            { st0_na1_ah1_ts0, st0_na1_ah1_ts1 },
        },
    },
    {
        {
            { st1_na0_ah0_ts0, st1_na0_ah0_ts1 },
            { st1_na0_ah1_ts0, st1_na0_ah1_ts1 },
        },
        {
            { st1_na1_ah0_ts0, st1_na1_ah0_ts1 },
            { st1_na1_ah1_ts0, st1_na1_ah1_ts1 },
        },
    },
    /* ... */
};

【讨论】:

  • 请解释一下'st0_na0_ah0_ts0'是什么意思,我如何扩展它来理解这个名字。
  • 谢谢,这让我有了新的思考方式
  • 很高兴它有帮助。
  • 我也是。但是有任何方法可以优化它,这样如果我添加任何参数,它就不会大幅增长。例如,如果我应该再添加 2 个状态,那么它将导致表格的巨大增长。请建议
【解决方案2】:

使用状态表实现状态机对于更简单/更少的状态很方便。但在您的情况下,将其扩展到 4d 会很复杂,并且难以维护或阅读。

相反,我建议您使用轻量级状态机框架。框架的优点是您的状态机变得易于维护和扩展。

您可以参考我之前的答案here 或访问我的GitHub 页面UML state machine in C 框架以获取更多信息。你可以找到GitHub项目here

【讨论】:

    猜你喜欢
    • 2015-09-15
    • 1970-01-01
    • 2020-07-26
    • 1970-01-01
    • 2014-05-07
    • 2013-09-18
    • 2011-01-17
    • 2016-07-21
    相关资源
    最近更新 更多