Re: Программистские задачки и хитрости
Добавлено: 19 апр 2020, 13:10
там шо, память двухпортовая?MX_Master писал(а):Гарантированно в разнопроцессорных чипах может быть только по обоюдному согласию.
Статьи, обзоры, цены на станки и комплектующие.
https://www.cnc-club.ru/forum/
там шо, память двухпортовая?MX_Master писал(а):Гарантированно в разнопроцессорных чипах может быть только по обоюдному согласию.
Какие такие третьи лица?.. Сам программист чтоль?MX_Master писал(а):Правда, от третьих лиц она не спасёт, но хорошая.
как вариант - также как и механизм устранения коллизий в ethernet. Jam-sigmal (у нас остановка шин или портов), потом задержка, в тактах зависящая от приоритета. Камни - это пустые такты и буфер для поступающих данных (если они непрерывны). Не? (я не делал)MX_Master писал(а):лучше всего организовать программный spinlock
Если в пределах одного CPU, то просто запрет всех прерываний на время проверки-изменения флага.MX_Master писал(а):Но появился ещё один вопрос.. Как лучше всего организовать программный spinlock? Простое чтение/запись в одну общую переменную явно атомарной операцией не будет. Возможно, понадобится что-то более хитрое. Конечно, в разных чипах есть "железные" регистры для spinlock механизмов. Но интересен именно программный способ и подводные камни при нём.
Однако остаётся нерешённым вопрос: Как обнаружить коллизию?..uralpt писал(а):как вариант - также как и механизм устранения коллизий в ethernet. Jam-sigmal (у нас остановка шин или портов), потом задержка, в тактах зависящая от приоритета.
программно. Отправлять пакетами, проверять четность. Как вариант - сверять md5 или хеш-сумму какую. В stm32H7 начиная с 750 (вроде) серии даже шифроватор встроили.UAVpilot писал(а):Однако остаётся нерешённым вопрос: Как обнаружить коллизию?..
Это как раз не программно, а очень даже аппаратно - передающий прямо во время передачи слушает линию и сравнивает получаемый сигнал с тем, что он передаёт. Это первый уровень модели OSI - только на этом уровне возможно детектирование коллизий прямо во время попытки передачи. А всякие чётности и контрольные суммы - это 2-7 уровни, там ты узнаешь о неудаче только после того, как тебе об этом сообщит принимающая сторона, если сможет, - т.е. никакой атомарности тут и близко не лежало.uralpt писал(а):программно. Отправлять пакетами, проверять четность. Как вариант - сверять md5 или хеш-сумму какую.
тут уж выбирать - или атомарно, или программно )UAVpilot писал(а):Это как раз не программно, а очень даже аппаратно... никакой атомарности тут и близко не лежало
ну... у нас есть второе ядро, и мы для проверки можем гонять по одной шине данные, по второй - хеши. Хоть это уже и не в рамках поставленной задачи, больше напоминает самопальный асинхронный протокол, но зато - "программно" и "более одного CPU".UAVpilot писал(а):А программно более, чем на одном CPU не получится...
Юзать аппаратный вывод напрямую с таймера (Output Compare или PWM). Минусы - выход привязан строго к одной или паре лапок МК и, чтобы считать импульсы, нужен ещё один аппаратный таймер. Плюсы - ровный вывод и частота в 30 МГц это не предел.uralpt писал(а):Стоит задача максимального ногодрыга real-time, т.е. по таймерам-счетчикам. Мне необходимо хотя бы по 30МГц на каждую из 4 лапок ). На коленке, ога. И не вникая в прелести ПЛИС.
Есть Cortex M7 (stm32H7) с частотой 400МГц.
минусы устраивают.MX_Master писал(а):Юзать аппаратный вывод напрямую с таймера
Это уже не программный способ - требуется аппаратная поддержка. Если оной нет (что сомнительно), то гораздо проще процессоры одной лапкой соединить.uralpt писал(а):ну... у нас есть второе ядро, и мы для проверки можем гонять по одной шине данные, по второй - хеши.
Самый быстрый способ ногодрыга - положить в память нужную последовательность байт и с помощью DMA гнать её в GPIO. Можно дрыгать 16-ю ногами, но в пределах одного порта.uralpt писал(а):Можно тоже вопрос. Стоит задача максимального ногодрыга real-time, т.е. по таймерам-счетчикам. Мне необходимо хотя бы по 30МГц на каждую из 4 лапок ). На коленке, ога. И не вникая в прелести ПЛИС.
Есть Cortex M7 (stm32H7) с частотой 400МГц. Прикинув, даже при DMA и минимальной обработке данных вряд ли можно получить больше 20-25МГц на лапу.
Слышал, но не довелось попробовать такую замечательную штуку как распберри. Теперь вопрос. Возможно, не устанавливая на нее ОС, использовать просто как высокочастотный МК? То есть прицепить ST-Link, залить свое ПО и сразу ехать? Какие камни?
stm32mp1xxuralpt писал(а):Слышал, но не довелось попробовать такую замечательную штуку как распберри. Теперь вопрос. Возможно, не устанавливая на нее ОС, использовать просто как высокочастотный МК? То есть прицепить ST-Link, залить свое ПО и сразу ехать? Какие камни?
Код: Выделить всё
void inline spin_lock()
{
while ( *small_cpu_lock );
*big_cpu_lock = 1;
}
void inline spin_unlock()
{
*big_cpu_lock = 0;
}
Код: Выделить всё
void inline spin_lock()
{
while ( *big_cpu_lock );
*small_cpu_lock = 1;
while ( *big_cpu_lock );
}
void inline spin_unlock()
{
*small_cpu_lock = 0;
}
Deadlock.MX_Master писал(а):Какие минусы могут быть на первый взгляд?