STM32 keil5编译优化

发布者:theta18最新更新时间:2018-08-17 来源: eefocus关键字:STM32  keil5  编译优化 手机看文章 扫描二维码
随时随地手机看文章

本来是写个IAP程序,Flash中只规划了4K字节,但是代码编写完后有6k,所以寻找优化方案,优化完在1.7k左右。

STM32 keil5编译优化,可以勾选一下几项:

1、Options for Taeget-->Target

勾选使用微库



2、Options for Taeget-->Target

①选择优化级别Level 3(-O3)

②勾选One ELF Section per Function



3、关于One ELF Section per Function的作用特别说明下:

①编译器在处理一个 c 文件的时候呢,如果这个选项不选,那么这个C文件中的所有函数在编译后只会产生一个叫 .text 的输出节:

AREA ||.text||, CODE, READONLY, ALIGN=2 
如果选了呢,那么每个函数将会产生一个输出节,如果你用C写了一个叫PRTL_HeadGet()的函数,那么编译器将会产生一个叫 i.PRTL_HeadGet 的输出节,具体如下:
AREA ||i.PRTL_HeadGet||, CODE, READONLY, ALIGN=2
 PRTL_HeadGet PROC
勾选后,编译器产生的输出节,粒度小多了,便于找到没有使用的函数,将它从最后输出文件中删除。这样,你最后产生的可执行文件大小将会变小。

②代码大小对比:

没勾选:Program Size: Code=4152 RO-data=216 RW-data=36 ZI-data=6148  

勾选后:Program Size: Code=1376 RO-data=200 RW-data=0 ZI-data=6144  

③map文件对比:

工程右击open map file.

没勾选:

Removing Unused input sections from the image.该部分内容是去除项目中没有使用的函数。没勾选前是按照文件优化的。

==============================================================================


Removing Unused input sections from the image.


    Removing iap.o(.rev16_text), (4 bytes).
    Removing iap.o(.revsh_text), (4 bytes).
    Removing led.o(.rev16_text), (4 bytes).
    Removing led.o(.revsh_text), (4 bytes).
    Removing stm32f0xx_flash.o(.rev16_text), (4 bytes).
    Removing stm32f0xx_flash.o(.revsh_text), (4 bytes).
    Removing stm32f0xx_rcc.o(.rev16_text), (4 bytes).
    Removing stm32f0xx_rcc.o(.revsh_text), (4 bytes).
    Removing stm32f0xx_gpio.o(.rev16_text), (4 bytes).
    Removing stm32f0xx_gpio.o(.revsh_text), (4 bytes).
    Removing system_stm32f0xx.o(.rev16_text), (4 bytes).
    Removing system_stm32f0xx.o(.revsh_text), (4 bytes).
    Removing startup_stm32f030xc.o(HEAP), (512 bytes).

13 unused section(s) (total 560 bytes) removed from the image.

==============================================================================

勾选后:

看最后,94 unused section(s) (total 3760 bytes) removed from the image.由于每个函数一个输出节,所以优化是按照函数优化的,没有使用的函数都没有编译进去。而没有勾选时是按照文件优化的,只要该文件中有函数被使用,该文件中所有函数都会被编译进去。


