您的位置:

arm-none-eabi-gcc全面解析

一、arm-none-eabi-gcc输出结果

在使用arm-none-eabi-gcc时,我们常常需要查看编译器输出的结果。这将帮助我们查找错误和优化代码。arm-none-eabi-gcc的输出可以分为三种:警告、错误和消息。其中,警告是代码可能存在问题,但不会导致编译失败;错误则导致编译失败,需要进行修复;而消息是一般性的编译信息,提供有关编译的有用信息。

示例代码:
#include <stdio.h>
int main() {
  int a = 10;
  int b = 0;
  int c = a / b;
  return c;
}

针对以上代码,arm-none-eabi-gcc编译后将输出如下:

In function 'main':
test.c:5:10: warning: division by zero [-Wdiv-by-zero]
   int c = a / b;
          ^
test.c:5:10: error: division by zero [-Werror=div-by-zero]
test.c:5:10: note: use -funsigned-char when compiling this file
test.c:6:10: warning: control reaches end of non-void function [-Wreturn-type]
   return c;
          ^

从上面的结果可以看到,arm-none-eabi-gcc给出了非常详细的输出结果,包括警告、错误和消息。这对于开发人员提高代码质量和调试代码都非常有帮助。

二、arm-none-eabi-gcc -lc

arm-none-eabi-gcc作为一款编译器,除了能够基本编译外,它还有很多可用的工具链。其中一个工具链是“-lc”,它告诉arm-none-eabi-gcc去链接C标准库的函数和调用C语言的库。

示例代码:
#include <stdio.h>
int main() {
  printf("Hello World");
  return 0;
}

针对以上代码,在编译时使用“-lc”参数链接C标准库。

arm-none-eabi-gcc main.c -lc -o main.elf

如果省略“-lc”,则编译器将找不到调用C标准库的函数,并报出“undefined reference to `printf’”的错误信息。

三、arm-none-eabi-gcc.exe

arm-none-eabi-gcc.exe是arm-none-eabi-gcc的可执行文件。当我们需要使用arm-none-eabi-gcc时,首先需要将其添加到PATH中,以便在命令行中使用。我们也可以通过命令行指定可执行文件的路径。

示例代码:
C:\\Program Files (x86)\\GNU Tools ARM Embedded\\9 2020-q2-update\\bin\\arm-none-eabi-gcc main.c -o main.elf

在以上代码中,我们使用了arm-none-eabi-gcc.exe的完整路径,以便直接使用。

四、arm-none-eabi-gcc是什么

arm-none-eabi-gcc是GNU开发工具中的一个组件,用于编译ARM架构的C/C++代码。它提供了许多功能,例如优化、宏处理、调试和代码生成。在嵌入式系统开发中,它被广泛用于开发和构建ARM平台的应用程序。

五、arm-none-eabi-gcc 教程

想要学习如何使用arm-none-eabi-gcc,我们可以参考官方的教程文档,也可以参考其他一些第三方的教程。其中,官方的教程文档包括基本的使用方法、调试和优化,以及一些示例代码。

以下是一个简单的教程,展示如何使用arm-none-eabi-gcc编译一个简单的LED闪烁程序。

示例代码:
#include "stm32f4xx.h"
void delay(uint32_t count) {
  while(count--);
}
int main(void) {
  RCC->AHB1ENR |= RCC_AHB1ENR_GPIOAEN; 
  GPIOA->MODER |= (1U << 10);
  while(1) {
    GPIOA->ODR ^= GPIO_ODR_OD5;
    delay(1000000);
  }
}

编译和链接示例代码,使用以下命令:

arm-none-eabi-gcc -mcpu=cortex-m4 -mfpu=fpv4-sp-d16 -mfloat-abi=softfp -Wl,-T,stm32.ld -g3 -Wall -o led.elf led.c
arm-none-eabi-objcopy -O binary led.elf led.bin
arm-none-eabi-objdump -S led.elf > led.s

此命令将生成可执行ELF文件(led.elf)、可烧写的二进制文件(led.bin)和汇编代码(led.s)。

六、arm-none-eabi-gcc下载

arm-none-eabi-gcc可以从GNU ARM官网下载。在下载页面中,选择对应版本和操作系统,然后下载该版本的二进制文件。

下载链接:https://developer.arm.com/tools-and-software/open-source-software/developer-tools/gnu-toolchain/gnu-rm/downloads

七、arm-none-eabi-gcc m4 fpu

当我们在编写针对ARM Cortex-M4F处理器的代码时,需要使用M4F上的硬件浮点单元(FPU)。

使用arm-none-eabi-gcc编译M4F代码时,需要通过以下参数使用浮点单元:

arm-none-eabi-gcc -mthumb -mcpu=cortex-m4 -mfpu=fpv4-sp-d16 -mfloat-abi=hard

八、arm-none-eabi-gcc 开发stm32

在stm32开发中使用arm-none-eabi-gcc,我们可以使用官方提供的标准库,或者使用第三方的库如STM32Cube等。

使用官方提供的标准库时,在编译和链接中需要添加以下参数:

-I inc \
-I Drivers/STM32F4xx_HAL_Driver/Inc \
-I Drivers/CMSIS/Device/ST/STM32F4xx/Include \
-I Drivers/CMSIS/Include \
src/main.c \
Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_gpio.c \
Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc.c \
Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal.c \
Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_cortex.c \
Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_uart.c \
Drivers/CMSIS/Device/ST/STM32F4xx/Source/Templates/system_stm32f4xx.c
-lm
-T stm32_flash.ld \
-mthumb \
-mcpu=cortex-m4 \
-mfpu=fpv4-sp-d16 \
-mfloat-abi=hard \
-ggdb \
-o main.elf

以上命令中,inc为存放头文件的文件夹、src为存放源代码的文件夹。stm32_flash.ld为链接文件。-lm为链接数学库(使用了printf时需要使用该库)。

使用第三方库STM32Cube时,我们需要下载并解压该库,然后在项目中引用库函数。

示例代码:
#include "stm32f4xx.h"
#include "stm32f4xx_hal.h"
int main(void) {
  HAL_Init();
  __HAL_RCC_GPIOA_CLK_ENABLE();
  GPIO_InitTypeDef GPIO_InitStruct = { 0 };
  GPIO_InitStruct.Pin = GPIO_PIN_5;
  GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
  GPIO_InitStruct.Pull = GPIO_NOPULL;
  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
  HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
  while (1) {
    HAL_GPIO_TogglePin(GPIOA, GPIO_PIN_5);
    HAL_Delay(500);
  }
}

链接时,需要添加以下参数:

-Tstm32f407vg.ld \
-mthumb \
-mcpu=cortex-m4 \
-mfpu=fpv4-sp-d16 \
-mfloat-abi=hard \
-Og \
-fmessage-length=0 \
-fsigned-char \
-ffunction-sections \
-fdata-sections \
-g \
-Wa,-a,-ad \
--specs=nano.specs \
-u _printf_float \
-Wl,--gc-sections \
-lm \
-o main.elf

使用STM32Cube作为库函数的话,在编译结束后需要先将编译结果转换成HEX文件,再使用烧写软件烧写到板子上。使用arm-none-eabi-objcopy可以将ELF文件转换为HEX文件,如下所示:

arm-none-eabi-objcopy -O ihex main.elf main.hex