'Is this a possible compiler error in the avr-gcc 11.1.0 (from Zak Kemble)?

This is kind of a complex problem, that I'm unsure of it's cause.

So bare with me because, my English(writing) is rusty, and my Technial Language(terminology) is not so good either.

Dev: Atmega1284P Compiler: AVR-GCC 11.1.0 from Zak's Electronics Blog

All the libraries that I'm using are written by me. They all work as expected, that includes my UART and it's "sister" UART Debugger. Here's a part of it to better understand the other code segments:

void USART0_TX_Flash_String(const unsigned char* text)
{
    while(pgm_read_byte(text)>0)
    {
        USART0_TXD(pgm_read_byte(text++));
    }
}

#define DEBUGGER_UART_TXFS(string)          USART0_TX_Flash_String(string)

void Print_Value_General(unsigned char* string, unsigned int value, unsigned char mode)
{
    unsigned char StringA[8] = {};
    DEBUGGER_UART_TX_String(string);
    DEBUGGER_UART_TXD(tab_txt);
    Convert_Value(value, mode, StringA);        // basicly itoa()
    DEBUGGER_UART_TX_String(StringA);
    DEBUGGER_UART_TX_String(enter_txt);
}

#define Print_Value_DEC(string, value)      Print_Value_General(string, value, 10)

This next segment is just a fraction of the ESP8266 library, namely the variables:

// ESP8266 Messages
const unsigned char flash_str_msg_report_wait_for_data[] PROGMEM = ">";

//  Basic AT Commands
const unsigned char flash_str_at[] PROGMEM = "AT";

// Software Access Point Settings
// TCP/IP AT Commands
const unsigned char flash_str_cipclose[] PROGMEM = "CIPCLOSE";
const unsigned char flash_str_cifsr[] PROGMEM = "CIFSR";
const unsigned char flash_str_cipdns[] PROGMEM = "CIPDNS";


typedef struct td_esp8266_cmd_ptr
{
    unsigned char* cmd_ptr;
    void(*fp)(unsigned char array[]);
}td_esp8266_cmd_ptr;

void UnDefinedEmptyFoo(unsigned char string[])
{
    DEBUGGER_UART_TX_String("void UnDefinedEmptyFoo(void) is Callled\r\n");
}


td_esp8266_cmd_ptr esp8266_cmd_ptr[6] = {
    {
        flash_str_msg_report_wait_for_data,     //  [] PROGMEM = ">";
        UnDefinedEmptyFoo,
    },
    {   
        flash_str_at,                           //  [] PROGMEM = "AT";
        UnDefinedEmptyFoo,
    },
    {
        flash_str_msg_report_busy,              //  [] PROGMEM = "busy p...";
        UnDefinedEmptyFoo,
    },
    {
        flash_str_cifsr,                        //  [] PROGMEM = "CIFSR";
        UnDefinedEmptyFoo,
    },
    {
        flash_str_cipclose,                     //  [] PROGMEM = "CIPCLOSE";
        UnDefinedEmptyFoo,
    },
    {
        flash_str_cipdns,                       //  [] PROGMEM = "CIPDNS";
        UnDefinedEmptyFoo,
    }
};
const td_esp8266_cmd_ptr esp8266_cmd_flash_ptr[6] PROGMEM = {
    {
        flash_str_msg_report_wait_for_data,     //  [] PROGMEM = ">";
        UnDefinedEmptyFoo,
    },
    {   
        flash_str_at,                           //  [] PROGMEM = "AT";
        UnDefinedEmptyFoo,
    },
    {
        flash_str_msg_report_busy,              //  [] PROGMEM = "busy p...";
        UnDefinedEmptyFoo,
    },
    {
        flash_str_cifsr,                        //  [] PROGMEM = "CIFSR";
        UnDefinedEmptyFoo,
    },
    {
        flash_str_cipclose,                     //  [] PROGMEM = "CIPCLOSE";
        UnDefinedEmptyFoo,
    },
    {
        flash_str_cipdns,                       //  [] PROGMEM = "CIPDNS";
        UnDefinedEmptyFoo,
    }
};

Here you can see two almost identical arrays of structure, or structure of arrays? To bee clear, I'm referencing:

td_esp8266_cmd_ptr esp8266_cmd_ptr[6] = {};
const td_esp8266_cmd_ptr esp8266_cmd_flash_ptr[6] PROGMEM = {};

The first one is stored in RAM, and the second one in Flash. The problem is with the second one.

This is the example code, to see where the problem starts:

