zynq中使用FreeRTOS的空闲钩子函数时在SDK中的设置

初玩zynq发现,在zynq中可以运行FreeRTOS,果断试了下;测试了几个例子,一切正常,但是在使用空闲钩子函数时导致无法正常执行。

要使用空闲钩子函数必须将FreeRTOSConfig.h文件中的configUSE_IDLE_HOOK定义为1,当然编译前已手动将其定义改为1,但是空闲钩子函数仍然没有运行。

查看源文件没发现错误,无意间再次确认configUSE_IDLE_HOOK是否改为1时,查看FreeRTOSConfig.h文件中configUSE_IDLE_HOOK定义为0了,再次修改,重新编译运行,不行,再看,configUSE_IDLE_HOOK又定义为0了,嗯,应该是编译工程时BSP也重新生成了,而默认configUSE_IDLE_HOOK定义为0,所以configUSE_IDLE_HOOK又回到了0。

找到原因,进入以下处理过程

不成功的处理

1. 直接在源文件(包含main的实现文件)头加上#define configUSE\_IDLE\_HOOK 1

这样当然不行,在编译FreeRTOS时configUSE_IDLE_HOOK任为0,这里定义的configUSE_IDLE_HOOK只有在编译源文件时有用,而源文件中也没使用这个宏,所以这样改是不行的。

当然将#define configUSE\_IDLE\_HOOK 1放到包含FreeRTOSConfig.h文件的FreeRTOS.h文件包含#include "FreeRTOS.h"之前也是同样道理,同样不行。

2. 修改SDK自带BSP中源文件

直接将SDK生成FreeRTOS BSP的源文件修改,这样看似可行。
当找到SDK的BSP目录(E:\Xilinx\SDK\2015.3\data\embeddedsw\ThirdParty\bsp\freertos821_xilinx_v1_0,这里假定vivado安装目录为E:\Xilinx)时,搜索发现根本没有FreeRTOSConfig.h这个文件,所以本方法不可行。
(后来发现FreeRTOSConfig.h是编译时才生成的)

3. 直接自定义BSP

后来在网上找资料,找到官网(个人认为Xilinx官网资料还是挺多的,不像Lattice实在太少,也可能是我没找到方法),找到的确有自定义BSP的方法(AR# 63964),但是例子中是自定义stand alone BSP的方法,以类似的方法修改,但是可能由于是FreeRTOS BSP的修改与stand alone有所不同,最后选择修改后的BSP,每次生成BSP会在执行freertos821_xilinx.tcl出错,没有解决,待日后处理,所以本方法还未成功。

解决办法

最后,真是,踏破铁鞋无觅,得来全不费功夫;最后在发现是我多虑了,SDK早已考虑到这些,直接在BSP上右键-> Board Support Package Settings,可以看到下图


直接在这里有设置,直接将use_idle_hook设置为true即可(以下还有关于FreeRTOS更多的设置,如STDIO、心跳钩子函数等)。

真是一个简单的问题,甚至可以说是不存在的问题,而网上搜索真没找到类似情况的说明,费了不少时间,这里特此记录,不成功的处理也可作为以后其它问题处理的备选方法。

其它

对于使用了队列的应用要添加#include "queue.h";使用了互斥量的要添加#include "semphr.h"

要使用xil_printf则要添加#include "xil\_printf.h";用了vivado中的宏定义要添加#include "xparameters.h"

版权声明:本文为CSDN博主「husipeng86」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/husipeng86/article/details/52074995

最新文章

最新文章