• Система автоматизации с открытым исходным кодом на базе esp8266/esp32 микроконтроллеров и приложения IoT Manager. Наша группа в Telegram

JTAG, Xtensa OCD Daemon …

pvvx

Активный участник сообщества
Тогда смело увеличивайте тайм-аут до 5 секунд.
А тормозит тут не программирование SPI FLASH, а передача данных на ESP8266 через JTAG. Тут от нас мало что зависит, т.к. этот процесс управляется xt-ocd.
Меняйте общий алгоритм :) Иначе это никуда не годится...
 

vphys

New member
Дело не в алгоритме, а в скорости JTAG и количестве циклов, необходимых для записи одного значения в память.
 

pvvx

Активный участник сообщества
Дело не в алгоритме, а в скорости JTAG и количестве циклов, необходимых для записи одного значения в память.
200 к в сек из которых основное время (вроде более 80% по памяти когда считал) - стирание сектора/блока flash. Во время стирания тоже можно работать.
Нерешаемых задач не бывает. Есть только некомпетенция :)
Если я сегодня не знаю как это решить, значит в данный момент не имею по данному вопросу всей необходимой информации...
 
Последнее редактирование:

jcmvbkbc

New member
binutils и gcc в новых версиях включают все необходимые патчи.
В gcc-5.2 нет этого патча: https://github.com/jcmvbkbc/gcc-xtensa/commit/d945a7ebcc1af6e21580b34b5b83f3a0178df0b7 , а binutils-2.24 -- не последняя версия.

gdb в последний момент поменяли на 7.5.1, т.к. 7.9.1 рассчитывает на регистры, которых нет в esp8266.
Можно об этом поподробнее?
 

vphys

New member
Значит его нет в основном дереве. Пинайте maintiner-ов gcc, чтобы включили. Если он исправляет какую-то критичную ошибку, мы можем его добавить в следующий билд.
Про регистры мы детально не смотрели, можете сравнить список определений в 7.5.1 и 7.9.1 и станет ясно, чего там не хватает.

200 к в сек из которых основное время (вроде более 80% по памяти когда считал) - стирание сектора/блока flash. Во время стирания тоже можно работать.
Нерешаемых задач не бывает. Есть только некомпетенция :)
Если я сегодня не знаю как это решить, значит в данный момент не имею по данному вопросу всей необходимой информации...
Посмотрите через timing panel. Основное время обычно уходит на выполнение команды "restore", которая копирует память по JTAG в SRAM. SRAM=>FLASH, как раз, работает быстро. Решить можно всё, но решать всё - непрактично. Пока приоритеты другие - те же hardware registers.

Кстати, вот подробный пример многопоточного web-сервера на RTOS SDK, позволяющего управлять светодиодом и реле из браузера: http://visualgdb.com/tutorials/esp8266/relay/
 

pvvx

Активный участник сообщества
Кстати, вот подробный пример многопоточного web-сервера на RTOS SDK, позволяющего управлять светодиодом и реле из браузера: http://visualgdb.com/tutorials/esp8266/relay/
Это не интересно, т.к. у вас там всё в закрытых китай-баг-либах. А моё Web-свалка с остатками только закрытой китай-части по WiFi управляет всем и одновременно держит десятки клиентов :)
 
Последнее редактирование:

jcmvbkbc

New member
Про регистры мы детально не смотрели, можете сравнить список определений в 7.5.1 и 7.9.1 и станет ясно, чего там не хватает.
Список определений регистров у них идентичный, потому что он берётся из конфигурационного оверлея, который один общий.
 

pvvx

