• Уважаемые посетители сайта esp8266.ru!
    Мы отказались от размещения рекламы на страницах форума для большего комфорта пользователей.
    Вы можете оказать посильную поддержку администрации форума. Данные средства пойдут на оплату услуг облачных провайдеров для сайта esp8266.ru
  • Система автоматизации с открытым исходным кодом на базе 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
 
Сверху Снизу