Препроцессор компиляции аномалий при использовании "побитового и"

У меня есть следующий программный код в заголовочном файле для целей отладки. Я намерен во время компиляции решить, какие сообщения выводить на консольный порт или не печатать вообще, если программа не скомпилирована в режиме отладки.

#define ALL 0xffffffff    
#define ENABLED  (ERROR | WARNING | INFO)    //Enabled error messages which needs to be printed out.

//Error msg types
#define ERROR         0x1ul
#define WARNING       0x2ul
#define INFO          0x4ul
#define DBG           0x10ul
#define ENTER         0x20ul

#define STORAGE            0x40ul
#define BOND_MANAGER       0x80ul
#define ANCS_EVENT         0x100ul
#define NOTIF_EVENT        0x200ul
#define BLE_EVENT          0x400ul
#define ANCS_APP           0x800ul
#define BLE                0x1000ul
#define PERIPHERALS        0x2000ul
#define PWM                0x4000ul
#define LEDS               0x8000ul

#define DebugMsgStr(a,b) do { \
        if (a & ENABLED) \
            simple_uart_putstring(b); \     //print to console port
    }while(0)

#define DebugMsg(a,...) do { \
        if (a & ENABLED) {\
            uint8_t data[100];          \
            snprintf(data,100,"%x - %x - %x",a,ENABLED,a&ENABLED);  \  //These two lines only used for debugging the debug_printf
            simple_uart_putstring(data); \                             //These two lines only used for debugging the debug_printf
            snprintf(data,100,__VA_ARGS__);  \
            simple_uart_putstring(data); }\     //print to console port
    }while(0)

Я печатаю сообщения в коде как:

DebugMsg(ERROR| BLE ,"[ERROR-BLE]This should be seen",..);
DebugMsg(DBG | BLE ,"[DBG-BLE]This should not been logged",..);

Последнее сообщение должно регистрироваться, только если включена отладка уровня DBG или модуля BLE. Несмотря на то, что уровень DBG в настоящее время не включен, я вижу следующие журналы:

8010 - 7 - 8000[LEDS-DBG] effect_counter:2
1010 - 7 - 10[BLE-DBG] Timer Tick: 0x0000745d

так

0x8010 & 0x7 == 0x8000.    
0x1010 & 0x7 == 0x10

Как это могло произойти? Я использую arm-gcc для компиляции в сканер cortex-m0 nrf51822 Nordic. Также есть снисходительный фрагмент, но ничего особенного не видел, только если (a&ENABLED) вообще не компилируется.

DebugMsg(DBG | BLE,"[BLE-DBG] Timer Tick: 0x%08x\r\n",currentTime);

R7 --> this probably contains a pointer to currentTime variable

0001587a:   adds r1, r7, #0           -->r1 = r7
0001587c:   adds r1, #12               -->r1 = r1+12

0001587e:   ldr r2, [pc, #248]      ; (0x15978 <ble_ancs_c_connection_moretriage_timer+272>)
00015880:   ldr r3, [pc, #248]      ; (0x1597c <ble_ancs_c_connection_moretriage_timer+276>)

00015882:   movs r0, #7                --> r0 -ba 0x7
00015884:   str r0, [sp, #0]           --> save to stack 

00015886:   movs r0, #16               -->r0 ->ba 0x10
00015888:   str r0, [sp, #4]           --> save to stack

0001588a:   adds r0, r1, #0            --> r0 = r1
0001588c:   movs r1, #100   ; 0x64     --> r1 = 100

0001588e:   bl 0x22c74 <snprintf>
00015892:   adds r3, r7, #0
00015894:   adds r3, #12
00015896:   adds r0, r3, #0
00015898:   bl 0x21a08 <simple_uart_putstring>
0001589c:   ldr r3, [r7, #112]      ; 0x70
0001589e:   adds r1, r7, #0
000158a0:   adds r1, #12
000158a2:   ldr r2, [pc, #220]      ; (0x15980 <ble_ancs_c_connection_moretriage_timer+280>)
000158a4:   adds r0, r1, #0
000158a6:   movs r1, #100   ; 0x64
000158a8:   bl 0x22c74 <snprintf>
000158ac:   adds r3, r7, #0
000158ae:   adds r3, #12
000158b0:   adds r0, r3, #0
000158b2:   bl 0x21a08 <simple_uart_putstring>

Заранее спасибо.

1 ответ

Решение

DebugMsg(DBG | BLE ,"[ERROR-BLE]This should be seen",..) расширяется как

if (DBG | BLE & ENABLED) ...

который становится

if (0x10ul | 0x1000ul & 0x07)

но & имеет более высокий приоритет, чем | так что это анализируется как

if (0x10 | (0x1000 & 0x07))

что всегда верно.

Вы должны изменить марку на

#define DebugMsgStr(a,b) do { \
    if ((a) & ENABLED) \
Другие вопросы по тегам