提升效率,减少时间和资源的消耗

尽量用最少的文字描述清楚问题。

事情起因是这样的:

  要做遥控小车的平台迁移,STM32开发板无法方便地供电,因此又拿出了尘封的51(STC89C52RC),搭配上最小系统板就可以用排针加杜邦线供电了。

测试的时候出了点问题,51开发板上用作显示的数码管会闪动,而在逻辑正确的情况下是不会出现这个情况的(后来发现数码管的位选段选信号有点小问题)。在排查过程中,一步一步找到了中断处理程序。

51一共有5个中断源,其中有2个定时器中断T0 T1,2个外部中断,1个串口中断。52比51多一个定时器中断T2。

定时器有4种工作模式,T0和T1的M1M0均为01的时候,也即TMOD为0x11时,是工作模式1,为16位定时器。不自动重装初值,需要手动重装初值。

初学51的入门书是郭天祥老师的<新概念51单片机C语言教程>,在第3章第5节讲述定时器中断的时候,为了讲述方便和容易理解,中断服务程序中是这样写的:

void T0_time() interrupt 1
{
    TH0 = (65536-45872)/256;
    TL0 = (65536-45872)%256;
    //...
    //...
}

这是在11.0592MHz晶振下50ms来一次中断的重装初值的方法。关于这个的解释是这样的。

在晶振为12M的时候,由于机器周期是12个时钟周期,机器周期为(1/12M)*12 = 1 (us)
也就是计一个数需要 1us
50ms需要 计50000个数
所要装入的总数是 65536-50000=15536
所要装入的初值是
    TH0=(65536-50000)/256;
    TL0=(65536-50000)%256;

在晶振为11.0592M的时候,机器周期为(1/11.0592M)*12 = 1 x 12 /11.0592 =1.085 (us)
100us,需要计 100/1.085 = 92.16个数,取整 92
所要装入的总数是 65536-92
所要装入的初值是
    TH0=(65536-92)/256;
    TL0=(65536-92)%256;

  其实我想说的是,虽然这样可能比较容易看懂(配合注释),但是就把这个表达式放在这儿而不把结果计算出来,会使效率大打折扣!

  其实在50ms下还好,因为总时间比较长,每次计算(65536-45872)/256的时间虽然是固定的,但是百分比较小,相对影响较小。

  当设定中断为100us来一次的时候,会使得计算表达式的时间所占百分比大大提升。由于100us = 0.1ms = 50ms / 500,也就是说,假设65536-92和65536-45872的时间消耗同一个数量级的(100us的时候中断服务程序中重装的初值45872变成了92),计算

 (65536-92)/256 和(65536-92)%256

的时间消耗百分比提升了500倍左右。

举个栗子:

void T0_time() interrupt 1 {
    TH0 = (65536-45872)/256;
    TL0 = (65536-45872)%256;
}

void T0_time() interrupt 1 {
    TH0 = (65536-92)/256;
    TL0 = (65536-92)%256;
}

假设做

TH0 = (65536-45872)/256;
TL0 = (65536-45872)%256;

TH0 = (65536-92)/256;
TL0 = (65536-92)%256;

都需要1us的时间。

在总时间为50ms时,前者所占百分比为 1/50k = 0.002%

在总时间为100us时,后者所占百分比为 1/100 = 1.000%

尼玛差了500倍左右!能想象吗?

别看绝对数字,因为这1us是我编出来的,实际上51属于低速芯片,而且还有其他事要做。事实上上中断里面除了重装初值还要做其他事情,却让这么一个简单的但没有化简的重装初值的表达式给占用了太多资源和时间。。

我好像说了好多废话,那我就直接说结论吧:就只是把结果计算出来,也就是把

TH0 = (65536-92)/256;
TL0 = (65536-92)%256;

换成

TH0 = 255;
TL0 = 194;

其他啥都不改,然后把程序下载到芯片上,数码管的变化已经可以由人眼分辨我会乱说?

有的效率提升其实很简单。

时间: 2024-08-01 10:40:43

提升效率,减少时间和资源的消耗的相关文章

如何减少无谓的资源消耗?如何在仓库拓扑中进行 SOC 设计?

仓库中的每个存储单元.传输设施以及物品都与特定属性相关.这些属性被称为存储组织标准(Storage Organization Criteria , SOC).这个标准定义了特定存储单元中,可以存储哪些类型的物品,或者特定传输设施可以传送哪些类型的物品.存储组织标准的例子还包括:吞吐量类.有害类以及温度类. 对每一个标准都有特定的.可枚举的允许值,如对吞吐量类来说有快速.中等和低速几种. 仓库管理流程控制系统中的领域功能使用这些信息来决定三个问题: 要存放物品的目标位置是什么? 从当前位置到目标位

