linux中keil如何编译器,Keil5配置GCC编译器编译STM32工程

本文介绍了如何在Linux环境下使用Keil5配合GCC编译器来编译STM32工程。首先,从指定链接下载GCC编译器并安装到Keil的安装目录下。然后,在Keil中配置GCC编译器路径,接着配置工程的CC、Assembler和Linker规则,包括-mcpu、-mthumb等选项,以适应STM32的Cortex-M3内核。最后,提供了一个STM32F10x的链接脚本示例,用于指导链接过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Keil一般使用ARMCC编译MCU工程代码。偶然听说Keil也是支持内嵌GCC编译器的。于是尝试了网上博客所述的一些方法,最终找到了一篇博客

http://blog.youkuaiyun.com/lan120576664/article/details/46806991

按照文中所述,发现仍存在一些其他错误,后来又查找了其他相关资料,在这作以总结

一、下载GCC编译器

https://launchpad.net/gcc-arm-embedded/

二、安装GCC

GCC解压到keil的安装目录下面。如下图

fd4044782eb2b3ded074b2667f495b78.png

三、配置Keil

如下图所示进行相关设置:

Prefix:arm-none-eabi-

Folder:D:keil_MDKKeil_v5ARMGCC (注:这里是刚刚安装的GCC所在位置)

3f080f401a13438c6d1b0594a2d24389.png

四、配置工程设置

1.配置CC编译规则

注意勾选一下选项,填写规则

Misc Controls : -mcpu=cortex-m3 -mthumb -fdata-sections -ffunction-sections

注:

1.这里我用的cortex-m3,如果你是m4内核就改成4)

2.-mthumb的意义是:使用这个编译选项生成的目标文件是Thumb的

3.-fdata-sections和-ffunction-sections和下文连接规则一起说

a69f88b5a8600cd311f17d0dd4f9ae0f.png

2.配置Assembler编译规则

类似前一项

Misc Controls : -mcpu=cortex-m3 -mthumb

194a4510384a366c2f80fc1ce8511dc9.png

3.配置Linker连接规则

这里要添加连接脚本,一般可以在官方提供的固件库包找到类似的

Misc Controls : -Wl,–gc-sections

注:

1.注意这个gc前面是两个短小的“–”,由于博客的问题直接复制会出错

2.-wl, 表示后面的参数 –gc-sections 传递给链接器

3.-fdata-sections和-ffunction-sections和–gc-sections的说明如下

-ffunction-sections和-fdata-sections会使编译器为每个function和data item分配独立的section。 –gc-sections会使连接器删除没有被使用的section。

连接操作以section作为最小的处理单元,只要一个section中有某个符号被引用,该section就会被放入output中。这些选项一起使用会从最终的输出文件中删除所有未被使用的function和data, 只包含用到的unction和data。

具体细节可以参考另一位博主的文章http://blog.youkuaiyun.com/pengfei240/article/details/55228228

be2ce0f1bf7abff2a2432385b23d283c.png

4.stm32f10x_flash_extsram.ld内容

/*

Default linker script for STM32F10x_1024K_1024K

Copyright RAISONANCE S.A.S. 2008

*/

/* include the common STM32F10x sub-script */

/* Common part of the linker scripts for STM32 devices*/

/* default stack sizes.

These are used by the startup in order to allocate stacks for the different modes.

*/

__Stack_Size = 1024 ;

PROVIDE ( _Stack_Size = __Stack_Size ) ;

__Stack_Init = _estack  - __Stack_Size ;

/*"PROVIDE" allows to easily override these values from an object file or the commmand line.*/

PROVIDE ( _Stack_Init = __Stack_Init ) ;

/*

There will be a link error if there is not this amount of RAM free at the end.

*/

_Minimum_Stack_Size = 0x100 ;

/* include the memory spaces definitions sub-script */

/*

Linker subscript for STM32F10x definitions with 1024K Flash and 1024K External SRAM */

/* Memory Spaces Definitions */

MEMORY

{

RAM (xrw) : ORIGIN = 0x68000000, LENGTH = 1024K

FLASH (rx) : ORIGIN = 0x8000000, LENGTH = 1024K

FLASHB1 (rx) : ORIGIN = 0x00000000, LENGTH = 0

EXTMEMB0 (rx) : ORIGIN = 0x00000000, LENGTH = 0

EXTMEMB1 (rx) : ORIGIN = 0x00000000, LENGTH = 0

EXTMEMB2 (rx) : ORIGIN = 0x00000000, LENGTH = 0

EXTMEMB3 (rx) : ORIGIN = 0x00000000, LENGTH = 0

}

/* higher address of the user mode stack */

_estack = 0x68100000;

/* include the sections management sub-script for FLASH mode */

/* Sections Definitions */

SECTIONS

