Keil如何提升性能和减小代码大小

2023-11-05

在编译程序的过程中,需要考虑两个问题,一个是使用的代码够不够快,另一个是编译的代码够不够小,下面汇集一些解决方法,主要针对Keil ARMCC编译器:

1,让代码够小

如图 1,未进行任何优化时,keil编译生成的文件大小为:9668字节。 
这里写图片描述 
第一步:project >> Option for Target “**” 打开如图 2界面。选择“target”,勾选上“Use MicroLIB”再编译。

这里写图片描述

分析:microLIB是缺省的C库,而且microLIB进行了高度优化。如果不勾选“Use MicroLIB”,keil会连接标准C库。所以勾选“Use MicroLIB”会减小code大小。 
第二步:project >> Option for Target “**” 打开如界面。选择“C/C++”,勾选上“One ELF Section per Functin”再编译。

这里写图片描述

分析:“One ELF Section per Functin”就是将每个函数都生成一个ELF文件,最会将需要的函数链接成一个大的ELF文件。但是如果没有勾选“One ELF Section per Functin”。Keil将每个文件编译成一个ELF文件(即使文件中用未被使用的函数),最会链接成一个ELF文件。所以勾选“One ELF Section per Functin”会使code变小。

2,让代码够快

注意使用的库函数,在使用memcpy的时候要注意,这里已经碰到了一些坑,C库函数提供的memcpy性能有待提高,所以如果代码中有大量的数据拷贝的情况,需要注意下这里的性能问题,可以自己实现这块的代码,目前找了集中memcpy的替代方案,有待验证:

(1)普通标准库的方法

void *memcpy(void *dest, const void *src, size_t count)  
{  
 char *tmp = dest;  
 const char *s = src;  
   
 while (count--)  
  *tmp++ = *s++ ;  
    
 return dest;  
}  

(2)考虑到重叠的实现方法

void *memcpy(void *dest, const void *src, size_t count)  
{  
 char *d;  
 const char *s;  
   
 if (dest > (src+size)) || (dest < src))  
    {  
    d = dest;  
    s = src;  
    while (count--)  
        *d++ = *s++;          
    }  
 else /* overlap */  
    {  
    d = (char *)(dest + count - 1); /* offset of pointer is from 0 */  
    s = (char *)(src + count -1);  
    while (count --)  
        *d-- = *s--;  
    }  
    
 return dest;  
} 

(3)另外还看到一种更高效的方法,可以尝试,参考如下链接:

http://blog.163.com/lzh_327/blog/static/7219480201110184108805/

