久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3913|回復: 0
收起左側

用C來做一個解釋性語言,一個狀態機,初始化的順序決定執行順序

[復制鏈接]
ID:128229 發表于 2016-6-28 00:23 | 顯示全部樓層 |閱讀模式
寫了幾年的代碼,今天試著用C來做一個解釋性語言,一個狀態機,初始化的順序決定執行順序。支持時間和事件觸發兩種方案。現在只是不同匯編,要是會的話也許可以做一個OS,本代碼沒有做驗證,慎用!

  1. /*
  2. 事件狀態機,用于處理基于時間和消息
  3. step by  step
  4. 用戶只需要將需要做的事情按照步驟后條件加入到本函數中即可

  5. 事件狀態機

  6. */

  7. #include"eventStateMachine.H"

  8. esm_sta esmSta[emsNum];
  9. event_disc eventDisc[eventNum];
  10. u32  esmSysTime = 0;

  11. u8  esmStructInit(event_disc *dat)
  12. {
  13.     u8 i ;
  14.     for(i =0 ;i != emsNum ; i++)
  15.         {
  16.         if(esmSta[i].usedFlag != 0)
  17.             {
  18.             esmSta[i].dat = dat ;
  19.                 return i ;
  20.             }
  21.         }
  22.     return emsNum ;
  23. }

  24. /* 用于初始化延時事件
  25. 0 - 本事件總數
  26. 1-寫入位置
  27. 2- 3 延時時間
  28. */

  29. void esmTimeInit(u8 *inBuf,u8(*fun)(void))
  30. {
  31.     u8 totaol ,i ,add;
  32.     totaol = inBuf[0];
  33.     add = inBuf[1];
  34.     u16 time = inBuf[2]<<8|inBuf[3];
  35.     for(i =0 ; i != totaol ; i++)
  36.         {
  37.         if(esmSta[add].dat[i].fun != NULL)
  38.             {
  39.             esmSta[add].dat[i].fun = fun ;
  40.             esmSta[add].dat[i].time = time ;
  41.             esmSta[add].totalNum++;
  42.             }
  43.         }
  44. }

  45. /* 事件結構體初始化
  46. 0 - 本事件總量
  47. 1- 寫入地址

  48. */
  49. void esmEventInit(u8 *inBuf ,u8 (*fun)(void))
  50. {
  51.     u8 totaol ,i ,add;
  52.     totaol = inBuf[0];
  53.     add = inBuf[1];
  54.     for(i =0 ; i != totaol ; i++)
  55.         {
  56.         if(esmSta[add].dat[i].fun != NULL)
  57.             {
  58.             esmSta[add].dat[i].fun = fun ;
  59.             esmSta[add].dat[i].time = 0xffff ;
  60.             esmSta[add].totalNum++;
  61.             }
  62.         }
  63. }

  64. /* 事件狀態機時間鉤子函數

  65. */
  66. void esmTimeHookFun(void)
  67. {
  68.     esmSysTime++;
  69. }

  70. void esmTimeCheck(u8 i ,u8 step)
  71. {
  72.     if(  esmSysTime - esmSta[i].dat[step].recordTime >= esmSta[i].dat[step].time)
  73.         {
  74.         esmSta[i].dat[step].fun();
  75.         esmSta[i].nextStepId++;  /* 時間順序結構體要求step by step */
  76.         esmSta[i].dat[step].recordTime = 0;
  77.         }
  78. }

  79. void esmEventCheck(u8 i ,u8 step)
  80. {
  81. u8 next ;
  82.    next =esmSta[i].dat[step].fun();
  83.    if(next != esmWaiteStell)
  84.        {
  85.        esmSta[i].nextStepId = next ;
  86.        }
  87. }
  88. void  esmEventRunSta(void)
  89. {
  90.     u8 i ;
  91.     u8 step ;
  92.     for(i = 0 ; i!= emsNum ; i++)
  93.         {
  94.         step = esmSta[i].nextStepId ;
  95.         if(esmSta[i].dat[step].time != 0xffff)
  96.             {
  97.             //啟動延時數秒
  98.             if(esmSta[i].dat[step].recordTime == 0)
  99.                 {
  100.                 esmSta[i].dat[step].recordTime = esmSysTime ;
  101.                 }
  102.             else
  103.                 {
  104.                 esmTimeCheck(i, step);
  105.                 }
  106.             }
  107.         else
  108.             {
  109.             //事件參考執行
  110.                 esmEventCheck(i, step);
  111.             }
  112.         //恢復開始從新執行
  113.         if(esmSta[i].totalNum == step)
  114.             {
  115.             esmSta[i].nextStepId = 0;
  116.             }
  117.         }
  118. }



  119. //測試驗證
  120. u8  esmTestFun1(void)
  121. {
  122.     static  u8 ii;
  123.     ii  = esmSysTime ;
  124.     return 0;
  125. }

  126. u8 esmTestFun2(void)
  127. {
  128.     if(esmSysTime == 10)
  129.         {
  130.         return esmStepPlus ;
  131.         }
  132.     else
  133.         {
  134.         return esmWaiteStell ;
  135.         }
  136. }




  137. //測試驗證
  138. u8  esmTestFun3(void)
  139. {
  140.     static  u8 iii;
  141.     iii  = esmSysTime ;
  142.     return 0;
  143. }

  144. /* 初始化順序就是執行的順序 */
  145. void  esmTest(void)
  146. {
  147. u8 inBuf[5];
  148.     inBuf[0] = eventNum ;
  149.     inBuf[1] = esmStructInit(eventDisc);
  150.     inBuf[2] = 0x00 ;
  151.     inBuf[3] = 8;
  152.     esmTimeInit( inBuf, &esmTestFun1);
  153.     esmEventInit( inBuf, &esmTestFun2);
  154.     esmTimeInit( inBuf, &esmTestFun3);

  155.     while(1)
  156.         {
  157.         esmEventRunSta();
  158.         esmTimeHookFun();
  159.         }
  160. }


  161. #ifndef __eventStateMachine_H
  162. #define __eventStateMachine_H
  163. #include "stm32f10x.h"
  164. /* Scheduler includes. */
  165. #include "FreeRTOS.h"
  166. #include "task.h"
  167. #include"pBase.h"

  168. #define  emsNum 3  /* 申請多個事件狀態機 */
  169. #define  eventNum 4
  170. typedef struct
  171. {
  172.   u8 id ;
  173.   u8 (*fun)(void);
  174.   u16 time; /* 延時時間 */
  175.   u16 recordTime ;
  176. }event_disc;

  177. typedef struct
  178. {
  179.   u8 stepId ;
  180.   u8 nextStepId ;
  181.   u8 usedFlag :1; /* 使用標記 */
  182.   u8 totalNum ;
  183.   event_disc *dat;
  184. }esm_sta;


  185. #define  esmWaiteStell 0xff /* 繼續等待 */
  186. #define  esmStepPlus  0xfe  /* 下一步操作 */
  187. void  esmTest(void);
  188. #endif
