|
From: | E. Weddington |
Subject: | Re: [avr-libc-dev] Can pgmspace.h __LPM_xxx__ macros become inline fn's? |
Date: | Thu, 30 Sep 2004 15:15:13 -0600 |
User-agent: | Mozilla Thunderbird 0.7.3 (Windows/20040803) |
Theodore A. Roth wrote:
On Thu, 30 Sep 2004, Bill Somerville wrote:Is there any reason why the LPM macros in avr/pgmspace.h cannot be reimplemented as inline functions? E.g.: __inline__ uint8_t __LPM_classic__( uint16_t addr ) { uint8_t result; __asm__ ( "lpm" "\n\t" "mov %0, r0" "\n\t" : "=r" (result) : "z" (addr) : "r0" ); return result; } This avoids warnings in C with -pedantic compiler switch, makes the code leagal in C++ (it is an error with -pedantic switch in C++).Those seem like pretty good reasons for switching to inline functions to me. If no one comes up with a strong reason against this, I have no major objections. My only (very weak) objection is that I've found that gdb can not step over an inlined function. That makes debugging a bit of a pain some times. Although, other advantages are type checking and the ability to step through an inline function in the debugger when you need to see what it is doing. One nit: should the function definition be "static __inline__ ..." instead of just "__inline__ ..."?
Hmm.All of the pgm_* API is implemented as #defines that eventually boil down to the __*LPM* style identifiers. Wouldn't declaring them as static make them non-visible outside of avr/pgmspace.h? I don't think this is desirable.
I'd also be careful about making this into inline functions, as GCC *sometimes* inlines them, and sometimes doesn't. And you might very well find the pgm_read* routines in bootloaders where you do *not* want to have subroutines called. I would investigate using __attribute__ ((always_inline)) on the functions. See the discussion of this attribute in the GCC manual here:
<http://gcc.gnu.org/onlinedocs/gcc-3.4.2/gcc/Function-Attributes.html#Function-Attributes>If the always_inline attribute is used, then it preserves the same functionality as what happens with the preprocessor macro.
However, I don't know if using function attributes will still invoke the -pedantic problem.
Eric
[Prev in Thread] | Current Thread | [Next in Thread] |