From: Berwyn H. <be...@br...> - 2008-02-12 06:35:23
|
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> </head> <body bgcolor="#ffffff" text="#000000"> Hi. The SDCC manual lists a number of pitfalls for a programmer of interrupt service routines. To avoid these, I suspect some new compiler features could help us out quite a bit. Here are some ideas for discussion.<br> <br> 1. Atomic access (see 3.8.1.2). It sure would be nice if the <i>critical</i> keyword worked on variable declarations. It would make access to the variable atomic. For example, a typical timer interrupt would run a long msec counter, and main() would check it to see if >1000 ms had been added. Since you can't access a long atomically, right now you'd have to do critical { if (msec>end) second(); }. That would at least prevent false triggers due to partial addition overflow. (BTW: it would be even worse than this because you probably don't want to run second() in a critical section.) But if the compiler knew you wanted access to that variable to be atomic, it could easily do critical { msec>end } for you.<br> <br> 2. A huge, fool-proof enhancement on this would be to make the linker warning if a variable was not declared as critical but it is >8 bits or in xram and if it is accessed both in and out of an interrupt routine. This would require that the compiler keep track of what functions interrupt routines call (and, I guess, some sort of "used by interrupt" flag for each function in the object file). BTW: it would be nice if the compiler could add the modifier keywords automatically, but if the project is multi-file, it won't know until after link.<br> <br> I know that keeping track of which functions are called by interrupts is quite significant to-do, but it would make using interrupt routines non-dangerous. There is a precedent for this: the Keil compiler warns about functions called inside and out of interrupt routines.<br> <br> 3. It is also very tricky for the programmer to remember to use the #pragma nooverlay modifier on all functions called by interrupt routines, and tricky to remember to use the <i>reentrant</i> keyword on functions called both in and out of interrupt routines. If the compiler/linker keeps track of which functions call which functions per the enhancement above, then it could also warn if nooverlay or reentrant modifiers are required.<br> <br> Any discussion on these ideas? Point 1, at least, could be done relatively easily, I suspect. Just seems like the kind of bug that easily happens and could be prevented automatically.<br> <br> - Berwyn<br> <br> <div class="moz-signature">-- <br> <meta http-equiv="CONTENT-TYPE" content="text/html; "> <title>--</title> <meta name="GENERATOR" content="OpenOffice.org 2.1 (Win32)"> <meta name="CREATED" content="20061130;17204690"> <meta name="CHANGEDBY" content="Berwyn Hoyt"> <meta name="CHANGED" content="20070111;12363553"> <style> <!-- P.msonormal { margin-bottom: 0cm } A:link { color: #0000ff } A:visited { color: #800080 } --> </style> <p><b><i>Berwyn Hoyt,</i></b> <i>Senior Hardware Engineer:</i> <a href="mailto:be...@br...">be...@br...</a><br> <b><i>Ph: </i></b>+64 3 359 2101; <b><i>Mobile:</i></b> +64 21 045 7830<br> <b><i>Brush Technology: </i></b><a href="http://www.brush.co.nz/">www.brush.co.nz</a><br> </p> </div> </body> </html> |