0

Xilinx SDK 2016.1 freeRTOS823_xlinx OS 平台

在我引入一些 freeRTOS 元素之前,我的代码似乎运行良好。我的代码的一般功能如下:

  1. 在 Interrupt 子例程中,我为从 Zynq Soc 的 IP 寄存器读取的变量focusPosition 赋值:

    // separate file
    u32 focusPosition=0;
    
    static void ISR(void *CallbackRef)
    {
      focusPosition = XRb_focus_Get_position_o(CallbackRef);
    }
    
  2. 然后我在主函数中将值打印到控制台:

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

代码打印了正确的值,但是,当我尝试在代码中实现一些额外的行时,例如 xTaskCreate() xEventGroupCreate(),有些东西会弄乱所有内存并且打印的值保持不变,这是不正确的。

简单添加与变量无关的代码如何对该变量产生任何影响?据我了解, xTaskCreate() 和 xEventGroupCreate() 是在堆上创建的。我厌倦了四处寻找 Xil_DCacheDisable() 是否有帮助,但没有。有任何想法吗?我的 focusPosition 变量是否正确定义/声明?

4

1 回答 1

1

您应该将 focusPosition 声明为 volatile,否则编译器不希望在 while 循环之外对其进行修改,因此可能会优化代码。添加额外的代码可能会导致这种情况发生。任何在中断中修改但在其他地方使用的变量都应声明为 volatile。

于 2016-11-17T12:02:48.303 回答