pvvx
Активный участник сообщества
Не назначить атрибут ICACHE_RODATA_ATTR у const char * srvContenErr[]
Не работают никакие атрибуты, кроме section(). https://gcc.gnu.org/onlinedocs/gcc/Variable-Attributes.html
Задать массив или переменную по спец.адресу можно только путем объявления в ld или лезть в Makefile
и добавлять: ld --section-start=rtc_mem_section=0x60001100
для: char rtc_mem[192] __attribute__ ((section ("rtc_mem_section")));
Нет оптимизации - объединения одинаковых стрингов в секции ".irom.text".
+ Создает не оптимальный код:
Каждый раз делает загрузку адреса, даже если указать register uint32_t *ptr (!):
Смещениями пользоваться вооще не умеет, если адрес задан абсолютный, даже в теле struct (!), начинает лепить горбатого:
Вся прошивка забита "memw" вместо EXTW, хотя cache нема у данного CPU.
The MEMW instruction causes all memory and cache accesses (loads, stores, acquires,
releases, prefetches, and cache operations, but not instruction fetches) before itself in
program order to access memory before all memory and cache accesses (but not instruction
fetches) after. At least one MEMW should be executed in between every load or
store to a volatile variable. The Multiprocessor Synchronization Option provides
some additional instructions that also affect memory ordering in a more focused fashion.
MEMW has broader applications than these other instructions (for example, when reading
and writing device registers), but it also may affect performance more than the synchronization
instructions.
И т.д. и т.п.
Кошмарный компилятор!
Кто выставлял такие опции транслятору?
Код:
static const char srvContenErr00[] ICACHE_RODATA_ATTR = "Ok"; // ERR_OK 0
static const char srvContenErr01[] ICACHE_RODATA_ATTR = "Out of memory error"; // ERR_MEM -1
static const char srvContenErr02[] ICACHE_RODATA_ATTR = "Buffer error"; // ERR_BUF -2
static const char srvContenErr03[] ICACHE_RODATA_ATTR = "Timeout"; // ERR_TIMEOUT -3
static const char srvContenErr04[] ICACHE_RODATA_ATTR = "Routing problem"; // ERR_RTE -4
static const char srvContenErr05[] ICACHE_RODATA_ATTR = "Operation in progress"; // ERR_INPROGRESS -5
static const char srvContenErr06[] ICACHE_RODATA_ATTR = "Illegal value"; // ERR_VAL -6
static const char srvContenErr07[] ICACHE_RODATA_ATTR = "Operation would block"; // ERR_WOULDBLOCK -7
static const char srvContenErr08[] ICACHE_RODATA_ATTR = "Connection aborted"; // ERR_ABRT -8
static const char srvContenErr09[] ICACHE_RODATA_ATTR = "Connection reset"; // ERR_RST -9
static const char srvContenErr10[] ICACHE_RODATA_ATTR = "Connection closed"; // ERR_CLSD -10
static const char srvContenErr11[] ICACHE_RODATA_ATTR = "Not connected"; // ERR_CONN -11
static const char srvContenErr12[] ICACHE_RODATA_ATTR = "Illegal argument"; // ERR_ARG -12
static const char srvContenErr13[] ICACHE_RODATA_ATTR = "Address in use"; // ERR_USE -13
static const char srvContenErr14[] ICACHE_RODATA_ATTR = "Low-level netif error"; // ERR_IF -14
static const char srvContenErr15[] ICACHE_RODATA_ATTR = "Already connected"; // ERR_ISCONN -15
const char * srvContenErr[] = {
srvContenErr00,
srvContenErr01,
srvContenErr02,
srvContenErr03,
srvContenErr04,
srvContenErr05,
srvContenErr06,
srvContenErr07,
srvContenErr08,
srvContenErr09,
srvContenErr10,
srvContenErr11,
srvContenErr12,
srvContenErr13,
srvContenErr14,
srvContenErr15
} ;
Задать массив или переменную по спец.адресу можно только путем объявления в ld или лезть в Makefile
и добавлять: ld --section-start=rtc_mem_section=0x60001100
для: char rtc_mem[192] __attribute__ ((section ("rtc_mem_section")));
Нет оптимизации - объединения одинаковых стрингов в секции ".irom.text".
+ Создает не оптимальный код:
Код:
uint32_t *ptr = (uint32_t *)(RTC_MEM_BASE);
*ptr++ = errn;
*ptr++ = RSR(EXCCAUSE);
*ptr++ = RSR(EPC1);
*ptr++ = RSR(EPC2);
*ptr++ = RSR(EPC3);
*ptr++ = RSR(EXCVADDR);
*ptr++ = RSR(DEPC);
Код:
*ptr++ = errn;
401001ac: 0329 s32i.n a2, a3, 0
*ptr++ = RSR(EXCCAUSE);
401001ae: 03e840 rsr.exccause a4
401001b1: fff531 l32r a3, 40100188 <wdt_task+0x48>
401001b4: 0349 s32i.n a4, a3, 0
*ptr++ = RSR(EPC1);
401001b6: 03b140 rsr.epc1 a4
401001b9: fff431 l32r a3, 4010018c <wdt_task+0x4c>
401001bc: 0349 s32i.n a4, a3, 0
*ptr++ = RSR(EPC2);
401001be: 03b240 rsr.epc2 a4
401001c1: fff331 l32r a3, 40100190 <wdt_task+0x50>
401001c4: 0349 s32i.n a4, a3, 0
*ptr++ = RSR(EPC3);
401001c6: 03b340 rsr.epc3 a4
401001c9: fff231 l32r a3, 40100194 <wdt_task+0x54>
401001cc: 0349 s32i.n a4, a3, 0
*ptr++ = RSR(EXCVADDR);
401001ce: 03ee40 rsr.excvaddr a4
401001d1: fff131 l32r a3, 40100198 <wdt_task+0x58>
401001d4: 0349 s32i.n a4, a3, 0
*ptr++ = RSR(DEPC);
401001d6: 03c040 rsr.depc a4
401001d9: fff031 l32r a3, 4010019c <wdt_task+0x5c>
401001dc: 0349 s32i.n a4, a3, 0
Код:
ieee80211_phy_init(g_ic.g.wifi_store.phy_mode); // phy_mode
40240097: ffe1c1 l32r a12, 4024001c <_irom0_text_start+0x1c>
4024009a: 05dc22 addmi a2, a12, 0x500
4024009d: 7228 l32i.n a2, a2, 28
4024009f: 112405 call0 402512e0 <ieee80211_phy_init>
The MEMW instruction causes all memory and cache accesses (loads, stores, acquires,
releases, prefetches, and cache operations, but not instruction fetches) before itself in
program order to access memory before all memory and cache accesses (but not instruction
fetches) after. At least one MEMW should be executed in between every load or
store to a volatile variable. The Multiprocessor Synchronization Option provides
some additional instructions that also affect memory ordering in a more focused fashion.
MEMW has broader applications than these other instructions (for example, when reading
and writing device registers), but it also may affect performance more than the synchronization
instructions.
И т.д. и т.п.
Кошмарный компилятор!
Кто выставлял такие опции транслятору?
Последнее редактирование: