1赞

2回答

1收藏

[评测分享] 【STM32H735-DK 测评】+TouchGFX工程修改使用MDK开发编译

#板卡评测 #板卡评测 3290 人阅读 | 2 人回复 | 2024-03-24

在使用TouchGFX开发生成的工程时,会生成keilIAR,和STM32CubeIDE的开发工程模板。但是在使用KEIL打开工程时,使用AC6编译会发现有很多错误,编译不成功。如下图所示。这里我就记录一下如何解决这些编译错误。方便在keil中开发编程。



下面就来分享一下如何解决这些错误。先从第一个错误开始。找不到FreeRTOS头文件PortMacro.h.



首先我们找一下在工程中是否存在这个文件。其次就是keil设置头文件路径是否正确。
如下图发现文件是存在的,咱们再看看keil头文件路径是否包含



打开设置可以看到Keil中头文件路径不对。我们修改一下路径。



如下修改路径。修改之后编译一下,发现错误减少了很多,刚刚的错误消失了。



下面解决其他错误,也是找不到头文件。我们还是继续找到这个文件的路径,然后添加keil上。



文件路径如下:



将该路径添加至keil设置中。


以上所有针对头文件找不到的错误都可以根据这样的方法去解决。都是没有包含路径的原因。

下面是文件找不到错误,其实也是文件路径不对。我们重新添加该文件,



最终还剩这一个错误和几个警告。这个错误的意思是vTaskSwitchContext函数被优化没了,所以我们要解决这个函数必须编译不被优化。



vTaskSwitchContext函数添加__attribute__((used))属性就可以保证编译有效了。




最后我们要添加TouchGFXlib库文件。要选择合适的lib库文件。




添加库之后编译还有一些错误。如图:剩下这些错误应该是TouchGFX设计新生成的文件没有自动添加到keil工程中,所以我们还要将新生成的设计文件添加进来。



下面添加TouchGFX的设计生成的Cpp文件添加进Keil中。




通过添加文件之后,最终编译成功。



最后总结一下,keil工程编译错误主要原因是:
1keil工程头文件路径设置未包含。
2:就是工程文件添加不完整,工程内缺少lib文件和Cpp文件。
3:就是Freertos部分文件错误。

下面就是试试下载调试看看正否正常。
下载之后会发现直接进HardFault_Handler了。看了一下是在进main之前加载数据段的时候就死机了。
这个查找了一下原因怀疑与编译还剩的警告可能有关,那个是下载链接存储段相关的。后来通过搜索进行如下解决方案。
下面就解决这个警告问题。网上搜索这个警告是如下解决的:

下面是我的修改,先链接文件增加

然后那3个警告位置如下修改:
将LOCATION_ATTRIBUTE_NOLOAD改为LOCATION_ATTRIBUTE。
后面段改为增加.bss.前缀。

做出修改之后,编译警告也没有了。

下面再次下载试试。调试发现会卡在如下位置BKPT  0xAB。这个问题搜索了一下是因为Semihosting 被使能了。
根据网上的解决办法关闭Semihosting 模式。下面是我添加的关闭代码
  1. /*----------------------------------------------------------------------------*
  2. * Disable Semihosting                                                        *
  3. *----------------------------------------------------------------------------*/
  4. #if     1   //defined(__IS_COMPILER_ARM_COMPILER_6__)
  5. __asm(".global __use_no_semihosting\n\t");
  6. __asm(".global __use_no_semihosting_swi\n\t");
  7. #   ifndef __MICROLIB
  8. __asm(".global __ARM_use_no_argv\n\t");
  9. #   endif

  10. void _ttywrch(int ch)
  11. {
  12.     UNUSED(ch);
  13. }

  14. #if !defined(RETARGET_SYS)
  15. #include <rt_sys.h>
  16. FILEHANDLE $Sub$_sys_open(const char *name, int openmode)
  17. {
  18.     UNUSED(name);
  19.     UNUSED(openmode);
  20.     return 0;
  21. }
  22. #endif

  23. __NO_RETURN
  24. void _sys_exit(int ret)
  25. {
  26.     UNUSED(ret);
  27.     while(1) {}
  28. }
  29. #endif
复制代码

然后再次编译下载,这次就全部正常了。



分享到:
回复

使用道具 举报

回答|共 2 个

倒序浏览

沙发

eefocus_3914144

发表于 2024-3-26 16:55:42 | 只看该作者

大佬确实花了不少时间来解决这个方法,如果再使用cubemax生成一下工程,会不会需要再去设置,我偿试了几次后,还是用他的cubeIDE比较省心。
回复 支持 反对

使用道具 举报

板凳

电子烂人

发表于 2024-6-5 08:51:54 | 只看该作者

多谢大佬分享,终于看到可行的解决办法了
我之前的经验是touchGFX生成一次,CUBEMX生成一次,然后再touchGFX生成一次,这样至少能保证部分头文件路径不会错误,但是难免还是会有.O文件缺失
这个问题确实很折磨,所以如果必须要用GFX的话cubeide更好一些(虽然也会报错)
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 注册/登录

本版积分规则

硬件工程师
35209 积分
53 主题
+ 关注
热门推荐
关闭

站长推荐上一条 /3 下一条