Скрыть объявление
На нашем форуме недоступен просмотр изображений для неавторизованных пользователей. Если Вы уже зарегистрированы на нашем форуме, то можете войти. Если у Вас еще нет аккаунта, мы будем рады, если Вы к нам присоединитесь. Зарегистрироваться Вы можете здесь.

'Реверс' SDK Espressif и ROM-BIOS для создания открытого SDK.

Тема в разделе "SDK и создание собственных прошивок", создана пользователем pvvx, 16 апр 2015.

  1. pvvx

    pvvx Активный участник сообщества

    Сообщения:
    10.251
    Симпатии:
    1.349
    Перенос векторов прерываний в Iram потребовался для прикручивания NMI_Handler к софтовому PWM на таймере :)
    Появилась void system_phy_set_max_tpw(uint8 max_tpw) напрямую переадресующая вызов к phy_set_most_tpw(uint8 max_tpw) c увеличением глубины стека. Такой переадреcсации в SDK ОЧЕНЬ много. Функции просто дублируют для увеличения размера кода, тормозов и глубины стека CPU в SDK:
    Код (Text):
    1. system_phy_set_max_tpw:
    2.                 addi            a1, a1, -16
    3.                 s32i            a0, a1, 0
    4.                 call0           phy_set_most_tpw
    5.                 l32i            a0, a1, 0
    6.                 addi            a1, a1, 16
    7.                 ret
    8. ; End of function system_phy_set_max_tpw
    9. system_phy_set_tpw_via_vdd33:
    10.                 addi            a1, a1, -16
    11.                 s32i            a0, a1, 0
    12.                 call0           phy_vdd33_set_tpw
    13.                 l32i            a0, a1, 0
    14.                 addi            a1, a1, 16
    15.                 ret
    16. ; End of function system_phy_set_tpw_via_vdd33
    17. phy_vdd33_set_tpw:                      ; CODE XREF: system_phy_set_tpw_via_vdd33+6j
    18.                 addi            a1, a1, 0xF0
    19.                 s32i.n          a0, a1, 0
    20.                 call0           get_vdd33_offset
    21.                 l32r            a0, 0x3FFEAE5A
    22.                 s8i             a2, a0, 0x80 ; 0x3FFEAE5A+0x80
    23.                 l32i.n          a0, a1, 0
    24.                 addi            a1, a1, 0x10
    25.                 ret.n
    26. ; End of function phy_vdd33_set_tpw
    Наверно за каждую глупую строчку на CИ прораммеру Espressif платят :)
     
    Последнее редактирование: 23 май 2015
  2. pvvx

    pvvx Активный участник сообщества

    Сообщения:
    10.251
    Симпатии:
    1.349
    Кто расскажет, зачем отняли SPI1 в SDK 1.1.0?
    Код (C):
    1.  
    2. /******************************************************************************
    3. * FileName: app_main.c
    4. * Description: Alternate SDK (libmain.a)
    5. * Author: PV`
    6. * (c) PV` 2015
    7. * ver 0.0.1
    8. *******************************************************************************/
    9. #include "user_config.h"
    10. #include "bios.h"
    11. #include "hw/esp8266.h"
    12. #include "hw/spi_register.h"
    13. //#include "flash.h"
    14. //=============================================================================
    15. // overlap_hspi_init()
    16. //-----------------------------------------------------------------------------
    17. void overlap_hspi_init(void)
    18. {
    19.     while((SPI0_EXT2) || (SPI1_CMD & 0xFFFC0000)); // 0x600001F8 || 0x60000100
    20.     PERI_IO_SWAP |= 0x80; // two spi masters on cspi
    21.     SPI0_EXT3 |= 1;
    22.     SPI1_EXT3 |= SPI_INT_HOLD_ENA;
    23.     SPI1_USER |= SPI_CS_SETUP;
    24.     SPI1_PIN = (SPI1_PIN & 0x7E) | (SPI_CS2_DIS | SPI_CS1_DIS); // SPI_CS0_ENA
    25.     SPI1_CLOCK &= ~SPI_CLK_EQU_SYSCLK;
    26. }
    27. //=============================================================================
    28. // overlap_hspi_deinit()
    29. //-----------------------------------------------------------------------------
    30. void overlap_hspi_deinit(void)
    31. {
    32.     while((SPI0_EXT2) || (SPI1_CMD & 0xFFFC0000)); // 0x600001F8 || 0x60000100
    33.     PERI_IO_SWAP &= 0xF7F; // two spi masters on cspi
    34.     SPI0_EXT3 &= 0x7E;
    35.     SPI1_EXT3 &= 0x7C;
    36.     SPI1_USER &= 0xFDF;
    37.     SPI1_PIN = (SPI1_PIN & 0x7E) | (SPI_CS2_DIS | SPI_CS1_DIS);
    38.     SPI1_CLOCK &= ~SPI_CLK_EQU_SYSCLK;
    39. }
    40. //=============================================================================
    41. // overlap_hspi_read_data()
    42. // Измененная с параметром void *des для работы и с нечетными адресами
    43. //-----------------------------------------------------------------------------
    44. #define SPI_FBLK 32
    45. int overlap_hspi_read_data(SpiFlashChip *fchip, uint32 faddr, void *des, uint32 size)
    46. {
    47.     SPI1_PIN = (SPI1_PIN & 0x7E) |  (SPI_CS2_DIS | SPI_CS1_DIS);
    48.     if(fchip->chip_size < faddr + size) return SPI_FLASH_RESULT_OK;
    49.     if(des == NULL) return SPI_FLASH_RESULT_ERR;
    50.     if(size < 1) return SPI_FLASH_RESULT_ERR;
    51.     uint32 blksize = (uint32)des & 3;
    52.     if(blksize) {
    53.         blksize = 4 - blksize;
    54.         if(size < blksize) blksize = size;
    55.         SPI1_ADDR = faddr | (blksize << 24);
    56.         SPI1_CMD = SPI_READ;
    57.         size -= blksize;
    58.         faddr += blksize;
    59.         while(SPI1_CMD);
    60.         register uint32 data_buf = SPI1_W0;
    61.         do {
    62.             *(uint8 *)des = data_buf;
    63.             des = (uint8 *)des + 1;
    64.             data_buf >>= 8;
    65.         } while(--blksize);
    66.     }
    67.     while(size) {
    68.         if(size < SPI_FBLK) blksize = size;
    69.         else blksize = SPI_FBLK;
    70.         SPI1_ADDR = faddr | (blksize << 24);
    71.         SPI1_CMD = SPI_READ;
    72.         size -= blksize;
    73.         faddr += blksize;
    74.         while(SPI1_CMD);
    75.         uint32 *srcdw = (uint32 *)(&SPI1_W0);
    76.         while(blksize >> 2) {
    77.             *((uint32 *)des) = *srcdw++;
    78.             des = ((uint32 *)des) + 1;
    79.             blksize -= 4;
    80.         }
    81.         if(blksize) {
    82.             uint32 data_buf = *srcdw;
    83.             do {
    84.                 *(uint8 *)des = data_buf;
    85.                 des = (uint8 *)des + 1;
    86.                 data_buf >>= 8;
    87.             } while(--blksize);
    88.             break;
    89.         }
    90.     }
    91.     return SPI_FLASH_RESULT_OK;
    92. }
    И команду spi_flash_read(a,b,c) заместили на overlap_hspi_read_data(flashchip,a,b,c)...
    А пока в SDK 1.1.0 всё глючит неимоверно :mad:
    Кароче SDK 1.0.2 ( так назовем этот последний вариант, вышедший как исправление для SDK 1.0.1 ) это есть последний, который официально работает на модулях ESP-01...12 с одной flash распаянной на свой единственный CS без спец. ухищрений :p
     
    Последнее редактирование: 23 май 2015
    JustACat нравится это.
  3. pvvx

    pvvx Активный участник сообщества

    Сообщения:
    10.251
    Симпатии:
    1.349
    Толи я совсем совсем ничего не понимаю, то-ли китайцы совсем решили плодить дубли каждой процедуре, про контрольку OR-ом уже .... :
    Код (C):
    1. /* China_bags_Espressif_SDK.c
    2. *  SDK 1.1.0
    3. */
    4. #include "user_config.h"
    5. #include "bios.h"
    6. #include "user_interface.h"
    7. #include "hw/esp8266.h"
    8.  
    9. void ICACHE_FLASH_ATTR system_phy_set_rfoption(uint8 option)
    10. {
    11.     phy_afterwake_set_rfoption(option);
    12. }
    13.  
    14. void ICACHE_FLASH_ATTR phy_afterwake_set_rfoption(uint8 option)
    15. {
    16.     uint32 x = (RTC_RAM_BASE[0x60>>2] & 0xFFFF) | (option << 16);
    17.     RTC_RAM_BASE[0x60>>2] = x; // 0x60001060
    18.     RTC_RAM_BASE[0x78>>2] |= x; // 0x60001078 - это ячейка памяти RTC c китай-контролькой области от 0x60001000 до 0x60001078, получаемая путем OR всех слов этой области :)
    19.     // но сколько не OR-ь всё равно китай-програмер получит шиш в виде несовпадения, т.к. тогда уж надо OR-ить заново всё, но это китай-программеру из Espressif не объяснить :)
    20. }
    21.  
    22. bool ICACHE_FLASH_ATTR system_deep_sleep_set_option(uint8 option)
    23. {
    24.     uint32 x = (RTC_RAM_BASE[0x60>>2] & 0xFFFF) | (option << 16);
    25.     RTC_RAM_BASE[0x60>>2] = x; // 0x60001060
    26.     rtc_mem_check(false); // пересчитать OR
    27.     // return всегда false
    28. }
    29.  
    30. bool ICACHE_FLASH_ATTR rtc_mem_check(bool flg)
    31. {
    32.     volatile uint32 * ptr = &RTC_RAM_BASE[0];
    33.     uint32 region_or_crc = 0;
    34.     while(ptr != &RTC_RAM_BASE[0x78>>2]) region_or_crc |= *ptr++; // китай-контролька OR-ом! :)
    35.     if(flg == false) {
    36.         *ptr = region_or_crc; // RTC_RAM_BASE[0x78>>2] = region_or_crc
    37.         return false;
    38.     }
    39.     return (*ptr != region_or_crc);
    40. }
    41. /*
    42. После отключения/включения питания и старта SDK:
    43. 60001000: 02ff0000 1e39153d 203d203c 00000000  ..я.=.9.< = ....
    44. 60001010: 00000000 07c2060d 074207c2 07430782  ......В.В.B.‚.C.
    45. 60001020: 0b03090b 070b0307 02060703 fe891009  ..............‰ю
    46. 60001030: 4e52800e 3840444a 0c0601fd 07031810  .ЂRNJD@8э.......
    47. 60001040: 1d15110b 140e0906 0d091f17 231b1711  ...............#
    48. 60001050: 00000000 0d330000 0ff4fe89 00000000  ......3.‰юф.....
    49. 60001060: 6f690000 42fa1a59 c9c400b4 229821e5  ..ioY.ъBґ.ДЙе!˜"
    50. 60001070: f6b668f7 56f5cbde d0b4a8b8 016417fe  чh¶цЮЛхVёЁґРю.d.
    51. Замечательная китай-конфигурация phy_rfoption 60001060 == 0x6f69 для WiFi :)
    52.  
    53. После deep_sleep:
    54. 60001000: 02ff0000 1e38153d 213d203c 00000000  ..я.=.8.< =!....
    55. 60001010: 00000000 0001050e 078107c1 078207c1  ........Б.Ѓ.Б.‚.
    56. 60001020: 0f03070d 070b0307 02070703 fe8c1009  ..............Њю
    57. 60001030: 4e52800e 3840444a 0d0603fd 07041911  .ЂRNJD@8э.......
    58. 60001040: 1d16120b 140e0a05 0e0a2018 231c1812  ......... .....#
    59. 60001050: 00000000 0d330000 0ff4fe89 00000000  ......3.‰юф.....
    60. 60001060: 00000001 42fa1a59 c9c400b4 229821e5  ....Y.ъBґ.ДЙе!˜"
    61. 60001070: f6b668f7 56f5cbde ffffffff 016417fe  чh¶цЮЛхVяяяяю.d.
    62.  
    63. 60001078 == 0xffffffff - замечательная китай контролька :)
    64. */[code]
     
    Последнее редактирование: 23 май 2015
  4. pvvx

    pvvx Активный участник сообщества

    Сообщения:
    10.251
    Симпатии:
    1.349
    Для страждущих:
    Установка PLL CPU на 80MHz в модуле с 26MHz кварцем (для собственных загрузчиков своих SDK):
    Код (C):
    1.  
    2. // Данный тест грузится и запускается в IRAM esptool -p COM6 -b 256000 load_ram 000000.bin
    3. void call_user_start(void)
    4. {
    5. // ROM-BIOS стартует с кварцем 26MHz и думает, что у неё 40MHz. Частота CPU выходит 52MHz.
    6.     ets_update_cpu_frequency(52); // указание правильной частоты для подсчета времени в ets_delay_us(), т.к. она считает такты CPU и множит на указанное число в MHz...
    7.     UART0_CLKDIV = 52000000/115200;
    8.     ets_printf("\nStart RAM porg\n");
    9.     ets_printf("CLK CPU %u MHz\n", ets_get_cpu_frequency());
    10.     ets_printf("---0---> %u %u \n", rom_i2c_readReg(103,4,1), rom_i2c_readReg(103,4,2));
    11.     ets_delay_us(175); // задержка, чтобы успели выйти символы из UART и не возникло их прерываний с растягиванием при активных битах, порождающих "кракозябы"
    12. // Переключение pll на 80MHz от кварца на 26MHz
    13.     rom_i2c_writeReg(103,4,1,136);
    14.     rom_i2c_writeReg(103,4,2,145);
    15. // Тут уже 80 MHz
    16.     ets_update_cpu_frequency(80);
    17.     UART0_CLKDIV = 80000000/115200;
    18.     ets_printf("---1---> %u %u \n", rom_i2c_readReg(103,4,1), rom_i2c_readReg(103,4,2));
    19.     ets_printf("CLK CPU %u MHz\n", ets_get_cpu_frequency());
    20.     ets_run();
    21. }
    Итоговый лог на 115200 Baud:
    Код (Text):
    1. Start RAM porg
    2. CLK CPU 52 MHz
    3. ---0---> 8 129
    4. ---1---> 136 145
    5. CLK CPU 80 MHz
    Кому не нравиться обращения к ROM-BIOS, то могут сами переписать rom_i2c_writeReg() :)
    Код (C):
    1. void rom_i2c_writeReg(uint32 a2, uint32 a3, uint32 a4, uint32 a5)
    2. {
    3.     volatile uint32 * ptr_reg = ((volatile uint32 *)0x60000D00 + (a3<<2));
    4.     *ptr_reg = (a5 << 16) | (a4 << 8) | a2 | 0x1000000;
    5.     while((*ptr_reg >> 25) & 1);
    6. }
    7. void rom_i2c_writeReg_Mask(int block, int host_id, int reg_add, int Msb, int Lsb, int indata);
    8. {
    9. .....
    10. }
    Для настройки скорости SAR ADC есть аналогичная pll:
    Код (C):
    1. #define i2c_bbpll                            0x67 // 103
    2. #define i2c_bbpll_en_audio_clock_out        4
    3. #define i2c_bbpll_en_audio_clock_out_msb    7
    4. #define i2c_bbpll_en_audio_clock_out_lsb    7
    5. #define i2c_bbpll_hostid                    4
    6.  
    По умолчанию ADC пашет на 20кГц...
     
    Последнее редактирование: 24 май 2015
  5. pvvx

    pvvx Активный участник сообщества

    Сообщения:
    10.251
    Симпатии:
    1.349
    Для своих загрузчиков разных SDK из большой flash осталось разобраться с "кэшированием" flash - ограничением его в 1 мегабайт. Т.е. пока не можем запустить на исполнение код из flash, который выше 1 мегабайта.
    Китайцы походу разбили flash на куски - на несколько чипов. Это скорее всего и связно с ограничением "кэширования" flash в 1 мегабайт...
    У кого есть какие предложения-предположения, что и где смотреть/искать в ESP8266 связанное с этим для преодоления данной проблемы (для запуска кода в любой области 16 мегабайтной flash) ?
    Дурной идиотский пример от Espressif использовать несколько разных чипов не предлагать :)
     
  6. anakod

    anakod Moderator Команда форума

    Сообщения:
    314
    Симпатии:
    100
    Спасибо за без лишней скромности лучшую работу по реверсу esp. По кешу у меня есть встречный вопрос - а нельзя ли задавать область кеширования динамически, те в той части где находится интересующий нас код, и при этом сохранять общий объем в тех же исходных рамках.
     
  7. pvvx

    pvvx Активный участник сообщества

    Сообщения:
    10.251
    Симпатии:
    1.349
    Не вижу такой возможности пока, т.к. вся информация по "кэшированию" пока не доступна. Предварительно это дело завязано как-то аппаратно с SPI и причем с обоими.
    Из общего соображения должен где-то иметься регистр задания базы адреса кеша, а адрес в SPI уже дает смещение. В итоге всё равно получаем доступными только первый мег. Тут надо искать где заложен размер кеширования.
    Если алго другой, тогда вообще ничего не ясно :)
     
  8. pvvx

    pvvx Активный участник сообщества

    Сообщения:
    10.251
    Симпатии:
    1.349
    @anakod для сведения к sming:
    В SDK 1.0.2 и 1.1.0 процедура чтения flash переехала c SPI0 на SPI1 и там пошуровали массу регистров, при этом spi_flash_read теперь (на SPI1) не имеет отключения/включения Cache_Read_Disable()/Cache_Read_Enable(). Так-же перенесли вектора прерываний в IRAM (см. их новые ld файлы) и встроили в них полу-программный ШИМ, а в AT что-то ещё, типа таймеров.
    AT запустить со своим загрузчиком, использующим только SPI0 для flash и базовые вектора в ROM-BIOS пока не удалось - висят процедуры espconn (наверно в новом NMI_vector какой счетчик для них)...
    А в общем я с их SDK заканчиваю. Никакой поддержки их SDK далее не гарантирую, т.к. оно содержит тучу ошибок. Метода идет к тому, что из их либ будут вырезаны только основные процедуры работы с wifi , а всё остальное писать самим... Т.е. никаких esp_init_data_default.bin и прочей фигни от них, типа их конфигов в конце flash, deep_sleep и прочего... Этим г... Espressif пусть развлекает янки :)
     
    Последнее редактирование: 25 май 2015
    Victor и JustACat нравится это.
  9. anakod

    anakod Moderator Команда форума

    Сообщения:
    314
    Симпатии:
    100
    На мой взгляд это единственное разумное решение в тушей ситуации. Будь они открыты к диалогу, действительно можно было бы прорабатывать код сдк и его ошибки. Но в текущей ситуации единственное разумное решение - реверсить ром и идти к созданию стабильного решения а не заплаток к их коду. Уж извините но по факту Espressif более чем огорчает. Вообще не понимаю как с таким прекрасными железом (да я понимаю что оно тоже ограничено и не является панацеей от всех бед, но в своей задумке и ценовой категории это действительно прекрасный продукт) они умудряются так бездарно подходить к софтверной части. Скорее всего тут работают разные команды. А может быть просто инвестиции закончились.
     
  10. pvvx

    pvvx Активный участник сообщества

    Сообщения:
    10.251
    Симпатии:
    1.349
    Не то и не другое. Они же не дают описание чипа, а скрывают данные по нему. На описание хоть кое-как много "инвестиций" не требуется.
    Не нашел возможности изменения размера "кэширования" у flash в регистрах периферии :( Flash всегда отображается в области c 0x40200000 по 0x40300000, что не меняй в разных регистрах.
    Надо пробовать лезть в TLB CPU, а там, в wdtlb/witlb пока не разбирался. У нас тут, на форуме, есть jcmvbkbc - он должен знать с чем их едеят, но как всегда молчит - (это называется "автор поддержки call0 ABI в xtensa gcc" - по этому и молчит :) )
    wdtlb/witlb загружаются сразу по старту, в первых исполняемых кодах CPU из ROM...
    ---------
    WDT в SDK 1.1.0 теперь просто повешен на таймер и ему дано правильное название - SoftWdtTimer :)

    Логика работы WDTв SDK 1.1.0:

    По таймеру “SoftWdtTimer “ в pp_soft_wdt_feed () проверяется флаг ответа на запрос pp_post(12), если он ещё активен – то:

    Cache_Read_Disable();
    Cache_Read_Enable_New();
    system_restart_local(); // перезагрузка


    Если не активен, то выставляется флаг и вызывается pp_post(12) с ets_timer_arm_new(SoftWdtTimer, 1600, 0, 1). “1600” грузится из переменной в памяти для возможности изменения периода опроса.

    По событию “12” в task флаг сбрасывается (+ сбрасывается WDT).
    ---------
    Это extern void ets_wdt_enable(void); , к примеру в sming, неверно и несовместимо ни с одним из SDK ( от 0.9.5 по 1.1.0 точно).
    Во первых ets_wdt_enable(int wdt_mode, int a, in b) и wdt_mode 5 шт у ROM-BIOS - 0,1,2,3,4. int wdt_mode, int a, in b сохраняются в struct swdt_info.
    У ROM-BIOS другая логика работы с WDT и имеет разные варианты алгоритмов ...
    Есть три переменных сохраняемых в памяти в структуре wdt_info (RAM_BIOS:3FFFC708).
    Она примерно такая:
    struct swdt_info {
    int wdt_mode;
    int reg_WDT_REG1; // равны периоду в WDT_REG1 (но это пока не точно)
    int reg_WDT_REG2; // равны периоду в WDT_REG2 (но это пока не точно)
    } wdt_info;
    int ets_wdt_get_mode(); // возвращает wdt_mode из wdt_info.
    void ets_wdt_restore(int wdt_mode); // при параметре =0 не вызывает ets_wdt_enable() с параметрами из wdt_info
    void ets_wdt_init(void); // просто включает WDT и активирует прерывание wdt_timer_proc() в которой в зависимости от режима wdt_mode разная обработка
    void ets_wdt_disable(void); // рубит WDT и отключает wdt_timer_proc() в зависимости от режима wdt_mode
    По этой причине у всех горе писателей использующих copy-paste вечно всё падает по WDT. :)
    Реверс ROM-BIOS wdt.c в Web_Base\xlam\libs\bios\wdt.c
     
    Последнее редактирование: 26 май 2015
  11. jcmvbkbc

    jcmvbkbc Читатель

    Сообщения:
    179
    Симпатии:
    17
    pvvx, если вы забыли, почему я молчу в ответ на ваши реплики, я вам напомню: http://esp8266.ru/forum/threads/proekt-v-xtensa-xplorer.113/page-2#post-2404
    И на ваши вопросы я отвечу вам вашими же словами: "вы работайте, работайте".
    Сделайте милость, не упоминайте больше моего имени и не обращайтесь ко мне иначе как со смиренными просьбами.
    Пока вы продолжаете вести себя как говно я не рассматриваю вас как собеседника и никакой помощи от меня лично вы не получите.
     
    Последнее редактирование: 26 май 2015
  12. pvvx

    pvvx Активный участник сообщества

    Сообщения:
    10.251
    Симпатии:
    1.349
    Да гуляйте дальше и лучше лесом - вас заждались на esp8266.com с глупыми вопросами...
    А тут всё равно от вас толку никакого - одни ошибочные данные даете и обманываете народ :) А по процу всё есть в PDF от Tensilica, Inc. Надо только время найти почитать, чтобы сделать фичу "многих SDK в одной прошивке" для народу. А мне это не особо надо. По вашему заявлению данную тему про расширение "кэша" и загрузчика для "многих SDK в одной прошивке" со спокойной совестью полностью перекладываю на вас :) Вы успешно застолбили и это меcто :) Оно как раз теперь пахнет :)
     
    Последнее редактирование: 26 май 2015
  13. pvvx

    pvvx Активный участник сообщества

    Сообщения:
    10.251
    Симпатии:
    1.349
    Интересно - как можно по не инициализированному указателю что-либо писать (SDK1.1.0 libmmain.a: eagle_lwip_if.o) ?
    Bag_DSK1.1.0_eagle_lwip_if_alloc.gif
    Китайцы отключили у транслятора все варнинги?
     
  14. pvvx

    pvvx Активный участник сообщества

    Сообщения:
    10.251
    Симпатии:
    1.349
    @anakod - обновил Web_Base\app\main\eagle_lwip_if.c в своей свалке для совместимости с SDK 1.1.0.
    Все структуры Lwip китайцы сделали __attribute__((packed)). В eagle_lwip_if.c проставил смещения к обращаемым полям структур для сравнения с вашей конфигурацией Lwip, если будете адаптировать... заодно закиньте kadamski, если удастся...
    Адреса куда сохраняются указатели на память queue нашлись...
    Ошибку, указанную выше, не инициализированного указателя исправил как было проще.
     
  15. pvvx

    pvvx Активный участник сообщества

    Сообщения:
    10.251
    Симпатии:
    1.349
    Слепил минимальный тестовый загрузчик "OpenSDK no WiFi" c mem_manager, переключением на 80MHz CLK CPU, os_printf_plus(), os_sprintf_plus(), wdt, ets_timer_arm_us, exception и т.д. https://github.com/pvvx/SDKnoWiFi
    Код (Text):
    1.    Section|                   Description| Start (hex)|   End (hex)|Used space
    2. ------------------------------------------------------------------------------
    3.       data|        Initialized Data (RAM)|    3FFE8000|    3FFE8000|       0
    4.     rodata|           ReadOnly Data (RAM)|    3FFE8000|    3FFE8004|       4
    5.        bss|      Uninitialized Data (RAM)|    3FFE8008|    3FFE8030|      40
    6.       text|            Cached Code (IRAM)|    40100000|    4010037C|     892
    7. irom0_text|           Uncached Code (SPI)|    40240000|    40240548|    1352
    8. Total Used RAM : 44
    9. Free RAM : 81876
    10. Free IRam : 31894
    Использует всего 40 байт в bss, а 4 в rodata - это из-за ld. Т.е. загружать ROM-BIOS надо только одну секцию кодов, путем указания кол-ва секций = 0 в заголовке flash (второй байт с начала, после 0xE9). B итоге до старта user_init() после сброса чипа проходит менее 30ms. Это происходит за счет не вывода сообщений загрузчиком ROM-BIOS из-за ошибки и соответственно нет ожидания передачи символов в UART на 74880 baud, что при загрузке 3-х стандартных блоков дает длительную задержку и вызывает повышение потребления при использовании частых коротких просыпаний после deep_sleep для опроса датчиков...
    Тестовый лог из user_init():
    Код (Text):
    1.  ets Jan  8 2013,rst cause:2, boot mode:(3,6)
    2.  
    3.  
    4. OpenLoaderSDK v1.3
    5. Test 'SDK no WiFi'
    6. Heap size:    81848 bytes
    7. Bss size:    40 bytes
    8. Stack pointer:    0x3fffffb0
    9. ets_delay_us(1000) dt=1001
    10. ets_delay_us(10000) dt=10001
    11. ets_delay_us(100000) dt=100000
    Просто проверял соответствие ets_delay_us() и system_get_time().
    Можно дописывать всякие deep_sleep() и прочее... будут адаптированы и интегрированы к "OpenSDK no WiFi" позже...
     
    Последнее редактирование: 3 июн 2015
    Victor и JustACat нравится это.
  16. anakod

    anakod Moderator Команда форума

    Сообщения:
    314
    Симпатии:
    100
    Спасибо, будем изучать! Так приятно видеть полностью открытое, понятное и легко читаемое решение в отличии от кучи непонятных и часто глючных библиотек Espressif :)
    1. Поправьте, пожалуйста, кодировку файлов в редакторе, у Вас видимо cp1251, а надо UTF8 (если правильно понимаю). Иначе на гитхабе комментарии не читаются.
    2. Насколько много остается нерешенных задач для того чтобы под OpenSDK заработал WiFi? Как я понял Вы уже значительно расковыряли libphy?
    3. По концепции этого SDK, мне кажется, deep sleep обязательно нужен. Чтобы с датчиками полноценно работать.
    4. Я думаю было бы было бы интересно сочетание http://richard.burtons.org/2015/05/17/decompiling-the-esp8266-boot-loader-v1-3b3/ с OpenSDK. Но возможно оно и не требуется, т.к. здесь уже разобрано больше. С другой стороны задачи несколько разные и отчасти друг друга хорошо дополняют.
     
    Victor нравится это.
  17. pvvx

    pvvx Активный участник сообщества

    Сообщения:
    10.251
    Симпатии:
    1.349
    Он уже работает первые тесты прошел.
    Код (Text):
    1. ets Jan  8 2013,rst cause:2, boot mode:(3,7)
    2.  
    3.  
    4. OpenLoaderSDK v1.3
    5. Old reset: Deep_Sleep
    6. Test 'SDK no WiFi'
    7. Heap size:    81848 bytes
    8. Bss size:    40 bytes
    9. Stack pointer:    0x3fffffb0
    10. sys_deep_sleep 50000 us...
    11. <0>
    12. ets Jan  8 2013,rst cause:2, boot mode:(3,7)
    13.  
    14.  
    15. OpenLoaderSDK v1.3
    16. Old reset: Deep_Sleep
    17. Test 'SDK no WiFi'
    18. Heap size:    81848 bytes
    19. Bss size:    40 bytes
    20. Stack pointer:    0x3fffffb0
    21. sys_deep_sleep 50000 us...
    22. <0>
    23. ....
    Это с ноликом в заголовке Flash - ROM-BIOS не выводит соо загрузок.

    deep_sleep_50ms.gif
    А вот так тормозит UART на выводе символов ^^^ уже в тесте SDK.
    В итоге вышло до 30ms - загрузка SDK, далее 20 ms тупит UART на выводе отладки, 50ms deep_sleep(50000) и по новой. 50/50 нагрузка :).
    Глобально ещё не проверял - ошибок пока должно быть много - слеплено кое-как и пока не актуальны украшения и прочая бижутерия...
    С cp1251 надо какую-то опцию в git крутить, но пока тоже не до него :)
     
    Последнее редактирование: 4 июн 2015
  18. anakod

    anakod Moderator Команда форума

    Сообщения:
    314
    Симпатии:
    100
    Я думаю достаточно в текстовом редакторе в котором работаете Вы сменить кодировку. Если в эклипсе, то File -> Properties -> Encoding
    И глобально вероятно нужно ее изменить чтобы все новые были в стандартном UTF8.
     
  19. pvvx

    pvvx Активный участник сообщества

    Сообщения:
    10.251
    Симпатии:
    1.349
    Я работаю в FAR и в Eclipse и под win - у них всё хорошо с 1251. В git тоже 1251 всё читается и принимается. Не работает только отображение в браузере. Для этого необходимо дать опцию локальному git передавальшику/принимальщику при приеме-передаче перекодировать в КОИ8. Но лень копаться (c первого раза не вышло), а описания как это настроить в инет все старые и не катят для новых git. Часть файлов перекодируется - например txt, а вот си коменты и прочее не хочет. Надо искать опцию и где она пихается. Она точно есть.
     
  20. anakod

    anakod Moderator Команда форума

    Сообщения:
    314
    Симпатии:
    100
    КОИ8 тут вряд ли поможет. Мне кажется Вы зря не хотите переходить на UTF8, сейчас это повсеместный стандарт. Да и для международного проекта самое правильное решение :)

    UPD Просто я, например, как раз с браузера люблю репозитории просматривать, и думаю таких много.
     

Поделиться этой страницей