復制代碼



回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 精品日韩一区二区 | 亚洲一区二区三区在线 | 精品99久久久久久 | 国产极品粉嫩美女呻吟在线看人 | 色视频www在线播放国产人成 | 日本在线一区二区三区 | 国产综合在线视频 | 国产小视频精品 | 精品国产乱码久久久久久老虎 | 日韩精品成人在线 | 国产精品久久久av | 日本又色又爽又黄又高潮 | 天天躁日日躁狠狠的躁天龙影院 | 一区二区三区欧美在线观看 | 亚洲成人一区 | 天堂资源最新在线 | 国产精品1区 | 久久久久久久av麻豆果冻 | 久久最新 | 久久久久中文字幕 | 日韩精品成人免费观看视频 | 91中文视频 | 精品国产18久久久久久二百 | 亚洲免费在线播放 | 黄网站免费在线看 | 91精品国产91久久久久久密臀 | 日韩波多野结衣 | 国产精品福利网站 | 久久精品手机视频 | 成人av网站在线观看 | 91久操网| 在线四虎| 久久最新精品 | 日本人麻豆 | 亚洲精品在线观看网站 | 国产最新视频在线 | 国产精品久久久久久久免费观看 | 久草网站 | 中文字幕日韩欧美一区二区三区 | 日本a在线 | 日韩精品久久 |