2016-11-16 1 views
0

자일링스 SDK 2016.1 freeRTOS823_xlinx OS 플랫폼을 업데이트하지 않습니다. 내 코드의 일반적인 기능은 다음과 같이변수는 제대로 내 코드가 좀 freeRTOS 요소를 도입 할 때까지 잘 작동하는 것 같았다</p> <p>

// separate file 
u32 focusPosition=0; 

static void ISR(void *CallbackRef) 
{ 
    focusPosition = XRb_focus_Get_position_o(CallbackRef); 
} 
  • :

    인터럽트 서브 루틴에서
    1. , 나는 Zynq의 SOC의 IP 레지스터에서 읽어 변수 focusPosition에 값을 할당

      // separate file 
      extern u32 focusPosition; 
      main{ 
      ... 
      while(1){ 
          sleep(1); 
          xil_printf("%d\n",focusPosition); 
      } 
      } 
      
    :

    는 다음 나는 주요 기능의 콘솔에 값을 printf와

    xTaskCreate() xEventGroupCreate()와 같은 코드에 몇 가지 추가 선을 구현하려고하면 모든 메모리가 엉망으로 인쇄 된 값이 올바르지 않게 유지됩니다.

    변수와 아무 관련이없는 코드를 간단히 추가하면 해당 변수에 어떤 영향이 있습니까? 늘어나는만큼 이해, xTaskCreate() 및 xEventGroupCreate() 힙에 만들어집니다. 나는 Xil_DCacheDisable()이 도움이 될지 알아보기 위해 피곤했다. 어떤 아이디어? 내 focusPosition 변수가 올바르게 정의/선언 되었습니까?

  • 답변

    1

    volatile로 focusPosition을 선언해야합니다. 그렇지 않으면 컴파일러가 while 루프 외부에서 수정되도록 기대하지 않으므로 코드를 최적화 할 수 있습니다. 추가 코드를 추가하면이 문제가 발생할 수 있습니다. 인터럽트에서 수정되었지만 다른 곳에서 사용 된 변수는 volatile로 선언되어야합니다.

    +0

    변수를 volatile로 선언해도 도움이되지 않았습니다. ( – Nazar

    +0

    외부 선언에서도 변수가 volatile로 선언 되었습니까? 그렇다고해도 어쨌든해야합니다. –

    +0

    ISR이 여전히 진행 중입니다. 변수에 올바른 값을 입력 했습니까? –

    관련 문제