Good day.

I use simple macro to define custom function for debug message.
It seems like this:

#define DebugMessageFromProgMem(...) xprintf(__VA_ARGS__)

#define DEBUG_MESSAGE_FROM_PROG(message, args...) {\
                static char progmem_debug_message_local[] PROGMEM = message;\
                DebugMessageFromProgMem(progmem_debug_message_local, ##args);\
        }

Here, xprintf - is extendet printf, which get format from program memory.
Also xprintf can get argumets from program memory, if you specify %S
in format string.

So, it is simply to use:

DEBUG_MESSAGE_FROM_PROG("We are here\r\n");
DEBUG_MESSAGE_FROM_PROG("value = %d\r\n", myValue);

And it is cheap for RAM.

Further, I want to add trace and assert function.
Now I use such macro:

#define STRING_HELPER(arg) #arg
#define STRING_VALUE(arg) STRING_HELPER(arg)
#define DEBUG_TRACE_PROGMEM(messageLine) \
        {\
                static const char progmem_trace_file[] PROGMEM = __FILE__;\
                static const char progmem_trace_line[] PROGMEM = 
STRING_VALUE(__LINE__);\
                static const char progmem_trace_messasge[] PROGMEM = 
messageLine;\
                DEBUG_MESSAGE_FROM_PROG("Function %s\r\nin file %S:%S %S", \
                        __func__, \
                        progmem_trace_file, \
                        progmem_trace_line, \
                        progmem_trace_messasge);\
        }

In the same way I define DEBUG_ASSERT_PROGMEM macro.
It is OK, but I want to use many trace and assert functions, so there
is a question.
Is there way to place function name in program memory?
Maybe there are specific __FUNC_PROGMEM__ marco, or some compiler parameters,
which switch __func__ from charecter array to string literal?

Alexander Iljin

_______________________________________________
AVR-GCC-list mailing list
AVR-GCC-list@nongnu.org
https://lists.nongnu.org/mailman/listinfo/avr-gcc-list

Reply via email to