This discussion has been locked.
You can no longer post new replies to this discussion. If you have a question you can start a new discussion

#pragma ASM/ENDASM inside a #define (???)

Hello,

I'm having trouble using #pragma ASM/ENDASM inside a #define statement. This is what I want to do inside the #define:

- push ACC (assembly)
- push IE (assembly)
- EA = 0 (C)

This is the code I'm *trying* to use:

#define portENTER_CRITICAL() \ 
{ \ 
#pragma ASM \ 
push  ACC \ 
push  IE  \ 
#pragma ENDASM \ 
EA = 0; \ 
}

But I always get an error, no matter what I change... also, it seems that #pragma ASM/ENDASM can't be used inside header files (who knows why...), is there any workaround for that, without repeating the same #defines inside all .c files that uses it?

Best regards,
Carlos.

PS: any one answering this thread, nevermind the "that's a bad practice! use separate asm and c source files! blah blah!..." comments... I really need this, so don't bother with those kind of comments...

Parents Reply Children
  • Hello :)

    Yep, I took Cygnal port as a base... The problem is the compiler... I'm using Keil and they use SDCC. SDCC suports assembly in #define statements, but doesn't support 51MX family, I think only keil cx51 supports 51MX...

    I already "expanded" all #defines with the code that was supposed to be inside them (basically I've made the pre-processor work by hand :), but now I have linker errors saying that it can't find some libraries (I think it has to do with floating point operations)...

    Regards and thanks for the replies :)
    Carlos.

  • "(I think it has to do with floating point operations)"

    Why would an RTOS be doing floating-point operations...?!

  • Hi,

    It's only on the demo software, to test the RTOS. The logic behind that is the greater probability of a task being interrupted by a context switch between a float operation (sum, multiplication, etc...) than with a single byte operation...

    regards,
    Carlos.

  • ANSI C does not allow preprocessor directives to be generated by #define.

    There's one ugly way to do this just with the C preprocessor:

    header.h
    --
    ...
    #include "mypragma.pragma"
    ...

    mypragma.pragma
    --
    #pragma mypragma
    --

    But I can't really recommend it.