1. 减少使用switch

2. 函数内部尽量使用内部变量,减少使用全局变量的次数

void func(void){
uint32_t sysclk;
  ... // 其他代码
rccClocks.SYSCLK = sysclk;
#if 1
// Code (inc. data) RO Data RW Data ZI Data Debug Object Name
// 416 34 40 0 28 289466 rcc.o
rccClocks.AHBCLK = sysclk / rccGetAHB_DIV();
#else
// Code (inc. data) RO Data RW Data ZI Data Debug Object Name
// 420 36 40 0 28 289466 rcc.o
rccClocks.AHBCLK = rccClocks.SYSCLK / rccGetAHB_DIV();
#endif
}

3. 尽量使用memset复位较多的数据:

#if 1
//Code (inc. data) RO Data RW Data ZI Data Debug Object Name
// 416 34 40 0 28 289474 rcc.o
memset(&rccClocks, 0, sizeof(rccClocks));  // 与size无关

    // 416         34         40          0         28     289474   rcc.o
    // memset(&rccClocks, 0, 32);

    // 416         34         40          0         28     289474   rcc.o
    // memset(&rccClocks, 0, 100);
#else
// Code (inc. data) RO Data RW Data ZI Data Debug Object Name
// 440 36 40 0 28 289486 rcc.o
rccClocks.PLLCLK = 0;
rccClocks.APBCLK[0] = 0;
rccClocks.AHBCLK = 0;
rccClocks.TIMCLK[0] = 0;
rccClocks.APBCLK[1] = 0;
rccClocks.SYSCLK = 0;
rccClocks.TIMCLK[1] = 0;
#endif

    // 416         36         40          0         28     289486   rcc.o
    rccClocks.PLLCLK    = 0;
    rccClocks.AHBCLK    = 0;

4. 避免使用do-while(0)

#if 0
// 416 34 40 0 28 289470 rcc.o
rccClocks.APBCLK[1] = apbclk;
#elif 0
// 424 36 40 0 28 289482 rcc.o
do {
rccClocks.APBCLK[1] = apbclk;
} while (0);
#elif 0
// 416 34 40 0 28 289478 rcc.o
rccClocks.APBCLK[1] = apbclk;
struct empty {
};
#else
// 416 34 40 0 28 289474 rcc.o
{
rccClocks.APBCLK[1] = apbclk;
};
#endif

可用inline函数替代:

#if 1
// 408 34 40 0 28 289422 rcc.o
static inline uint32_t APB_DIV_SEL(uint32_t n)
{
if (n & 0x04) {
n ^= 0x04;
return (1 << (1 + n));
} else {
return 1;
}
}
#else
// 408 34 40 0 28 289358 rcc.o
# define APB_DIV_SEL(n) (((n)&0x04) ? (1 << (1 + (n ^ 0x04))) : 1)
#endif
#if 0
// 416 34 40 0 28 289466 rcc.o
return (1 << (1 + index));
} else {
return 1;
}
#else
// 416 36 40 0 28 289466 rcc.o
index += 1;
} else {
index = 0;
}
return (1 << index);
#endif
#if 0
// 416 34 40 0 28 289466 rcc.o
index ^= 0x04;
#else
// 420 34 40 0 28 289466 rcc.o
index &= ~0x04;
#endif