Активный участник сообщества
Не понял, что особенного в распечатке регистров. В VisualGDB ее тоже можно посмотреть через Debug->Windows->Registers или через watch.
Missing.gif
Почему частота процессора при старте кода в IRAM в вашей среде 160 MHz? Кварц у меня на модуле 26 MHz -> после старта ROM-BIOS должно быть 52 MHz.
Код:
Start Test
Start CLK CPU 160 MHz !!!
CLK CPU 52 MHz
i/o bus 1 read time: 22 tCPU, 0 tik, 0 rtc
i/o bus 1000 read time: 34015 tCPU, 425 tik, 114 rtc
i/o bus 1 write time: 11 tCPU, 0 tik, 1 rtc
i/o bus 1000 write time: 22015 tCPU, 288 tik, 76 rtc
i/o bus 0 while time: 1 tCPU, 0 tik, 0 rtc
i/o bus 1000 while time: 4004 tCPU, 51 tik, 13 rtc
CLK CPU 104 MHz
i/o bus 1 read time: 27 tCPU, 0 tik, 1 rtc
i/o bus 1000 read time: 38016 tCPU, 238 tik, 64 rtc
i/o bus 1 write time: 11 tCPU, 0 tik, 0 rtc
i/o bus 1000 write time: 22015 tCPU, 144 tik, 38 rtc
i/o bus 0 while time: 1 tCPU, 0 tik, 0 rtc
i/o bus 1000 while time: 4004 tCPU, 26 tik, 7 rtc
CLK CPU 80 MHz
i/o bus 1 read time: 22 tCPU, 1 tik, 0 rtc
i/o bus 1000 read time: 34015 tCPU, 425 tik, 74 rtc
i/o bus 1 write time: 11 tCPU, 1 tik, 0 rtc
i/o bus 1000 write time: 22015 tCPU, 288 tik, 50 rtc
i/o bus 0 while time: 1 tCPU, 0 tik, 1 rtc
i/o bus 1000 while time: 4004 tCPU, 50 tik, 9 rtc
CLK CPU 160 MHz
i/o bus 1 read time: 27 tCPU, 0 tik, 0 rtc
i/o bus 1000 read time: 38016 tCPU, 238 tik, 41 rtc
i/o bus 1 write time: 11 tCPU, 0 tik, 0 rtc
i/o bus 1000 write time: 22015 tCPU, 144 tik, 25 rtc
i/o bus 0 while time: 1 tCPU, 0 tik, 0 rtc
i/o bus 1000 while time: 4004 tCPU, 25 tik, 5 rtc
Код:
#ifdef __cplusplus
extern "C"
{
#endif

#include <c_types.h>
//#include <eagle_soc.h>

    extern void uart_div_modify(uint32 uart_num, uint32 div_baud);
    extern void ets_delay_us(uint32 us);
    extern int ets_printf(const char *format, ...);
    extern int ets_uart_printf(const char *format, ...);
    extern void ets_update_cpu_frequency(uint32_t clk_mhz);
    extern uint32 ets_get_cpu_frequency(void);
    extern void rom_i2c_writeReg(uint32 block, uint32 host_id, uint32 reg_add, uint32 data);
    extern void ets_run(void);

#define system_get_time() (*((volatile uint32 *)(0x3FF20C00)))
#define printf ets_uart_printf

#define GET_CCOUNT(x) __asm__ __volatile__("rsr.ccount %0" : "=r"(x))
#define GET_PS(x) __asm__ __volatile__("rsr.ps %0" : "=r"(x))


#define CLK_PRE_PORT    (*((volatile uint32 *)(0x3FF00014)))
#define UART0_CLKDIV    (*((volatile uint32 *)(0x60000014)))
#define    GPIO_IN            (*((volatile uint32 *)(0x60000318)))
#define    IO_RTC_4        (*((volatile uint32 *)(0x60000710)))
#define    IO_RTC_SLP_CNT_VAL    (*((volatile uint32 *)(0x6000071C)))


#ifdef __cplusplus
}
#endif

void  read_io_test(uint32 i)
{
    uint32_t t1, t2, y = i;
    ets_delay_us(1000);
    if (i == 1) {
        GET_CCOUNT(t1);
        GPIO_IN;
        GET_CCOUNT(t2);
    }
    else {
        GET_CCOUNT(t1);
        while (y--) GPIO_IN;
        GET_CCOUNT(t2);
    }
    printf("i/o bus %u read time: %u tCPU,", i, t2 - t1);
    ets_delay_us(1000);
    if (i == 1) {
        t1 = system_get_time();
        GPIO_IN;
        t2 = system_get_time();
    }
    else {
        y = i;
        t1 = system_get_time();
        while (y--) GPIO_IN;
        t2 = system_get_time();
    }
    printf(" %u tik,", t2 - t1);
    ets_delay_us(1000);
    if (i == 0) {
        t1 = IO_RTC_SLP_CNT_VAL;
        GPIO_IN;
        t2 = IO_RTC_SLP_CNT_VAL;
    }
    else {
        y = i;
        t1 = IO_RTC_SLP_CNT_VAL;
        while (y--) GPIO_IN;
        t2 = IO_RTC_SLP_CNT_VAL;
    }
    printf(" %u rtc\n", t2 - t1);

    ets_delay_us(1000);
}

