Я работаю с небольшой совместной ОС (Salvo) в C для встроенной цели (MSP430).Функциональное поведение без использования callstack
Мне нужно реализовать обработчик команд с большим количеством кодов реализации без повторного использования. Эти коды могут включать контекстные коммутаторы, используя ОС. Во время переключения контекста столбец NOT сохранен, поэтому я должен оставаться на том же уровне стека. Я делаю вещи таким образом, путем включения гр файлов:
TaskA()
{
while(1)
{
command_code = OS_WaitMsgQ()
switch(command_code)
case 0x01:
{
#include CSC0x01_Name_of_the_command.c
}
case 0x02:
{
#include CSC0x02_Name_of_the_command.c
//OSContextSwitch()?
}
//100+ cases like this...
}
}
Это работает прямо сейчас, но с таким подходом я потеряю большую часть функции моего IDE при написании командных специальных кодов, и я не знаю, если это будет управляемо, когда код будет расти.
Есть ли лучшее решение?
Кроме того, эти командные коды могут использовать фрагменты кода, которые можно повторно использовать, но также содержат контекстные переключатели.
Есть ли что-то лучше, чем:
- копии и прошлое?
- вовлеченный и опасный многострочный макрос?
- сохранение и восстановление стека с использованием сборки для этих общих функций?
Или, какое из них является меньшим злом?
Это может быть хорошим решением, но мой компилятор может не согласиться: [link] (http://e2e.ti.com/support/development_tools/compiler/f/343/t/245902.aspx): " inline "не форсирует вложение. [...] f вы действительно хотите принудительно вставить, используйте прагму FUNC_ALWAYS_INLINE. Это действительно означает «всегда», поэтому будьте осторожны: широкое использование может привести к тому, что у компилятора закончится память и произойдет сбой. – pserra
После отражения то же самое приложение добавляется вместе с включенными. Спасибо за Ваш ответ. Любые идеи по второй части? – pserra
Сделайте то, что они сказали, и используйте прагму 'FUNC_ALWAYS_INLINE'. И будьте осторожны. :) – jeremycole