前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >AIoT应用创新大赛-用标准GNU GCC完成RT1060工程编译(纯VSCode开发)

AIoT应用创新大赛-用标准GNU GCC完成RT1060工程编译(纯VSCode开发)

原创
作者头像
忙碌的死龙
修改2022-03-15 10:48:51
1.1K0
修改2022-03-15 10:48:51
举报
文章被收录于专栏:RT1060开发RT1060开发

前言:其实在微信群里,NXP官方大佬也多次提到,使用官方IDE可以配置成标准GNU GCC工具链。可能是多年玩单片机的傲慢,让自己觉得不就是个构建环境嘛,有什么,自己改改就行。多花的时间一半算是浪费的,一半算是值得的。

但是有一点让我不得不吐槽,官方IDE生成的makefile,头文件路径是绝对路径!!!

这确实让我没法忍,我一个房地产公司的招标总监都能发现这个问题,并且解决掉,难道官方不知道?纯粹就是懒!


如果不想自己改文件,也不想了解过程的,请下拉到最后的gitee地址获取源码,不想装官方IDE,对过程感兴趣的朋友可以往下看。


第1步、首先按官方提供的腾讯微云地址,下载板子的gpio案例工程(这里我下载的是evkmimxrt1060_igpio_led_output源码包),然后解压缩源码。

注意事项:VSCode的安装和arm-none-eabi-gcc工具的安装这里不再累赘说明,没有使用特殊插件和特殊的做法,大家可以用自己熟悉的版本完成。

第2步、使用VSCode打开源码目录(在这教程里,我将更名为rt1060_-gnu_-gcc,和我放在gitee开源仓的目录名一致),然后打开终端命令行,在终端中输入

代码语言:txt
复制
cd Debug
make

然后得到的是下面这样的错误提示,只要仔细观察,会发现这里有两个很致命的错误。

代码语言:txt
复制
Building file: ../xip/evkmimxrt1060_flexspi_nor_config.c
Invoking: MCU C Compiler
arm-none-eabi-gcc -std=gnu99 -D__REDLIB__ -DCPU_MIMXRT1062DVL6A -DCPU_MIMXRT1062DVL6A_cm7 -DSDK_DEBUGCONSOLE=1 -DXIP_EXTERNAL_FLASH=1 -DXIP_BOOT_HEADER_ENABLE=1 -DMCUXPRESSO_SDK -DCR_INTEGER_PRINTF -DPRINTF_FLOAT_ENABLE=0 -D__MCUXPRESSO -D__USE_CMSIS -DDEBUG -I"D:\test\evkmimxrt1060_igpio_led_output\board" -I"D:\test\evkmimxrt1060_igpio_led_output\source\TencentOS_Tiny\arch\arm\arm-v7m\common\include" -I"D:\test\evkmimxrt1060_igpio_led_output\source\TencentOS_Tiny\arch\arm\arm-v7m\cortex-m7\gcc" -I"D:\test\evkmimxrt1060_igpio_led_output\source\TencentOS_Tiny\kernel\core\include" -I"D:\test\evkmimxrt1060_igpio_led_output\source\TencentOS_Tiny\kernel\hal\include" -I"D:\test\evkmimxrt1060_igpio_led_output\source\TencentOS_Tiny\kernel\pm\include" -I"D:\test\evkmimxrt1060_igpio_led_output\source\TencentOS_Tiny\tos_config" -I"D:\test\evkmimxrt1060_igpio_led_output\source" -I"D:\test\evkmimxrt1060_igpio_led_output\utilities" -I"D:\test\evkmimxrt1060_igpio_led_output\drivers" -I"D:\test\evkmimxrt1060_igpio_led_output\device" -I"D:\test\evkmimxrt1060_igpio_led_output\component\uart" -I"D:\test\evkmimxrt1060_igpio_led_output\component\lists" -I"D:\test\evkmimxrt1060_igpio_led_output\xip" -I"D:\test\evkmimxrt1060_igpio_led_output\CMSIS" -I"D:\test\evkmimxrt1060_igpio_led_output\evkmimxrt1060\driver_examples\gpio\led_output" -O0 -fno-common -g3 -c -ffunction-sections -fdata-sections -ffreestanding -fno-builtin -fmerge-constants -fmacro-prefix-map="../xip/"=. -mcpu=cortex-m7 -mfpu=fpv5-d16 -mfloat-abi=hard -mthumb -D__REDLIB__ -fstack-usage -specs=redlib.specs -MMD -MP -MF"xip/evkmimxrt1060_flexspi_nor_config.d" -MT"xip/evkmimxrt1060_flexspi_nor_config.o" -MT"xip/evkmimxrt1060_flexspi_nor_config.d" -o "xip/evkmimxrt1060_flexspi_nor_config.o" "../xip/evkmimxrt1060_flexspi_nor_config.c"
arm-none-eabi-gcc: fatal error: cannot read spec file 'redlib.specs': No such file or directory
compilation terminated.
make: *** [xip/subdir.mk:23: xip/evkmimxrt1060_flexspi_nor_config.o] Error 1
  1. 第一个错误是上图第4行:gcc找不到redlib.specs,这说明我使用的gcc版本(gcc version 10.3.1 20210824 (release))是不支持这个redlib编译配置文件的,支持的只有newlib和newlib_nano配置。通过谷歌可以搜索到nxp官方有说明,nxp默认是使用的下面这个配置,需要切换成常用的nano配置(在接下来的第三步完成)
  2. Redlib - Our own (non-GNU) ISO C90 standard C library, with some C99 extensions.
  3. 参考文档请见https://community.nxp.com/t5/LPCXpresso-IDE-FAQs/Switching-the-selected-C-library/m-p/473669
  4. 以及https://community.nxp.com/t5/LPCXpresso-IDE-FAQs/What-are-Redlib-and-Newlib/m-p/475288

2.第二个错误是上图的第3行,大家可以往后拉,可以看到-I参数后面跟的头文件目录是绝对路径!构建系统中使用绝对路径是一种让人无语的行为,建议官方以后更正。使用绝对路径意味着代码如果直接转发给别人,是不能直接编译的,会提示找不到头文件。修复这个错误,需要把绝对路径更改成相对路径,也是在接下来的第三步完成。

第3步、在VSCode里使用搜索功能,并将redlib.specs替换成nano.specs

现在,在VSCode里重新搜索redlib,可以发现在subdir.mk文件里,gcc编译指令行有这么一个宏定义参数-D__REDLIB__。

而在startup/startup_mimxrt1062.c文件和其他几个c文件里,有用到这个宏定义,我们需要把subdir.mk里的这个宏定义参数删除掉。

替换之后,c 标准库就被指定为newlib_nano库。接下来,需要把makefile里头文件目录从绝对路径修改为相对路径。

现在需要把

代码语言:txt
复制
-I"D:\test\evkmimxrt1060_igpio_led_output\board" -I"D:\test\evkmimxrt1060_igpio_led_output\source\TencentOS_Tiny\arch\arm\arm-v7m\common\include" -I"D:\test\evkmimxrt1060_igpio_led_output\source\TencentOS_Tiny\arch\arm\arm-v7m\cortex-m7\gcc" -I"D:\test\evkmimxrt1060_igpio_led_output\source\TencentOS_Tiny\kernel\core\include" -I"D:\test\evkmimxrt1060_igpio_led_output\source\TencentOS_Tiny\kernel\hal\include" -I"D:\test\evkmimxrt1060_igpio_led_output\source\TencentOS_Tiny\kernel\pm\include" -I"D:\test\evkmimxrt1060_igpio_led_output\source\TencentOS_Tiny\tos_config" -I"D:\test\evkmimxrt1060_igpio_led_output\source" -I"D:\test\evkmimxrt1060_igpio_led_output\utilities" -I"D:\test\evkmimxrt1060_igpio_led_output\drivers" -I"D:\test\evkmimxrt1060_igpio_led_output\device" -I"D:\test\evkmimxrt1060_igpio_led_output\component\uart" -I"D:\test\evkmimxrt1060_igpio_led_output\component\lists" -I"D:\test\evkmimxrt1060_igpio_led_output\xip" -I"D:\test\evkmimxrt1060_igpio_led_output\CMSIS" -I"D:\test\evkmimxrt1060_igpio_led_output\evkmimxrt1060\driver_examples\gpio\led_output"

