在使用TouchGFX开发生成的工程时,会生成keil,IAR,和STM32CubeIDE的开发工程模板。但是在使用KEIL打开工程时,使用AC6编译会发现有很多错误,编译不成功。如下图所示。这里我就记录一下如何解决这些编译错误。方便在keil中开发编程。
下面就来分享一下如何解决这些错误。先从第一个错误开始。找不到FreeRTOS头文件PortMacro.h.
首先我们找一下在工程中是否存在这个文件。其次就是keil设置头文件路径是否正确。 如下图发现文件是存在的,咱们再看看keil头文件路径是否包含
打开设置可以看到Keil中头文件路径不对。我们修改一下路径。
如下修改路径。修改之后编译一下,发现错误减少了很多,刚刚的错误消失了。
下面解决其他错误,也是找不到头文件。我们还是继续找到这个文件的路径,然后添加keil上。
文件路径如下:
将该路径添加至keil设置中。
以上所有针对头文件找不到的错误都可以根据这样的方法去解决。都是没有包含路径的原因。
下面是文件找不到错误,其实也是文件路径不对。我们重新添加该文件,
最终还剩这一个错误和几个警告。这个错误的意思是vTaskSwitchContext函数被优化没了,所以我们要解决这个函数必须编译不被优化。
将vTaskSwitchContext函数添加__attribute__((used))属性就可以保证编译有效了。
最后我们要添加TouchGFX的lib库文件。要选择合适的lib库文件。
添加库之后编译还有一些错误。如图:剩下这些错误应该是TouchGFX设计新生成的文件没有自动添加到keil工程中,所以我们还要将新生成的设计文件添加进来。
下面添加TouchGFX的设计生成的Cpp文件添加进Keil中。
通过添加文件之后,最终编译成功。
最后总结一下,keil工程编译错误主要原因是: 1:keil工程头文件路径设置未包含。 2:就是工程文件添加不完整,工程内缺少lib文件和Cpp文件。 3:就是Freertos部分文件错误。
下面就是试试下载调试看看正否正常。 下载之后会发现直接进HardFault_Handler了。看了一下是在进main之前加载数据段的时候就死机了。 这个查找了一下原因怀疑与编译还剩的警告可能有关,那个是下载链接存储段相关的。后来通过搜索进行如下解决方案。 下面就解决这个警告问题。网上搜索这个警告是如下解决的:
下面是我的修改,先链接文件增加
然后那3个警告位置如下修改: 将LOCATION_ATTRIBUTE_NOLOAD改为LOCATION_ATTRIBUTE。 后面段改为增加.bss.前缀。
做出修改之后,编译警告也没有了。
下面再次下载试试。调试发现会卡在如下位置BKPT 0xAB。这个问题搜索了一下是因为Semihosting 被使能了。 根据网上的解决办法关闭Semihosting 模式。下面是我添加的关闭代码 - /*----------------------------------------------------------------------------*
- * Disable Semihosting *
- *----------------------------------------------------------------------------*/
- #if 1 //defined(__IS_COMPILER_ARM_COMPILER_6__)
- __asm(".global __use_no_semihosting\n\t");
- __asm(".global __use_no_semihosting_swi\n\t");
- # ifndef __MICROLIB
- __asm(".global __ARM_use_no_argv\n\t");
- # endif
- void _ttywrch(int ch)
- {
- UNUSED(ch);
- }
- #if !defined(RETARGET_SYS)
- #include <rt_sys.h>
- FILEHANDLE $Sub$_sys_open(const char *name, int openmode)
- {
- UNUSED(name);
- UNUSED(openmode);
- return 0;
- }
- #endif
- __NO_RETURN
- void _sys_exit(int ret)
- {
- UNUSED(ret);
- while(1) {}
- }
- #endif
复制代码
然后再次编译下载,这次就全部正常了。
|