2

我正在写医疗软件。为此,我提出了一个工作流程,让我可以向编程知识有限的人展示我制作的程序与我应该制作的程序相同。工作流程如下:

  1. 制作一个人类可读的文档,说明程序必须做什么,不能做什么。

  2. 将该文档转换为状态机图。

  3. 编写证明是编写的单元测试 C 代码实现步骤 2 中的图表

  4. 编写通过第 3 步中的单元测试的代码。

步骤 1 和 2 不能自动化。我正在寻找一种方法来自动化步骤 3 和 4。基本上我需要一些程序来保持以下语句同步:

状态机图:

/** \page parallel_lcd
 * parallel lcd state machine \n
 * \dot
 * digraph statemachine {
 *  node [shape=record];
 *  ST_LCD_INIT [ label="Init" , color = red];
 *  ST_LCD_INITA [ label="Init A" , color = red];
 *  ST_LCD_INITB [ label="Init B" , color = red];
 *
 *  ST_LCD_INIT -> ST_LCD_INITA [ label ="(1)", arrowhead="open", style="solid" , color = green];
 *  ST_LCD_INITA -> ST_LCD_INITB [ label ="(2)", arrowhead="open", style="solid" , color = green];
 * }
 * \enddot
 */

单元测试:

//arrow (1)
myLCD.state = ST_LCD_INIT;
parLcdExecute();
TEST_ASSERT_EQUAL_INT(ST_LCD_INITA,myLCD.state);

//arrow (2)
myLCD.state = ST_LCD_INITA;
parLcdExecute();
TEST_ASSERT_EQUAL_INT(ST_LCD_INITB,myLCD.state);

代码:

static TPARALLELLCD* myLcd = NULL;

void parLcdExecute (void)
{
    switch (myLcd->state)
    {
        case ST_LCD_INIT:
        {
            //do something
            myLcd->state = ST_LCD_INIT_A;
            break;
        }
        case ST_LCD_INITA:
        {
            //do something
            myLcd->state = ST_LCD_INIT_B;
            break;
        }
        case ST_LCD_INIT_B:
        {
            //do something
            break;
        }
    }
}

void parLcdInit(TPARALLELLCD* lcd)
{
    myLcd = lcd;
}

头文件:

typedef enum
{
    ST_LCD_INIT,
    ST_LCD_INIT_A,
    ST_LCD_INIT_B,
}TPARLCDSTATES;

typedef struct
{   
    uint8_t lines[PAR_LCD_NUM_LINES][PAR_LCD_LINE_SIZE];
    TPARLCDSTATES state;
}TPARALLELLCD;

void parLcdExecute (void);
void parLcdInit(TPARALLELLCD* lcd);

我正在使用 C 测试框架“unity”:https ://www.throwtheswitch.org/unity

我一直在寻找状态机生成器/编译器。我找到了 SMC:状态机编译器,但据我所知,它不能做我想做的事情: http ://smc.sourceforge.net

有人知道可以做到这一点的软件吗?

干杯,塞德里克

4

0 回答 0