'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 |