替换成

代码语言:txt
复制
-I"../board" -I"../source/TencentOS_Tiny/arch/arm/arm-v7m/common/include" -I"../source/TencentOS_Tiny/arch/arm/arm-v7m/cortex-m7/gcc" -I"../source/TencentOS_Tiny/kernel/core/include" -I"../source/TencentOS_Tiny/kernel/hal/include" -I"../source/TencentOS_Tiny/kernel/pm/include" -I"../source/TencentOS_Tiny/tos_config" -I"../source" -I"../utilities" -I"../drivers" -I"../device" -I"../component/uart" -I"../component/lists" -I"../xip" -I"../CMSIS" -I"../evkmimxrt1060/driver_examples/gpio/led_output"

第4步、又到了愉快的编译环节,在Debug目录下执行make命令,gcc开心的编译了一小段时间,然后又报错了

代码语言:txt
复制
Building target: evkmimxrt1060_igpio_led_output.axf
Invoking: MCU Linker
arm-none-eabi-gcc -nostdlib -Xlinker -Map="evkmimxrt1060_igpio_led_output.map" -Xlinker --gc-sections -Xlinker -print-memory-usage -Xlinker --sort-section=alignment -Xlinker --cref -mcpu=cortex-m7 -mfpu=fpv5-d16 -mfloat-abi=hard -mthumb -T evkmimxrt1060_igpio_led_output_Debug.ld -o "evkmimxrt1060_igpio_led_output.axf"  ./xip/evkmimxrt1060_flexspi_nor_config.o ./xip/fsl_flexspi_nor_boot.o  ./utilities/fsl_assert.o ./utilities/fsl_debug_console.o  ./startup/startup_mimxrt1062.o  ./source/TencentOS_Tiny/kernel/pm/tos_pm.o ./source/TencentOS_Tiny/kernel/pm/tos_tickless.o  ./source/TencentOS_Tiny/kernel/core/tos_barrier.o ./source/TencentOS_Tiny/kernel/core/tos_binary_heap.o ./source/TencentOS_Tiny/kernel/core/tos_bitmap.o ./source/TencentOS_Tiny/kernel/core/tos_char_fifo.o ./source/TencentOS_Tiny/kernel/core/tos_completion.o ./source/TencentOS_Tiny/kernel/core/tos_countdownlatch.o ./source/TencentOS_Tiny/kernel/core/tos_event.o ./source/TencentOS_Tiny/kernel/core/tos_global.o ./source/TencentOS_Tiny/kernel/core/tos_mail_queue.o ./source/TencentOS_Tiny/kernel/core/tos_message_queue.o ./source/TencentOS_Tiny/kernel/core/tos_mmblk.o ./source/TencentOS_Tiny/kernel/core/tos_mmheap.o ./source/TencentOS_Tiny/kernel/core/tos_mutex.o ./source/TencentOS_Tiny/kernel/core/tos_pend.o ./source/TencentOS_Tiny/kernel/core/tos_priority_mail_queue.o ./source/TencentOS_Tiny/kernel/core/tos_priority_message_queue.o ./source/TencentOS_Tiny/kernel/core/tos_priority_queue.o ./source/TencentOS_Tiny/kernel/core/tos_ring_queue.o ./source/TencentOS_Tiny/kernel/core/tos_robin.o ./source/TencentOS_Tiny/kernel/core/tos_rwlock.o ./source/TencentOS_Tiny/kernel/core/tos_sched.o ./source/TencentOS_Tiny/kernel/core/tos_sem.o ./source/TencentOS_Tiny/kernel/core/tos_stopwatch.o ./source/TencentOS_Tiny/kernel/core/tos_sys.o ./source/TencentOS_Tiny/kernel/core/tos_task.o ./source/TencentOS_Tiny/kernel/core/tos_tick.o ./source/TencentOS_Tiny/kernel/core/tos_time.o ./source/TencentOS_Tiny/kernel/core/tos_timer.o  ./source/TencentOS_Tiny/arch/arm/arm-v7m/cortex-m7/gcc/port_c.o ./source/TencentOS_Tiny/arch/arm/arm-v7m/cortex-m7/gcc/port_s.o  ./source/TencentOS_Tiny/arch/arm/arm-v7m/common/tos_cpu.o ./source/TencentOS_Tiny/arch/arm/arm-v7m/common/tos_fault.o  ./source/gpio_led_output.o ./source/semihost_hardfault.o  ./drivers/fsl_clock.o ./drivers/fsl_common.o ./drivers/fsl_common_arm.o ./drivers/fsl_gpio.o ./drivers/fsl_lpuart.o  ./device/system_MIMXRT1062.o  ./component/uart/fsl_adapter_lpuart.o  ./component/lists/fsl_component_generic_list.o  ./board/board.o ./board/clock_config.o ./board/dcd.o ./board/pin_mux.o   
/opt/gcc-arm-none-eabi/bin/../lib/gcc/arm-none-eabi/10.3.1/../../../../arm-none-eabi/bin/ld: cannot find libcr_nohost_nf.a
/opt/gcc-arm-none-eabi/bin/../lib/gcc/arm-none-eabi/10.3.1/../../../../arm-none-eabi/bin/ld: cannot find libcr_c.a
/opt/gcc-arm-none-eabi/bin/../lib/gcc/arm-none-eabi/10.3.1/../../../../arm-none-eabi/bin/ld: cannot find libcr_eabihelpers.a
collect2: error: ld returned 1 exit status
make: *** [makefile:44: evkmimxrt1060_igpio_led_output.axf] Error 1