Android测试提升效率批处理脚本(三)

前言: 前面放出过几次批处理,这次只放一个环境检查的被管理员给打回来了,不得不再找找几个有含金量的放出来,请看正文~~~ 目录 1.Android环境检查 2.Android内存监控 3.模拟蓝牙手柄事件 一.Android环境检查 @ECHO OFF ECHO.     ::::::::::::::::::::::::::::::::::::::::::::::::: ECHO.     ::                                             :: ECH

paip.提升效率---filter map reduce 的java 函数式编程实现

#paip.提升效率---filter map reduce 的java 函数式编程实现 ======================================================== #----------------------index索引------------------++函数式编程的优点儿以及缺点++actual code 实际代码例如以下---filter 实现...--- map 实现..---reduce---调用 ##函数式编程的优点儿以及缺点------

【翻译】铁三角(规模、时间和资源的限制)并不适用于软件开发

当我们开始偷工减料并仓促完成,就会开始犯小错误,然后堆积成大错误,然后花更多的时间(和开支)来查找并修复这些错误. The Iron Triangle Does Not Apply to Software Development by David Bernstein · May. 06, 16 · Agile Zone 翻译 KumaT  2016.5.18 (如有纰漏恳谢指正)(翻译后的顺序对比原文做了微调.) There are three main constraints in manuf

提升效率的Linux终端快捷操作汇总

很多普通 Linux 桌面用户都对使用终端感到排斥和恐惧,其实它没大家想的那么复杂,很多常见操作都可以直接在终端中进行,如:安装软件.升级系统等. 无论你是新手还是 Linux 终端使用的老鸟,系统极客在此为大家总结了提升终端命令执行效率的快捷操作汇总,希望能帮助你学习和提升效率. 移动定位光标 在终端中移动光标和定位似乎非常不便,其实不是你想的那样,有很多种方式可以让键盘成为你的好朋友,只是需要掌握正确的方法而已. 定位单词 在长段的命令中,使用 Ctrl + ← 和 Ctrl + → 可快速

atitit groovy 总结java 提升效率

atitit groovy 总结java 提升效率 #---环境配置 1 #------安装麻烦的 2 三.创建groovy项目 2 3.  加入? Groovy 类 2 4.  编译执行groovy类 3 Groovy断点调试不生效的解决 4 Groovy实现执行原理 5 1. Groovy脚本的执行.. 5 2. Groovy类的执行.. 5 Groovy语法长处: 6 3. 动态类型def 6 4. 循环变量不须要def 6 5. String 和Gstring 6 6. 范围 6 7. 

Atitit 提升效率 界面gui方面的前后端分离与cbb体系建设 规范推荐标准

1. H5 html+ajax与后端彻底的前后端分离1 2. 业务逻辑也适当的迁移js化1 2.1. Cbb体系 通用模块设计与累积 规划1 3. 需求文档直接生成html界面原形1 4. 原形设计h5化1 5. 国际化,配置化2 6. 跨域 与服务端代理(已经实现)2 7. 直接方便html界面与后端的连接.2 1. H5 html+ajax与后端彻底的前后端分离 这样方便人员梯度建设以及加快效率..一个项目很大的部分就在于界面制作 当界面制作好,就可以通过通用接口直接连接测试,提升效率. 2

paip.提升效率--数据绑定到table原理和流程Angular js jquery实现

paip.提升效率--数据绑定到table原理和流程Angular js  jquery实现 html #--keyword 1 #---原理和流程 1 #----jq实现的代码 1 #-----Angular 的实现 3 #--keyword jquery 遍历表格tr  td Angular 模板绑定 #---原理和流程 获得所有的行,第一的头行..排除,,,在的所有的删除. 遍历表格tr获得tds的所有的id数组. 根据id/id索引来获得绑定的数据源里面的数据字段..绑定到个td上..

C#中使用泛型对照使用通用基础类型效率减少近一倍

?? C#中使用泛型对照使用通用基础类型效率减少近一倍 以下是測试结果: CSharp class and generic TotalMilliseconds: 270772.9229CSharp generic TotalMilliseconds: 269963.3999CSharp normal TotalMilliseconds: 159716.9094 測试代码: using System; using System.Collections.Generic; using System.L