• Уважаемые посетители сайта esp8266.ru!
    Мы отказались от размещения рекламы на страницах форума для большего комфорта пользователей.
    Вы можете оказать посильную поддержку администрации форума. Данные средства пойдут на оплату услуг облачных провайдеров для сайта esp8266.ru
  • Система автоматизации с открытым исходным кодом на базе esp8266/esp32 микроконтроллеров и приложения IoT Manager. Наша группа в Telegram

Обсуждение AdHoc бинарный протокол.

cheblin

Member
больше затрат процессорного времени на прерывания и обработку каждого символа чем переключение на 3мбит/c с DMA и передача всей RAM MK сотню раз в сек без всякой индексации, типизации, сериализации,
:)

как будешь различать начало и конец передачи?

и это.... про батарею поговорить не желаешь?
 

pvvx

Активный участник сообщества
готово!
для случая когда язык кодо генерации С и генерируемые пакеты фиксированной длинны ( в качестве данных полей не используются строки или динамические массивы) к генерируему коду прикладывается упрощёный рантайм. Который совершенно точно влезет даже в STM8.
Где такое взять - STM8?
У него нет никакого внешнего интерфейса связи.
ESP8266 обслуживает поток WiFi в TCP/HTTP на 800к..1мегабайт/c. Это переключение к 8 миллионов светодиодов в сек :) Но мы будем посылать по одному байту в Http с AdHoc и мигать одним светодиодом, один раз в сек, т.к. у нас Arduino комюнити!
 

pvvx

Активный участник сообщества
:)
как будешь различать начало и конец передачи?
Очень просто - DMA кладет блок в фиксед адрес, забирает из другого фиксед адреса. В обоих устройствах имеем отображение деятельности обоих устройств, в которые назначены все необходимые для связи структуры.

и это.... про батарею поговорить не желаешь?
А в тех, BLE которые, уже есть стек и прочие фичи. Там всё тупо - проснулся по готовности датчика (irq) считал данные с датчика отправил заснул. Для каждого типа данных имеется свой профиль (UUID, GATT,...).
 

cheblin

Member
DMA кладет блок в фиксед адрес
что за магия позволяет данным из одного DMA, в другом DMA оказаться?

сериализация? uart? так тебя и спрашивают, как определить начало и конец посылки? что с помехами?
что там Endianness ?
в которые назначены все необходимые для связи структуры
ты это серьёзно?
но это работает только на однотипных устройствах.
что там с выравниваниями?
 

pvvx

Активный участник сообщества
Я проверил :)
да на любом механизме, да таже радиоуправляемая моделька... а хаб, куда всё стекается та самая ESP.
Никуда и ничего не стекается. ESP не может физически поддерживать TCP/IP. Только игра в вечерний блог - "я мигаю светодиодом" и на полку, потом в помойку.
мне ещё предстоит понять как в Arduino встроить сгенерированный код
Там обычный C++ и "мало RAM", да надо отдать время на работу WiFi через костыли... такая мультизадачность через костыли.
 

cheblin

Member
в
которые назначены все необходимые для связи структуры
ты это серьёзно?
но это работает только на однотипных устройствах.
что там с выравниваниями? что с Endian?

как некое наколеночное решение - ок.
про универсальность забудь
 

pvvx

Активный участник сообщества
что за магия позволяет данным из одного DMA, в другом DMA оказаться?
сериализация? uart? так тебя и спрашивают, как определить начало и конец посылки? что с помехами?
Один канал на прием, второй на передачу.
Было же предложено работать по UART :)
Блоки всегда одной длины. Старт любым пином UART/GPIO или прерыванием UART по тишине (даже у примитива 16550 есть аппаратное прерывание по тишине 8 (вроде) тиков в бодах).

что там Endianness ?
Хорошо - процы то знают с кем соединены. Они же на одной плате :)
 

pvvx

Активный участник сообщества
Соврал - прерывание по тишине в 4 символа - типа для Modbus :) От туда и ноги Modbus растут
 

cheblin

Member
Они же на одной плате
ой всё...

теперь хоть стало понятно про какие "кадры кино" ты вещал...
я думал там какая то магия...а оказалось, всего лишь, кое кто чижика съел
 

pvvx

Активный участник сообщества
Там псё по ethernet и по паре RS-485 для устаревших.
теперь хоть стало понятно про какие "кадры кино" ты вещал...
Кадр это внутре у виртуального устройства. в черном ящике по вашему.
Система немного посложнее чем интерпретатор Rust.
Там несколько интерпретаторов и конфигурируемых находу драйверов....
 

