减少或消除重复的数组条目

时间:2016-02-16 19:28:19

标签: c arrays finite-automata automata

我想消除或彻底减少涉及常量集或下一个状态的查找的常量数组条目。这可能是非常简单的事情,我只是不知道正确的结构使用。我正在编写嵌入式C代码,我正在努力使事情变得非常快,但是其中一些数组变得非常大,所以我需要在代码速度和空间之间取得平衡。我没有很多嵌入式代码经验,而且我们公司没有专业知识。

作为一个小例子,考虑确定下一个状态的三个标志变量,fEnable,fDone和fFault。假设我将fEnable编码为bit 2,将fDone编码为bit 1,将fFault编码为bit 0.然后我会有一个这样的表来确定状态:

const uint8_t NEXT_STATE[] = {
    SEQ_SAME, // 000
    SEQ_PREV, // 001
    SEQ_PREV, // 010
    SEQ_PREV, // 011
    SEQ_SAME, // 100
    SEQ_PREV, // 101
    SEQ_NEXT, // 110
    SEQ_PREV  // 111
};

我的下一个状态由编码输入决定:

p->state = NEXT_STATE[ p->encodedInput ];

对于我的代码,我有一堆像这样的常量数组,用于时序常量和其他值(不仅仅是下一个状态)。

我的问题是,消除查询表中冗余条目的最佳方法是什么?例如,你可以使用逻辑简化,并知道如果设置了fFault,你需要SEQ_PREV。如果没有,如果未设置fDone,则需要SEQ_SAME。对于(!fFault)(fDone)(fEnabled)= SEQ_PREV,(!fFault)(fDone)(!fEnabled)= SEQ_NEXT。我可以看看如何使用一个常量二进制表来实现这一目标,但我不确定这是最好的方法。

作为一个更大的表的示例,请考虑这个(对于这里的格式化抱歉):

const enum PowerState_t PWR_TRANSITION_TABLE[16][PWR_NUM_STATES] =
{   // PWR_OFF          PWR_T_ON        PWR_ON          PWR_T_OFF       PWR_FAULT       PWR_CRIT_FAULT
    {PWR_FAULT,         PWR_T_OFF,      PWR_FAULT,      PWR_FAULT,      PWR_FAULT,      PWR_CRIT_FAULT  },          // 0000
    {PWR_FAULT,         PWR_T_ON,       PWR_FAULT,      PWR_T_ON,       PWR_FAULT,      PWR_CRIT_FAULT  },           // 0001
    {PWR_FAULT,         PWR_FAULT,      PWR_FAULT,      PWR_FAULT,      PWR_CRIT_FAULT, PWR_CRIT_FAULT  },  // 0010
    {PWR_FAULT,         PWR_FAULT,      PWR_FAULT,      PWR_FAULT,      PWR_CRIT_FAULT, PWR_CRIT_FAULT  },  // 0011
    {PWR_OFF,           PWR_OFF,        PWR_FAULT,      PWR_OFF,        PWR_OFF,        PWR_OFF         },  // 0100
    {PWR_T_ON,          PWR_T_ON,       PWR_FAULT,      PWR_T_ON,       PWR_FAULT,      PWR_CRIT_FAULT  },  // 0101
    {PWR_FAULT,         PWR_FAULT,      PWR_FAULT,      PWR_FAULT,      PWR_CRIT_FAULT, PWR_CRIT_FAULT  },  // 0110
    {PWR_FAULT,         PWR_FAULT,      PWR_FAULT,      PWR_FAULT,      PWR_CRIT_FAULT, PWR_CRIT_FAULT  },  // 0111
    {PWR_CRIT_FAULT,    PWR_T_OFF,      PWR_T_OFF,      PWR_T_OFF,      PWR_FAULT,      PWR_CRIT_FAULT  },  // 1000
    {PWR_CRIT_FAULT,    PWR_ON,         PWR_ON,         PWR_T_ON,       PWR_FAULT,      PWR_CRIT_FAULT  },  // 1001
    {PWR_CRIT_FAULT,    PWR_FAULT,      PWR_FAULT,      PWR_FAULT,      PWR_CRIT_FAULT,        PWR_CRIT_FAULT  },  // 1010
    {PWR_CRIT_FAULT,    PWR_FAULT,      PWR_FAULT,      PWR_FAULT,      PWR_CRIT_FAULT,        PWR_CRIT_FAULT  },  // 1011
    {PWR_CRIT_FAULT,    PWR_CRIT_FAULT, PWR_CRIT_FAULT, PWR_CRIT_FAULT, PWR_CRIT_FAULT, PWR_CRIT_FAULT  },  // 1100
    {PWR_CRIT_FAULT,    PWR_CRIT_FAULT, PWR_CRIT_FAULT, PWR_CRIT_FAULT, PWR_CRIT_FAULT, PWR_CRIT_FAULT  },  // 1101
    {PWR_CRIT_FAULT,    PWR_CRIT_FAULT, PWR_CRIT_FAULT, PWR_CRIT_FAULT, PWR_CRIT_FAULT, PWR_CRIT_FAULT  },  // 1110
    {PWR_CRIT_FAULT,    PWR_CRIT_FAULT, PWR_CRIT_FAULT, PWR_CRIT_FAULT, PWR_CRIT_FAULT, PWR_CRIT_FAULT  }   // 1111
};

提前感谢您的帮助。

0 个答案:

没有答案