找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1704|回复: 23
收起左侧

关于节约单片机系统CPU算力

[复制链接]
ID:155811 发表于 2022-3-31 12:17 | 显示全部楼层 |阅读模式
减少cpu的运算时间,就可以降低晶振的频率也能有相同的效率,所以更节能.


用 时钟芯片制作 数码管单片机时钟,常规做法是,每个主循环 从时钟芯片读一次整个时间,
然后把时间数据从bcd 转换成 十进制, 再把十进制的每一位分解成个位数,
再刷新数码管缓存,显示时间.


正确的做法, 程序启动时读一次 时钟芯片的时间, 如果数码管不显示秒,
每隔 大约一分钟,读一次 时钟芯片的分数据, 这样其实不会积累误差, 然后转换分钟数据,
刷新数码管的分 缓存.

评分

参与人数 1黑币 +40 收起 理由
admin + 40 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

ID:401564 发表于 2022-3-31 23:57 | 显示全部楼层
对于一个数码时钟,1MHZ以上的晶振,随便一个8位单片机都是一件轻松的事,压根就不需要节约什么CPU算力,节约出来干嘛?你怕单片机累了?
效率这个东西要用在需要的地方
读取时间是一直在读取,基本是没停过,如果有按键,扫描完按键,显示完了就读取
一分钟读取一次,就很容易给人一种"你这个钟比北京时间慢一分钟"的感觉
回复

使用道具 举报

ID:47286 发表于 2022-4-1 09:28 | 显示全部楼层
我认为节约算力的目的是干更多的事 而不是没事就让cpu闲着 一个单片机省的电还没一个线性稳压芯片自己消耗的多 省它有啥意义
回复

使用道具 举报

ID:299872 发表于 2022-4-1 10:07 | 显示全部楼层
这也是够省的
回复

使用道具 举报

ID:155811 发表于 2022-4-1 12:15 | 显示全部楼层
精益求精还有人说不应该
回复

使用道具 举报

ID:47286 发表于 2022-4-1 13:41 | 显示全部楼层
himanzj 发表于 2022-4-1 12:15
精益求精还有人说不应该

这不是应该不应该的问题 是楼主没定义前提 或者说没说明如此操作的出发点是什么

cpu这东西只要上电就不会停 即使你什么都不干 它也在工作 也在消耗能源 我们先不说麒麟乃至i5 i7之类的东西 那是另外一种情况 只说51到stm32这类的小东西

我实测过 除了休眠模式 即便是待机模式 耗电量都小不到哪去 就说待机模式 cpu耗电量能小一半 看着很大 但问题是 cpu一共才消耗几毫安 小一半这点节能相对于外围零件的耗电量几乎什么都不是 亮一颗LED都能秒杀

能耗上不考虑的话 就说到算力的问题 前面说了 这种小东西的算力总共就那么点 节省算力的目的是什么 为了降频么 那你一个单片机就只去读时钟芯片是么 那是省还是浪费 如果不仅仅读时钟 还要显示时间 或者采集ADC 或者其它什么什么吧 你觉得能耗会省下来么 相反可能因为降频引起其它工作迟滞 对么 节省算力的目的是为了不耽误其它工作 这个逻辑算合理吧 于是 结论就明确了 只要不影响其它工作就无需考虑增加读时钟的间隔

就算放宽间隔 不需要计数器么 计数器会不断计数吧 那不消耗能源么 那不是等于闲着还更多消耗能源么 不是更浪费了么 正常的思路是如将算力发挥到极限 至少我个人编程的思想一直是只要它还干得动 就给它找更多的活干

很多设计实例都在努力降频 努力节省算力 但那不是目的 只是一种选择 因为能源限制 比如用电池又需要很长续航 只能在算力和能耗上取舍 楼主的说法也没错 但我开始就说了 这不是错不错的问题 是前提问题 而这点楼主并没说明 对吧 既然没前提没范围 有别的看法不正常么
回复

使用道具 举报

ID:155811 发表于 2022-4-1 15:46 | 显示全部楼层
按你的说法,程序都不要优化了,反正都一样
回复

使用道具 举报

ID:155811 发表于 2022-4-1 15:54 | 显示全部楼层
正常的人,应该从这例子归纳从方法,再推广应用,不是程序不应该优化,而喷人
回复

使用道具 举报