{

/* for Cortex devices, the beginning of the startup code is stored in the .isr_vector section, which goes to FLASH */

.isr_vector :

{

. = ALIGN(4);

KEEP(*(.isr_vector))            /* Startup code */

. = ALIGN(4);

} >FLASH

/* for some STRx devices, the beginning of the startup code is stored in the .flashtext section, which goes to FLASH */

.flashtext :

{

. = ALIGN(4);

*(.flashtext)            /* Startup code */

. = ALIGN(4);

} >FLASH

/* the program code is stored in the .text section, which goes to Flash */

.text :

{

. = ALIGN(4);

*(.text)                   /* remaining code */

*(.text.*)                   /* remaining code */

*(.rodata)                 /* read-only data (constants) */

*(.rodata*)

*(.glue_7)

*(.glue_7t)

. = ALIGN(4);

_etext = .;

/* This is used by the startup in order to initialize the .data secion */

_sidata = _etext;

} >FLASH

/* This is the initialized data section

The program executes knowing that the data is in the RAM

but the loader puts the initial values in the FLASH (inidata).

It is one task of the startup to copy the initial values from FLASH to RAM. */

.data  : AT ( _sidata )

{

. = ALIGN(4);

/* This is used by the startup in order to initialize the .data secion */

_sdata = . ;

*(.data)

*(.data.*)

. = ALIGN(4);

/* This is used by the startup in order to initialize the .data secion */

_edata = . ;

} >RAM

/* This is the uninitialized data section */

.bss :

{

. = ALIGN(4);

/* This is used by the startup in order to initialize the .bss secion */

_sbss = .;

*(.bss)

*(COMMON)

. = ALIGN(4);

/* This is used by the startup in order to initialize the .bss secion */

_ebss = . ;

} >RAM

PROVIDE ( end = _ebss );

PROVIDE ( _end = _ebss );

/* This is the user stack section

This is just to check that there is enough RAM left for the User mode stack

It should generate an error if it's full.

*/

._usrstack :

{

. = ALIGN(4);

_susrstack = . ;

. = . + _Minimum_Stack_Size ;

. = ALIGN(4);

_eusrstack = . ;

} >RAM

/* this is the FLASH Bank1 */

/* the C or assembly source must explicitly place the code or data there

using the "section" attribute */

.b1text :

{

*(.b1text)                   /* remaining code */

*(.b1rodata)                 /* read-only data (constants) */

*(.b1rodata*)

} >FLASHB1

/* this is the EXTMEM */

/* the C or assembly source must explicitly place the code or data there

using the "section" attribute */

/* EXTMEM Bank0 */

.eb0text :

{

*(.eb0text)                   /* remaining code */

*(.eb0rodata)                 /* read-only data (constants) */

*(.eb0rodata*)

} >EXTMEMB0

/* EXTMEM Bank1 */

.eb1text :

{

*(.eb1text)                   /* remaining code */

*(.eb1rodata)                 /* read-only data (constants) */

*(.eb1rodata*)

} >EXTMEMB1

/* EXTMEM Bank2 */

.eb2text :

{

*(.eb2text)                   /* remaining code */

*(.eb2rodata)                 /* read-only data (constants) */

*(.eb2rodata*)

} >EXTMEMB2

/* EXTMEM Bank0 */

.eb3text :

{

*(.eb3text)                   /* remaining code */

*(.eb3rodata)                 /* read-only data (constants) */

*(.eb3rodata*)

} >EXTMEMB3

/* after that it's only debugging information. */

/* remove the debugging information from the standard libraries */

DISCARD :

{

libc.a ( * )

libm.a ( * )

libgcc.a ( * )

}

/* Stabs debugging sections.  */

.stab          0 : { *(.stab) }

.stabstr       0 : { *(.stabstr) }

.stab.excl     0 : { *(.stab.excl) }

.stab.exclstr  0 : { *(.stab.exclstr) }

.stab.index    0 : { *(.stab.index) }

.stab.indexstr 0 : { *(.stab.indexstr) }

.comment       0 : { *(.comment) }

/* DWARF debug sections.

Symbols in the DWARF debugging sections are relative to the beginning

of the section so we begin them at 0.  */

/* DWARF 1 */

.debug          0 : { *(.debug) }

.line           0 : { *(.line) }

/* GNU DWARF 1 extensions */

.debug_srcinfo  0 : { *(.debug_srcinfo) }

.debug_sfnames  0 : { *(.debug_sfnames) }

/* DWARF 1.1 and DWARF 2 */

.debug_aranges  0 : { *(.debug_aranges) }

.debug_pubnames 0 : { *(.debug_pubnames) }

/* DWARF 2 */

c2c9ed493cd281aa86d8a6f5178c4c01.gif [1] [2] 610626052e95c7fbe3d254abc769d9ad.gif

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值