回覆列表
  • 1 # lehoon

    使用函式指標陣列,減少if,switch case使用,而且梳理好邏輯,提高程式碼的可讀性。

    用法如下:

    typedef enum {

    E_IDLE = 0,

    E_SYNC,

    E_DETECT_FAULT,

    E_FEEDBACK_FAULT

    } Enum_State;

    static Enum_State eState = E_IDLE;

    static void APP_Idle(void); /* 省略了函式具體實現的功能 */

    static void APP_Sync(void);

    static void APP_DetectLedFault(void);

    static void APP_FeedbackFault(void);

    void (*APP_Operation[])(void) = { /* Sequence must be consistent with EnumState */

    APP_Idle,

    APP_Sync,

    APP_DetectLedFault,

    APP_FeedbackFault

    };

    void main(void)

    {

    for(;;)

    {

    APP_Operation[eState]();

    }

    }

  • 2 # 超脫眾品化育群生

    一百多個條件應該不是平級的吧?分個層唄,機率大的靠前一些。另外執行程式碼類似的可以做個複用的宏函式,總體上我來做應該是先分類後歸類

  • 3 # 三輪新司機

    使用狀態機是個好辦法,將通訊協議的接收流程分成多個狀態,在每個狀態裡只處理有限的幾種接收情況,根據接收到的情況設定下一次的狀態。

  • 4 # 迷途不行

    兩種情況啊

    1.指令之間有明顯分隔符的,那麼收到分隔符,將接收的緩衝區進行解析,然後直接清空緩衝區

    2.如果沒有明顯分隔符,那麼就每一次收到資料就嘗試解析,清除解析成功的資料,留下未解析的資料(可能是半包資料)

    對於解析訊息,可以直接sscanf函式搞定 自己百度一下

  • 5 # 程式bug一樣的存在

    類似中斷呼叫即可!

    d語言的程式碼演示

    alias funx=void function();

    funx[127] cmds = [&case1,...];

    void test(){

    auto c = readbuf();

    cmds[c & 127]();

    }

  • 6 # Ren

    主要得看協議是怎麼定製的,使用簡單快速的方法判定:其他節點的包、沒有接收完成的包、接收完成的包、校驗錯誤的包、傳輸超時的包、匯流排干擾產生的偶然字元等等狀態,根據不同的狀態做出處理,接收完成的包儘快轉存後解包,儘可能少進入實質解包的過程。曾經看到過有同學用強制解包的方法判斷包的可用性,如果是算力比較差的51之類的微控制器,非累死不可。

  • 7 # ScholarMartin

    想辦法把這一百多個case值對映到一個小範圍,switch在編譯時會最佳化為查表分支。

    值的分佈範圍影響散轉表的大小。

  • 中秋節和大豐收的關聯?
  • 獨立顯示卡玩遊戲效果這麼好,為什麼智慧手機不採用呢?