• Система автоматизации с открытым исходным кодом на базе 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];
Ваши действия?
 
Сверху Снизу