Я разрабатываю довольно сложное приложение для микроконтроллера на C, и у меня есть некоторые сомнения относительно того, как «связать» мои общие данные между различными задачами/потоками, не связывая их.
До сих пор я использовал планировщик с временным разделением для запуска своего приложения, поэтому в защите данных не было необходимости. Но я хочу сделать приложение правильным, и я хочу подготовить его для многопоточной ОС позже.
Я попытался упростить свой вопрос, используя совершенно другую систему, чем реальная система, над которой я работаю. Я не мог добавить изображение, потому что я новый пользователь, но вместо этого я попытаюсь объяснить:
У нас есть 4 задачи/потока: 3 входных потока, которые считывают некоторые данные датчиков с разных датчиков через аппаратные абстракционные слои (HAL). Собранные данные датчиков хранятся в домене задачи (т.е. они не будут глобальными!!). Теперь у нас также есть 1 выходная задача, назовем ее «Регулятор». Регулятор должен использовать (считывать) данные датчиков, собранные со всех трех датчиков, для получения надлежащего результата.
Вопрос: Как Регулятор будет считывать собранные данные, хранящиеся в разных входных задачах, без привязки к другим задачам?
Регулятор должен знать о входных задачах и их данных только по ссылке (т.е. без #includes, без связи).
До сих пор у Регулятора был указатель на каждую из необходимых данных датчика, и этот указатель настраивается во время инициализации. Это не будет работать в многопоточном приложении из-за защиты данных.
Я мог бы создать несколько функций getSensorValue()
, использующих семафоры, для каждого значения датчика, а затем связать их с регулятором с помощью указателей на функции. Но это займет много памяти!! Есть ли более элегантный способ сделать это? Я просто ищу входы.
Надеюсь все понятно :)
__thread
. Что вы считаете много памяти, 3 семафора должны занимать всего несколько байт памяти. Или потоки не могут быть заблокированы в течение длительного времени из-за скорости чтения сенсора? - person Pyrce   schedule 03.04.2013