一、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官网下载。在下载页面中,选择对应版本和操作系统,然后下载该版本的二进制文件。
七、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