Xilinx SDK 2016.1 freeRTOS823_xlinx OS平台
我的代码似乎工作得很好,直到我引入了一些freeRTOS元素。我的代码的一般功能如下:
-
在中断子程序中,我为变量focusPosition赋值,该值从Zynq Soc的IP寄存器中读取:
// separate file u32 focusPosition=0; static void ISR(void *CallbackRef) { focusPosition = XRb_focus_Get_position_o(CallbackRef); }
-
然后在main函数中将值打印到控制台:
// separate file extern u32 focusPosition; main{ ... while(1){ sleep(1); xil_printf("%dn",focusPosition); } }
代码打印正确的值,然而,当我尝试在代码中实现一些额外的行,如xTaskCreate() xEventGroupCreate(),有些东西搞砸了所有的内存和打印的值保持不变,这是不正确的。
简单地添加与变量无关的代码怎么会对该变量产生任何影响?据我所知,xTaskCreate()和xEventGroupCreate()是在堆上创建的。我想看看xil_dachedisable()是否有帮助,但是没有。什么好主意吗?我的focusPosition变量是否正确定义/声明?
您应该将focusPosition声明为volatile,否则编译器不会期望在while循环之外修改它,因此可能会优化代码。添加额外的代码可能会导致这种情况发生。任何在中断中修改但在其他地方使用的变量都应该声明为volatile。