Потоки на встроенных устройствах без ПО

Поддерживаются ли потоки (или pthreads) на устройствах без операционной системы. Я использую компилятор ARM/GNU C++(arm-none-eabi-g++) и получаю сообщение об ошибке не могу найти -lpthread при компиляции, хотя я указал флаг -lpthread в команде компоновщика.


person Mehreen    schedule 20.01.2021    source источник
comment
Какое устройство вы используете? Вы действительно используете голое железо? Или у вас минималистичная ОС? Для чего планируете темы?   -  person Johannes Overmann    schedule 20.01.2021
comment
Я использую Microchip SAML11.   -  person Mehreen    schedule 20.01.2021
comment
SAML11 поставляется с криптографическими ускорителями. Я хочу запустить один поток на криптографическом ускорителе и другой поток на основном процессоре.   -  person Mehreen    schedule 20.01.2021
comment
chiark.greenend.org.uk/~sgtatham/coroutines.html   -  person artless noise    schedule 20.01.2021
comment
таблица данных подразумевает, что это просто какой-то код, который они поместили в ПЗУ для вас, что означает, что вы можете взять любой микроконтроллер и библиотеку и просто использовать то, что вы можете легко нарезать в суперпетле. Если бы у них было аппаратное ускорение, я бы ожидал, что они сформулировали бы вещи по-другому, если бы я не читал каждую страницу...   -  person old_timer    schedule 20.01.2021
comment
Ничего не поддерживается на физических устройствах. Вот что значит голый металл. Это действительно голое железо, только если каждая инструкция, выполняемая приложением, была скомпилирована из исходного кода в репозитории вашего проекта. Нет зависимостей.   -  person Solomon Slow    schedule 20.01.2021
comment
@Solomon: я думаю, что знаю, что вы имеете в виду, но даже устройства с «голым металлом» обычно поставляются с поддержкой от поставщика в виде библиотек поддержки, промежуточного программного обеспечения и уровней аппаратной абстракции. См. CMSIS для ARM. Во всяком случае, можно было бы надеяться. :-)   -  person Johannes Overmann    schedule 20.01.2021
comment
да, вся эта штука с голым металлом становится немного нечеткой, как и все эти библиотеки, которые во многих случаях вы напрямую не разговариваете с оборудованием, а с библиотеками/apis. существует множество определений (и варианты написания: голый металл, голый металл, голый металл, и в некоторых местах каждому написанию придается особое значение, а в других нет). Нет реального ответа на вопрос, что означает «голый металл». без ОС, хотя часто соглашаются.   -  person old_timer    schedule 21.01.2021
comment
поставщики, которые хотят остаться в бизнесе, должны предлагать ide с SDK, набором инструментов, отладчиком и т. д., и они так и делают в той или иной форме. также, чтобы сохранить его свежим, и поэтому они склонны менять эту среду каждые столько лет, чтобы выглядеть и чувствовать, если не для чего-то еще.   -  person old_timer    schedule 21.01.2021
comment
возможно, путаница заключается в предположении, что все mcus - это голое железо, а не голое железо, программирование - это программная вещь, а не аппаратное обеспечение, вы можете писать код на голом железе для своего компьютера в течение всего дня, мы регулярно получаем вопросы по этому поводу ... Если это так В этом случае просто используйте один из многих вариантов операционной системы (freertos, atomthreads и т. д.). но это никоим образом не означает, что опция потоков в цепочке инструментов будет работать.   -  person old_timer    schedule 21.01.2021


Ответы (2)


Без операционной системы, которая поддерживает вытесняющую многозадачность, у вас нет потоков. Это то, к чему относится термин «голый металл».

Ни g++, ни компоновщик не могут предоставить вам функциональность потока. Только операционная система может предоставлять потоки.

Конечно, вы можете создать собственную обработку потоков в своем собственном приложении на «голом железе», но это серьезная задача.

Подпрограммы прерывания обычно вытесняют основную программу на устройствах с «голым железом» и могут рассматриваться как периодически запускаемые потоки. И периодическое прерывание таймера может использоваться для переключения контекстов потока. Это первый шаг к вытесняющей многозадачности операционной системы.

