Программистские задачки и хитрости

Duhas
Мастер
Сообщения: 1949
Зарегистрирован: 10 окт 2015, 23:25
Репутация: 284
Настоящее имя: Андрей
Откуда: Красноярск
Контактная информация:

Re: Программистские задачки и хитрости

Сообщение Duhas »

MX_Master писал(а):Гарантированно в разнопроцессорных чипах может быть только по обоюдному согласию.
там шо, память двухпортовая?
Аватара пользователя
Serg
Мастер
Сообщения: 21923
Зарегистрирован: 17 апр 2012, 14:58
Репутация: 5181
Заслуга: c781c134843e0c1a3de9
Настоящее имя: Сергей
Откуда: Москва
Контактная информация:

Re: Программистские задачки и хитрости

Сообщение Serg »

MX_Master писал(а):Правда, от третьих лиц она не спасёт, но хорошая.
Какие такие третьи лица?.. Сам программист чтоль? :)
Я не Христос, рыбу не раздаю, но могу научить, как сделать удочку...
Аватара пользователя
MX_Master
Мастер
Сообщения: 7460
Зарегистрирован: 27 июн 2015, 19:45
Репутация: 3086
Настоящее имя: Михаил
Откуда: Алматы
Контактная информация:

Re: Программистские задачки и хитрости

Сообщение MX_Master »

Товарищи, задачка с вашей помощью решена успешно ;)

Но появился ещё один вопрос.. Как лучше всего организовать программный spinlock? Простое чтение/запись в одну общую переменную явно атомарной операцией не будет. Возможно, понадобится что-то более хитрое. Конечно, в разных чипах есть "железные" регистры для spinlock механизмов. Но интересен именно программный способ и подводные камни при нём.
Аватара пользователя
uralpt
Мастер
Сообщения: 651
Зарегистрирован: 23 ноя 2015, 14:31
Репутация: 104
Настоящее имя: евгений
Откуда: Миасс
Контактная информация:

Re: Программистские задачки и хитрости

Сообщение uralpt »

MX_Master писал(а):лучше всего организовать программный spinlock
как вариант - также как и механизм устранения коллизий в ethernet. Jam-sigmal (у нас остановка шин или портов), потом задержка, в тактах зависящая от приоритета. Камни - это пустые такты и буфер для поступающих данных (если они непрерывны). Не? (я не делал)

Можно тоже вопрос. Стоит задача максимального ногодрыга real-time, т.е. по таймерам-счетчикам. Мне необходимо хотя бы по 30МГц на каждую из 4 лапок :)). На коленке, ога. И не вникая в прелести ПЛИС.
Есть Cortex M7 (stm32H7) с частотой 400МГц. Прикинув, даже при DMA и минимальной обработке данных вряд ли можно получить больше 20-25МГц на лапу.
Слышал, но не довелось попробовать такую замечательную штуку как распберри. Теперь вопрос. Возможно, не устанавливая на нее ОС, использовать просто как высокочастотный МК? То есть прицепить ST-Link, залить свое ПО и сразу ехать? Какие камни?
Последний раз редактировалось uralpt 20 апр 2020, 11:21, всего редактировалось 1 раз.
Аватара пользователя
Serg
Мастер
Сообщения: 21923
Зарегистрирован: 17 апр 2012, 14:58
Репутация: 5181
Заслуга: c781c134843e0c1a3de9
Настоящее имя: Сергей
Откуда: Москва
Контактная информация:

Re: Программистские задачки и хитрости

Сообщение Serg »

MX_Master писал(а):Но появился ещё один вопрос.. Как лучше всего организовать программный spinlock? Простое чтение/запись в одну общую переменную явно атомарной операцией не будет. Возможно, понадобится что-то более хитрое. Конечно, в разных чипах есть "железные" регистры для spinlock механизмов. Но интересен именно программный способ и подводные камни при нём.
Если в пределах одного CPU, то просто запрет всех прерываний на время проверки-изменения флага.
Если для общения между несколькими CPU, то чисто программного способа не существует по определению.
uralpt писал(а):как вариант - также как и механизм устранения коллизий в ethernet. Jam-sigmal (у нас остановка шин или портов), потом задержка, в тактах зависящая от приоритета.
Однако остаётся нерешённым вопрос: Как обнаружить коллизию?.. :)
Я не Христос, рыбу не раздаю, но могу научить, как сделать удочку...
Аватара пользователя
uralpt
Мастер
Сообщения: 651
Зарегистрирован: 23 ноя 2015, 14:31
Репутация: 104
Настоящее имя: евгений
Откуда: Миасс
Контактная информация:

Re: Программистские задачки и хитрости

Сообщение uralpt »