void MXA_Test(void)
{
    DEBUGGER_UART_TX_String("void MXA_Test(void) Start");
    DEBUGGER_UART_TX_String(enter_txt);
    DEBUGGER_UART_TX_String("For Loop Start for(u8b i = 0; i < 6; i++)");
    DEBUGGER_UART_TX_String(enter_txt);
    for(u8b i = 0; i < 6; i++)
    {
        Print_Value_DEC("esp8266_cmd_ptr[i].cmd_ptr:    ", i);
        DEBUGGER_UART_TXFS(esp8266_cmd_ptr[i].cmd_ptr);
        DEBUGGER_UART_TX_String(enter_txt); 
    }
    DEBUGGER_UART_TX_String("For Loop End");
    DEBUGGER_UART_TX_String(enter_txt);
    
    u8b var_name_str_start[] = {"\r\nesp8266_cmd_flash_ptr["};
    u8b var_name_str_end[] = {"]:   "};
    
    DEBUGGER_UART_TX_String("Usig esp8266_cmd_flash_ptr (stored in FLASH):");
    DEBUGGER_UART_TX_String(enter_txt);
    DEBUGGER_UART_TX_String("Geting Var directly:   esp8266_cmd_flash_ptr[0].cmd_ptr");
    DEBUGGER_UART_TX_String(enter_txt);
    
    DEBUGGER_UART_TX_String(var_name_str_start);
    DEBUGGER_UART_TXD(0x30);
    DEBUGGER_UART_TX_String(var_name_str_end);
    DEBUGGER_UART_TXFS(esp8266_cmd_flash_ptr[0].cmd_ptr);
    
    DEBUGGER_UART_TX_String(var_name_str_start);
    DEBUGGER_UART_TXD(0x31);
    DEBUGGER_UART_TX_String(var_name_str_end);
    DEBUGGER_UART_TXFS(esp8266_cmd_flash_ptr[1].cmd_ptr);
    
    DEBUGGER_UART_TX_String(var_name_str_start);
    DEBUGGER_UART_TXD(0x32);
    DEBUGGER_UART_TX_String(var_name_str_end);
    DEBUGGER_UART_TXFS(esp8266_cmd_flash_ptr[2].cmd_ptr);
    
    DEBUGGER_UART_TX_String(var_name_str_start);
    DEBUGGER_UART_TXD(0x33);
    DEBUGGER_UART_TX_String(var_name_str_end);
    DEBUGGER_UART_TXFS(esp8266_cmd_flash_ptr[3].cmd_ptr);

    DEBUGGER_UART_TX_String(var_name_str_start);
    DEBUGGER_UART_TXD(0x34);
    DEBUGGER_UART_TX_String(var_name_str_end);
    DEBUGGER_UART_TXFS(esp8266_cmd_flash_ptr[4].cmd_ptr);
    
    DEBUGGER_UART_TX_String(var_name_str_start);
    DEBUGGER_UART_TXD(0x35);
    DEBUGGER_UART_TX_String(var_name_str_end);
    DEBUGGER_UART_TXFS(esp8266_cmd_flash_ptr[5].cmd_ptr);
    
    DEBUGGER_UART_TX_String(enter_txt);
    DEBUGGER_UART_TX_String("Geting Var INdirectly: esp8266_cmd_flash_ptr[i].cmd_ptr");
    DEBUGGER_UART_TX_String(enter_txt);
    u8b i = 0;
    DEBUGGER_UART_TX_String(var_name_str_start);
    DEBUGGER_UART_TXD(i+0x30);
    DEBUGGER_UART_TX_String(var_name_str_end);
    DEBUGGER_UART_TXFS(esp8266_cmd_flash_ptr[i].cmd_ptr);
    i++;
    DEBUGGER_UART_TX_String(var_name_str_start);
    DEBUGGER_UART_TXD(i+0x30);
    DEBUGGER_UART_TX_String(var_name_str_end);
    DEBUGGER_UART_TXFS(esp8266_cmd_flash_ptr[i].cmd_ptr);
    i++;
    DEBUGGER_UART_TX_String(var_name_str_start);
    DEBUGGER_UART_TXD(i+0x30);
    DEBUGGER_UART_TX_String(var_name_str_end);
    DEBUGGER_UART_TXFS(esp8266_cmd_flash_ptr[i].cmd_ptr);
    i++;
    DEBUGGER_UART_TX_String(var_name_str_start);
    DEBUGGER_UART_TXD(i+0x30);
    DEBUGGER_UART_TX_String(var_name_str_end);
    DEBUGGER_UART_TXFS(esp8266_cmd_flash_ptr[i].cmd_ptr);
    i++;
    DEBUGGER_UART_TX_String(var_name_str_start);
    DEBUGGER_UART_TXD(i+0x30);
    DEBUGGER_UART_TX_String(var_name_str_end);
    DEBUGGER_UART_TXFS(esp8266_cmd_flash_ptr[i].cmd_ptr);
    i++;
    DEBUGGER_UART_TX_String(var_name_str_start);
    DEBUGGER_UART_TXD(i+0x30);
    DEBUGGER_UART_TX_String(var_name_str_end);
    DEBUGGER_UART_TXFS(esp8266_cmd_flash_ptr[i].cmd_ptr);
    i++;
    
    DEBUGGER_UART_TX_String(enter_txt);
    DEBUGGER_UART_TX_String("For Loop Start for(u8b i = 0; i < 3; i++)");
    DEBUGGER_UART_TX_String(enter_txt);
    for(i = 0; i < 3; i++)
    {
        Print_Value_DEC("esp8266_cmd_flash_ptr[i].cmd_ptr:  ", i);
        DEBUGGER_UART_TXFS(esp8266_cmd_flash_ptr[i].cmd_ptr);
        DEBUGGER_UART_TX_String(enter_txt); 
    }
    DEBUGGER_UART_TX_String("For Loop End");
    DEBUGGER_UART_TX_String(enter_txt);
    
    DEBUGGER_UART_TX_String("For Loop Start for(u8b i = 0; i < 6; i++)");
    DEBUGGER_UART_TX_String(enter_txt);
    for(i = 0; i < 6; i++)
    {
        Print_Value_DEC("esp8266_cmd_flash_ptr[i].cmd_ptr:  ", i);
        DEBUGGER_UART_TXFS(esp8266_cmd_flash_ptr[i].cmd_ptr);
        DEBUGGER_UART_TX_String(enter_txt); 
    }
    DEBUGGER_UART_TX_String("For Loop End");
    DEBUGGER_UART_TX_String(enter_txt);
    
    DEBUGGER_UART_TX_String("do while Loop End");
    DEBUGGER_UART_TX_String(enter_txt);
    
    i = 0;
    DEBUGGER_UART_TX_String("Loop Start while(i < 3)");
    DEBUGGER_UART_TX_String(enter_txt);
    while(i < 3)
    {
        Print_Value_DEC("esp8266_cmd_flash_ptr[i].cmd_ptr:  ", i);
        DEBUGGER_UART_TXFS(esp8266_cmd_flash_ptr[i].cmd_ptr);
        DEBUGGER_UART_TX_String(enter_txt); 
        i++;
    }
    DEBUGGER_UART_TX_String("while Loop End");
    DEBUGGER_UART_TX_String(enter_txt);
    
    DEBUGGER_UART_TX_String("void MXA_Test(void) End");
    DEBUGGER_UART_TX_String(enter_txt);
}

