2014-02-11 2 views
0

임베디드 타겟 (MSP430)에 대해 C에서 작은 협동 OS (Salvo)로 작업하고 있습니다.콜 스택 사용하지 않고 함수와 비슷한 동작

많은 재사용 할 수없는 구현 코드로 명령 처리기를 구현해야합니다. 이러한 코드에는 OS를 사용하는 컨텍스트 스위치가 포함될 수 있습니다. 컨텍스트 전환 중에 콜 스택은 이 아니며이 저장되어 있으므로 동일한 스택 수준을 유지해야합니다. 나는 C 파일을 포함하여, 일을 이런 식으로 일을 오전 : 이것은하지만이 방법, 지금 노력하고 있습니다

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) : " 인라인 "키워드는 강제로 인라인되지 않습니다. [...] f 실제로 인라이닝을 강제 실행하려면 FUNC_ALWAYS_INLINE pragma를 사용하십시오. 항상 "항상"이라는 뜻이므로주의해야합니다. 광범위하게 사용하면 컴파일러에서 메모리가 부족해져 충돌 할 수 있습니다. – pserra

+0

리플렉션 후에는 정확히 같은 것이 포함에 추가됩니다. 귀하의 답변에 감사드립니다. 두 번째 부분에 대한 통찰력? – pserra

+0

그들이 말한 것을 수행하고'FUNC_ALWAYS_INLINE' pragma를 사용하십시오. 조심해. :) – jeremycole

관련 문제