mbradley
Joined: 11 Jul 2009 Posts: 118 Location: California, USA
|
BlockSlice - Slice manager (aka state machine) |
Posted: Sun Jun 14, 2015 3:21 pm |
|
|
Hello everyone,
I have posted in a little while, but I wanted to share a recent lib I created.
Its a way to have only a part of your function execute every time your function is called. The parts (slices) in your function will execute in order.
For me, I had some background math that needed to be done, that was rather long. I noticed I had a bunch of free time while doing output pulses, and input captures, so I decided I would execute parts of the code in these areas, and it started to look really ugly.
So now, when ever I know I have free cycles, I make a call to my function, and I know it won't hang up because only a portion of it runs at a time.
Here is the code, I hope you enjoy it.
--mike
blockslice.h
Code: |
/*
Example usage:
#include "blockslice.h"
#define LED_GREEN PIN_B5
#define LED_YELLOW PIN_B4
#define LED_RED PIN_B3
mDefineBlockSlice(2); // number of block slices to define
void procStatus(void)
{
mBlockSliceStart(0); // this is used to track which state machine
mBlockSlice() { output_high(LED_YELLOW); }
mBlockSlice() { output_low(LED_YELLOW); }
mBlockSliceEnd();
}
void procLights(void)
{
mBlockSliceStart(1); // this is used to track which state machine
mBlockSlice() { output_high(LED_GREEN); }
mBlockSlice() { output_low(LED_GREEN); }
mBlockSlice() { output_high(LED_RED); }
mBlockSlice() { output_low(LED_RED); }
mBlockSliceEnd();
}
void main()
{
output_high(LED_GREEN);
// initialize the state machines
mBlockSliceIni(0);
mBlockSliceIni(1);
while(TRUE)
{
procStatus();
procLights();
delay_ms(500);
}
}
*/
// yes, I know there is no ';' at the end of this line, its on purpose, see translate below
#define mDefineBlockSlice(cnt) unsigned int8 __bsActive = 0; unsigned int8 __bsNdx[cnt], __bsState[cnt]
/*
mDefineBlockSlice(1);
translates to:
unsigned int8 __bsActive = 0; unsigned int8 __bsNdx[1], __bsState[1];
*/
#define mBlockSliceIni(ndx) __bsState[ndx] = 0;
#define mBlockSliceStart(ndx) __bsActive = ndx; __bsNdx[ndx] = 255;
/*
mBlockSliceStart(0);
translates to:
__bsActive = 0; __bsNdx[0] = 255;
*/
#define mBlockSlice() __bsNdx[__bsActive]++; if ( __bsState[__bsActive] == __bsNdx[__bsActive] )
/*
mBlockSlice()
{
output_high(LED_ERR);
delay_ms(500);
}
translates to:
__bsNdx[__bsActive]++; if ( __bsState[__bsActive] == __bsNdx[__bsActive]) )
{
output_high(LED_ERR);
delay_ms(500);
}
*/
#define mBlockSliceEnd() __bsState[__bsActive]++; if ( __bsState[__bsActive] > __bsNdx[__bsActive] ) { __bsState[__bsActive] = 0; }
/*
mBlockSliceEnd();
translates to:
__bsState[__bsActive]++; if ( __bsState[__bsActive] > __bsNdx[__bsActive] ) { __bsState[__bsActive] = 0; }
*/
|
_________________ Michael Bradley
www.mculabs.com
Open Drivers and Projects |
|