历史上的今天
返回首页

历史上的今天

今天是:2025年07月26日(星期六)

正在发生

2019年07月26日 | Keil5配置GCC编译器编译STM32工程

2019-07-26 来源:eefocus

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


http://blog.csdn.net/lan120576664/article/details/46806991


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


一、下载GCC编译器

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


二、安装GCC

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

这里写图片描述


三、配置Keil

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


Prefix:arm-none-eabi-

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

这里写图片描述


四、配置工程设置

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和下文连接规则一起说

这里写图片描述


2.配置Assembler编译规则

类似前一项


Misc Controls : -mcpu=cortex-m3 -mthumb

这里写图片描述


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.csdn.net/pengfei240/article/details/55228228



这里写图片描述

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 */

推荐阅读

史海拾趣

Franz Binder GmbH & Co公司的发展小趣事

Franz Binder GmbH & Co公司的发展故事

故事一:初创与奠基

Franz Binder GmbH & Co公司,简称宾德集团,成立于1960年,由Franz Binder在德国创立。起初,公司仅是一个机械加工车间,专注于加工车削件。然而,随着技术的不断积累和市场需求的增长,宾德开始专注于圆形连接器的生产。1967年,公司成功生产出第一只连接器,这标志着宾德正式进入连接器制造领域。此后,宾德不断投入研发,提升产品质量,逐渐在行业内崭露头角。

故事二:全球化布局

随着业务的不断扩展,宾德集团开始寻求全球化发展。1979年,宾德在瑞士成立了分公司Binder Electronic Components,标志着公司正式走向世界。此后,宾德在全球范围内迅速扩张,相继在美国、中国、法国、瑞典、英国、新加坡、荷兰和韩国等国家成立了子公司,并与全球45个经销商建立了合作关系。这一全球化布局不仅提升了宾德的品牌影响力,还为公司带来了更多的市场机会。

故事三:技术创新与产品多样化

宾德集团始终将技术创新视为企业发展的核心动力。公司不断投入研发资源,推出了一系列具有创新性的连接器产品。从微型连接器到电源连接器,再到医疗设备连接器和自动化技术连接器,宾德的产品线日益丰富,满足了不同行业的需求。特别是在工业自动化领域,宾德连接器以其高可靠性、高传输率和易于安装的特点,赢得了众多客户的青睐。

故事四:品质与认证

品质是宾德集团赖以生存和发展的基石。公司始终坚持高标准、严要求,确保每一件产品都符合国际质量标准。为此,宾德不仅通过了ISO 9001和ISO 14001等国际质量管理体系认证,还获得了UL、VDE和ESTI+等多项国际认证。这些认证不仅证明了宾德产品的卓越品质,也为客户提供了更多的信心和保障。

故事五:中国市场的发展

中国作为全球最大的电子市场之一,对宾德集团的发展具有重要意义。2001年,宾德在中国成立了全资子公司——南京宾德电气有限公司(宾德中国),负责中国地区的销售和客户服务。自成立以来,宾德中国凭借优质的产品和服务,迅速赢得了中国市场的认可。特别是在智能制造、自动化技术和医疗等领域,宾德连接器的应用越来越广泛,为中国电子行业的发展做出了积极贡献。

GardTec Inc公司的发展小趣事

背景:GardTec Inc公司,成立于1987年(也有资料显示为1985年),自创立之初便确立了成为全球风扇配件产品第一供应商的目标。这一明确的定位为公司后续的发展奠定了坚实的基础。

发展:在创立初期,GardTec专注于风扇配件的研发与生产,通过技术创新和品质提升,逐渐在行业内崭露头角。公司利用现代化的制造和工程设施,不断突破设计与材料的限制,推出了一系列具有创新性的风扇配件产品。

影响:随着产品质量的提升和市场份额的扩大,GardTec逐渐在电子行业中建立了良好的口碑,为后续的快速发展奠定了基础。

FCI [First Components International]公司的发展小趣事

背景:为了满足全球客户的需求,GardTec开始实施全球化战略,在亚洲和美国等地设立全球制造厂和库存地。

发展:通过在全球范围内的战略布局,GardTec不仅提升了产品的供应效率,还更好地服务了世界各地的客户。公司的全球化布局进一步巩固了其在风扇配件市场的领先地位。

影响:全球化战略的实施,使得GardTec的产品能够迅速响应市场变化,满足不同地区客户的多样化需求,从而增强了公司的市场竞争力。

American Power Management Inc公司的发展小趣事

为了进一步提升竞争力,APMI开始实施国际化发展战略。公司积极开拓海外市场,与国际知名电子制造商建立合作关系。同时,APMI还加强了与国际同行的技术交流与合作,吸收借鉴先进的管理经验和技术成果。通过国际化发展,APMI不仅拓宽了市场渠道,还提升了公司的国际影响力。

粤翔(FlyWin)公司的发展小趣事
信号处理单元接收到电压异常信号后,迅速向处理器发出警告,使处理器有时间执行数据保存操作。
CYMBET公司的发展小趣事

在电子行业中,技术的更新换代速度极快。为了保持竞争力,CYMBET公司始终将创新作为核心驱动力。公司不断投入研发资金,引进先进设备和技术人才,对EnerChip技术进行持续的优化和升级。例如,公司成功研发出了更高能量密度、更长寿命的EnerChip电池芯片,进一步提升了产品的性能和市场竞争力。同时,CYMBET还积极探索新的应用领域,将EnerChip技术应用于可穿戴设备、物联网等新兴领域,为公司带来了新的增长点。

问答坊 | AI 解惑

基于单片机和FPGA的DDS信号源

本帖最后由 paulhyde 于 2014-9-15 03:10 编辑 基于单片机和FPGA的DDS信号源  …

查看全部问答>

WINCE5.0下的IE为何无法浏览WAP网站?

WINCE自带的IE浏览器其他网站都可以浏览,就是不能浏览WAP网站,请问各位DX这是什么原因?应该如何解决?…

查看全部问答>

winCE 下如何得到设备名

请问如何知道板子已有设备的设备名?比如要找LCD的设备名,我找遍了Display驱动程序也没有找到。但是相关函数比如CreateFile()要用到设备名。哪个文件记录了所有的设备的设备名呢?…

查看全部问答>

如何在WinCE上创建窗口,并在窗口上加按钮,使用VS2005下的VC++,

大家好, 小弟想在PDA中做一个WinCE应用程序,(不知道这么说是否准确?:) 要求很简单, 首先创建一个窗口, 然后,在这个窗口上创建几个按钮, 使用的是VS2005下的VC++, 希望大哥们能帮忙,多谢, …

查看全部问答>

先发点TFT LCD的资料

最近用的是LM3S9B96,屏是ILI932x系列的2.8 TFT LCD,欢迎大家一起讨论!…

查看全部问答>

直接页面寄存器

请问大家什么叫直接页面寄存器?我网上没有搜到这个术语的解释…

查看全部问答>

Keil中 Program Size: Code RO-data RW-data ZI-data 所代表的意思

在Keil中编译工程成功后,在下面的Bulid Ouput窗口中会输出下面这样一段信息: Program Size: Code=6320  RO-data=4864  RW-data=44  ZI-data=1636    代表的意思: Code :是程序中代码所占字节大小 RO-data :程 ...…

查看全部问答>

自行车灯光

请教大神一下,这个是什么原理…

查看全部问答>

AD10 原理图报错

现在用AD10画原理图,元器件重名的时候不会再器件旁边画红色波浪线警告了,AD6.9是有的,为什么啊?是要设置什么规则吗?自己摸索了下在project option里面设置了没反应,求助…

查看全部问答>