Вроде как нет. Только загрузка по мере использования "руками", но могу и ошибаться, спец по чипу из меня еще тот.использовать напрямую из флеша, не отображая их в RAM
Указание компилятору сунуть строку HTTPsfupload во flash память:
const uint8 HTTPsfupload[] ICACHE_RODATA_ATTR = "<html><body...../html>";
#define sizeHTTPsfupload 220
Достаем ручками из флаша.
.....
pdata = (uint32)((void *)HTTPsfupload);
size = sizeHTTPsfupload;
break;
}
if(pdata != 0 && size != 0) {
spi_flash_read_array(pdata&MASK_ADDR_FLASH_ICACHE_DATA, pbuf, size);
....
ээээ... не понял вопроса. Вроде как это константа и по определению она не изменяется, зачем ее обратно переписывать?Хм, а как его потом обратно выпинуть из RAM?
А дальше и такВ прошивке pvvx есть такой код...
#define tcp_puts_fd(fmt, ...) do { \
static const char flash_str[] ICACHE_RODATA_ATTR = fmt; \
web_conn->msgbuflen += os_sprintf(&web_conn->msgbuf[web_conn->msgbuflen], ets_strcpy(UartDev.rcv_buff.pRcvMsgBuff, flash_str), ##__VA_ARGS__); \
} while(0)
#define tcp_strcpy_fd(fmt) do { \
static const char flash_str[] ICACHE_RODATA_ATTR = fmt; \
web_conn->msgbuflen += ets_strlen(ets_strcpy(&web_conn->msgbuf[web_conn->msgbuflen], ets_strcpy(UartDev.rcv_buff.pRcvMsgBuff, flash_str))); \
} while(0)
tcp_puts_fd("HTTP/1.1 %u %s\r\nServer: " WEB_NAME_VERSION "\r\nConnection: close\r\n", CurResp->status, CurResp->headers);
Я может не правильно понял суть фокуса. Я думал эта конструкция заставляет ESP не маппить этот массив в RAM сразу, а сделать это позже. Если это так, то без возможности отменить этот маппинг, это очень сомнительная фича, ведь если в конце концов все эти данные все равно окажутся в RAM это почти то же самое, как если бы я их вначале все туда загрузил. Какая разница когда я подойду к моменту "кончилась RAM" в начале или чуть попозже, когда мне эти данные каждый по разу понадобятся? Вот если бы у меня была возможность подтянуть данные, а потом выкинуть их из RAM, была бы польза. С другой стороны, чем тогда этот фокус отличается от динамического выделения + инициализации данными из flash и последующим освобождением?зачем ее обратно переписывать
это он и есть на мой взгляд....фокус отличается от динамического выделения + инициализации данными из flash и последующим освобождением?
Спасибо за подсказку. Замечательное решение.А дальше и так
Так если можно сделать os_malloc + заполнить из флэша, а потом еще и os_free, оно удобнее получается, я хотя бы могу когда мне данные не нужны будут память обратно получить, а тут уже не могу. Где и что я не понимаю?это он и есть на мой взгляд.
то я там не привел объявление pbuf поскольку считал что в контексте обсуждения это не важно. На самом деле pbuf это локальный массив объявленный так;pdata = (uint32)((void *)HTTPsfupload);
Но есть ещё беда - почему-то одинаковые стринги в ICACHE_RODATA_ATTR компилятор не видит и дублирует. Возможно какая опция ещё нужна...Ах вон оно что. Все, теперь картинка сложилась, спасибо.
0002D240: 25 73 20 25│75 0A 00 00│25 73 20 25│75 0A 00 00 %s %u◙ %s %u◙
0002D250: 25 73 20 25│75 0A 00 00│25 73 20 25│75 0A 00 00 %s %u◙ %s %u◙
0002D260: 25 73 20 25│75 0A 00 00│25 73 20 25│75 0A 00 00 %s %u◙ %s %u◙
0002D270: 25 73 20 25│75 0A 00 00│25 73 20 25│75 0A 00 00 %s %u◙ %s %u◙
0002D280: 25 73 20 25│75 0A 00 00│25 73 20 25│75 0A 00 00 %s %u◙ %s %u◙
0002D290: 25 73 20 25│75 0A 00 00│25 73 20 25│75 0A 00 00 %s %u◙ %s %u◙
0002D2A0: 25 73 20 25│75 0A 00 00│25 73 20 25│75 0A 00 00 %s %u◙ %s %u◙
0002D2B0: 25 73 20 25│75 0A 00 00│25 73 20 25│75 0A 00 00 %s %u◙ %s %u◙
0002D2C0: 25 73 20 25│75 0A 00 00│25 73 20 25│75 0A 00 00 %s %u◙ %s %u◙
0002D2D0: 25 73 20 25│75 0A 00 00│25 73 20 25│75 0A 00 00 %s %u◙ %s %u◙
0002D2E0: 25 73 20 25│75 0A 00 00│25 73 20 25│75 0A 00 00 %s %u◙ %s %u◙
0002D2F0: 25 73 20 25│75 0A 00 00│25 73 20 25│75 0A 00 00 %s %u◙ %s %u◙
0002D300: 25 73 20 25│75 0A 00 00│25 73 20 25│75 0A 00 00 %s %u◙ %s %u◙
0002D310: 25 73 20 25│75 0A 00 00│25 73 20 25│75 0A 00 00 %s %u◙ %s %u◙
0002D320: 25 73 20 25│75 0A 00 00│25 73 20 25│75 0A 00 00 %s %u◙ %s %u◙
0002D330: 25 73 20 25│75 0A 00 00│25 73 20 25│75 0A 00 00 %s %u◙ %s %u◙
0002D340: 25 73 20 25│75 0A 00 00│00 00 00 00│00 00 00 00 %s %u◙
У меня небольшой опыт в компиляторах си, но вроде бы ни один компилятор и не пытается анализировать константные строки на предмет повторения. Может быть китайцы наобъявляли кучу одинаковых стрингов, например в разных модулях.вся ICACHE_RODATA заполнена одинаковыми сообщениями из SDK
Любой компилятор это делает.У меня небольшой опыт в компиляторах си, но вроде бы ни один компилятор и не пытается анализировать константные строки на предмет повторения. Может быть китайцы наобъявляли кучу одинаковых стрингов, например в разных модулях.
40269fe7: 5d9401 l32r a0, 40241638 <system_get_checksum+0x3c>
40269fea: 0000c0 callx0 a0