diff --git a/test_on_28377/.cproject b/test_on_28377/.cproject
index 8ac92ce..27deca7 100644
--- a/test_on_28377/.cproject
+++ b/test_on_28377/.cproject
@@ -28,21 +28,21 @@
-
+
-
+
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
-
-
+
-
-
-
+
+
-
-
-
+
+
+
-
-
-
-
-
+
+
+
+
-
-
-
-
-
-
-
+
+
+
+
+
+
diff --git a/test_on_28377/.launches/FSM_test.launch b/test_on_28377/.launches/FSM_test.launch
index 44c9b58..164d719 100644
--- a/test_on_28377/.launches/FSM_test.launch
+++ b/test_on_28377/.launches/FSM_test.launch
@@ -1,6 +1,19 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -11,6 +24,7 @@
+
@@ -18,6 +32,10 @@
-
+
+
+
+
+
diff --git a/test_on_28377/2837xD_RAM_lnk_cpu1.cmd b/test_on_28377/2837xD_RAM_lnk_cpu1.cmd
index 7bed282..19a7acd 100644
--- a/test_on_28377/2837xD_RAM_lnk_cpu1.cmd
+++ b/test_on_28377/2837xD_RAM_lnk_cpu1.cmd
@@ -12,6 +12,7 @@ PAGE 0 :
RAMLS2 : origin = 0x009000, length = 0x000800
RAMLS3 : origin = 0x009800, length = 0x000800
RAMLS4 : origin = 0x00A000, length = 0x000800
+ RAMGS10 : origin = 0x016000, length = 0x001000
RESET : origin = 0x3FFFC0, length = 0x000002
/* Flash sectors */
@@ -51,7 +52,7 @@ PAGE 1 :
RAMGS7 : origin = 0x013000, length = 0x001000
RAMGS8 : origin = 0x014000, length = 0x001000
RAMGS9 : origin = 0x015000, length = 0x001000
- RAMGS10 : origin = 0x016000, length = 0x001000
+
// RAMGS11 : origin = 0x017000, length = 0x000FF8 /* Uncomment for F28374D, F28376D devices */
@@ -77,7 +78,7 @@ PAGE 1 :
SECTIONS
{
codestart : > BEGIN, PAGE = 0
- .text : >> RAMD0 | RAMLS0 | RAMLS1 | RAMLS2 | RAMLS3 | RAMLS4, PAGE = 0
+ .text : >> RAMD0 | RAMLS0 | RAMLS1 | RAMLS2 | RAMLS3 | RAMLS4 | RAMGS10, PAGE = 0
.cinit : > RAMM0, PAGE = 0
.switch : > RAMM0, PAGE = 0
.reset : > RESET, PAGE = 0, TYPE = DSECT /* not used, */
diff --git a/test_on_28377/targetConfigs/TMS320F28377D.ccxml b/test_on_28377/targetConfigs/TMS320F28377D.ccxml
index 99f29d0..5d896ab 100644
--- a/test_on_28377/targetConfigs/TMS320F28377D.ccxml
+++ b/test_on_28377/targetConfigs/TMS320F28377D.ccxml
@@ -1,42 +1,62 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/vscode/FSM_OOP/baseFSM/FSM.c b/vscode/FSM_OOP/baseFSM/FSM.c
index ea8cb8c..794e4fd 100644
--- a/vscode/FSM_OOP/baseFSM/FSM.c
+++ b/vscode/FSM_OOP/baseFSM/FSM.c
@@ -42,17 +42,6 @@ static inline void preload(FSM* pFSM){
}
}
-
-static inline void excuteDelay(FSM* pFSM){
- FSMHandler *fcns = &pFSM->privateVars.fcns;
- for (int event = 0; event < pFSM->privateVars.numEvent; event++)
- {
- if(!fcns->isDelayExcuted[event] && fcns->transitionDelayTable[event] != NULL ){
- fcns->transitionDelayTable[event](pFSM->data);
- fcns->isDelayExcuted[event] = 1;
- }
- }
-}
void stepBaseFSM(FSM *pFSM)
{
@@ -62,20 +51,21 @@ void stepBaseFSM(FSM *pFSM)
FSMHandler *fcns = &pFSM->privateVars.fcns;
int curState = pFSM->privateVars.curState;
void *data = pFSM->data;
-
- excuteDelay(pFSM);
-
FSM **childFSM = pFSM->privateVars.childFSM;
int index = pFSM->privateVars.curState * pFSM->privateVars.numEvent + pFSM->privateVars.curEvent;
int nextState;
+ if(fcns->delayedEvent){
+ fcns->transitionDelayTable[fcns->delayedEvent](data);
+ fcns->delayedEvent = 0;
+ }
+
if (fcns->transitionTable[index] != NULL)
{
- fcns->isDelayExcuted[curState] = 0;
if (fcns->exitActionTable[curState] != NULL)
fcns->exitActionTable[curState](data, childFSM);
- nextState = (*fcns->transitionTable[index])(data, curState, fcns->isDelayExcuted);
+ nextState = (*fcns->transitionTable[index])(data, curState, &fcns->delayedEvent);
if (fcns->enterActionTable[nextState] != NULL)
fcns->enterActionTable[nextState](data, childFSM);
@@ -110,15 +100,14 @@ FSM* newBaseFSM(int numState, int numEvent, int defaultState){
pFSM->privateVars.preloader.isReady = 0;
pFSM->privateVars.fcns.duringActionTable = calloc(numState, sizeof(StateFuncPtr));
- pFSM->privateVars.fcns.isDelayExcuted = calloc(numEvent, sizeof(int));
- memset(pFSM->privateVars.fcns.isDelayExcuted, 1, sizeof(int));
+
- pFSM->privateVars.fcns.transitionDelayTable = calloc(numState, sizeof(StateFuncPtr));
pFSM->privateVars.fcns.enterActionTable = calloc(numState, sizeof(StateFuncPtr));
pFSM->privateVars.fcns.exitActionTable = calloc(numState, sizeof(StateFuncPtr));
pFSM->privateVars.fcns.transitionTable = calloc(numState * numEvent, sizeof(TransitionFuncPtr));
pFSM->privateVars.fcns.childFSMStepTable = calloc(numState * numEvent, sizeof(ChildFSMStepFuncPtr));
+ pFSM->privateVars.fcns.transitionDelayTable = calloc(numEvent, sizeof(StateFuncPtr));
FSMVtbl vtbl = {
.reset = resetBaseFSM,
@@ -126,6 +115,7 @@ FSM* newBaseFSM(int numState, int numEvent, int defaultState){
.selectEvent = NULL,
.setupHandler = NULL,
.initData = NULL,
+ .initDataLoader = NULL,
};
pFSM->vtbl = vtbl;
@@ -136,9 +126,11 @@ FSM* newBaseFSM(int numState, int numEvent, int defaultState){
void constructFSM(FSM* pFSM){
assert(pFSM->vtbl.setupHandler);
assert(pFSM->vtbl.initData);
+ assert(pFSM->vtbl.initDataLoader);
pFSM->vtbl.setupHandler(&pFSM->privateVars.fcns);
pFSM->vtbl.initData(pFSM);
+ pFSM->vtbl.initDataLoader(pFSM);
}
diff --git a/vscode/FSM_OOP/baseFSM/FSM_protected.h b/vscode/FSM_OOP/baseFSM/FSM_protected.h
index 8b67be8..fc23698 100644
--- a/vscode/FSM_OOP/baseFSM/FSM_protected.h
+++ b/vscode/FSM_OOP/baseFSM/FSM_protected.h
@@ -50,7 +50,7 @@ typedef struct _FSMHandler{
void (**duringActionTable)(void *data, FSM **cFSM);
void (**exitActionTable)(void *data, FSM **cFSM);
- int *isDelayExcuted;
+ int delayedEvent;
void (**transitionDelayTable)(void *data);
void (**childFSMStepTable)(FSM **cFSM);
diff --git a/vscode/FSM_OOP/baseFSM/FSM_public.h b/vscode/FSM_OOP/baseFSM/FSM_public.h
index 8aec8c7..820f636 100644
--- a/vscode/FSM_OOP/baseFSM/FSM_public.h
+++ b/vscode/FSM_OOP/baseFSM/FSM_public.h
@@ -19,6 +19,7 @@ typedef struct _FSMVtbl {
void (*step)(FSM *pFSM); // 子类重新实现可以添加一些打印信息
void (*initData)(FSM *pFSM); // 子类必须重新实现
void (*setupHandler)(FSMHandler *fcns); // 子类必须重新实现
+ void (*initDataLoader)(FSM *pFSM); // 子类必须重新实现
}FSMVtbl;
diff --git a/vscode/FSM_OOP/keytest/keyFSM.c b/vscode/FSM_OOP/keytest/keyFSM.c
index 3192211..664138d 100644
--- a/vscode/FSM_OOP/keytest/keyFSM.c
+++ b/vscode/FSM_OOP/keytest/keyFSM.c
@@ -40,13 +40,15 @@ static void initData(KeyFSM *pFSM){ // 必须重新实现
data->countMultiDown = 0;
data->in = Up;
data->out = Idle;
-
- pFSM->base.privateVars.preloader.in = malloc(sizeof(KeyIn));
- pFSM->base.privateVars.preloader.preloadSize = sizeof(KeyIn);
pFSM->base.data = data;
}
+static void initDataLoader(KeyFSM *pFSM){ // 必须重新实现
+ pFSM->base.privateVars.preloader.in = malloc(sizeof(KeyIn));
+ pFSM->base.privateVars.preloader.preloadSize = sizeof(KeyIn);
+}
+
static void setupHandler(FSMHandler* fcns){ // 必须重新实现
addStateActionFcn(enter, Waiting);
addStateActionFcn(during, DownDebouncing);
@@ -92,8 +94,9 @@ KeyFSM *createKeyFSM(){
#endif
pFSM->base.vtbl.selectEvent = (Avoid_WARNING_SelectEvent)selectEvent;
- pFSM->base.vtbl.initData = (Avoid_WARNING_Overrider_Fcns)initData;
pFSM->base.vtbl.setupHandler = (Avoid_WARNING_void_fcns)setupHandler;
+ pFSM->base.vtbl.initData = (Avoid_WARNING_Overrider_Fcns)initData;
+ pFSM->base.vtbl.initDataLoader = (Avoid_WARNING_Overrider_Fcns)initDataLoader;
constructFSM((FSM_Ptr)pFSM);
diff --git a/vscode/FSM_OOP/keytest/keyFSM_private.h b/vscode/FSM_OOP/keytest/keyFSM_private.h
index 3c31ec0..f27d0ed 100644
--- a/vscode/FSM_OOP/keytest/keyFSM_private.h
+++ b/vscode/FSM_OOP/keytest/keyFSM_private.h
@@ -148,7 +148,7 @@ static State transitionHandler(PhsicalDown)(KeyFSMData* data, State curState, in
}
}
-static State transitionHandler(PhsicalUp)(KeyFSMData* data, State curState, int *isDelayExecuted)
+static State transitionHandler(PhsicalUp)(KeyFSMData* data, State curState, Event *delayedEvent)
{
FSM_LOG(" 物理按键松开 ");
data->countDelay = 0;
@@ -180,7 +180,7 @@ static void delayHanlder(DelayCount3)(KeyFSMData* data){
data->out = Idle;
}
-static State transitionHandler(DelayCount3)(KeyFSMData* data, State curState, int *isDelayExecuted){
+static State transitionHandler(DelayCount3)(KeyFSMData* data, State curState, Event *delayedEvent){
FSM_LOG(" 延迟计数到3 ");
data->countDelay = 0;
@@ -188,13 +188,13 @@ static State transitionHandler(DelayCount3)(KeyFSMData* data, State curState, in
{
case DownDebouncing:
data->out = Down;
- isDelayExecuted[DelayCount3] = 0;
+ *delayedEvent = DelayCount3;
FSM_LOG("按键按下");
return Downing;
case UpDebouncing:
- data->out = Up;
+ data->out = Idle;
data->countMultiDown++;
FSM_LOG("按键松开");
@@ -221,7 +221,7 @@ static State transitionHandler(DelayCount3)(KeyFSMData* data, State curState, in
break;
}
FSM_LOG(" 多击%d ", data->countMultiDown+1);
- isDelayExecuted[DelayCount3] = 0;
+ *delayedEvent = DelayCount3;
return MultiDowning;
default: