2016-11-16 170 views
0

賽靈思SDK 2016.1 freeRTOS823_xlinx OS平臺變量不正確更新

我的代碼似乎直到我介紹了一些FreeRTOS的元素,做工精細。我的代碼的一般功能如下:

  1. 在中斷子程序,我的值分配給變量focusPosition對從ZYNQ SOC的IP寄存器讀:

    // separate file 
    u32 focusPosition=0; 
    
    static void ISR(void *CallbackRef) 
    { 
        focusPosition = XRb_focus_Get_position_o(CallbackRef); 
    } 
    
  2. 然後我的printf在主函數值到控制檯:

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

然而,當我嘗試在代碼中實現一些額外的行時(如xTaskCreate()xEventGroupCreate()),代碼會打印出所有內存,並且打印值保持不變,這是不正確的。

簡單的補充,它無關變量的代碼如何才能對變量是否有影響?據我所知,xTaskCreate()和xEventGroupCreate()是在堆上創建的。我厭倦了,看看Xil_DCacheDisable()是否會有所幫助,但沒有。有任何想法嗎?我的focusPosition變量是否已正確定義/聲明?

回答

1

您應該聲明focusPosition爲volatile,否則編譯器不希望它在while循環之外被修改,因此可以優化代碼。添加額外的代碼可能會導致這種情況發生。任何在中斷中修改但在其他地方使用的變量都應聲明爲volatile。

+0

聲明變量爲volatile並沒有幫助( – Nazar

+0

你是否聲明它在extern聲明中也是不穩定的?即使這樣也無濟於事你也應該這麼做 –

+0

你也確定ISR還在繼續並返回正確的值到變量? –