там шо, память двухпортовая?MX_Master писал(а):Гарантированно в разнопроцессорных чипах может быть только по обоюдному согласию.
Программистские задачки и хитрости
-
- Мастер
- Сообщения: 1949
- Зарегистрирован: 10 окт 2015, 23:25
- Репутация: 284
- Настоящее имя: Андрей
- Откуда: Красноярск
- Контактная информация:
Re: Программистские задачки и хитрости
- Serg
- Мастер
- Сообщения: 21923
- Зарегистрирован: 17 апр 2012, 14:58
- Репутация: 5181
- Заслуга: c781c134843e0c1a3de9
- Настоящее имя: Сергей
- Откуда: Москва
- Контактная информация:
Re: Программистские задачки и хитрости
Какие такие третьи лица?.. Сам программист чтоль?MX_Master писал(а):Правда, от третьих лиц она не спасёт, но хорошая.
Я не Христос, рыбу не раздаю, но могу научить, как сделать удочку...
- MX_Master
- Мастер
- Сообщения: 7475
- Зарегистрирован: 27 июн 2015, 19:45
- Репутация: 3099
- Настоящее имя: Михаил
- Откуда: Алматы
- Контактная информация:
Re: Программистские задачки и хитрости
Товарищи, задачка с вашей помощью решена успешно
Но появился ещё один вопрос.. Как лучше всего организовать программный spinlock? Простое чтение/запись в одну общую переменную явно атомарной операцией не будет. Возможно, понадобится что-то более хитрое. Конечно, в разных чипах есть "железные" регистры для spinlock механизмов. Но интересен именно программный способ и подводные камни при нём.
Но появился ещё один вопрос.. Как лучше всего организовать программный spinlock? Простое чтение/запись в одну общую переменную явно атомарной операцией не будет. Возможно, понадобится что-то более хитрое. Конечно, в разных чипах есть "железные" регистры для spinlock механизмов. Но интересен именно программный способ и подводные камни при нём.
- uralpt
- Мастер
- Сообщения: 651
- Зарегистрирован: 23 ноя 2015, 14:31
- Репутация: 104
- Настоящее имя: евгений
- Откуда: Миасс
- Контактная информация:
Re: Программистские задачки и хитрости
как вариант - также как и механизм устранения коллизий в ethernet. Jam-sigmal (у нас остановка шин или портов), потом задержка, в тактах зависящая от приоритета. Камни - это пустые такты и буфер для поступающих данных (если они непрерывны). Не? (я не делал)MX_Master писал(а):лучше всего организовать программный spinlock
Можно тоже вопрос. Стоит задача максимального ногодрыга 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: Программистские задачки и хитрости
Если в пределах одного CPU, то просто запрет всех прерываний на время проверки-изменения флага.MX_Master писал(а):Но появился ещё один вопрос.. Как лучше всего организовать программный spinlock? Простое чтение/запись в одну общую переменную явно атомарной операцией не будет. Возможно, понадобится что-то более хитрое. Конечно, в разных чипах есть "железные" регистры для spinlock механизмов. Но интересен именно программный способ и подводные камни при нём.
Если для общения между несколькими CPU, то чисто программного способа не существует по определению.
Однако остаётся нерешённым вопрос: Как обнаружить коллизию?..uralpt писал(а):как вариант - также как и механизм устранения коллизий в ethernet. Jam-sigmal (у нас остановка шин или портов), потом задержка, в тактах зависящая от приоритета.
Я не Христос, рыбу не раздаю, но могу научить, как сделать удочку...
- uralpt
- Мастер
- Сообщения: 651
- Зарегистрирован: 23 ноя 2015, 14:31
- Репутация: 104
- Настоящее имя: евгений
- Откуда: Миасс
- Контактная информация:
Re: Программистские задачки и хитрости
программно. Отправлять пакетами, проверять четность. Как вариант - сверять md5 или хеш-сумму какую. В stm32H7 начиная с 750 (вроде) серии даже шифроватор встроили.UAVpilot писал(а):Однако остаётся нерешённым вопрос: Как обнаружить коллизию?..
- Serg
- Мастер
- Сообщения: 21923
- Зарегистрирован: 17 апр 2012, 14:58
- Репутация: 5181
- Заслуга: c781c134843e0c1a3de9
- Настоящее имя: Сергей
- Откуда: Москва
- Контактная информация:
Re: Программистские задачки и хитрости
Это как раз не программно, а очень даже аппаратно - передающий прямо во время передачи слушает линию и сравнивает получаемый сигнал с тем, что он передаёт. Это первый уровень модели OSI - только на этом уровне возможно детектирование коллизий прямо во время попытки передачи. А всякие чётности и контрольные суммы - это 2-7 уровни, там ты узнаешь о неудаче только после того, как тебе об этом сообщит принимающая сторона, если сможет, - т.е. никакой атомарности тут и близко не лежало.uralpt писал(а):программно. Отправлять пакетами, проверять четность. Как вариант - сверять md5 или хеш-сумму какую.
Я не Христос, рыбу не раздаю, но могу научить, как сделать удочку...
- uralpt
- Мастер
- Сообщения: 651
- Зарегистрирован: 23 ноя 2015, 14:31
- Репутация: 104
- Настоящее имя: евгений
- Откуда: Миасс
- Контактная информация:
Re: Программистские задачки и хитрости
тут уж выбирать - или атомарно, или программно )UAVpilot писал(а):Это как раз не программно, а очень даже аппаратно... никакой атомарности тут и близко не лежало
- Serg
- Мастер
- Сообщения: 21923
- Зарегистрирован: 17 апр 2012, 14:58
- Репутация: 5181
- Заслуга: c781c134843e0c1a3de9
- Настоящее имя: Сергей
- Откуда: Москва
- Контактная информация:
Re: Программистские задачки и хитрости
А программно более, чем на одном CPU не получится...
Я не Христос, рыбу не раздаю, но могу научить, как сделать удочку...
- uralpt
- Мастер
- Сообщения: 651
- Зарегистрирован: 23 ноя 2015, 14:31
- Репутация: 104
- Настоящее имя: евгений
- Откуда: Миасс
- Контактная информация:
Re: Программистские задачки и хитрости
ну... у нас есть второе ядро, и мы для проверки можем гонять по одной шине данные, по второй - хеши. Хоть это уже и не в рамках поставленной задачи, больше напоминает самопальный асинхронный протокол, но зато - "программно" и "более одного CPU".UAVpilot писал(а):А программно более, чем на одном CPU не получится...
Ладно-ладно, и так знаю ответ ) Лучше как линукс-мастер скажи виндовсятнику, можно сотворить или не? (вопрос в #84). На скорую руку ответа не нашел.
- MX_Master
- Мастер
- Сообщения: 7475
- Зарегистрирован: 27 июн 2015, 19:45
- Репутация: 3099
- Настоящее имя: Михаил
- Откуда: Алматы
- Контактная информация:
Re: Программистские задачки и хитрости
Юзать аппаратный вывод напрямую с таймера (Output Compare или PWM). Минусы - выход привязан строго к одной или паре лапок МК и, чтобы считать импульсы, нужен ещё один аппаратный таймер. Плюсы - ровный вывод и частота в 30 МГц это не предел.uralpt писал(а):Стоит задача максимального ногодрыга real-time, т.е. по таймерам-счетчикам. Мне необходимо хотя бы по 30МГц на каждую из 4 лапок ). На коленке, ога. И не вникая в прелести ПЛИС.
Есть Cortex M7 (stm32H7) с частотой 400МГц.
- uralpt
- Мастер
- Сообщения: 651
- Зарегистрирован: 23 ноя 2015, 14:31
- Репутация: 104
- Настоящее имя: евгений
- Откуда: Миасс
- Контактная информация:
Re: Программистские задачки и хитрости
минусы устраивают.MX_Master писал(а):Юзать аппаратный вывод напрямую с таймера
Своими словами - беру кейл+Cube, подкачиваю необходимые библиотеки, нахожу на ARM11 лапки JTAG, и все это в связке заработает? И Cube поймет пины, и Кейл - мой кривой Си )? Хоть бы где почитать... я пока даже не понимаю, с какой стороны подходить и какие вопросы спрашивать. Неужели никто не пробовал, камень-то шустрый
- MX_Master
- Мастер
- Сообщения: 7475
- Зарегистрирован: 27 июн 2015, 19:45
- Репутация: 3099
- Настоящее имя: Михаил
- Откуда: Алматы
- Контактная информация:
Re: Программистские задачки и хитрости
Я этот способ лично проверял на STM32F103, STM32F407 и на STM32H743. Всё работает как часы. На первых парах код из кубика, канеш, понадобится.
- Serg
- Мастер
- Сообщения: 21923
- Зарегистрирован: 17 апр 2012, 14:58
- Репутация: 5181
- Заслуга: c781c134843e0c1a3de9
- Настоящее имя: Сергей
- Откуда: Москва
- Контактная информация:
Re: Программистские задачки и хитрости
Это уже не программный способ - требуется аппаратная поддержка. Если оной нет (что сомнительно), то гораздо проще процессоры одной лапкой соединить.uralpt писал(а):ну... у нас есть второе ядро, и мы для проверки можем гонять по одной шине данные, по второй - хеши.
Самый быстрый способ ногодрыга - положить в память нужную последовательность байт и с помощью DMA гнать её в GPIO. Можно дрыгать 16-ю ногами, но в пределах одного порта.uralpt писал(а):Можно тоже вопрос. Стоит задача максимального ногодрыга real-time, т.е. по таймерам-счетчикам. Мне необходимо хотя бы по 30МГц на каждую из 4 лапок ). На коленке, ога. И не вникая в прелести ПЛИС.
Есть Cortex M7 (stm32H7) с частотой 400МГц. Прикинув, даже при DMA и минимальной обработке данных вряд ли можно получить больше 20-25МГц на лапу.
Слышал, но не довелось попробовать такую замечательную штуку как распберри. Теперь вопрос. Возможно, не устанавливая на нее ОС, использовать просто как высокочастотный МК? То есть прицепить ST-Link, залить свое ПО и сразу ехать? Какие камни?
stm32mp1xxuralpt писал(а):Слышал, но не довелось попробовать такую замечательную штуку как распберри. Теперь вопрос. Возможно, не устанавливая на нее ОС, использовать просто как высокочастотный МК? То есть прицепить ST-Link, залить свое ПО и сразу ехать? Какие камни?
Я не Христос, рыбу не раздаю, но могу научить, как сделать удочку...
- MX_Master
- Мастер
- Сообщения: 7475
- Зарегистрирован: 27 июн 2015, 19:45
- Репутация: 3099
- Настоящее имя: Михаил
- Откуда: Алматы
- Контактная информация:
Re: Программистские задачки и хитрости
Программный 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: Программистские задачки и хитрости
Deadlock.MX_Master писал(а):Какие минусы могут быть на первый взгляд?
Я не Христос, рыбу не раздаю, но могу научить, как сделать удочку...
- MX_Master
- Мастер
- Сообщения: 7475
- Зарегистрирован: 27 июн 2015, 19:45
- Репутация: 3099
- Настоящее имя: Михаил
- Откуда: Алматы
- Контактная информация:
Re: Программистские задачки и хитрости
Пока ещё не поймал Скорее всего, потому что в циклах ожидания в сопроцессоре сами циклы не пустые.
-
- Мастер
- Сообщения: 1949
- Зарегистрирован: 10 окт 2015, 23:25
- Репутация: 284
- Настоящее имя: Андрей
- Откуда: Красноярск
- Контактная информация:
Re: Программистские задачки и хитрости
дык нужно только ждать посылки? диаграммку бы работы.. собственно я вапще не вижу великой проблемы когда можно организовать направленные буферы
буферы для данных + к каждому флаги "обновил" и "прочитал", чтобы данные не перезаписывались пока вторая сторона не считала и т.д.
буферы для данных + к каждому флаги "обновил" и "прочитал", чтобы данные не перезаписывались пока вторая сторона не считала и т.д.
- MX_Master
- Мастер
- Сообщения: 7475
- Зарегистрирован: 27 июн 2015, 19:45
- Репутация: 3099
- Настоящее имя: Михаил
- Откуда: Алматы
- Контактная информация:
Re: Программистские задачки и хитрости
Два буфера было в предыдущей версии В этот раз хочу сделать иначе. Аппаратные spinlock'и тоже попробую для разнообразия
-
- Мастер
- Сообщения: 1949
- Зарегистрирован: 10 окт 2015, 23:25
- Репутация: 284
- Настоящее имя: Андрей
- Откуда: Красноярск
- Контактная информация:
Re: Программистские задачки и хитрости
я просто недоосознал надо ли оно )