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

BLE SoC PHY6202

cool2000

Member
Перед сравнением результат всегда приводится к большей разрядности.
Литералы кажется всегда int со знаком или без.
 

cool2000

Member
The integer promotion rules say that any integer type narrower than int which appears as an operand of + is promoted to int (not unsigned int).
 

pvvx

Активный участник сообщества
Тогда второй вопрос - зачем adds ? Почему не add?
 

cool2000

Member
Ну так там int ota_adr_index, а здесь uint16_t pkt_index
pvvx написал(а):
Тогда второй вопрос - зачем adds ? Почему не add?
В данном случае это не важно. Разница только в том, что adds дополнительно выставляет флаги. Насколько я понимаю, gcc, использует add только для операций с индексными регистрами, стеком, счётчиком команд.
 

pvvx

Активный участник сообщества
Т.е. чтобы больше погонять заряды в CPU и увеличить потребление. Понятно.
 

pvvx

Активный участник сообщества
До нормального кодогенератора там далеко...
В общем осталась только эта опшибка... Скоро испытаю OTA, т.к. накалякал-дописал js для текущей версии OTA с id "РНY6"...
 

pvvx

Активный участник сообщества
hal_flash_write() и потом hal_flash_read() не работает - читает старый кэш.
Команда AP_PCR->CACHE_BYPASS = 0; и прочие (вставлял и WaitMs(20) - не помогают.
Остальное, если убрать проверку записи - работает (не пока не выкладывал)
То что я там накрутил в js, пригодится?
да, наверняка пригодится, когда буду раскрашивать...
 

cool2000

Member
Команда AP_PCR->CACHE_BYPASS = 0;
Вроде вот такая должна быть последовательность:
C:
    AP_CACHE->CTRL0 = 0x02;
    AP_PCR->CACHE_RST = 0x02;
    AP_PCR->CACHE_BYPASS = 1;
Defines из SDK:
C:
#define HAL_CACHE_ENTER_BYPASS_SECTION()  do{ \
        HAL_ENTER_CRITICAL_SECTION();\
        AP_CACHE->CTRL0 = 0x02; \
        AP_PCR->CACHE_RST = 0x02;\
        AP_PCR->CACHE_BYPASS = 1;    \
        HAL_EXIT_CRITICAL_SECTION();\
    }while(0);
#define HAL_CACHE_EXIT_BYPASS_SECTION()  do{ \
        HAL_ENTER_CRITICAL_SECTION();\
        AP_CACHE->CTRL0 = 0x00;\
        AP_PCR->CACHE_RST = 0x03;\
        AP_PCR->CACHE_BYPASS = 0;\
        HAL_EXIT_CRITICAL_SECTION();\
    }while(0);
 

pvvx

Активный участник сообщества
См. hal_flash_read() -> если записать AP_PCR->CACHE_BYPASS=0 отрабатывает ваши команды.
Фиг его знает - может он ещё запись кэширует....

Работает так - если чип заснул, то кэш XIP обновляется гарантированно. Надо немного поменять алгоритм - проверять CRC32 на всю запись OTA в конце, по команде CMD_OTA_END.
 

pvvx

Активный участник сообщества
Запись проходит без проблем.
Лог с проверкой после каждого блока что говорят переменные ota, но без проверки записи каждого кусочка (16 байт):
Код:
Старт DFU
OTA send: 00ff
OTA read: ver: 01, err: 0, dbg: 0, start: 0, offs: 0x11010020, idx: 0x0010, total: 0x0011, crc: 0xC012FD5E
OTA send: 01ff20000111504859361200
OTA read: ver: 01, err: 0, dbg: 0, start: 1, offs: 0x11010020, idx: 0xFFFF, total: 0x0012, crc: 0xC012FD5E
OTA send: 0000504859360100000020000111100100004388
OTA read: ver: 01, err: 0, dbg: 0, start: 1, offs: 0x11010020, idx: 0x0000, total: 0x0012, crc: 0x557AB31D
OTA send: 010020010000f00000002000011100000000440b
OTA read: ver: 01, err: 0, dbg: 0, start: 1, offs: 0x11010020, idx: 0x0001, total: 0x0012, crc: 0xD52EEB28
OTA send: 020000000000000000000000000000000000d05c
OTA read: ver: 01, err: 0, dbg: 0, start: 1, offs: 0x11010020, idx: 0x0002, total: 0x0012, crc: 0x04517BB9
OTA send: 03000000000000000000000000000000000081a0
OTA read: ver: 01, err: 0, dbg: 0, start: 1, offs: 0x11010020, idx: 0x0003, total: 0x0012, crc: 0xD28B9AE6
OTA send: 04000000000000000000000000000000000030d5
OTA read: ver: 01, err: 0, dbg: 0, start: 1, offs: 0x11010020, idx: 0x0004, total: 0x0012, crc: 0x5E306857
OTA send: 0500000000000000000000000000000000006129
OTA read: ver: 01, err: 0, dbg: 0, start: 1, offs: 0x11010020, idx: 0x0005, total: 0x0012, crc: 0xE0ADC600
OTA send: 060000000000000000000000000000000000916d
OTA read: ver: 01, err: 0, dbg: 0, start: 1, offs: 0x11010020, idx: 0x0006, total: 0x0012, crc: 0xF1F2471C
...
Потом читается всё ok.
 

pvvx

Активный участник сообщества
Тормоз ещё тот:
Код:
29:29: Поиск устройств
29:31: Connecting to: BTH01-31BDBC
29:31: OTA: FF010100200001111100120050485936E5394CC0
29:31: DevCfg: 000000001F501D000206B400
29:31: Устройство подключено.
29:33: Файл:
29:33: PHY6 OTA ID: 36594850, Сегментов: 1, Старт: 0x11010000, Размер: 20304 байт
29:33: Размер файла: 20308 байт
29:33: Счетчик: 1270
29:46: Старт программирования...
31:56: Программирование завершено за 129.404 секунд
Интервал соединения 30 ms (поставил по рекомендациям Огрызков (Apple) - кратное 15 ms)
1705714658275.png
Порядок среднего тока ~0.45 мА
Стирание сектора:
1705714689880.png
В TLSR825x - интервал 20 ms но OTA во много раз быстрее, хотя CPU там полный тормоз с очень мелкой кэш XIP. (Ср.ток 1 мА)
 

pvvx

Активный участник сообщества
Походу вроде всё с OTA. Есть загрузка без параметров (т.е. всё по умолчанию) и с заданием всех параметров...

Нужен новый ota_app_phy62x2.ld, который должен линковать всё в один бинарник с заголовками.
Заголовок – это app_info_t. За ним следует таблица сегментов app_info_seg_t. Далее, включая заголовок и таблицу сегментов - это скорее всего сегмент кода XIP. Затем сегменты данных.
Адрес записи APP_OTA – 0x11010000. В исходниках всё описано... Пользовательские инструкции - потом, после раскраски имеющегося...
Запустить Boot_OTA из APP_OTA можно путем записи в спец. регистр и софт-перезагрузке.
Если записали какую ерунду вместо APP_OTA – держим кнопку и включаем питание – запустится Boot_OTA.
 

pvvx

Активный участник сообщества
@cool2000 - пора раскрашивать...
OTA работает, минимальный набор функций настроек тоже работает, но не нарисованы в html.
Ошибки в js в загрузке файла оставил (не исправлял) - дублирует при повторе...
Вылечил скорость OTA - теперь около 1 килобайта в сек.
 
Сверху Снизу