减小code体积的书写习惯的更多相关文章

  1. 最佳实践 —— 详细谈谈如何减小APK体积

    转载请注明出处: http://www.cnblogs.com/soaringEveryday/p/5254520.html 随着Android移动开发的需求越来越复杂,我们不可避免的遇到发布出去的a ...

  2. 减小delphi体积的方法

    1.关闭RTTI反射机制  自从Delphi2010中引入了新的RTTI反射机制后,编译出来的程序会变得很大,这是因为默认情况下 Delphi2010 给所有类都加上了反射机制.而我们的工程并不每每都 ...

  3. Jmeter(六)Jmeter脚本包含要素及书写习惯

    Jmeter有丰富的组件,逻辑控制器.配置原件.Sampler.定时器.前置处理器.后置处理器.断言.监听器:而编写脚本一定要养成个人习惯,让人看到Jmeter的脚本目录结构树能够一目了然:因此,首先 ...

  4. Docker减小镜像体积

    导航: 这里分为几个部分. 相关转载云原生:米开朗基杨 1.Docker减小镜像体积 2.Docker镜像针对不同语言的精简策略 对于刚接触容器的人来说,他们很容易被自己制作的 Docker 镜像体积 ...

  5. 使用--gc-section编译选项减小程序体积

    本周在给程序添加功能的时候,突然发现,我只是写了几个函数,还没调用,size就变大了.这肯定是不行的嘛,没用的函数就应该不链接进来,占用我宝贵的空间. 这种功能,讲道理编译器肯定要支持的,于是搜了一下 ...

  6. 减小ipa体积之删除frameWork中无用mach-O文件

    最近项目末期, 我们团队为了ipa的大小使用不少的体积减小的方法, 除了一些常规的方法之外, 我分享一下自己研究出来的新思路. 首先我们来简单的介绍一下mach-O. 什么是mach-O? Mach- ...

  7. Android Studio如何减小APK体积

    最近在用AndroidStudio开发一个小计算器,代码加起来还不到200行.但是遇到一个问题,导出的APK文件大小竟然达到了1034K.这不科学,于是就自己动手精简APK.下面我们大家一起学习怎么缩 ...

  8. 减小Cookie体积

    HTTP coockie能够用于权限验证和个性化身份等多种用途.coockie内的有关信息是通过HTTP文件头来在webserver和浏览器之间进行交流的.因此保持coockie尽可能的小以降低用户的 ...

  9. php代码书写习惯优化小结

    (1)使用 static 静态方法比普通方法快4倍(2)echo输出快于print(3)连接字符使用 , 代替 .(4)循环之前先取出最大值,而不是在循环里面取值    正确的方法      $max ...

  10. 好的js书写习惯

    1:单一判断 bad if (result) { console.log("秋叶"); } if (!result) { console.log("秋叶"); ...

随机推荐

  1. CSS和CSS3(背景,图片,浮动等)

    CSS和CSS3背景图片 CSS的背景,无法伸缩图片. <!DOCTYPE html> <html lang="en"> <head> < ...

  2. STM32学习笔记:创建标准库工程模板

    背景 标准库下载:地址 本章的项目可以在这里下载. STM32作为一类经典的MCU.本人从2018年1月1日开始对于STM32系列单片机的学习. 本人所持的型号为:STM32F429ZI-DISCOV ...

  3. [ABC184F] Programming Contest题解

    前置知识 meet in middle (折半搜索) 会的大佬请跳过 不会的请自己前往oi wiki或CSDN(百度吧,少年) 解题思路 纯暴力 看完题目考虑将每一种情况计算出来,排序后找不超过T的最 ...

  4. vue - ElementUI

    关于ElementUI最好还是通过实践项目来做,来熟悉. 这只是一些ElementUI的注意事项,至此vue2的内容真的全部完结,后面将继续vue3的内容更新. 一.完整引入 一般提及什么什么UI会有 ...

  5. VulnHub - breach系列:breach-2.1

    VulnHub - breach系列:breach-2.1 靶机描述 Breach 2.0 是多部分系列中的第二部分,是一项 boot2root/CTF 挑战,旨在展示真实场景,沿途充满了曲折和恶作剧 ...

  6. PLSQL 无法查询带中文的WHERE条件

    今天遇到一个坑爹的问题,plsql无法查询带where条件的语句,是因为plsql中Oracle的客户端字符集和服务器上的不一样造成的,需要新增系统环境变量,特意记录下解决办法. 第一步:查询服务器上 ...

  7. linux环境搭建mysql5.7总结

    以下安装方式,在阿里云与腾讯云服务器上都测试可用. 一.进入到opt目录下,执行: [root@master opt]# wget https://dev.mysql.com/get/Download ...

  8. VirtualBox Ubuntu 22.04 Server联网、与主机互联

    使用 VirtualBox 7.0安装了两个Ubuntu 22.04 Server虚拟机,想要实现: 主机与虚拟机互联 虚拟机之间互联,且互联的IP应为静态 虚拟机可以联网 解决方法 每个虚拟机配置两 ...

  9. MES 与 PLC 的几种交互方式

    在 MES 开发领域,想要从 PLC 获取数据就必须要和 PLC 有信号交互.高效准确的获取 PLC 数据一直是优秀 MES 系统开发的目标之一.初涉相关系统开发的工程师往往不能很好的理解 PLC 和 ...

  10. 聊天chat封装

    说明:连接状态,客户端ID,在线状态,连接中,当前聊天会话ID,当前聊天对象ID,总未读数, 聊天功能实现首先要保证当前用户已经登录状态 监听登录时更新会话列表 监听退出时更新会话列表 发起聊天的时候 ...