void write_io_test(uint32 i)
{
    uint32_t t1, t2, y = i;
    uint32 x = GPIO_IN;
    ets_delay_us(1000);
    if (i == 1) {
        GET_CCOUNT(t1);
        GPIO_IN = x;
        GET_CCOUNT(t2);
    }
    else {
        GET_CCOUNT(t1);
        while (y--) GPIO_IN = x;
        GET_CCOUNT(t2);
    }
    printf("i/o bus %u write time: %u tCPU,", i, t2 - t1);
    ets_delay_us(1000);
    if (i == 1) {
        t1 = system_get_time();
        GPIO_IN = x;
        t2 = system_get_time();
    }
    else {
        y = i;
        t1 = system_get_time();
        while (y--) GPIO_IN = x;
        t2 = system_get_time();
    }
    printf(" %u tik,", t2 - t1);
    ets_delay_us(1000);
    if (i == 1) {
        t1 = IO_RTC_SLP_CNT_VAL;
        GPIO_IN = x;
        t2 = IO_RTC_SLP_CNT_VAL;
    }
    else {
        y = i;
        t1 = IO_RTC_SLP_CNT_VAL;
        while (y--) GPIO_IN = x;
        t2 = IO_RTC_SLP_CNT_VAL;
    }
    printf(" %u rtc\n", t2 - t1);
    ets_delay_us(1000);
}

void __attribute__((optimize("O1"))) while_test(uint32 i)
{
    uint32_t t1, t2, y = i;
    uint32 x = GPIO_IN;
    ets_delay_us(1000);
    if (i == 0) {
        GET_CCOUNT(t1);
        GET_CCOUNT(t2);
    }
    else {
        GET_CCOUNT(t1);
        while (y--)
            ;
        GET_CCOUNT(t2);
    }
    printf("i/o bus %u while time: %u tCPU,", i, t2 - t1);
    ets_delay_us(1000);
    if (i == 0) {
        t1 = system_get_time();
        t2 = system_get_time();
    }
    else {
        y = i;
        t1 = system_get_time();
        while (y--)
            ;
        t2 = system_get_time();
    }
    printf(" %u tik,", t2 - t1);
    ets_delay_us(1000);
    if (i == 0) {
        t1 = IO_RTC_SLP_CNT_VAL;
        t2 = IO_RTC_SLP_CNT_VAL;
    }
    else {
        y = i;
        t1 = IO_RTC_SLP_CNT_VAL;
        while (y--)
            ;
        t2 = IO_RTC_SLP_CNT_VAL;
    }
    printf(" %u rtc\n", t2 - t1);
    ets_delay_us(1000);
}

void tests(void)
{
    ets_delay_us(1000);
    printf("CLK CPU %u MHz\n", ets_get_cpu_frequency());
    read_io_test(1);
    read_io_test(1000);
    write_io_test(1);
    write_io_test(1000);
    while_test(0);
    while_test(1000);
    ets_delay_us(1000);
}

