|
|
View previous topic :: View next topic |
Author |
Message |
zilot
Joined: 21 Nov 2006 Posts: 16
|
Simple State Machine Concept |
Posted: Wed Feb 07, 2007 10:23 am |
|
|
Here is some simple state machine concept, maybe someone finds it
as usefull.Any comment?
Code: | ////////////////////////////////////////////////////////////////////////////
/////// ///////
/////// State Machine Concept ///////
/////// ///////
////////////////////////////////////////////////////////////////////////////
/////// ///////
/////// State Machine Name = STM ///////
/////// State Machine States = STMST1, STMST2, ...STMST10 ///////
/////// State Machine Events = STMEV1, STMEV2,....STMEV10 ///////
////////////////////////////////////////////////////////////////////////////
/////// Transitions ///////
////////////////////////////////////////////////////////////////////////////
/////// STMST1==>STMST5 for STMEV1 ///////
/////// STMST1==>STMST3 for STMEV4 ///////
///////--------------------------------------------------------------///////
/////// STMST2==>STMST1 for STMEV3 ///////
/////// STMST2==>STMST10 for STMEV7 ///////
///////--------------------------------------------------------------///////
/////// STMST3==>STMST4 for STMEV8 ///////
/////// STMST3==>STMST7 for STMEV2 ///////
///////--------------------------------------------------------------///////
/////// etc........................ ///////
/////// etc........................ ///////
////////////////////////////////////////////////////////////////////////////
/////// When some extern event happens, one should call ///////
/////// STMHandler (some event from defined set of events). ///////
/////// Will State machine change or not current state ///////
/////// depends whether transition is defined or not for current ///////
/////// state and event passed as parameter to STMHandler(). ///////
////////////////////////////////////////////////////////////////////////////
//--------------------- Define states on State Machine STM -----------------
enum state{STMST1,STMST2,STMST3,STMST4,STMST5,STMST6,STMST7,STMST8,STMST9,STMST10}currentState;
//--------------------- Define events on State Machine STM -----------------
enum event{STMEV1,STMEV2,STMEV3,STMEV4,STMEV5,STMEV6,STMEV7,STMEV8,STMEV9,STMEV10}currentEvent;
//--------------------------- Define states handler ------------------------
void STMST1Handler(event eventHappened)
{
switch(eventHappened)
{
case STMEV1: //Do some action
currentState=STMST5;
break;
case STMEV4: //Do some action
currentState=STMST3;
break;
// Other cases
default: break;
}
}
void STMST2Handler(event eventHappened)
{
switch(eventHappened)
{
case STMEV3: //Do some action
currentState=STMST1;
break;
case STMEV7: //Do some action
currentState=STMST10;
break;
// Other cases
default: break;
}
}
void STMST3Handler(event eventHappened)
{
switch(eventHappened)
{
case STMEV8: //Do some action
currentState=STMST4;
break;
case STMEV2: //Do some action
currentState=STMST7;
break;
// Other cases
default: break;
}
}
void STMST4Handler(event eventHappened)
{
; //Same as for other states transitions
}
void STMST5Handler(event eventHappened)
{
; //Same as for other states transitions
}
void STMST6Handler(event eventHappened)
{
; //Same as for other states transitions
}
void STMST7Handler(event eventHappened)
{
; //Same as for other states transitions
}
void STMST8Handler(event eventHappened)
{
; //Same as for other states transitions
}
void STMST9Handler(event eventHappened)
{
; //Same as for other states transitions
}
void STMST10Handler(event eventHappened)
{
; //Same as for other states transitions
}
//------------------------ Define state machine handler ---------------------
void STMHandler (event eventHappened)
{
switch(currentState)
{
case STMST1: STMST1Handler(eventHappened);
break;
case STMST2: STMST2Handler(eventHappened);
break;
case STMST3: STMST3Handler(eventHappened);
break;
case STMST4: STMST4Handler(eventHappened);
break;
case STMST5: STMST5Handler(eventHappened);
break;
case STMST6: STMST6Handler(eventHappened);
break;
case STMST7: STMST7Handler(eventHappened);
break;
case STMST8: STMST8Handler(eventHappened);
break;
case STMST9: STMST9Handler(eventHappened);
break;
case STMST10: STMST10Handler(eventHappened);
break;
default:
break;
}
} |
|
|
|
kender
Joined: 09 Aug 2004 Posts: 768 Location: Silicon Valley
|
|
Posted: Wed Feb 07, 2007 5:29 pm |
|
|
Nested switch state machine. I think, it's the only type of state machine that can be practically implemented on a PIC with stable versions of the CCS compiler. As a result, this concept is very useful.
You might find this post interesting too http://www.ccsinfo.com/forum/viewtopic.php?t=28656
P.S. Here's a link to some standard state machine implementation concepts http://www.quantum-leaps.com/writings/PSiCC_Excerpts.pdf (chapter 3). It's outside the context of PICs, however all of these consepts have been implemented on ARM uCs. |
|
|
zilot
Joined: 21 Nov 2006 Posts: 16
|
|
Posted: Thu Feb 08, 2007 1:50 am |
|
|
I became frustrated when realised I cant do almost any modification of generated code from some embedded UML based software, to work with CCS compiler and PIC. There is visual state (IAR systems), but hard (maybe impossible) to be modified for CCS.
So seems this is for now only solution for some UML based work, but with no automatic code generation, just fingers and keyboard. Sadness but we must wait for some better times, or change controller and tools. |
|
|
kender
Joined: 09 Aug 2004 Posts: 768 Location: Silicon Valley
|
|
Posted: Thu Feb 08, 2007 2:24 am |
|
|
Things should get better, after CCS debugs v4, and it will actually support function pointers.
Automatic code generation (ACG) is not a bad idea. For example, MS Visio Technical has UML stencils with all necessary fields. Visio is relatively cheap, compared to IAR suites. Visio supports Visual Basic for Applications (VBA). May be, ACG can be coded in VBA for Visio. |
|
|
zilot
Joined: 21 Nov 2006 Posts: 16
|
|
Posted: Thu Feb 08, 2007 5:15 am |
|
|
My first idea was to realise State Machine as structure, actually to define State Machine type, and to define States as type too. But was disapointed when realised that CCS doesnt support pointers to function. I wanted to encapsulate handler function into State, etc.... to be more generic, and to make easy for many State Machines definition in one project.
Dont like VB, just C, so this will be only way for now to deal with states. |
|
|
treitmey
Joined: 23 Jan 2004 Posts: 1094 Location: Appleton,WI USA
|
|
|
jma_1
Joined: 08 Feb 2005 Posts: 147 Location: Wisconsin
|
|
Posted: Thu Feb 08, 2007 1:04 pm |
|
|
Howdy,
If you like state machines, check out the compiler support for the Rabbit line of microprocessors. Search for 'costate' or 'cofunction'. It's interesting to view competitive products with built in multi-tasking support and features. I've never tried the CCS rtos, but the uC rtos available from Rabbit has been around for quite some time.
Cheers,
JMA |
|
|
jma_1
Joined: 08 Feb 2005 Posts: 147 Location: Wisconsin
|
|
Posted: Thu Feb 08, 2007 1:13 pm |
|
|
Greetings,
If you like UML (including 2.0) there are half a dozen free software tools which generate UML. The Eclipse framework alone has at least a dozen plug-ins for UML. One or more of these plug-ins supports code generation (c/c++ and/or java). Some of the commericial plug-ins, like Rational Rose will even do reverse engineering.
I have not researched anything recently, put ArgoUml was a freely available, stand-alone, java application, which allowed diagrams and code generation.
Cheers,
JMA |
|
|
zilot
Joined: 21 Nov 2006 Posts: 16
|
|
Posted: Fri Feb 09, 2007 2:12 am |
|
|
Till today I've tried Matlab RTW code generator for State Machine, and some models from simulink, VisualState IAR product, and Rhapsody. None of producted c codes cant be easily modified for PIC CCS, when calculate time eventualy I'll spend in code modification, and time I'll spend for manualy code writting, I'm on the same.
Rhapsody is very powerfull tool, you have complete image of whats happening in system, Object diagrams, Statecharts, Colaboration diagrams, good visual simulator of events and states in one word complete embedded UML environment. But rather to use with powerfull microcontroler (processor) and compiler than with PIC and CCS. |
|
|
|
|
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot vote in polls in this forum
|
Powered by phpBB © 2001, 2005 phpBB Group
|