person Johannes Overmann    schedule 20.01.2021
comment
Не могли бы вы объяснить, что вы подразумеваете под созданием собственной обработки потоков в своем собственном приложении с голым металлом. Есть ли какой-либо другой способ, кроме потоков, который я могу использовать для одновременной работы криптографического ускорителя и основного процессора. - person Mehreen; 20.01.2021
comment
Даже на «голом железе» вы можете запускать вещи параллельно или псевдопараллельно, например, все процедуры обработки прерываний выполняются псевдопараллельно. И, конечно же, вы можете переложить работу на другое оборудование, такое как ваш криптографический сопроцессор. Просто запустите криптографическую работу, сделайте что-нибудь еще на главном процессоре, а синхронизируйтесь позже. И вы можете использовать совместную многозадачность (также называемую волокнами или сопрограммами), если видите в этом какую-то пользу. - person Johannes Overmann; 20.01.2021
comment
@Mehreen Вы можете добиться упреждающей многозадачности на своей платформе, используя FreeRTOS например: вы сможете запускать несколько задач из своей основной программы так же, как вы запускали бы несколько потоков в операционной системе общего назначения. системы, такой как Linux или Windows, но с использованием другого API. - person Frant; 20.01.2021
comment
но freertos означает не голое железо... - person old_timer; 20.01.2021
comment
Это не такая сложная задача, чтобы эти две вещи происходили, вам нужно переключать задачи, если вы хотите, но это может быть так же просто, как ваш некриптографический код запускается в периодическом прерывании, и вы ограничиваете время его выполнения, чтобы оставить процент за криптозадачу. Или вы просто ждете, пока криптовалюта закончится... Вы также можете проверить цены и использовать более мелкие детали и иметь две части: одну только для криптовалюты и одну для всего остального. - person old_timer; 20.01.2021
comment
@old_timer Да, это больше не будет «голое железо», я согласен на 100%. Просто, учитывая то, как был сформулирован вопрос, я подумал, что человек, задающий его, может иметь другое представление о «голом металле», чем у нас с вами. - person Frant; 20.01.2021
comment
@old_timer: Да, FreeRTOS больше не голое железо. Точно. Хороший указатель, так как FreeRTOS — это один из ответов на вопрос, как мне получить потоки на моем «голом железе»: используйте минималистическую ОС, например, RTOS. - person Johannes Overmann; 20.01.2021
comment
переключать контексты потоков, это касается только одного ядра? Какое многоядерное встраиваемое устройство на голом железе, у которого ядер больше, чем потоков в приложении (каждый поток сможет работать на своем ядре). - person Anton Krug; 27.04.2021
comment
@AntonKrug: Да, это касается только одного ядра. Если у вас многоядерный процессор и/или гиперпоточность, у вас есть несколько потоков даже на «голом железе». И тогда у вас будут все проблемы многопоточного программирования даже на голом железе. Однако написать приложение на «голом железе», использующее несколько ядер, довольно сложно. Вам нужно правильно запустить другие ядра, определить желаемую когерентность кеша, настроить отдельные стеки. И вам нужен код для примитивов синхронизации потоков. Pthreads не подойдут, так как это зависит от ОС. - person Johannes Overmann; 27.04.2021
comment
@Johannes Overmann настроить стеки и выполнить их легко, и даже многопоточное приложение легко, если нет большого взаимодействия (когда каждый поток просто делает что-то независимо от другого), хитрость заключается в том, чтобы заставить их работать, но заставить их работать в стиль «pthreads». В то время как большая часть онлайн-контента по-прежнему предполагает, что baremetal должен быть только одним ядром, и речь идет о планировании нескольких задач в одном потоке. - person Anton Krug; 27.04.2021
comment
@AntonKrug: Да, именно так. pthreads — это абстрагирование многопоточных возможностей аппаратного обеспечения (например, разрешение приложению создавать и уничтожать потоки), в то время как запуск многопоточности на «голом железе» на оборудовании совершенно другой. У вас есть только темы. Заставить pthreads работать на «голом железе», реализовать многопоточную систему — это полпути к простой ОС. - person Johannes Overmann; 28.04.2021

Если вам не нужны на самом деле pthreads (просто вы не знали о других методах), то сопрограммы могут быть решением для вас.

A coroutine is a function that can suspend execution to be resumed later. Coroutines are stackless: they suspend execution by returning to the caller and the data that is required to resume execution is stored separately from the stack. This allows for sequential code that executes asynchronously (e.g. to handle non-blocking I/O without explicit callbacks), and also supports algorithms on lazy-computed infinite sequences and other uses.

https://en.cppreference.com/w/cpp/language/coroutines

Проще говоря, это нечто среднее между функциями и потоками. Вам не нужно ждать, пока они закончат выполнение, как обычные функции, и не нужно быть частью ОС (FreeRTOS — это ОС), чтобы иметь функцию потока (pthread или другого).

Это новая функция C++20, которую вы могли бы поддерживать в своей встроенной цепочке инструментов. Тем не менее, есть хорошая запись в блоге об их реализации на языке C.

http://www.vishalchovatiya.com/coroutine-in-c-language/< /а>

Я не включаю контент из блога, так как это не маленький фрагмент, но я сделал дублирующий снимок на случай, если исходный сайт выйдет из строя:

https://web.archive.org/web/20210428125420/http://www.vishalchovatiya.com/coroutine-in-c-language/

person Anton Krug    schedule 28.04.2021
comment
Хорошее предложение для «голого железа» (и даже для всех других) вариантов использования. Coroutines — это, по сути, совместная многозадачность. Вы можете иметь их со стеком и без стека. Я не уверен, что указатель на сопрограммы С++ 20 полезен. Недавно я посмотрел на спецификацию, и она кажется ужасно сложной. Но некоторые низкоуровневые RTOS поддерживают сопрограммы и иногда называют их задачами, так что это хороший момент, когда речь идет о «голом железе». +1 - person Johannes Overmann; 28.04.2021
comment
Спасибо, какое-то время думал о longjump setjump, о том, как его можно использовать с небольшим встроенным сфокусированным планировщиком, чтобы довести что-то до «голого железа» без ОС, но тогда где грань между модным приложением для «голого железа» и наличием очень упрощенная ОС. - person Anton Krug; 28.04.2021