UAVpilot писал(а):Однако остаётся нерешённым вопрос: Как обнаружить коллизию?..
программно. Отправлять пакетами, проверять четность. Как вариант - сверять md5 или хеш-сумму какую. В stm32H7 начиная с 750 (вроде) серии даже шифроватор встроили.
Аватара пользователя
Serg
Мастер
Сообщения: 21923
Зарегистрирован: 17 апр 2012, 14:58
Репутация: 5181
Заслуга: c781c134843e0c1a3de9
Настоящее имя: Сергей
Откуда: Москва
Контактная информация:

Re: Программистские задачки и хитрости

Сообщение Serg »

uralpt писал(а):программно. Отправлять пакетами, проверять четность. Как вариант - сверять md5 или хеш-сумму какую.
Это как раз не программно, а очень даже аппаратно - передающий прямо во время передачи слушает линию и сравнивает получаемый сигнал с тем, что он передаёт. Это первый уровень модели OSI - только на этом уровне возможно детектирование коллизий прямо во время попытки передачи. А всякие чётности и контрольные суммы - это 2-7 уровни, там ты узнаешь о неудаче только после того, как тебе об этом сообщит принимающая сторона, если сможет, - т.е. никакой атомарности тут и близко не лежало.
Я не Христос, рыбу не раздаю, но могу научить, как сделать удочку...
Аватара пользователя
uralpt
Мастер
Сообщения: 651
Зарегистрирован: 23 ноя 2015, 14:31
Репутация: 104
Настоящее имя: евгений
Откуда: Миасс
Контактная информация:

Re: Программистские задачки и хитрости

Сообщение uralpt »

UAVpilot писал(а):Это как раз не программно, а очень даже аппаратно... никакой атомарности тут и близко не лежало
тут уж выбирать - или атомарно, или программно :))
Аватара пользователя
Serg
Мастер
Сообщения: 21923
Зарегистрирован: 17 апр 2012, 14:58
Репутация: 5181
Заслуга: c781c134843e0c1a3de9
Настоящее имя: Сергей
Откуда: Москва
Контактная информация:

Re: Программистские задачки и хитрости

Сообщение Serg »

А программно более, чем на одном CPU не получится... :)
Я не Христос, рыбу не раздаю, но могу научить, как сделать удочку...
Аватара пользователя
uralpt
Мастер
Сообщения: 651
Зарегистрирован: 23 ноя 2015, 14:31
Репутация: 104
Настоящее имя: евгений
Откуда: Миасс
Контактная информация:

Re: Программистские задачки и хитрости

Сообщение uralpt »

UAVpilot писал(а):А программно более, чем на одном CPU не получится... :)
ну... у нас есть второе ядро, и мы для проверки можем гонять по одной шине данные, по второй - хеши. Хоть это уже и не в рамках поставленной задачи, больше напоминает самопальный асинхронный протокол, но зато - "программно" и "более одного CPU".
Ладно-ладно, и так знаю ответ :)) Лучше как линукс-мастер скажи виндовсятнику, можно сотворить или не? (вопрос в #84). На скорую руку ответа не нашел.
Аватара пользователя
MX_Master
Мастер
Сообщения: 7460
Зарегистрирован: 27 июн 2015, 19:45
Репутация: 3086
Настоящее имя: Михаил
Откуда: Алматы
Контактная информация:

Re: Программистские задачки и хитрости

Сообщение MX_Master »

uralpt писал(а):Стоит задача максимального ногодрыга real-time, т.е. по таймерам-счетчикам. Мне необходимо хотя бы по 30МГц на каждую из 4 лапок ). На коленке, ога. И не вникая в прелести ПЛИС.
Есть Cortex M7 (stm32H7) с частотой 400МГц.
Юзать аппаратный вывод напрямую с таймера (Output Compare или PWM). Минусы - выход привязан строго к одной или паре лапок МК и, чтобы считать импульсы, нужен ещё один аппаратный таймер. Плюсы - ровный вывод и частота в 30 МГц это не предел.
Аватара пользователя
uralpt
Мастер
Сообщения: 651
Зарегистрирован: 23 ноя 2015, 14:31
Репутация: 104
Настоящее имя: евгений
Откуда: Миасс
Контактная информация:

Re: Программистские задачки и хитрости

Сообщение uralpt »

MX_Master писал(а):Юзать аппаратный вывод напрямую с таймера
минусы устраивают.
Своими словами - беру кейл+Cube, подкачиваю необходимые библиотеки, нахожу на ARM11 лапки JTAG, и все это в связке заработает? И Cube поймет пины, и Кейл - мой кривой Си :))? Хоть бы где почитать... я пока даже не понимаю, с какой стороны подходить и какие вопросы спрашивать. Неужели никто не пробовал, камень-то шустрый
Аватара пользователя
MX_Master
Мастер
Сообщения: 7460
Зарегистрирован: 27 июн 2015, 19:45
Репутация: 3086
Настоящее имя: Михаил
Откуда: Алматы
Контактная информация:

Re: Программистские задачки и хитрости

Сообщение MX_Master »