This is it's Output via UART:

void MXA_Test(void) Start
For Loop Start for(u8b i = 0; i < 6; i++)
esp8266_cmd_ptr[i].cmd_ptr:     00
>
esp8266_cmd_ptr[i].cmd_ptr:     01
AT
esp8266_cmd_ptr[i].cmd_ptr:     02
busy p...
esp8266_cmd_ptr[i].cmd_ptr:     03
CIFSR
esp8266_cmd_ptr[i].cmd_ptr:     04
CIPCLOSE
esp8266_cmd_ptr[i].cmd_ptr:     05
CIPDNS
For Loop End
Usig esp8266_cmd_flash_ptr (stored in FLASH):
Geting Var directly:    esp8266_cmd_flash_ptr[0].cmd_ptr

esp8266_cmd_flash_ptr[0]:   >
esp8266_cmd_flash_ptr[1]:   AT
esp8266_cmd_flash_ptr[2]:   busy p...
esp8266_cmd_flash_ptr[3]:   CIFSR
esp8266_cmd_flash_ptr[4]:   CIPCLOSE
esp8266_cmd_flash_ptr[5]:   CIPDNS
Geting Var INdirectly:  esp8266_cmd_flash_ptr[i].cmd_ptr

esp8266_cmd_flash_ptr[0]:   >
esp8266_cmd_flash_ptr[1]:   AT
esp8266_cmd_flash_ptr[2]:   busy p...
esp8266_cmd_flash_ptr[3]:   CIFSR
esp8266_cmd_flash_ptr[4]:   CIPCLOSE
esp8266_cmd_flash_ptr[5]:   CIPDNS
For Loop Start for(u8b i = 0; i < 3; i++)
esp8266_cmd_flash_ptr[i].cmd_ptr:       00
K?\?m?~???????&? ?1?B?S?d?u??????^???
???
...
esp8266_cmd_flash_ptr[i].cmd_ptr:       01
??
...
esp8266_cmd_flash_ptr[i].cmd_ptr:       02
??
...
For Loop End
For Loop Start for(u8b i = 0; i < 6; i++)
esp8266_cmd_flash_ptr[i].cmd_ptr:       00
K?\?m?~???????&? ?1?B?S?d?u??????^???
???
...
esp8266_cmd_flash_ptr[i].cmd_ptr:       01
??
...
esp8266_cmd_flash_ptr[i].cmd_ptr:       02
??
...
esp8266_cmd_flash_ptr[i].cmd_ptr:       03
??
...
esp8266_cmd_flash_ptr[i].cmd_ptr:       04
K?\?m?~???????&? ?1?B?S?d?u??????^???
???
...
esp8266_cmd_flash_ptr[i].cmd_ptr:       05
K?\?m?~???????&? ?1?B?S?d?u??????^???
...
For Loop End
Loop Start while(i < 3)
esp8266_cmd_flash_ptr[i].cmd_ptr:       00
K?\?m?~???????&? ?1?B?S?d?u??????^???
???
...
esp8266_cmd_flash_ptr[i].cmd_ptr:       01
??
...
\
esp8266_cmd_flash_ptr[i].cmd_ptr:       02
??
...
\
while Loop End
void MXA_Test(void) End

