| 
 在使用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
 
  复制代码 
然后再次编译下载,这次就全部正常了。  
 
 
 |