void duff_memcpy( char* to, char* from, int count ) {
    size_t n = (count+7)/8;
    switch( count%8 ) {
		case 7:     *to++ = *from++;
		case 6:     *to++ = *from++;
		case 5:     *to++ = *from++;
		case 4:     *to++ = *from++;
		case 3:     *to++ = *from++;
		case 2:     *to++ = *from++;
		case 1:     *to++ = *from++;
		case 0: do{ *to++ = *from++;
		}while(--n>0);
    }
}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Keil如何提升性能和减小代码大小 的相关文章

  • Gooey使用python打包后,print不能输出到GUI的命令行窗口内的问题解决

    为了给自己的图片接口站api horosama com补充图片 写了个壁纸爬虫程序 同时用Gooey做了个简单的GUI 然而 程序在vscode里直接运行的时候 是可以print函数输出到GUI的命令行窗口的 用pyinstaller打包之
  • QT QLine 使用详解

    本文详细的介绍了QLine控件的各种操作 例如 新建界面 源文件 设置属性 设置宽度 最小宽度 样式表 其它文章等等操作 实际开发中 一个界面上可能包含十几个控件 手动调整它们的位置既费时又费力 QLine表示平面上整数精度的二维向量 用于
  • Mybatis获取自动增长Id

    Mybatis获取自动增长Id MyBatis成功插入后获取自动增长的id 1 向xxMapping xml配置中加上两个配置
  • 基于51单片机温度控制风扇转动

    基于51单片机温度控制风扇转动 实验是在郭天祥老师的51单片机实验教程上做的改动 实验要求 数码管上显示的温度大于要求的温度时 这里设定是34度 风扇转动 实验步骤 1 温度传感器获得温度 2 对数据进行处理 3 把温度显示到数码管上 4
  • Tcl/TK基础语法学习(三)---字符串

    字符串基本用法 字符串表示 指定重复次数 string repeat 指定字符类型 sting is 返回 0 1 字符串长度 string length 包括空格 索引值 字符索引string index 字符获取 sring range
  • WebDriver介绍

    什么是Selenium 和WebDriver Selenium是一个浏览器自动化操作框架 Selenium主要由三种工具组成 第一个工具SeleniumIDE 是Firefox的扩展插件 支持用户录制和回访测试 录制 回访模式存在局限性 对
  • 蓝牙之十一 AVRCP协议

    Profile简介 AVRCP子协议的作用是支持CT控制TG 具体来说如果手机和一个蓝牙音箱设备连接上了 那么音箱可以控制手机播放 暂停 切歌以及获得手机上播放歌曲的信息 如专辑 歌名 歌手 时长等信息 iphone对信息获取支持较为完善
  • mac去除dmg打开密码的方法

    由于使用osx 系统 经常会访问到很多网站下载的dmg都会有密码 特别是风云社区上面的几千款免费精品Mac软件 社区地址如下 每次操作起来还是挺麻烦的 所以我们得去除这个密码 毕竟作为一个开发者不管是写代码还是电脑使用都得高效 一 打开di
  • socket通信中的几个重要结构体定义

    struct sockaddr unsigned short sa family 地址类型 AF xxx char sa data 14 14字节的端口和地址 struct sockaddr in short int sin family
  • CentOs7静默安装oracle11

    我们安装几个必要的工具 yum y install vim yum y install unzip yum y install lrzsz yum y update 先装这几个 安装Oracle11GR2所需要的依赖包 我们准备以下软件 l
  • Oracle 体系结构

    体系结构包括实例 SGA 后台进程 数据库文件 用户进程和服务器进程以及其他文件 如参数文件密码文件和归档日志文件等 1 物理结构 文件组成 数据文件 数据库操作中数据的最终存储位置 控制文件 验证数据库完整性 重做日志文件 在发生故障时用
  • Python通过日志loguru记录程序中的中间变量,同时导出并分析

    文章目录 思路 示例代码 1 源程序中这样保存中间结果 2 解析中间结果并导出 在程序运行的时候除了密密麻麻的日志外 这些关键函数的输入输出也十分重要 是回溯与数据核对的唯一 思路 使用loguru日志库 将不常见的 TRACE 级别作为保
  • 虚拟机ubuntu设置和windows的共享文件夹

    vmware workstation 12 ubuntu 16 04 参考 VMware下Ubuntu与宿主Windows共享文件夹 VMware无法通过mount挂载共享文件夹 下面的评论 ubuntu 执行apt get update报
  • 找不到vcruntime140.dll无法继续执行代码怎么办?(详解)

    1 vcruntime140 dll是什么 有什么作用 vcruntime140 dll是Windows操作系统中的一个动态链接库文件 它属于Microsoft Visual C Redistributable的一部分 DLL是Dynami
  • Metro UI CSS 学习笔记之组件(对话框)

    查阅Metro UI CSS 对组件 对话框 描述 本人觉得已经描述的很详细 所以在这里不打算做详细的讲解 大家可以直接阅读以下源代码 是进过本人已经优化后的代码 温馨提示 相关注释 也已经在代码中添加
  • 玩转ChatGPT:名单排序

    一 写在前面 最近在文秘工作中 碰到一个名字排序的问题 大概的规则 1 按照第一个汉字的首字母的英文单词排序 从A Z 2 若第一个字的首字母一致 则比较二个字的首字母 同样是A Z 3 若第二个字的首字母一致 则比较三个字的首字母 同样是
  • Webpack5核心原理与应用实践(基础用法)一

    前言 记录Webpack基本配置规则 根据场景 技术栈运用具体方法 工具与技巧 主要有 搭建完善的JavaScript CSS开发环境 搭建微前端 NPM包 桌面应用等 一 Webpack配置项 1 Webpack编译流程 Webpak原生
  • 【1day】复现Cellular Router命令执行漏洞

    注 该文章来自作者日常学习笔记 请勿利用文章内的相关技术从事非法测试 如因此产生的一切不良后果与作者无关 目录 一 漏洞描述 二 影响版本 三 资产测绘 四 漏洞复现 一 漏
  • vue-cli 项目集成 Jest 单元测试

    前言 前端单元测试对于保证代码质量和稳定性是非常重要的 为什么需要单元测试 检测bug 提升回归效率 保证代码质量 一 框架对比 Mocha 比较灵活成熟 但没有内部集成 需要自主选择断言库和监听库 Jasmine 是 Jest 的底层库

