EmbeddedRelated.com
Forums

8051 and a C switch statement

Started by Martin Griffith December 28, 2007
On Sun, 30 Dec 2007 19:18:32 +0200, in comp.arch.embedded Anton
Erasmus <nobody@spam.prevent.net> wrote:

>On Fri, 28 Dec 2007 23:39:04 +0100, Martin Griffith ><mart_in_medina@ya___.es> wrote: > >>Got a 4k8 serial biphase signal being decoded by a at85c52 with an >>external non retrig monostable (hc221), and I'm running out of time >>occasionally waiting for the generic 2*8 LCD to clear it's busy flag. >>The LCD is fed with the info from the incoming biphase >> >>To reduce the "reaction time" I could use a long switch statement on >>the signal's clock interrupt bitcount from the sync word, 80 per >>frame, do just a little bit each interrupt. >> >>The real question is >> >>" how big can I make the switch statement?" >>Whats the limit? >>I'm using the rasionance C compiler. > >There can be another problem, depending on your compiler. >The older IAR C51 Compilers generated thread unsafe code for >a switch statement for more than about 3 items, hence if one used >big switch statements inside an interrupt routine and outside, the >code crashed. This was for IAR C51 V4 and V5. I do not know whether >this has been fixed, or if an option had been added to force the >compiler to generate thread safe code. > >You can always split a big switch statement into multiple smaller >ones. This is a bit slower than one big one. > >i.e. > switch (var) /* Check bottom bits */ > { > case 0: > break; > > > case maxsize: > break; > default: > switch(var) > { > case maxsize+1: > break; > } > > > } > > >Regards > Anton Erasmus
Ah, there was I happily writing a 16 case switch. Generally speaking, should you keep code in a case statement short? I was thinking that it should be like a interrupt, short and sweet case 7: { temp=temp<<1; temp=temp&0xff; *LCDdata=temp+47; break; } sort of thing Sorry if the question seems a bit 101ish, but they didn't have computers for humans when I was a lad. martin
On Sun, 30 Dec 2007 18:45:20 +0100, Martin Griffith
<mart_in_medina@ya___.es> wrote:

>On Sun, 30 Dec 2007 19:18:32 +0200, in comp.arch.embedded Anton >Erasmus <nobody@spam.prevent.net> wrote: > >>On Fri, 28 Dec 2007 23:39:04 +0100, Martin Griffith >><mart_in_medina@ya___.es> wrote: >> >>>Got a 4k8 serial biphase signal being decoded by a at85c52 with an >>>external non retrig monostable (hc221), and I'm running out of time >>>occasionally waiting for the generic 2*8 LCD to clear it's busy flag. >>>The LCD is fed with the info from the incoming biphase >>> >>>To reduce the "reaction time" I could use a long switch statement on >>>the signal's clock interrupt bitcount from the sync word, 80 per >>>frame, do just a little bit each interrupt. >>> >>>The real question is >>> >>>" how big can I make the switch statement?" >>>Whats the limit? >>>I'm using the rasionance C compiler. >> >>There can be another problem, depending on your compiler. >>The older IAR C51 Compilers generated thread unsafe code for >>a switch statement for more than about 3 items, hence if one used >>big switch statements inside an interrupt routine and outside, the >>code crashed. This was for IAR C51 V4 and V5. I do not know whether >>this has been fixed, or if an option had been added to force the >>compiler to generate thread safe code. >> >>You can always split a big switch statement into multiple smaller >>ones. This is a bit slower than one big one. >> >>i.e. >> switch (var) /* Check bottom bits */ >> { >> case 0: >> break; >> >> >> case maxsize: >> break; >> default: >> switch(var) >> { >> case maxsize+1: >> break; >> } >> >> >> } >> >> >>Regards >> Anton Erasmus >Ah, there was I happily writing a 16 case switch. > >Generally speaking, should you keep code in a case statement short?
If it is in an interrupt routine, then it normally should be short, not because it is in a switch statement, but because it is executed in an interrupt routine. I personally keep the segments in a switch statement reasonably short. I find that the code becomes difficult to maintain if one has huge sections in each case statement, especially if it is a switch statement with many cases. Also the switch statement is normally for decision making, while the contents of the case blocks are for controlling/action. I find it good practice to split these concepts. [snipped] Regards Anton Erasmus