ID:123289 发表于 2022-4-1 16:44 | 显示全部楼层
【减少cpu的运算时间,就可以降低晶振的频率也能有相同的效率,所以更节能.】
不赞同:
晶振的频率是死的,不可以随意降低的。如果强行将12M的换成6M的,那么整体速率都减一倍,合适吗。

【用时钟芯片制作数码管单片机时钟,常规做法是,每个主循环 从时钟芯片读一次整个时间,
然后把时间数据从bcd 转换成 十进制, 再把十进制的每一位分解成个位数,再刷新数码管缓存,显示时间.
正确的做法, 程序启动时读一次 时钟芯片的时间, 如果数码管不显示秒,
每隔 大约一分钟,读一次 时钟芯片的分数据, 这样其实不会积累误差, 然后转换分钟数据,
刷新数码管的分 缓存.】

不赞同:
1、读不读时钟芯片的耗电是一样的,不一样只发生在:时钟芯片有没有休眠模式,只有芯片休眠时才省点电。
2、即使CPU不运行“从bcd 转换成 十进制, 再……”的程序,CPU的耗电也是一样的,除非你让进入CPU休眠模式。
所以,所谓“正确的做法……”,依据就不足了。
楼主的提法,少了读“时钟芯片”的次数,但需要增加了辅助的计时程序,也省不了多少CPU的运行时间。

建议的省电做法是:
1、尽量让所有的芯片,多多地处于休眠状态。本例中,尽量让“时钟芯片”、“CPU”长期处于休眠状态。
2、不要主动去读“时钟芯片”,而是让“时钟芯片”在需要时间变更时,产生中断,换醒CPU,这时CPU再读时间,译码、切换显示,完成后再次进入休眠。
3、其实耗电最多的是【数码管】,它远大于楼主讨论的。
相对于【数码管】的耗电,少读几次“时钟芯片”,或省点运行时间,意义不太大。
个人习惯上,主循环程序的最后一句,是让CPU休眠的。
回复

使用道具 举报

ID:401564 发表于 2022-4-1 16:58 | 显示全部楼层
himanzj 发表于 2022-4-1 15:46
按你的说法,程序都不要优化了,反正都一样

你这叫优化?
关键是,你把节省出来的单片机时间拿来干嘛了?并没有呀,就算是带温度显示,自动调节亮度,GPS自动授时,整点播报,闹钟设定,随便一个1MHZ的8位单片机,做起这种事情来,那也是轻松到不行的一件事,那"优化"有什么意义?
而用你的方法,只会让一个产品更加降低档次
你不想一下,一分钟读取一次,时间显示就很容易有一种"慢一分钟"的显示效果,你没有考虑过这个?对于用户而已,钟表能跟北京时间一样准,那才是他们关心的
至于单片机累不累,他们会考虑这个?
一秒钟读取一次跟一分钟读取一次有什么区别?单片机整体运行会慢吗?不会呀
回复

使用道具 举报

ID:883242 发表于 2022-4-1 17:23 | 显示全部楼层
大家都没注意到楼主最大的漏洞在“每隔 大约一分钟,读一次 时钟芯片的分数据”这句话吗?

这个1分钟是从哪里来的?还不是单片机定时器产生的吗?定时器工作的时候单片机又不能休眠,只能瞎j8跑,根本就没节约什么算力,更不可能带来省电的效果。
回复

使用道具 举报

ID:155811 发表于 2022-4-1 17:38 | 显示全部楼层
Hephaestus 发表于 2022-4-1 17:23
大家都没注意到楼主最大的漏洞在“每隔 大约一分钟,读一次 时钟芯片的分数据”这句话吗?

这个1分钟是从 ...

大约一分钟好吗, 不是要你再用一个 时钟准确计时一分钟
回复

使用道具 举报

ID:155811 发表于 2022-4-1 17:40 | 显示全部楼层
dzbj 发表于 2022-4-1 13:41
这不是应该不应该的问题 是楼主没定义前提 或者说没说明如此操作的出发点是什么

cpu这东西只要上电就 ...

按你的说法,我还是把程序改回原来的, 每个主循环读一次整个时间,
回复

使用道具 举报

ID:883242 发表于 2022-4-1 17:45 | 显示全部楼层
himanzj 发表于 2022-4-1 17:38
大约一分钟好吗, 不是要你再用一个 时钟准确计时一分钟

只要你的单片机还在瞎跑,不管是精确还是大约,都不是节约算力。
回复