Я этот способ лично проверял на STM32F103, STM32F407 и на STM32H743. Всё работает как часы. На первых парах код из кубика, канеш, понадобится.
Аватара пользователя
Serg
Мастер
Сообщения: 21923
Зарегистрирован: 17 апр 2012, 14:58
Репутация: 5181
Заслуга: c781c134843e0c1a3de9
Настоящее имя: Сергей
Откуда: Москва
Контактная информация:

Re: Программистские задачки и хитрости

Сообщение Serg »

uralpt писал(а):ну... у нас есть второе ядро, и мы для проверки можем гонять по одной шине данные, по второй - хеши.
Это уже не программный способ - требуется аппаратная поддержка. Если оной нет (что сомнительно), то гораздо проще процессоры одной лапкой соединить. :)
uralpt писал(а):Можно тоже вопрос. Стоит задача максимального ногодрыга real-time, т.е. по таймерам-счетчикам. Мне необходимо хотя бы по 30МГц на каждую из 4 лапок :)). На коленке, ога. И не вникая в прелести ПЛИС.
Есть Cortex M7 (stm32H7) с частотой 400МГц. Прикинув, даже при DMA и минимальной обработке данных вряд ли можно получить больше 20-25МГц на лапу.
Слышал, но не довелось попробовать такую замечательную штуку как распберри. Теперь вопрос. Возможно, не устанавливая на нее ОС, использовать просто как высокочастотный МК? То есть прицепить ST-Link, залить свое ПО и сразу ехать? Какие камни?
Самый быстрый способ ногодрыга - положить в память нужную последовательность байт и с помощью DMA гнать её в GPIO. Можно дрыгать 16-ю ногами, но в пределах одного порта. :)
uralpt писал(а):Слышал, но не довелось попробовать такую замечательную штуку как распберри. Теперь вопрос. Возможно, не устанавливая на нее ОС, использовать просто как высокочастотный МК? То есть прицепить ST-Link, залить свое ПО и сразу ехать? Какие камни?
stm32mp1xx :)
Я не Христос, рыбу не раздаю, но могу научить, как сделать удочку...
Аватара пользователя
MX_Master
Мастер
Сообщения: 7460
Зарегистрирован: 27 июн 2015, 19:45
Репутация: 3086
Настоящее имя: Михаил
Откуда: Алматы
Контактная информация:

Re: Программистские задачки и хитрости

Сообщение MX_Master »

Программный spinlock реализовал пока что так.. В быстром ARM процессоре

Код: Выделить всё

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;
}
Мелкий проц читает и пишет в общую память намного чаще. Какие минусы могут быть на первый взгляд?
Аватара пользователя
Serg
Мастер
Сообщения: 21923
Зарегистрирован: 17 апр 2012, 14:58
Репутация: 5181
Заслуга: c781c134843e0c1a3de9
Настоящее имя: Сергей
Откуда: Москва
Контактная информация:

Re: Программистские задачки и хитрости

Сообщение Serg »

MX_Master писал(а):Какие минусы могут быть на первый взгляд?
Deadlock.
Я не Христос, рыбу не раздаю, но могу научить, как сделать удочку...
Аватара пользователя
MX_Master
Мастер
Сообщения: 7460
Зарегистрирован: 27 июн 2015, 19:45
Репутация: 3086
Настоящее имя: Михаил
Откуда: Алматы
Контактная информация:

Re: Программистские задачки и хитрости

Сообщение MX_Master »

Пока ещё не поймал :hehehe: Скорее всего, потому что в циклах ожидания в сопроцессоре сами циклы не пустые.
Duhas
Мастер
Сообщения: 1949
Зарегистрирован: 10 окт 2015, 23:25
Репутация: 284
Настоящее имя: Андрей
Откуда: Красноярск
Контактная информация:

Re: Программистские задачки и хитрости

Сообщение Duhas »

дык нужно только ждать посылки? диаграммку бы работы.. собственно я вапще не вижу великой проблемы когда можно организовать направленные буферы

буферы для данных + к каждому флаги "обновил" и "прочитал", чтобы данные не перезаписывались пока вторая сторона не считала и т.д.
Аватара пользователя
MX_Master
Мастер
Сообщения: 7460
Зарегистрирован: 27 июн 2015, 19:45
Репутация: 3086
Настоящее имя: Михаил
Откуда: Алматы
Контактная информация:

Re: Программистские задачки и хитрости

Сообщение MX_Master »

Два буфера было в предыдущей версии :) В этот раз хочу сделать иначе. Аппаратные spinlock'и тоже попробую для разнообразия ;)
Duhas
Мастер
Сообщения: 1949
Зарегистрирован: 10 окт 2015, 23:25
Репутация: 284
Настоящее имя: Андрей
Откуда: Красноярск
Контактная информация:

Re: Программистские задачки и хитрости

Сообщение Duhas »

я просто недоосознал надо ли оно )
Ответить

Вернуться в «Оффтоп»