随机推荐

  • 堆,栈、和内存管理

    1 stack 栈 是存在于某作用域 scope 的一个内存空间 memory space 例如当你调用函数 函数本身即会生成一个stack用来放置它所接收的参数 以及返回地址 在函数本身 function body 内声明的任何变量其所使
  • 2023年陕西省《网络建设与运维》技能大赛试题

    项目简介 某集团公司原在北京建立了总公司 后在成都建立了分公司 广东设立了办事处 集团设有产品 营销 法务 财务 人力5个部门 全网采用OSPF RIP ISIS BGP路由协议进行互联互通 集团在北京建立两个数据中心 贵州建立异地灾备数据
  • npm 常见插件安装

    npm 常见插件安装 为方便项目中遇到各种插件的安装 特做以下的积累 持续更新中 1 element ui npm i element ui S 2 vuex npm install vuex 3 vue cli npm install g
  • Flyway简介及使用

    Flyway简介及使用 1 简介 1 1 Flyway是什么 Flyway是一款开源的数据库版本管理工具 它更倾向于规约优于配置的方式 Flyway可以独立于应用实现管理并跟踪数据库变更 支持数据库版本自动升级 并且有一套默认的规约 不需要
  • AngularJS弹出框 $modal的使用

    HTML 注意在Chrome浏览器中会给input添加默认样式 影响到打钩的框出不来 主要是position和影响透明度的opacity
  • 顺序栈的基本操作

    顺序栈的基本操作 08 09 21 21 06 lkm 顺序栈的基本操作 include
  • Android文件存储(例子)

    Android文件存储 例子 Android的文件存储 有I O流的方式存储 与java一样 还有一种Android自己的SharePreferences存储方法 下面看一个例子 用I O流的方式存储方法和SharePreferences存
  • 【嵌入式中的C】寄存器清零和置位操作

    对寄存器中的某一位进行操作 如果是封装到具体功能Bit以及bit组的代码工程 可以直接进行赋值 封装代码的方式可以参看这个链接 嵌入式中的C 联合体 union以及一般使用方式 如果是整个寄存器呢 比如stm32寄存器映射的时候标准库是这么
  • 国际麻将番种介绍(明星三缺一)

    国标版番种介绍 名称 番数 说明及实例 大四喜 88 由4副风刻 杠 组成的胡牌 不计圈风刻 门风刻 三风刻 对对胡 小四喜 幺九刻 缺门 大三元 88 胡牌中 有中发白3副刻子 不计箭刻 双箭刻 小三元 缺门 绿一色 88 由23468条
  • 文本超出部分显示省略号

    我们经常在网站上可以看到以下样式 标题太长 一行显示不下 则会使用省略号来代替 但是事实上 这个省略号并不是打字打上去的 而是使用代码表示出来的 今天则主要介绍如何让文本超出部分显示省略号 1 单行文本超出部分显示省略号 1 1 语法
  • 流程图Drawio宝藏软件(终于可以代替了ProcessOn)

    文章目录 一 上连接开始编辑 二 官网 三 笔者版本 优点一 完全免费无任何使用限制 无需认证 优点二 一款在线的绘图工具也可以安装软件 效果完全相同 优点三 Drawio 是自带30多个国家的语言 包括中文 不需要注册就可以登陆使用 优点
  • java中集合排序的常用方法总结

    前言 1 集合元素为数字 2 集合元素为对象 前言 平常的开发需求中肯定会遇到对集合排序问题 最常见的排序是在持久层中使用sql进行排序 但是由于业务限制或是其他原因 不能在持久层进行排序处理只能在逻辑层处理 那今天就来聊一下如何在逻辑层
  • AXI从设备接口

    AXI从设备接口 可以实现EP应用 即作为PCIe总线主设备通过PCIe总线向主机发起PCIe事务 实现RP应用时 AXI从设备接口可以用于发起I O 配置CFG和延迟内存写DMWr请求 实现EP应用时 该接口连接的客户逻辑 外设 必须具有
  • vue的script的三种写法

    以搜索框为例子 vue2的写法 第一种
  • 2021年阿里巴巴83行代码挑战赛来啦!赢MacBook Pro等好礼

    2021年83行代码挑战赛来啦 点击立即前往 CHERRY机械键盘 代码马克杯 Git 鼠标垫 霸王洗发水等2000份将奖品等你来 本次大赛由阿里云云效团队耗时一个月精心筹备 熬夜加班完成 只为真诚地用代码向所有卓越的程序猿致敬 也向卓越的
  • docker logs命令查看日志

    docker logs 打印详细信息 docker logs mysql 容器名字 NAMES docker logs d6c6e958f022 容器ID CONTAINER ID docker logs f 持续输出日志 持续的输出名为m
  • vscode配置码云

    参考 https blog csdn net watfe article details 79761741 1 通过git init命令把这个目录变成Git可以管理的仓库 建立本地仓库 本地仓库和代码开发的不是同一个 git init In
  • 关于elasticsearch连接时断时续以及Kibana出现server is not ready yet的问题,大坑!

    代码小白 记录自学制作谷粒商城遇到的坑 如有错误请轻喷 1 问题的出现 elasticsearch连接时断时续 在加完分词插件之后 出现了elasticsearch连接失败的情况 但是经过多次刷新之后居然是可以成功连接上去的 查看日志也没发
  • react的jsx的基本语法和创建脚手架

    初始react react是一个构建用户界面的javascript库 创建一个简单react 第一步 引入核心库 第二步 在真实dom中提供一个挂载点 div div 第三步 业务代码 创建虚拟dom对象 createElement let
  • Keil如何提升性能和减小代码大小

    在编译程序的过程中 需要考虑两个问题 一个是使用的代码够不够快 另一个是编译的代码够不够小 下面汇集一些解决方法 主要针对Keil ARMCC编译器 1 让代码够小 如图 1 未进行任何优化时 keil编译生成的文件大小为 9668字节 第