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

BLE SoC PHY6202

pvvx

Активный участник сообщества
memset(x, 0, sizeof(x)) оно само вставит, если x[2] = {};
Это в случае примера, а структура может быть получена от куда угодно.
 

cool2000

Member
Придется вручную считать размер структур и писать #define size_этой_стркутуры 5.
Вручную не обязательно, если очень нужно задать реальный занимаемый размер, то можно придумать что-то вроде такого:
C:
typedef struct __aaa {
    uint32_t a;
    uint8_t  b;
} aaa_t

#define struct_size(__typedef, __last_member) (offsetof(__typedef, __last_member) + sizeof(__typedef.__last_member)

aaa_t x, y;
x.a = 1;
x.b = 2;
y.a = 1;
y.b = 2;

memcmp(&x, &y, struct_size(aaa_t, b));
 

cool2000

Member
Рабочий вариант:#define struct_size(__var, __member) (offsetof(typeof(__var), __last_member) + sizeof(__var.__member))
C:
typedef struct __aaa {
    uint32_t a;
    uint8_t  b;
} aaa_t;

        aaa_t x, y;
        x.a = 25;
        x.b = 30;
        y.a = 15;
        y.b = 20;
        return memcmp(&x, &y, struct_size(x, b));
Код:
        return memcmp(&x, &y, struct_size(x, b));
11020d80:    2205          movs    r2, #5
        y.b = 20;
11020d82:    3305          adds    r3, #5
11020d84:    710b          strb    r3, [r1, #4]
        return memcmp(&x, &y, struct_size(x, b));
11020d86:    f006 fd6f     bl    11027868 <__memcmp_veneer>
Получаем sizeof(aaa_t) => 8, сравниваемый размер 5 байт.
 

pvvx

Активный участник сообщества
Набил предварительный код OTA, но ещё ни разу не собиравшийся и не состыкованный с общим. Аналогично к нему уже есть куски и в HTML/js, которые надо немного адаптировать. Пока нет времени на PHY62x2.
Позволяет грузить в любой адрес и кусками. Подпись на любой кусок ставит после успеха.
Может, чтобы не плодить прошивки, при старте грузить промежуточный загрузчик? Он смотрит, если есть корректный образ OTA в верхних адресах, то его переписывает, в противном случае запускает App.
Код такого загрузчика тоже уже набил, но не проверял и не выкладывал в git, т.к. надо лепить свою разметку загружаемого файла. Как и в любом другом случае.
И он идет и в загрузчик с OTA.
Причина загрузчика с OTA - убогость данного SoC и Cortex M0.
При наличии загрузчика с OTA пользователю будет невозможно "окирпичить" устройство, путем заливки любого OTA. По старту с кнопкой вылезет загрузчик...
Но основная причина в том, что для работы OTA желательно весь код, всю прошивку, исполнять из RAM. Это значит всегда включена вся retention RAM и потребление сна большое.
Вам это надо в рабочем проекте?
 

pvvx

Активный участник сообщества
Остается задача ужать код OTA загрузчика до минимума. Т.к. не требуется переписывания загруженного OTA в рабочую область, то объем “свободной” Flash в таком случае будет больше. Но появляется проблема с внешними BT адаптерами – работа с разными характеристиками устройства под одним MAC. Надо глядеть как в SDK отрабатывает специально сделанный для этого UUID, указывающий, что таблица характеристик изменилась…

Короче нужно решить ещё много разнообразных мелочей для нормальной работы OTA и прочего.
Но сторонней помощи нет никакой и времени тоже - я не занимаюсь только этим проектом...
 

pvvx

Активный участник сообщества
Добавил -munaligned-access к ключам компиляции, gcc начал выдавать warning: target CPU does not support unaligned accesses.
Уж проще написать обработку прерывания исключения, по типу как в ESP8266 . Тогда будет читать любой unalign, но долго :)

И где раскрашенный HTML с OTA? Пора проверять и отлаживать OTA - все коды линкованы...
 

cool2000

Member
Подкинул CSS
HTML:
  <html class="telFlasherClass"><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <link rel="stylesheet" href="styles.css">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
PHY62x2-BTHome тест версия.png
 

pvvx

Активный участник сообщества
Это упрощенный вариант - сделан чисто из отладочной версии.
А ХоТчется что-то в виде страничек-закладок как в большом эксплорере :)
На крайний случай как меню роутеров...
 

pvvx

Активный участник сообщества
По поводу закладок, можно пример, или что где д.б.?
Мне нужен только пример. Далее кое как раскидаю сам. Потом разрисуем.
Я тут полдня опять со снегом борюсь снегоуборщиком... Дорога к гаражу только 50 метров... :)
 

pvvx

Активный участник сообщества
@cool2000 - объясните, пожалуйста, почему у меня это не работает?
C:
uint16_t ota_adr = pmsg[0] | (pmsg[1] << 8);

// ota.pkt_index - тоже объявлен uint16_t и инициализирован 0xffff (-1)
...
if (ota_adr == (ota.pkt_index + 1)) {   // correct OTA data index
11005538:    892b          ldrh    r3, [r5, #8]
1100553a:    1c59          adds    r1, r3, #1
1100553c:    428e          cmp    r6, r1
1100553e:    d16d          bne.n    1100561c <ota_parser+0x1d8>
 

cool2000

Member
Оба значения uint16_t без знака расширяются до 32 бит, затем к pkt_index(32 бит) прибавляется 1, в результате условие никогда не выполнится:
  • ota_adr: 0xZZZZ => 0x0000ZZZZ
  • pkt_index: 0xFFFF => 0x0000FFFF
  • 0x0000FFFF + 1 = 0x00010000
  • 0x00010000 == 0x0000ZZZZ
Вам видимо нужно записать так:
if ((uint16_t)(ota.pkt_index + 1) == ota_adr) { // correct OTA data index
C:
            if ((uint16_t)(ota.pkt_index + 1) == ota_adr) {   // correct OTA data index
11005436:   8929        ldrh    r1, [r5, #8]
11005438:   1c4b        adds    r3, r1, #1
1100543a:   b29b        uxth    r3, r3
1100543c:   429e        cmp r6, r3
 
Сверху Снизу