I've made it much shorter, so where ever you see ... that is equal to a ton of yunk data. So the problem only occurres when I'm tring to get a string with a pointer that is stored in Flash, like so:

 for(i = 0; i < 6; i++)
    {
        Print_Value_DEC("esp8266_cmd_flash_ptr[i].cmd_ptr:  ", i);
        DEBUGGER_UART_TXFS(esp8266_cmd_flash_ptr[i].cmd_ptr);
        DEBUGGER_UART_TX_String(enter_txt); 
    }

But all other approaches work fine. Here's my last and biggest code dump of the day, the .lss file:

0000a752 <MXA_Test>:

void MXA_Test(void)
{
    a752:   cf 92           push    r12
    a754:   df 92           push    r13
    a756:   ef 92           push    r14
    a758:   ff 92           push    r15
    a75a:   0f 93           push    r16
    a75c:   1f 93           push    r17
    a75e:   cf 93           push    r28
    a760:   df 93           push    r29
    a762:   cd b7           in  r28, 0x3d   ; 61
    a764:   de b7           in  r29, 0x3e   ; 62
    a766:   6d 97           sbiw    r28, 0x1d   ; 29
    a768:   0f b6           in  r0, 0x3f    ; 63
    a76a:   f8 94           cli
    a76c:   de bf           out 0x3e, r29   ; 62
    a76e:   0f be           out 0x3f, r0    ; 63
    a770:   cd bf           out 0x3d, r28   ; 61
    DEBUGGER_UART_TX_String("void MXA_Test(void) Start");
    a772:   81 e6           ldi r24, 0x61   ; 97
    a774:   95 e0           ldi r25, 0x05   ; 5
    a776:   0e 94 50 10     call    0x20a0  ; 0x20a0 <USART0_TX_String>
    DEBUGGER_UART_TX_String(enter_txt);
    a77a:   8f e9           ldi r24, 0x9F   ; 159
    a77c:   94 e1           ldi r25, 0x14   ; 20
    a77e:   0e 94 50 10     call    0x20a0  ; 0x20a0 <USART0_TX_String>
    DEBUGGER_UART_TX_String("For Loop Start for(u8b i = 0; i < 6; i++)");
    a782:   8b e7           ldi r24, 0x7B   ; 123
    a784:   95 e0           ldi r25, 0x05   ; 5
    a786:   0e 94 50 10     call    0x20a0  ; 0x20a0 <USART0_TX_String>
    DEBUGGER_UART_TX_String(enter_txt);
    a78a:   8f e9           ldi r24, 0x9F   ; 159
    a78c:   94 e1           ldi r25, 0x14   ; 20
    a78e:   0e 94 50 10     call    0x20a0  ; 0x20a0 <USART0_TX_String>
    for(u8b i = 0; i < 6; i++)
    a792:   30 e0           ldi r19, 0x00   ; 0
    a794:   e3 2e           mov r14, r19
    a796:   31 e0           ldi r19, 0x01   ; 1
    a798:   f3 2e           mov r15, r19
    DEBUGGER_UART_TX_String(enter_txt);
    a79a:   10 e0           ldi r17, 0x00   ; 0
    a79c:   00 e0           ldi r16, 0x00   ; 0
    {
        Print_Value_DEC("esp8266_cmd_ptr[i].cmd_ptr:    ", i);
    a79e:   4a e0           ldi r20, 0x0A   ; 10
    a7a0:   b8 01           movw    r22, r16
    a7a2:   86 eb           ldi r24, 0xB6   ; 182
    a7a4:   95 e0           ldi r25, 0x05   ; 5
    a7a6:   0e 94 64 14     call    0x28c8  ; 0x28c8 <Print_Value_General>
        DEBUGGER_UART_TXFS(esp8266_cmd_ptr[i].cmd_ptr);
    a7aa:   f7 01           movw    r30, r14
    a7ac:   80 81           ld  r24, Z
    a7ae:   91 81           ldd r25, Z+1    ; 0x01
    a7b0:   0e 94 78 10     call    0x20f0  ; 0x20f0 <USART0_TX_Flash_String>
        DEBUGGER_UART_TX_String(enter_txt); 
    a7b4:   8f e9           ldi r24, 0x9F   ; 159
    a7b6:   94 e1           ldi r25, 0x14   ; 20
    a7b8:   0e 94 50 10     call    0x20a0  ; 0x20a0 <USART0_TX_String>
    for(u8b i = 0; i < 6; i++)
    a7bc:   0f 5f           subi    r16, 0xFF   ; 255
    a7be:   1f 4f           sbci    r17, 0xFF   ; 255
    a7c0:   f4 e0           ldi r31, 0x04   ; 4
    a7c2:   ef 0e           add r14, r31
    a7c4:   f1 1c           adc r15, r1
    a7c6:   0a 32           cpi r16, 0x06   ; 6
    a7c8:   11 05           cpc r17, r1
    a7ca:   49 f7           brne    .-46        ; 0xa79e <MXA_Test+0x4c>
    }
    DEBUGGER_UART_TX_String("For Loop End");
    a7cc:   83 ed           ldi r24, 0xD3   ; 211
    a7ce:   95 e0           ldi r25, 0x05   ; 5
    a7d0:   0e 94 50 10     call    0x20a0  ; 0x20a0 <USART0_TX_String>
    DEBUGGER_UART_TX_String(enter_txt);
    a7d4:   8f e9           ldi r24, 0x9F   ; 159
    a7d6:   94 e1           ldi r25, 0x14   ; 20
    a7d8:   0e 94 50 10     call    0x20a0  ; 0x20a0 <USART0_TX_String>
    
    u8b var_name_str_start[] = {"\r\nesp8266_cmd_flash_ptr["};
    a7dc:   89 e1           ldi r24, 0x19   ; 25
    a7de:   e5 e5           ldi r30, 0x55   ; 85
    a7e0:   f7 e0           ldi r31, 0x07   ; 7
    a7e2:   de 01           movw    r26, r28
    a7e4:   11 96           adiw    r26, 0x01   ; 1
    a7e6:   01 90           ld  r0, Z+
    a7e8:   0d 92           st  X+, r0
    a7ea:   8a 95           dec r24
    a7ec:   e1 f7           brne    .-8         ; 0xa7e6 <MXA_Test+0x94>
    u8b var_name_str_end[] = {"]:   "};
    a7ee:   80 91 6e 07     lds r24, 0x076E ; 0x80076e <esp8266_cmd_ptr+0x66e>
    a7f2:   90 91 6f 07     lds r25, 0x076F ; 0x80076f <esp8266_cmd_ptr+0x66f>
    a7f6:   a0 91 70 07     lds r26, 0x0770 ; 0x800770 <esp8266_cmd_ptr+0x670>
    a7fa:   b0 91 71 07     lds r27, 0x0771 ; 0x800771 <esp8266_cmd_ptr+0x671>
    a7fe:   8a 8f           std Y+26, r24   ; 0x1a
    a800:   9b 8f           std Y+27, r25   ; 0x1b
    a802:   ac 8f           std Y+28, r26   ; 0x1c
    a804:   bd 8f           std Y+29, r27   ; 0x1d
    
    DEBUGGER_UART_TX_String("Usig esp8266_cmd_flash_ptr (stored in FLASH):");
    a806:   80 ee           ldi r24, 0xE0   ; 224
    a808:   95 e0           ldi r25, 0x05   ; 5
    a80a:   0e 94 50 10     call    0x20a0  ; 0x20a0 <USART0_TX_String>
    DEBUGGER_UART_TX_String(enter_txt);
    a80e:   8f e9           ldi r24, 0x9F   ; 159
    a810:   94 e1           ldi r25, 0x14   ; 20
    a812:   0e 94 50 10     call    0x20a0  ; 0x20a0 <USART0_TX_String>
    DEBUGGER_UART_TX_String("Geting Var directly:   esp8266_cmd_flash_ptr[0].cmd_ptr");
    a816:   8e e0           ldi r24, 0x0E   ; 14
    a818:   96 e0           ldi r25, 0x06   ; 6
    a81a:   0e 94 50 10     call    0x20a0  ; 0x20a0 <USART0_TX_String>
    DEBUGGER_UART_TX_String(enter_txt);
    a81e:   8f e9           ldi r24, 0x9F   ; 159
    a820:   94 e1           ldi r25, 0x14   ; 20
    a822:   0e 94 50 10     call    0x20a0  ; 0x20a0 <USART0_TX_String>
    

    DEBUGGER_UART_TX_String(var_name_str_start);
    a880:   ce 01           movw    r24, r28
    a882:   01 96           adiw    r24, 0x01   ; 1
    a884:   0e 94 50 10     call    0x20a0  ; 0x20a0 <USART0_TX_String>
    DEBUGGER_UART_TXD(0x33);
    a888:   83 e3           ldi r24, 0x33   ; 51
    a88a:   0e 94 2a 0f     call    0x1e54  ; 0x1e54 <USART0_TXD>
    DEBUGGER_UART_TX_String(var_name_str_end);
    a88e:   ce 01           movw    r24, r28
    a890:   4a 96           adiw    r24, 0x1a   ; 26
    a892:   0e 94 50 10     call    0x20a0  ; 0x20a0 <USART0_TX_String>
    DEBUGGER_UART_TXFS(esp8266_cmd_flash_ptr[3].cmd_ptr);
    a896:   81 e6           ldi r24, 0x61   ; 97
    a898:   91 e0           ldi r25, 0x01   ; 1
    a89a:   0e 94 78 10     call    0x20f0  ; 0x20f0 <USART0_TX_Flash_String>

    DEBUGGER_UART_TX_String(enter_txt);
    a8da:   8f e9           ldi r24, 0x9F   ; 159
    a8dc:   94 e1           ldi r25, 0x14   ; 20
    a8de:   0e 94 50 10     call    0x20a0  ; 0x20a0 <USART0_TX_String>
    DEBUGGER_UART_TX_String("Geting Var INdirectly: esp8266_cmd_flash_ptr[i].cmd_ptr");
    a8e2:   84 e4           ldi r24, 0x44   ; 68
    a8e4:   96 e0           ldi r25, 0x06   ; 6
    a8e6:   0e 94 50 10     call    0x20a0  ; 0x20a0 <USART0_TX_String>
    DEBUGGER_UART_TX_String(enter_txt);
    a8ea:   8f e9           ldi r24, 0x9F   ; 159
    a8ec:   94 e1           ldi r25, 0x14   ; 20
    a8ee:   0e 94 50 10     call    0x20a0  ; 0x20a0 <USART0_TX_String>
    u8b i = 0;
    DEBUGGER_UART_TX_String(var_name_str_start);
    a8f2:   ce 01           movw    r24, r28
    a8f4:   01 96           adiw    r24, 0x01   ; 1
    a8f6:   0e 94 50 10     call    0x20a0  ; 0x20a0 <USART0_TX_String>
    DEBUGGER_UART_TXD(i+0x30);
    a8fa:   80 e3           ldi r24, 0x30   ; 48
    a8fc:   0e 94 2a 0f     call    0x1e54  ; 0x1e54 <USART0_TXD>
    DEBUGGER_UART_TX_String(var_name_str_end);
    a900:   ce 01           movw    r24, r28
    a902:   4a 96           adiw    r24, 0x1a   ; 26
    a904:   0e 94 50 10     call    0x20a0  ; 0x20a0 <USART0_TX_String>
    DEBUGGER_UART_TXFS(esp8266_cmd_flash_ptr[i].cmd_ptr);
    a908:   8f e1           ldi r24, 0x1F   ; 31
    a90a:   92 e0           ldi r25, 0x02   ; 2
    a90c:   0e 94 78 10     call    0x20f0  ; 0x20f0 <USART0_TX_Flash_String>
    i++;

    DEBUGGER_UART_TX_String(enter_txt);
    a9a6:   8f e9           ldi r24, 0x9F   ; 159
    a9a8:   94 e1           ldi r25, 0x14   ; 20
    a9aa:   0e 94 50 10     call    0x20a0  ; 0x20a0 <USART0_TX_String>
    DEBUGGER_UART_TX_String("For Loop Start for(u8b i = 0; i < 3; i++)");
    a9ae:   8c e7           ldi r24, 0x7C   ; 124
    a9b0:   96 e0           ldi r25, 0x06   ; 6
    a9b2:   0e 94 50 10     call    0x20a0  ; 0x20a0 <USART0_TX_String>
    DEBUGGER_UART_TX_String(enter_txt);
    a9b6:   8f e9           ldi r24, 0x9F   ; 159
    a9b8:   94 e1           ldi r25, 0x14   ; 20
    a9ba:   0e 94 50 10     call    0x20a0  ; 0x20a0 <USART0_TX_String>
    for(i = 0; i < 3; i++)
    a9be:   2c e8           ldi r18, 0x8C   ; 140
    a9c0:   e2 2e           mov r14, r18
    a9c2:   20 e0           ldi r18, 0x00   ; 0
    a9c4:   f2 2e           mov r15, r18
    DEBUGGER_UART_TX_String(enter_txt);
    a9c6:   67 01           movw    r12, r14
    a9c8:   10 e0           ldi r17, 0x00   ; 0
    a9ca:   00 e0           ldi r16, 0x00   ; 0
    {
        Print_Value_DEC("esp8266_cmd_flash_ptr[i].cmd_ptr:  ", i);
    a9cc:   4a e0           ldi r20, 0x0A   ; 10
    a9ce:   b8 01           movw    r22, r16
    a9d0:   86 ea           ldi r24, 0xA6   ; 166
    a9d2:   96 e0           ldi r25, 0x06   ; 6
    a9d4:   0e 94 64 14     call    0x28c8  ; 0x28c8 <Print_Value_General>
        DEBUGGER_UART_TXFS(esp8266_cmd_flash_ptr[i].cmd_ptr);
    a9d8:   f6 01           movw    r30, r12
    a9da:   80 81           ld  r24, Z
    a9dc:   91 81           ldd r25, Z+1    ; 0x01
    a9de:   0e 94 78 10     call    0x20f0  ; 0x20f0 <USART0_TX_Flash_String>
        DEBUGGER_UART_TX_String(enter_txt); 
    a9e2:   8f e9           ldi r24, 0x9F   ; 159
    a9e4:   94 e1           ldi r25, 0x14   ; 20
    a9e6:   0e 94 50 10     call    0x20a0  ; 0x20a0 <USART0_TX_String>
    for(i = 0; i < 3; i++)
    a9ea:   0f 5f           subi    r16, 0xFF   ; 255
    a9ec:   1f 4f           sbci    r17, 0xFF   ; 255
    a9ee:   f4 e0           ldi r31, 0x04   ; 4
    a9f0:   cf 0e           add r12, r31
    a9f2:   d1 1c           adc r13, r1
    a9f4:   03 30           cpi r16, 0x03   ; 3
    a9f6:   11 05           cpc r17, r1
    a9f8:   49 f7           brne    .-46        ; 0xa9cc <MXA_Test+0x27a>
    }
    DEBUGGER_UART_TX_String("For Loop End");
    a9fa:   83 ed           ldi r24, 0xD3   ; 211
    a9fc:   95 e0           ldi r25, 0x05   ; 5
    a9fe:   0e 94 50 10     call    0x20a0  ; 0x20a0 <USART0_TX_String>
    DEBUGGER_UART_TX_String(enter_txt);
    aa02:   8f e9           ldi r24, 0x9F   ; 159
    aa04:   94 e1           ldi r25, 0x14   ; 20
    aa06:   0e 94 50 10     call    0x20a0  ; 0x20a0 <USART0_TX_String>
    
    DEBUGGER_UART_TX_String("For Loop Start for(u8b i = 0; i < 6; i++)");
    aa0a:   89 ec           ldi r24, 0xC9   ; 201
    aa0c:   96 e0           ldi r25, 0x06   ; 6
    aa0e:   0e 94 50 10     call    0x20a0  ; 0x20a0 <USART0_TX_String>
    DEBUGGER_UART_TX_String(enter_txt);
    aa12:   8f e9           ldi r24, 0x9F   ; 159
    aa14:   94 e1           ldi r25, 0x14   ; 20
    aa16:   0e 94 50 10     call    0x20a0  ; 0x20a0 <USART0_TX_String>
    aa1a:   9c e8           ldi r25, 0x8C   ; 140
    aa1c:   c9 2e           mov r12, r25
    aa1e:   90 e0           ldi r25, 0x00   ; 0
    aa20:   d9 2e           mov r13, r25
    aa22:   10 e0           ldi r17, 0x00   ; 0
    aa24:   00 e0           ldi r16, 0x00   ; 0
    for(i = 0; i < 6; i++)
    {
        Print_Value_DEC("esp8266_cmd_flash_ptr[i].cmd_ptr:  ", i);
    aa26:   4a e0           ldi r20, 0x0A   ; 10
    aa28:   b8 01           movw    r22, r16
    aa2a:   86 ea           ldi r24, 0xA6   ; 166
    aa2c:   96 e0           ldi r25, 0x06   ; 6
    aa2e:   0e 94 64 14     call    0x28c8  ; 0x28c8 <Print_Value_General>
        DEBUGGER_UART_TXFS(esp8266_cmd_flash_ptr[i].cmd_ptr);
    aa32:   f6 01           movw    r30, r12
    aa34:   80 81           ld  r24, Z
    aa36:   91 81           ldd r25, Z+1    ; 0x01
    aa38:   0e 94 78 10     call    0x20f0  ; 0x20f0 <USART0_TX_Flash_String>
        DEBUGGER_UART_TX_String(enter_txt); 
    aa3c:   8f e9           ldi r24, 0x9F   ; 159
    aa3e:   94 e1           ldi r25, 0x14   ; 20
    aa40:   0e 94 50 10     call    0x20a0  ; 0x20a0 <USART0_TX_String>
    for(i = 0; i < 6; i++)
    aa44:   0f 5f           subi    r16, 0xFF   ; 255
    aa46:   1f 4f           sbci    r17, 0xFF   ; 255
    aa48:   f4 e0           ldi r31, 0x04   ; 4
    aa4a:   cf 0e           add r12, r31
    aa4c:   d1 1c           adc r13, r1
    aa4e:   06 30           cpi r16, 0x06   ; 6
    aa50:   11 05           cpc r17, r1
    aa52:   49 f7           brne    .-46        ; 0xaa26 <MXA_Test+0x2d4>
    }
    DEBUGGER_UART_TX_String("For Loop End");
    aa54:   83 ed           ldi r24, 0xD3   ; 211
    aa56:   95 e0           ldi r25, 0x05   ; 5
    aa58:   0e 94 50 10     call    0x20a0  ; 0x20a0 <USART0_TX_String>
    DEBUGGER_UART_TX_String(enter_txt);
    aa5c:   8f e9           ldi r24, 0x9F   ; 159
    aa5e:   94 e1           ldi r25, 0x14   ; 20
    aa60:   0e 94 50 10     call    0x20a0  ; 0x20a0 <USART0_TX_String>

    i = 0;
    DEBUGGER_UART_TX_String("Loop Start while(i < 3)");
    aabe:   85 e2           ldi r24, 0x25   ; 37
    aac0:   97 e0           ldi r25, 0x07   ; 7
    aac2:   0e 94 50 10     call    0x20a0  ; 0x20a0 <USART0_TX_String>
    DEBUGGER_UART_TX_String(enter_txt);
    aac6:   8f e9           ldi r24, 0x9F   ; 159
    aac8:   94 e1           ldi r25, 0x14   ; 20
    aaca:   0e 94 50 10     call    0x20a0  ; 0x20a0 <USART0_TX_String>
    aace:   10 e0           ldi r17, 0x00   ; 0
    aad0:   00 e0           ldi r16, 0x00   ; 0
    while(i < 3)
    {
        Print_Value_DEC("esp8266_cmd_flash_ptr[i].cmd_ptr:  ", i);
    aad2:   4a e0           ldi r20, 0x0A   ; 10
    aad4:   b8 01           movw    r22, r16
    aad6:   86 ea           ldi r24, 0xA6   ; 166
    aad8:   96 e0           ldi r25, 0x06   ; 6
    aada:   0e 94 64 14     call    0x28c8  ; 0x28c8 <Print_Value_General>
        DEBUGGER_UART_TXFS(esp8266_cmd_flash_ptr[i].cmd_ptr);
    aade:   f7 01           movw    r30, r14
    aae0:   80 81           ld  r24, Z
    aae2:   91 81           ldd r25, Z+1    ; 0x01
    aae4:   0e 94 78 10     call    0x20f0  ; 0x20f0 <USART0_TX_Flash_String>
        DEBUGGER_UART_TX_String(enter_txt); 
    aae8:   8f e9           ldi r24, 0x9F   ; 159
    aaea:   94 e1           ldi r25, 0x14   ; 20
    aaec:   0e 94 50 10     call    0x20a0  ; 0x20a0 <USART0_TX_String>
    while(i < 3)
    aaf0:   0f 5f           subi    r16, 0xFF   ; 255
    aaf2:   1f 4f           sbci    r17, 0xFF   ; 255
    aaf4:   f4 e0           ldi r31, 0x04   ; 4
    aaf6:   ef 0e           add r14, r31
    aaf8:   f1 1c           adc r15, r1
    aafa:   03 30           cpi r16, 0x03   ; 3
    aafc:   11 05           cpc r17, r1
    aafe:   49 f7           brne    .-46        ; 0xaad2 <MXA_Test+0x380>
        i++;
    }
    DEBUGGER_UART_TX_String("while Loop End");
    ab00:   86 e1           ldi r24, 0x16   ; 22
    ab02:   97 e0           ldi r25, 0x07   ; 7
    ab04:   0e 94 50 10     call    0x20a0  ; 0x20a0 <USART0_TX_String>
    DEBUGGER_UART_TX_String(enter_txt);
    ab08:   8f e9           ldi r24, 0x9F   ; 159
    ab0a:   94 e1           ldi r25, 0x14   ; 20
    ab0c:   0e 94 50 10     call    0x20a0  ; 0x20a0 <USART0_TX_String>
    
    DEBUGGER_UART_TX_String("void MXA_Test(void) End");
    ab10:   8d e3           ldi r24, 0x3D   ; 61
    ab12:   97 e0           ldi r25, 0x07   ; 7
    ab14:   0e 94 50 10     call    0x20a0  ; 0x20a0 <USART0_TX_String>
    DEBUGGER_UART_TX_String(enter_txt);
    ab18:   8f e9           ldi r24, 0x9F   ; 159
    ab1a:   94 e1           ldi r25, 0x14   ; 20
    ab1c:   0e 94 50 10     call    0x20a0  ; 0x20a0 <USART0_TX_String>
}
    ab20:   6d 96           adiw    r28, 0x1d   ; 29
    ab22:   0f b6           in  r0, 0x3f    ; 63
    ab24:   f8 94           cli
    ab26:   de bf           out 0x3e, r29   ; 62
    ab28:   0f be           out 0x3f, r0    ; 63
    ab2a:   cd bf           out 0x3d, r28   ; 61
    ab2c:   df 91           pop r29
    ab2e:   cf 91           pop r28
    ab30:   1f 91           pop r17
    ab32:   0f 91           pop r16
    ab34:   ff 90           pop r15
    ab36:   ef 90           pop r14
    ab38:   df 90           pop r13
    ab3a:   cf 90           pop r12
    ab3c:   08 95           ret

So can anyone make heads or tails out of it?



Solution 1:[1]

The Solution to the problem lies in the fact, that I was using pointers... (Me Schoolbus - Pointer.... U know).

for(i = 0; i < 6; i++)
{
   Print_Value_DEC("esp8266_cmd_flash_ptr[i].cmd_ptr:  ", i);
   //DEBUGGER_UART_TXFS(esp8266_cmd_flash_ptr[i].cmd_ptr);
   DEBUGGER_UART_TXFS(pgm_read_word(&(esp8266_cmd_flash_ptr[i].cmd_ptr)));  // works
   DEBUGGER_UART_TX_String(enter_txt); 
}

Because

const td_esp8266_cmd_ptr esp8266_cmd_flash_ptr[6] PROGMEM = {};

contains pointers to the strings, and those pointers are stored in Flash, that is why an extra pgm_read_word has to be used before.

But then again, if this is the code that works in all cases,(in and outside of loops) why does the "bad" code work outside the loops?

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 Balázs Bagi