2014-02-11 4 views
0

Я работаю с небольшой совместной ОС (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 при написании командных специальных кодов, и я не знаю, если это будет управляемо, когда код будет расти.

Есть ли лучшее решение?

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

Есть ли что-то лучше, чем:

  • копии и прошлое?
  • вовлеченный и опасный многострочный макрос?
  • сохранение и восстановление стека с использованием сборки для этих общих функций?

Или, какое из них является меньшим злом?

ответ

0

Вы должны уметь записывать каждую из своих команд как inline и называть их регулярными функциями. Это гораздо более приятный подход, чем то, что вы сделали, оно просто оставляет его компилятору для создания правильного кода для вас. Беспорядок #include, как это будет никоим образом не ремонтопригодным.

+0

Это может быть хорошим решением, но мой компилятор может не согласиться: [link] (http://e2e.ti.com/support/development_tools/compiler/f/343/t/245902.aspx): " inline "не форсирует вложение. [...] f вы действительно хотите принудительно вставить, используйте прагму FUNC_ALWAYS_INLINE. Это действительно означает «всегда», поэтому будьте осторожны: широкое использование может привести к тому, что у компилятора закончится память и произойдет сбой. – pserra

+0

После отражения то же самое приложение добавляется вместе с включенными. Спасибо за Ваш ответ. Любые идеи по второй части? – pserra

+0

Сделайте то, что они сказали, и используйте прагму 'FUNC_ALWAYS_INLINE'. И будьте осторожны. :) – jeremycole