// void call_user_start(void)
int main()
{
    // CLK CPU 52 MHz ???
    IO_RTC_4 = 0; // отключить WiFi
    // ets_update_cpu_frequency(52);

    UART0_CLKDIV = ((ets_get_cpu_frequency()  * 1000000) >> (CLK_PRE_PORT & 1)) / 115200;
    ets_delay_us(1000);
    printf("\n\n\nStart Test\n");
    printf("Start CLK CPU %u MHz !!!\n", ets_get_cpu_frequency());
    ets_delay_us(1000);

    // CLK CPU 52 MHz !!!
    CLK_PRE_PORT &= ~1;
    rom_i2c_writeReg(103, 4, 1, 8);
    rom_i2c_writeReg(103, 4, 2, 129);
    ets_update_cpu_frequency(52);
    UART0_CLKDIV = ((ets_get_cpu_frequency()  * 1000000) >> (CLK_PRE_PORT & 1)) / 115200;

    tests();

    // CLK CPU 104 MHz
    CLK_PRE_PORT |= 1;
    ets_update_cpu_frequency(52 * 2);

    tests();

    // CLK CPU 80 MHz
    CLK_PRE_PORT &= ~1;
    ets_delay_us(1000);
    rom_i2c_writeReg(103, 4, 1, 136);
    rom_i2c_writeReg(103, 4, 2, 145);
    ets_update_cpu_frequency(80);
    UART0_CLKDIV = ((ets_get_cpu_frequency()  * 1000000) >> (CLK_PRE_PORT & 1)) / 115200;

    tests();

    // CLK CPU 160 MHz
    CLK_PRE_PORT |= 1;
    ets_update_cpu_frequency(80 * 2);

    tests();

    while (1)
        ;
//    ets_run();
}
-mno-serialize-volatile
Кошмарная среда в VS - чтобы задать опции трансляции на каждый СИ файл свои повеситься проще...
 
Последнее редактирование:

jcmvbkbc

New member
Только много кода из 7.9 (например, unwinder) ссылается на регистры, которых нет в ESP8266.
По-прежнему не хватает подробностей, ну да ладно.
gdb-7.9.1 нормально собирается вот этой версией crosstool-NG: https://github.com/jcmvbkbc/crosstool-NG/tree/lx106-g++-1.21.0
Никаких дополнительных патчей, помимо тех, что использовались для 7.5 там нет.
 

vphys

New member
По-прежнему не хватает подробностей, ну да ладно.
gdb-7.9.1 нормально собирается вот этой версией crosstool-NG: https://github.com/jcmvbkbc/crosstool-NG/tree/lx106-g++-1.21.0
Никаких дополнительных патчей, помимо тех, что использовались для 7.5 там нет.
ОК, подробности:
Список регистров в 7.5.1:
Код:
a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, pc, sar, litbase, sr176, sr208, ps, mmid, ibreakenable, ddr, ibreaka0, dbreaka0, dbreakc0, epc1, epc2, epc3, depc, eps2, eps3, excsave1, excsave2, excsave3, interrupt, intset, intclear, intenable, vecbase, exccause, debugcause, ccount, prid, icount, icountlevel, excvaddr, ccompare0, psintlevel, psum, psexcm, litbaddr, litben
Список регистров в 7.9.1:
Код:
pc,  ar0,ar1,ar2,ar3,ar4,ar5,ar6,ar7,ar8,ar9,ar10,ar11,ar12,ar13,ar14,ar15,ar16,ar17,ar18,ar19,ar20,ar21,ar22,ar23,ar24,ar25,ar26,ar27,ar28,ar29,ar30,ar31,lbeg,lend,lcount,sar,litbase,windowbase,windowstart,sr176,sr208,ps,threadptr,scompare1,ptevaddr,mmid,rasid,itlbcfg,dtlbcfg,ibreakenable,ddr,ibreaka0,ibreaka1,dbreaka0,dbreaka1,dbreakc0,dbreakc1,epc1,epc2,epc3,epc4,epc5,epc6,epc7,depc,eps2,eps3,eps4,eps5,eps6,eps7,excsave1,excsave2,excsave3,excsave4,excsave5,excsave6,excsave7,cpenable,interrupt,intset,intclear,intenable,vecbase,exccause,debugcause,ccount,prid,icount,icountlevel,excvaddr,ccompare0,ccompare1,ccompare2,misc0,misc1,a0,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15,psintlevel,psum,pswoe,psring,psexcm,pscallinc,psowb,litbaddr,litben,dbnum,asid3,asid2,asid1,instpgszid4,datapgszid4,ptbase
Соответственно, xt-ocd возвращает блок регистров в формате, ожидаемом в 7.5.1 и 7.9.1 его распарсить не сможет. Если заменить его вручную на список из 7.5.1, то unwinder из 7.9.1 будет ругаться на отсутствующие WR, WS и AR. Насколько стабильно будет взять tdep и компанию из 7.5.1 и собрать их с 7.9.1 я не смотрел. Возможно, заработает. Возможно, начнет произвольно глючить.
 