使用道具 举报

ID:401564 发表于 2022-4-1 23:20 | 显示全部楼层
himanzj 发表于 2022-4-1 17:38
大约一分钟好吗, 不是要你再用一个 时钟准确计时一分钟

好几个网友都在反对你的建议,你还不知道问题出现在哪里吗?
回复

使用道具 举报

ID:47286 发表于 2022-4-2 01:37 | 显示全部楼层
himanzj 发表于 2022-4-1 17:40
按你的说法,我还是把程序改回原来的, 每个主循环读一次整个时间,

如果你只是读时钟这么点事 改回去没什么问题

读时钟的消耗主要是io口模拟I2C或者spi通讯时必须的延时 不管用for 用nop还是用什么 反正都要死等一会 那么短的延时用计时器没意义 一般就是死等 这时候cpu什么都干不了 累积多了对进行其它任务有影响 如果用硬件spi或者i2c 除非你打算把51当系统用 否则什么都不用考虑

靠减少指令节能基本就是然并卵的事 标压i7也不会这么干 何况一个mcu 耗电量还没一个红led大
回复

使用道具 举报

ID:47286 发表于 2022-4-2 01:53 | 显示全部楼层
himanzj 发表于 2022-4-1 17:38
大约一分钟好吗, 不是要你再用一个 时钟准确计时一分钟

是为了反对而反对么

不管你怎么大约 就算你非说10秒就是1分钟 那也得有个准数吧 那这数怎么来的 死循环么 计时器么 或者其它什么算法 哪样不开销算力

我们的茅盾在于 你认为cpu什么都没干就省电了 而我认为这是最大的浪费 因为不管你让不让cpu干活 它都在不停的干活 如果你不用它 那就是白白的耗电而没创造任何价值 哪怕是没价值的价值也没有

大cpu主动降频节能是因为本来它耗电量大 热功至少要20W以上吧 这还是节能型的 别说51 stm32能比么 而它的算力远远超过大部分应用的消耗

移动电子频繁休眠节能并不是它喜欢 是因为目前的电池技术还不够给力 是为了更长时间工作而做出的妥协 每次休眠要保存环境 每次起动要恢复环境 这些都是算力开销 比不休眠大太多了 这也说明单纯靠减少指令实现节能是多么不靠谱
回复

使用道具 举报

ID:57657 发表于 2022-4-2 06:47 | 显示全部楼层
配置 CLK_DIV 寄存器,即可降低功耗。
功耗取决于一个时钟周期有多少晶体管状态改变,以及开关频率。
回复

使用道具 举报

ID:155811 发表于 2022-4-2 12:22 | 显示全部楼层
dzbj 发表于 2022-4-2 01:53
是为了反对而反对么

不管你怎么大约 就算你非说10秒就是1分钟 那也得有个准数吧 那这数 ...

,又转移话题说了一大堆,可惜已经%%了
回复

使用道具 举报

ID:47286 发表于 2022-4-2 13:34 | 显示全部楼层
himanzj 发表于 2022-4-2 12:22
,又转移话题说了一大堆

好吧 那就简单点 你的想法是然并
回复

使用道具 举报

ID:883242 发表于 2022-4-2 14:29 | 显示全部楼层
himanzj 发表于 2022-4-2 12:22
,又转移话题说了一大堆,可惜已经%%了

%%的是你。连实测数据都没有就拍脑袋说。
回复

使用道具 举报

ID:155811 发表于 2022-4-2 16:37 | 显示全部楼层
Hephaestus 发表于 2022-4-2 14:29
%%的是你。连实测数据都没有就

你怎么知道我没有实测 ,是你自己不拿证据说话
回复

使用道具 举报

ID:883242 发表于 2022-4-2 21:19 | 显示全部楼层
himanzj 发表于 2022-4-2 16:37
你怎么知道我没有实测 ,是你自己不拿证据说话

有实测数据拿出来啊,拿不出来%%?
回复

使用道具 举报

ID:155811 发表于 2022-4-4 14:27 | 显示全部楼层
dzbj 发表于 2022-4-2 01:53
是为了反对而反对么

不管你怎么大约 就算你非说10秒就是1分钟 那也得有个准数吧 那这数 ...

我都程序实现了,你还纠结一分还是10秒,
还有你降频节能是一方面,难道就可以不要优化程序了,
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表