今天继续来分享一个关于FreeRTOS学习实践过程中遇到的一个错误。
其实这个错误也是由于宏定义定义不对造成的,只是这次出现的错误提示多了一些其他说明。话不多说,我们先来看一下吧。
错误:
.\Objects\Freertos_test_one.axf: Error: L6218E: Undefined symbol xQueueCreateMutex (referred from main.o).
Not enough information to list image symbols.
Not enough information to list load addresses in the image map.
我们可以看到上面第一条的错误其实跟上一篇文章那三个错误一样,就是由于编译器在链接时候找不到该函数。
但是这次仔细看下面还有两条提示,其大致意思就是你提供的信息太少,找不到相应的函数,可能看到这里会不太明白。我们下面讲了你就会明白,编译器为什么这么提示你。
我们可以先从这个函数xQueueCreateMutex着手,从我们的工程中直接搜索有这个函数出现的地方,于是,我们看到这个函数定义这里是这么定义的,代码如下:
#if( ( configUSE_MUTEXES == 1 ) && ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) )
QueueHandle_t xQueueCreateMutex( const uint8_t ucQueueType )
{
Queue_t *pxNewQueue;
const UBaseType_t uxMutexLength = ( UBaseType_t ) 1, uxMutexSize = ( UBaseType_t ) 0;
pxNewQueue = ( Queue_t * ) xQueueGenericCreate( uxMutexLength, uxMutexSize, ucQueueType );
prvInitialiseMutex( pxNewQueue );
return pxNewQueue;
}
#endif /* configUSE_MUTEXES */
从上面的代码我们可以看出,如果定义该函数,需要configUSE_MUTEXES为1以及configSUPPORT_DYNAMIC_ALLOCATION 为1,后面的宏configSUPPORT_DYNAMIC_ALLOCATION是支持动态创建的意思,这个肯定是为1的,要不之前那么多都是动态创建的,早就提示你错误了。
因此我们看向宏configUSE_MUTEXES,这个宏的意思是使用互斥量,也就是如果你使用到了互斥量的话,就需要将其置为1。由此判断,这个宏定义可能是为0,造成函数xQueueCreateMutex未定义。
于是,我们定位到宏configUSE_MUTEXES的定义处,发现其的确是为0。
#define configUSE_MUTEXES 1 //使用到互斥量需定义为1
由此看出,正是因为configUSE_MUTEXES为0,造成函数定义前的预编译条件不通过,造成编译器编译到这里时候直接跳过,所以才会提示函数xQueueCreateMutex未定义。
所以编译器也提示你的信息不足,也就是缺少相应的条件。同时我们发现,在使用FreeRTOS的时候一定要注重FreeRTOSConfig头文件的配置。
解决方法:
那解决方法自然就跟我们上一篇文章将到的一样:
1、使用到互斥量的话,就将宏configUSE_MUTEXES置为1。
2、如果没有用到互斥量,切记将宏configUSE_MUTEXES置为0,同时不要使用互斥量的API函数。
按照上述解决方法,我们再次编译可以看到,此时编译通过了,如下图所示:
好了,今天的分享就到这里了~,如果有其他小伙伴也遇到过这种错误,可以参考一下我的这个例子。
本人水平有限,上述信息仅供学习参考,如有错误和不妥之处,请多多指教。
另外创作不易,请勿抄袭,如果有帮助到大家的话希望大家可以点个赞和收藏,谢谢~