jcmvbkbc

New member
ОК, подробности:
Список регистров в 7.5.1:
Код:
a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, pc, sar, litbase, sr176, sr208, ps, mmid, ibreakenable, ddr, ibreaka0, dbreaka0, dbreakc0, epc1, epc2, epc3, depc, eps2, eps3, excsave1, excsave2, excsave3, interrupt, intset, intclear, intenable, vecbase, exccause, debugcause, ccount, prid, icount, icountlevel, excvaddr, ccompare0, psintlevel, psum, psexcm, litbaddr, litben
Список регистров в 7.9.1:
Код:
pc,  ar0,ar1,ar2,ar3,ar4,ar5,ar6,ar7,ar8,ar9,ar10,ar11,ar12,ar13,ar14,ar15,ar16,ar17,ar18,ar19,ar20,ar21,ar22,ar23,ar24,ar25,ar26,ar27,ar28,ar29,ar30,ar31,lbeg,lend,lcount,sar,litbase,windowbase,windowstart,sr176,sr208,ps,threadptr,scompare1,ptevaddr,mmid,rasid,itlbcfg,dtlbcfg,ibreakenable,ddr,ibreaka0,ibreaka1,dbreaka0,dbreaka1,dbreakc0,dbreakc1,epc1,epc2,epc3,epc4,epc5,epc6,epc7,depc,eps2,eps3,eps4,eps5,eps6,eps7,excsave1,excsave2,excsave3,excsave4,excsave5,excsave6,excsave7,cpenable,interrupt,intset,intclear,intenable,vecbase,exccause,debugcause,ccount,prid,icount,icountlevel,excvaddr,ccompare0,ccompare1,ccompare2,misc0,misc1,a0,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15,psintlevel,psum,pswoe,psring,psexcm,pscallinc,psowb,litbaddr,litben,dbnum,asid3,asid2,asid1,instpgszid4,datapgszid4,ptbase
А, ну понятно. Рекомендую ознакомиться с этим: http://wiki.linux-xtensa.org/index.php/Toolchain_Overlay_File
И с этим: https://github.com/jcmvbkbc/crosstool-NG/tree/lx106-g++-1.21.0/overlays
 

vphys

New member
Спасибо, похоже мы не скопировали xtensa-config.h. Попробуем тогда собрать 7.9.1 с вашими overlays...
Кстати, если я не ошибаюсь, Вы собрали xt-ocd.exe, выложенный на форуме? Там есть определенные глюки с поддержкой FT2232. Вы не знаете, кто занимается поддержкой этого билда, или может дать доступ к исходникам под NDA, чтобы мы могли поправить этот глюк?
 

jcmvbkbc

New member
Спасибо, похоже мы не скопировали xtensa-config.h.
Скорее gdb/xtensa-config.c...

Кстати, если я не ошибаюсь, Вы собрали xt-ocd.exe, выложенный на форуме?
Нет, я только повторно выложил то, что собрал Vladimir Uzelac.

Там есть определенные глюки с поддержкой FT2232. Вы не знаете, кто занимается поддержкой этого билда, или может дать доступ к исходникам под NDA, чтобы мы могли поправить этот глюк?
На мой взгляд логичнее было бы довести до ума порт openocd: https://github.com/projectgus/openocd
Но ок, я узнаю возможно ли поковыряться в xt-ocd и на каких условиях, и сведу вас.
 

vphys