Removing Unused input sections from the image.


    Removing iap.o(.rev16_text), (4 bytes).
    Removing iap.o(.revsh_text), (4 bytes).
    Removing iap.o(i.IAP_Delay), (6 bytes).
    Removing led.o(.rev16_text), (4 bytes).
    Removing led.o(.revsh_text), (4 bytes).
    Removing led.o(i.LEDTest), (42 bytes).
    Removing led.o(i.LED_flash), (40 bytes).
    Removing led.o(i.LED_temp_flash), (90 bytes).
    Removing stm32f0xx_flash.o(.rev16_text), (4 bytes).
    Removing stm32f0xx_flash.o(.revsh_text), (4 bytes).
    Removing stm32f0xx_flash.o(i.FLASH_EraseAllPages), (52 bytes).
    Removing stm32f0xx_flash.o(i.FLASH_GetFlagStatus), (20 bytes).
    Removing stm32f0xx_flash.o(i.FLASH_GetPrefetchBufferStatus), (20 bytes).
    Removing stm32f0xx_flash.o(i.FLASH_ITConfig), (24 bytes).
    Removing stm32f0xx_flash.o(i.FLASH_OB_BOOT0Config), (64 bytes).
    Removing stm32f0xx_flash.o(i.FLASH_OB_BOOT0SWConfig), (64 bytes).
    Removing stm32f0xx_flash.o(i.FLASH_OB_BOOTConfig), (64 bytes).
    Removing stm32f0xx_flash.o(i.FLASH_OB_EnableWRP), (140 bytes).
    Removing stm32f0xx_flash.o(i.FLASH_OB_Erase), (116 bytes).
    Removing stm32f0xx_flash.o(i.FLASH_OB_GetRDP), (20 bytes).
    Removing stm32f0xx_flash.o(i.FLASH_OB_GetUser), (16 bytes).
    Removing stm32f0xx_flash.o(i.FLASH_OB_GetWRP), (12 bytes).
    Removing stm32f0xx_flash.o(i.FLASH_OB_Launch), (20 bytes).
    Removing stm32f0xx_flash.o(i.FLASH_OB_Lock), (16 bytes).
    Removing stm32f0xx_flash.o(i.FLASH_OB_ProgramData), (56 bytes).
    Removing stm32f0xx_flash.o(i.FLASH_OB_RDPConfig), (92 bytes).
    Removing stm32f0xx_flash.o(i.FLASH_OB_SRAMParityConfig), (64 bytes).
    Removing stm32f0xx_flash.o(i.FLASH_OB_Unlock), (32 bytes).
    Removing stm32f0xx_flash.o(i.FLASH_OB_UserConfig), (72 bytes).
    Removing stm32f0xx_flash.o(i.FLASH_OB_VDDAConfig), (64 bytes).
    Removing stm32f0xx_flash.o(i.FLASH_OB_WriteUser), (60 bytes).
    Removing stm32f0xx_flash.o(i.FLASH_PrefetchBufferCmd), (24 bytes).
    Removing stm32f0xx_flash.o(i.FLASH_ProgramHalfWord), (52 bytes).
    Removing stm32f0xx_flash.o(i.FLASH_SetLatency), (20 bytes).
    Removing stm32f0xx_rcc.o(.rev16_text), (4 bytes).
    Removing stm32f0xx_rcc.o(.revsh_text), (4 bytes).
    Removing stm32f0xx_rcc.o(i.RCC_ADCCLKConfig), (44 bytes).
    Removing stm32f0xx_rcc.o(i.RCC_AHBPeriphResetCmd), (24 bytes).
    Removing stm32f0xx_rcc.o(i.RCC_APB1PeriphClockCmd), (24 bytes).
    Removing stm32f0xx_rcc.o(i.RCC_APB1PeriphResetCmd), (24 bytes).
    Removing stm32f0xx_rcc.o(i.RCC_APB2PeriphClockCmd), (24 bytes).
    Removing stm32f0xx_rcc.o(i.RCC_APB2PeriphResetCmd), (24 bytes).
    Removing stm32f0xx_rcc.o(i.RCC_AdjustHSI14CalibrationValue), (20 bytes).
    Removing stm32f0xx_rcc.o(i.RCC_AdjustHSICalibrationValue), (20 bytes).
    Removing stm32f0xx_rcc.o(i.RCC_BackupResetCmd), (28 bytes).
    Removing stm32f0xx_rcc.o(i.RCC_CECCLKConfig), (24 bytes).
    Removing stm32f0xx_rcc.o(i.RCC_ClearFlag), (20 bytes).
    Removing stm32f0xx_rcc.o(i.RCC_ClearITPendingBit), (12 bytes).
    Removing stm32f0xx_rcc.o(i.RCC_ClockSecuritySystemCmd), (28 bytes).
    Removing stm32f0xx_rcc.o(i.RCC_DeInit), (92 bytes).
    Removing stm32f0xx_rcc.o(i.RCC_GetClocksFreq), (376 bytes).
    Removing stm32f0xx_rcc.o(i.RCC_GetFlagStatus), (52 bytes).
    Removing stm32f0xx_rcc.o(i.RCC_GetITStatus), (20 bytes).
    Removing stm32f0xx_rcc.o(i.RCC_GetSYSCLKSource), (16 bytes).
    Removing stm32f0xx_rcc.o(i.RCC_HCLKConfig), (20 bytes).
    Removing stm32f0xx_rcc.o(i.RCC_HSEConfig), (16 bytes).
    Removing stm32f0xx_rcc.o(i.RCC_HSI14ADCRequestCmd), (24 bytes).
    Removing stm32f0xx_rcc.o(i.RCC_HSI14Cmd), (28 bytes).
    Removing stm32f0xx_rcc.o(i.RCC_HSI48Cmd), (28 bytes).
    Removing stm32f0xx_rcc.o(i.RCC_HSICmd), (28 bytes).
    Removing stm32f0xx_rcc.o(i.RCC_I2CCLKConfig), (24 bytes).
    Removing stm32f0xx_rcc.o(i.RCC_ITConfig), (24 bytes).
    Removing stm32f0xx_rcc.o(i.RCC_LSEConfig), (32 bytes).
    Removing stm32f0xx_rcc.o(i.RCC_LSEDriveConfig), (24 bytes).
    Removing stm32f0xx_rcc.o(i.RCC_LSICmd), (28 bytes).
    Removing stm32f0xx_rcc.o(i.RCC_MCOConfig), (24 bytes).
    Removing stm32f0xx_rcc.o(i.RCC_PCLKConfig), (20 bytes).
    Removing stm32f0xx_rcc.o(i.RCC_PLLCmd), (28 bytes).
    Removing stm32f0xx_rcc.o(i.RCC_PLLConfig), (28 bytes).
    Removing stm32f0xx_rcc.o(i.RCC_PREDIV1Config), (20 bytes).
    Removing stm32f0xx_rcc.o(i.RCC_RTCCLKCmd), (28 bytes).
    Removing stm32f0xx_rcc.o(i.RCC_RTCCLKConfig), (16 bytes).
    Removing stm32f0xx_rcc.o(i.RCC_SYSCLKConfig), (20 bytes).
    Removing stm32f0xx_rcc.o(i.RCC_USARTCLKConfig), (48 bytes).
    Removing stm32f0xx_rcc.o(i.RCC_USBCLKConfig), (24 bytes).
    Removing stm32f0xx_rcc.o(i.RCC_WaitForHSEStartUp), (44 bytes).
    Removing stm32f0xx_rcc.o(.data), (16 bytes).
    Removing stm32f0xx_gpio.o(.rev16_text), (4 bytes).
    Removing stm32f0xx_gpio.o(.revsh_text), (4 bytes).
    Removing stm32f0xx_gpio.o(i.GPIO_DeInit), (112 bytes).
    Removing stm32f0xx_gpio.o(i.GPIO_PinAFConfig), (32 bytes).
    Removing stm32f0xx_gpio.o(i.GPIO_PinLockConfig), (26 bytes).
    Removing stm32f0xx_gpio.o(i.GPIO_ReadInputData), (4 bytes).
    Removing stm32f0xx_gpio.o(i.GPIO_ReadInputDataBit), (14 bytes).
    Removing stm32f0xx_gpio.o(i.GPIO_ReadOutputData), (4 bytes).
    Removing stm32f0xx_gpio.o(i.GPIO_ReadOutputDataBit), (14 bytes).
    Removing stm32f0xx_gpio.o(i.GPIO_StructInit), (24 bytes).
    Removing stm32f0xx_gpio.o(i.GPIO_Write), (4 bytes).
    Removing stm32f0xx_gpio.o(i.GPIO_WriteBit), (12 bytes).
    Removing system_stm32f0xx.o(.rev16_text), (4 bytes).
    Removing system_stm32f0xx.o(.revsh_text), (4 bytes).
    Removing system_stm32f0xx.o(i.SystemCoreClockUpdate), (108 bytes).
    Removing system_stm32f0xx.o(.data), (20 bytes).
    Removing startup_stm32f030xc.o(HEAP), (512 bytes).