pvvx

Активный участник сообщества
в
ты это серьёзно?
но это работает только на однотипных устройствах.
что там с выравниваниями? что с Endian?

как некое наколеночное решение - ок.
про универсальность забудь
Это вы о IP протоколе?
Там нет всех перечисленных фич на автомате.
 

cheblin

Member
вы о IP протоколе
причём тут протоколы.
коекто считает что все устройства имеютодинаковую модель память и скопировав память с одного на другое пытаетися натянуть структуру хранения на все устройства.
и говорит это круто.
ОК
 

cheblin

Member
как у AdHoc с порядком битов в
Код:
static inline UMAX get_bytes(uint8_t* src, size_t byte, size_t bytes)
{
#ifdef   UINT64_MAX
    int32_t hi = 0;
#endif
    int32_t lo = 0;
    switch (bytes)
    {
#ifdef   UINT64_MAX
    case 8: hi |= src[byte + 7] << 24;
    case 7: hi |= src[byte + 6] << 16;
    case 6: hi |= src[byte + 5] << 8;
    case 5: hi |= src[byte + 4];
#endif
    case 4: lo |= src[byte + 3] << 24;
    case 3: lo |= src[byte + 2] << 16;
    case 2: lo |= src[byte + 1] << 8;
    case 1: lo |= src[byte];
    }
    return
#ifdef   UINT64_MAX
        (hi & 0xFFFFFFFFLL) << 32 |
#endif
        (lo & 0xFFFFFFFFLL);
}
static inline int32_t set_bytes(const UMAX src, const size_t bytes, uint8_t* dst, const size_t byte)
{
#ifdef   UINT64_MAX
    const uint32_t hi = (uint32_t)(src >> 32);
#endif
    const uint32_t lo = (uint32_t)(src & 0xFFFFFFFFL);
    switch (bytes)
    {
#ifdef   UINT64_MAX
    case 8: dst[byte + 7] = hi >> 24;
    case 7: dst[byte + 6] = hi >> 16;
    case 6: dst[byte + 5] = hi >> 8;
    case 5: dst[byte + 4] = hi & 0xFF;
#endif
    case 4: dst[byte + 3] = lo >> 24;
    case 3: dst[byte + 2] = lo >> 16;
    case 2: dst[byte + 1] = lo >> 8;
    case 1: dst[byte] = lo & 0xFF;
    }
    return byte + bytes;
}
ваще никаких чудес, представляешь.
байты подготавливаю под платформу приёма одновременно сжимая/разжимая

у меня метаданные храняться на клиенте и сревере

и знаешь что...
всё это работает, потому как тесты тоже автоматически генерируются, и прогоняются
 

pvvx

Активный участник сообщества
Как мне осуществить доступ к передаваемым объектам с нескольких параллельно работающих ядер или с внешних асинхронных запросов с разных процессов, устройств? Где в AdHoc указывается атомарность пересылаемого объекта или пачки объектов (группы)?

Я пока “кадр” размещаю в shared memory (shm) с семафором(-ами) занятости для доступности любому процессу в Linux…
ваще никаких чудес
Зачем обманываете? Биты у нас по интерфейсу могут идти в шахматном порядке - как вы указали - процессоры разные :)
 

cheblin

Member
вот тут я уже выложил пример сгенерированного кода первого урока, там всё открыто.

думаю часть ответов там есть.

AdHoc НЕ занимается вопросами разделения доступа к своим данным. это ложиться на плечи погромиста.

последжовательность простая - получи курсор по данным пакета и доставай данные сколько влезет, если нужна и запись, используй доступные примитивы пногопоточного доступа к разделйным рессурсам
 

pvvx

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

ваще никаких чудес
причём тут протоколы.
коекто считает что все устройства имеютодинаковую модель память и скопировав память с одного на другое пытаетися натянуть структуру хранения на все устройства.
и говорит это круто.
ОК
Ну они программят в Арудино only.
У других таких проблем нет - архитектур до чертиков.
Вам пример:
Мне надо передать массив, описанный в си так:
Код:
typedef struct _acc_data_xyz_t {
    int16_t        x;
    int16_t        y;
    int16_t        z;
}acc_data_xyz_t;
acc_data_xyz_t  acc_data[2];
Ваши действия?
 
Сверху Снизу