Встроенное устройство -> std :: thread -> FreeRTOS? - PullRequest
1 голос
/ 27 января 2020

, поэтому в настоящее время я изучаю возможность использования чистого C ++ 17 проекта для встроенного устройства ( Cortex m4 ). Но исходя из того, что это встроенное устройство, у нас есть порт и мы используем RTOS , например, FreeRTOS или u c -OS , и я бы очень предпочел использовать std::thread (Таким образом, мы можем легко заменить RTOS , если это необходимо). Есть ли способ переопределить класс потока в C ++ для использования зависимой от платформы RTOS ?

Заранее спасибо

Ответы [ 2 ]

0 голосов
/ 29 января 2020

Есть ли способ переопределить класс потока в C ++ для использования зависящей от платформы ОСРВ?

Нет простого способа сделать это, но были попытки сделать это с помощью другие, как указал @ Артур Пассо. Даже если это не просто переопределение классов c, определяемых операционной системой, вместо этого вам нужно перехватывать вызовы слишком цепочки, чтобы просматривать API FreeRTOS всякий раз, когда требуется вызов ОС c. Это, в свою очередь, поднимает так много вопросов о том, как поддерживать работоспособность в разных версиях компилятора.

Поскольку я проводил подобное исследование несколько месяцев или go, я считаю, что наилучшим из возможных решений будет одно из следующих. ( Я бы лично выбрал вариант 1, учитывая степень гибкости и удобства обслуживания ).

  1. Создайте собственный уровень абстракции ОС C ++ поверх CMSIS OS API , который поддерживается большинством поставщиков RTOS (FreeRTOS, KeilRTX, Chibi поддерживают его, я уверен, что u c -OS также делает это). Это облегчает использование одной абстракции со многими ОСРВ, если ваша система сборки способна связывать нужные файлы в зависимости от используемой ОСРВ. Это в то же время дает вам полную гибкость в настройке приоритетов потоков, размеров стеков и т. Д. c. что может быть невозможно, если вы go используете что-то вроде posix api.

  2. Создайте свой собственный уровень абстракции C ++ OS поверх API POSIX. FreeRTOS предоставляет POSIX API https://www.freertos.org/FreeRTOS-Plus/FreeRTOS_Plus_POSIX/index.html, я уверен, что у других будет аналогичный вариант.

0 голосов
/ 27 января 2020

Невозможно указать std::thread использовать FreeRTOS::thread (выдумал), но вы можете использовать условную компиляцию и псевдоним типа как

#ifdef FREE_RTOS                  // you will need to get the correct symbol from the implementation to check for
using thread_t = FreeRTOS::thread // you will need to use the correct type here
#elif defined(OTHER_RTOS)
using thread_t = OtherRTOS::thread
#else
using thread_t = std::thread
#endif

И теперь thread_t будет типом потока из реализации и вернется к std::thread, если символы не найдены.

...