94 unused section(s) (total 3760 bytes) removed from the image.


==============================================================================


关键字:STM32  keil5  编译优化 引用地址:STM32 keil5编译优化

上一篇:keil5中新建一个STM32工程
下一篇:stm32f103的运行错误和keil5的一些变动

推荐阅读最新更新时间:2024-03-16 16:11

stm32——跑马灯实验(用库函数实现)
库函数介绍 1,初始化函数: void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct); 作用:初始化一个或者多个IO口(同一组)的工作方式和速度。该函数主要是操作GPIO_CRL(CRH)寄存器,在上拉或者下拉的有时候有设置BSRR或者BRR寄存器 例如: GPIO_InitTypeDef GPIO_InitStructure; GPIO_InitTypeDef.GPIO_Pin = GPIO_Pin_5;//LED0-- PB.5 端口配置 GPIO_InitTypeDef.GPIO_Mode = GPIO_Mode_OUT_PP;//
[单片机]
<font color='red'>stm32</font>——跑马灯实验(用库函数实现)
stm32 灵活静态存储控制器(FSMC)(NORFLASH\PSRAM)
Flexible static memory controller(FSMC) 今天在处理TFT彩屏的时候突然发现有人用FSMC控制器来处理,然后就认真的研究了下FSMC; 可见他分为4个块,三个类型,我们可以根据自己的需要来选择;这次我就直说FSMC 的Block 1; 首先,基地址BASE_ADDR = 6000 0000;至于片选,datasheet上也说了,我们可以通过控制HADDR(27,26)来选择操作; 然后还有今天一直困扰我的问题,我要选择A16,我用的是16位数据,他的数据地址为6000 0000 + 2^16*2 = 6002 0000;我一直都在疑惑:明明是A16,为什么是第17位被置1,后来
[单片机]
<font color='red'>stm32</font> 灵活静态存储控制器(FSMC)(NORFLASH\PSRAM)
STM32系统时钟 CAN UART
在调试USB-CAN的适配器的过程中,采用库函数开发,在调试串口的过程中串口数据始终乱码。 思考一番,发现由于外部晶振的原因,在 Keil 中Ctrl + Shift + F 查找 HSE_VALUE: #if !defined HSE_VALUE #ifdef STM32F10X_CL #define HSE_VALUE ((uint32_t)25000000) /*! Value of the External oscillator in Hz */ #else #define HSE_VALUE ((uint32_t)8000000) /*! Value of the External oscil
[单片机]
STM32自学笔记GPIO寄存器
GPIO寄存器一览 以下图片全部摘自STM32中文参考手册 GPIOx- CRL(x=A…E) 这个寄存器主要是设置GPIO的低8位(0~7)端口的配置 MODE 用来设置端口输出的速度 (在输入模式下不需要配置,仅在输出模式下需要配置) CNF 用来设置输入模式或者输出模式 例如 设置PA0为推挽输出速度为50MHz GPIOA- CRL&=0XFFFFFFF0;//PA0配置清零 GPIOA- CRL|=0X00000003;//PA0输出 速度50MHz 设置PA0为上下拉输入(默认下拉) GPIOA- CRL&=0XFFFFFFF0;//PA0配置清零 GPIOA- CRL|=0X00000008
[单片机]
<font color='red'>STM32</font>自学笔记GPIO寄存器
关于STM32软硬件兼容性相关的知识
Ⅰ、写在前面 很多朋友初学STM32的时候,对STM32芯片很多相关知识都不是很了解,导致了在学习的路上很迷茫,甚至半途放弃。希望本文的内容对初学的朋友有一定帮助。 常见问题: 1.我开发板是STM32F103ZE芯片,但网上找到的软件工程基于STM32F103R8芯片的,我能直接将工程下载并调试吗? 2.我有 STM32F205 R8的原理图和封装库,但现在需要画STM32F405RC芯片的板子,能直接替换使用吗? 以上问题在你阅读本文之后就会得到比较明确的答案。 关于本文的更多详情请往下看。 Ⅱ、本文要点 从本文的标题可以看得出来,主要是站在“STM32兼容性”的角度来分析问题。 在开发STM32项目中
[单片机]
关于<font color='red'>STM32</font>软硬件兼容性相关的知识
STM32延时函数的方法
STM32延时函数的方法 1.普通延时法 这个比较简单,让单片机做一些无关紧要的工作来打发时间,经常用循环来实现,不过要做的比较精准还是要下一番功夫。 2.SysTick 定时器延时 CM3 内核的处理器,内部包含了一个SysTick 定时器,SysTick 是一个24 位的倒计数定时器,当计到0 时,将从RELOAD寄存器中自动重装载定时初值。 延时函数delay的编写 原理:3层for循环,循环次数是 NUM = 4X5X248 = 4960次,由每次循环都有条件判断(如 i 》0)和自减语句(如 i--),因此每次循环又耗费两个机器周期 所以,总耗费的机器周期为 SUM = NUM x 2 = 9920个。 整合自:CS
[单片机]
stm32-esp8266驱动程序
esp8266模块是串口通讯,通讯的协议是AT指令,要正确的配置对应的AT指令模块才可以工作,这里就需要知道AT指令有没有配置成功,这个比较容易实现,一般发送AT指令配置成功的话,芯片都会返回至少一个OK,当然还有其它数据,我们只需要去解析有没有接收到OK就知道指令发送是否成功了。我这里是作为TCP客服端,所以只需要以下一些指令即可: 1 发送 ATrn 返回 OK 以上操作确保芯片连接正常,工作正常 2 发送 ATE0rn 返回 OK 关闭回显 3 发送 AT+CWMODE=1rn 返回 OK 设置成客服端模式 4 发送 AT+CIPSTATUS 返回 2 3 4 5 2
[单片机]
stm32-esp8266驱动程序
基于STM32 MCU的太阳能LED街灯解决方案
随着化石类能源的日益减少,以及温室气体的过度排放导致全球变暖问题越来越受到重视,人们一方面在积极开发各类可再生新能源,另一方面也在倡导节能减排的绿色环保技术。太阳能作为取之不尽、用之不竭的清洁能源,成为众多可再生能源的重要代表;而在照明领域,寿命长、节能、安全、绿色环保、色彩丰富、微型化的led固态照明也已被公认为世界一种节能环保的重要途径。太阳能-LED街灯同时整合了这两者的优势,利用清洁能源以及高效率的LED实现绿色照明。 本文介绍的太阳能-LED街灯方案,能自动检测环境光以控制路灯的工作状态,最大功率点追踪(MPPT)保证最大太阳能电池板效率,恒电流控制LED,并带有蓄电池状态输出以及用户可设定LED工作时间等功能。
[电源管理]
基于<font color='red'>STM32</font> MCU的太阳能LED街灯解决方案
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved