[TriEmbed] arrays of function addresses Re: optimized switch statements Re: Hacking a fake vintage radio (with Arduino + Pi 0)

Pete Soper pete at soper.us
Wed Jul 1 18:50:10 CDT 2020


Would this constitute "threaded execution"? I recall being told how 
Forth dispatches in a clever way at the end of each operation and the 
use of "NEXT" seems similar (to my vague memory of the description).

One other trick users of C and C++ should consider is function 
references in variables and parameters. Some time back I made a "simple 
pin change" library to give folks three more interrupts with the  
Atmega328, the one used with the Arduino Uno and Nano and others 
(warning: only tested with that chip). It uses an array of functions 
that resolve to either a dummy internal function or the user's desired 
interrupt handler. If anybody is interested the code is here: 
https://bitbucket.org/petesoper/simplepinchange

The C syntax for pointers to functions gets my vote for hardest to remember.

-Pete

On 7/1/20 7:18 PM, Jon Wolfe via TriEmbed wrote:
>
> In an interesting coincidence, the place where I recall seeing the use 
> of goto I described was also in a bytecode interpreter, for the “Pawn 
> Scripting language” (which is really cool by the way, I’ve got it to 
> run on 8 bit AVR, arm cortex-M and also transpiled to JavaScript using 
> emscripten, and run inside a browser. It is extremely fast for a 
> bytecode interpreter)
>
> Check out line 208:
>
> https://github.com/compuphase/pawn/blob/master/amx/amxexec_gcc.c
>
> That ‘NEXT’ macro is using a goto behind the scenes. Each block of 
> code in between that labels (ie the semantic ‘case statement’ 
> equivalents) ends with a NEXT macro, so it may actually be faster than 
> even a compiler optimized switch-case because there is no ‘loop’ logic 
> needed, to cycle back around to the ‘switch’. Its really just a 
> devilish jumping around inside that function.
>
> One could argue that ‘break’ and ‘continue’ statements used inside 
> loops are really just dressed up ‘gotos’ with specific jump 
> destinations. I’ve been writing code almost daily for close to 30 
> years, and much of that time doing C or C++, and I’d estimate the time 
> in between occasions where I used the goto keyword to be 2-5 years, so 
> in other words, pretty rare. One of those uses can be for “breaking’ 
> out of a nested loop. Java has a “break <label>” statement that you 
> can use to break out of an outer loop from within an inner loop. 
> Standard C/C++ doesn’t have anything like that so you have to either 
> use a flag, restructure your loops, or use a goto statement. I think 
> it’s a matter of option,  on a case by case basis which technique will 
> lead to cleaner, easier to follow code in any particular situation.
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.triembed.org/pipermail/triembed_triembed.org/attachments/20200701/54ee069f/attachment.html>


More information about the TriEmbed mailing list