New member
Скорее gdb/xtensa-config.c...
На мой взгляд логичнее было бы довести до ума порт openocd: https://github.com/projectgus/openocd
Но ок, я узнаю возможно ли поковыряться в xt-ocd и на каких условиях, и сведу вас.
Спасибо. OpenOCD я смотрел - там нет нескольких простых, но важных вещей типа software breakpoints и нормальной трансляции событий в GDB-сигналы. По моим прикидкам, работы где-то от 2х дней до недели, но времени на это сейчас катастрофически не хватает. Если у Вас или кого-то из знакомых есть время с этим поковыряться, мы это можем оплатить при условиии, что на выходе будет стабильный тул, не отличающийся по user experience от версии под ARM. Напишите в личку, если есть такая возможность.

Также буду очень благодарен за контакты по xt-ocd.
 

rojer

Разработчик Smart.js
Команда форума
джентельмены (и леди, если есть), извините что врываюсь, но я смотрю, что здесь все нужные люди собрались.
прочитал тред, но пока не смог составить общую картину - что у нас на данный момент с JTAG и GDB под нашу любимую ESP8266?
у меня имеется FT2232, подключённая к JTAG ногам ESP, GDB, собранный из lx106-g++-1.21.0 и openocd из projectgus/openocd.
конфиг я слепил, оно иногда останавливается и даже показывает какой-то бэктрейс, но орёт благим матом и не ставит бряки ("software breakpoints not enabled").
я вижу, что vphys барыжит неким коммерческим софтом, который вроде как умеет больше. это не очень интересно, особенно если под винду.
есть некий бюджет времени на ковыряние, хотелось бы допилить openocd, for great justice. не подскажете, в какую сторону копать?
заранее спасибо!
 

vphys

New member
джентельмены (и леди, если есть), извините что врываюсь, но я смотрю, что здесь все нужные люди собрались.
прочитал тред, но пока не смог составить общую картину - что у нас на данный момент с JTAG и GDB под нашу любимую ESP8266?
у меня имеется FT2232, подключённая к JTAG ногам ESP, GDB, собранный из lx106-g++-1.21.0 и openocd из projectgus/openocd.
конфиг я слепил, оно иногда останавливается и даже показывает какой-то бэктрейс, но орёт благим матом и не ставит бряки ("software breakpoints not enabled").
я вижу, что vphys барыжит неким коммерческим софтом, который вроде как умеет больше. это не очень интересно, особенно если под винду.
есть некий бюджет времени на ковыряние, хотелось бы допилить openocd, for great justice. не подскажете, в какую сторону копать?
заранее спасибо!
Да, OpenOCD требует допиливания, а именно:
1. Hardware breakpoint-ы работают, но где-то в одном случае из 10 он их пропускает и программа сыпится. Надо это поймать, исправить и сделать тест (скрипт с breakpoint-ом в цикле, который должен остановиться и нормально продолжиться 100 раз подряд).
2. Нужно имплементировать software breakpoints (запись инструкции в память, разобраться с выравниванием).
3. Нужно починить single stepping. Команды step,next и finish должны работать, как в обычном линуксовом gdb. Чутье подсказывает, что openocd репортит неправильный сигнал, в результате чего gdb воспринимает это не как step complete или breakpoint hit, а как unknown exception и прекращает step. Нужно это понять и починить.

Результат нужно будет опубликовать на github в нашем подразделе. Если хотите взяться, сбросьте свой email в личку, обсудим конкретные условия, формальное ТЗ и оплату.
 

wbeam

New member
без буквы H - тормоза (USB не 480Mb/s, а 12). Если собирать самому на FT - то это обычно jtagkey. По тому выбор не широк...
http://elk.informatik.fh-augsburg.de/hhweb/doc/openocd/usbjtag/img/jtagkey-schema.jpg
http://anoda.cocolog-nifty.com/photos/uncategorized/2011/12/08/jtag_key.png
там схема для буквы L как раз, а для H такой схемы у вас не найдётся?
 

CHERTS

Moderator
Команда форума
Если кому интересно, мы-таки допилили OpenOCD для ESP8266: http://github.com/sysprogs/esp8266-openocd
Было бы интересно, если наряду с исходниками Вы бы выложили хотя бы здесь бинарные сборки под Windows и Linux, потому как собрать OpenOCD под Windows это какой то ад, у меня банально не получилось, просидел пару дней и толку нуль.
 
Сверху Снизу