在VSCode里搜索这三个静态库,发现是Debug/evkmimxrt1060_igpio_led_output_Debug_library.ld这个link Script文件最后引用了这三个静态库

代码语言:txt
复制
GROUP (
  "libcr_nohost_nf.a"
  "libcr_c.a"
  "libcr_eabihelpers.a"
  "libgcc.a"
)

需要替换成

代码语言:txt
复制
GROUP (
  "libc_nano.a"
  "libm.a"
  "libgcc.a"
)

这是因为前面使用了newlib_nano库,所以需要将对应库的静态库文件变更成nano库的文件。

参考资料为官方MCUXpresso IDE User Guide的第83页,链接在下方

MCUXpresso IDE User Guide- NXP Community

最后,我们再次尝试运行编译命令,这一次顺利编译成功了,输出如下

代码语言:txt
复制
Memory region         Used Size  Region Size  %age Used
     BOARD_FLASH:       26736 B         8 MB      0.32%
        SRAM_DTC:       22792 B       128 KB     17.39%
        SRAM_ITC:          0 GB       128 KB      0.00%
         SRAM_OC:          0 GB       768 KB      0.00%
     BOARD_SDRAM:          0 GB        30 MB      0.00%
   NCACHE_REGION:          0 GB         2 MB      0.00%
Finished building target: evkmimxrt1060_igpio_led_output.axf
 
make --no-print-directory post-build
Performing post-build steps
arm-none-eabi-size "evkmimxrt1060_igpio_led_output.axf"; # arm-none-eabi-objcopy -v -O binary "evkmimxrt1060_igpio_led_output.axf" "evkmimxrt1060_igpio_led_output.bin" ; # checksum -p MIMXRT1062xxxxA -d "evkmimxrt1060_igpio_led_output.bin";
   text    data     bss     dec     hex filename
  26684      52   22736   49472    c140 evkmimxrt1060_igpio_led_output.axf

折腾了两个多小时,不断尝试和查找资料,终于完成了,可喜可贺。

如有需要使用这个代码做参考的,可以到我的gitee仓库去获取:

https://gitee.com/walker2048/rt1060_play/tree/gn%2Bninja/

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 但是有一点让我不得不吐槽,官方IDE生成的makefile,头文件路径是绝对路径!!!
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档