Это вопрос на С++ для встроенной пользовательской платы, для которой я разрабатываю программу. Мы будем использовать freeRTOS, если это поможет. Плата имеет 3 физических слота/разъема. 1 слот/разъем имеет 20 контактов и принимает 1 из 3 конкретных плат, но в будущем может быть больше плат. Два других слота/разъема имеют 18 контактов и могут вмещать 1 из 8 плат, но в будущем их может быть больше.
Платы, как правило, обмениваются данными через SPI, но иногда их нужно немного взломать с помощью ручных вызовов GPIO (зависит от того, какая плата установлена). Схема связи не может быть стандартизирована (не то, что я могу придумать) из-за проблем с обратной совместимостью. Платы, которые вставляются в эти слоты, должны иметь возможность подключаться к другим, другим основным платам, если того выберет конечный потребитель.
У меня есть класс SPI, который вызывает базовый аппаратный SPI. У меня есть класс слота, который принимает указатель на объект SPI и включает в себя несколько контактов сброса и несколько тестовых функций, чтобы определить, какая плата подключена к какому слоту. Я создаю 3 таких объекта слота, по одному для каждого физического слота/заголовка.
После определения того, что содержит каждый слот, я пришел к тому, что мне нужно спроектировать/создать/кодировать классы для каждой из плат, но я столкнулся с архитектурной проблемой, по крайней мере, мне так кажется. Поскольку это встроенная система, я хотел бы избежать использования ключевого слова «новый», но это не высечено на камне.
Я думаю, что было бы расточительно создавать копии каждой платы, а затем использовать только те 3, которые были обнаружены.
В моей голове я думаю, что мой класс слота, возможно, должен иметь какой-то указатель void, который можно установить так, чтобы он указывал на объект, экземпляр которого создается после того, как мы определим, что это за доска. В этом случае я почти уверен, что мне придется использовать «новый».
Я знаю, что в C есть концепция «объединения», когда вы создаете какой-то пользовательский тип, который может быть любым из нескольких типов. Когда вы создаете копии этого типа, выделяется достаточно памяти для самого большого члена объединения. Можете ли вы сделать это на C++ и поместить классы в качестве членов объединения, а затем каким-то образом сделать его типом класса, который вы определили для слота?
Есть ли другие дизайнерские идеи?
Любая другая информация, которую необходимо добавить, чтобы кто-то лучше понял проблему?
Спасибо,
new
, вероятно, заходит слишком далеко. - person Jacek Ślimok   schedule 04.01.2020