嵌入式Linux的低功耗策略

2023-05-16

引 言
由于Linux系统具备嵌入式操作系统需要的很多特色,如适应于多种CPU和多种硬件平台、性能稳定、可裁剪性很好、源码开放、研发和使用简单等。现在,基于Linux应用的嵌入式设备日益增多,Linux正在嵌入式领域发挥着越来越重要的作用。

对于嵌入式设备尤其是移动设备来说,功耗是系统的重要指标,系统设计的重要目标之一就是要尽可能地降低功耗。现在,对功耗的研究主要集中在硬件解决方案上,而软件研究方面很少。实践证实:在硬件设计和选型确定后,功耗的高低和软件设计有很大的关联性。软件设计和编程质量的好坏,极大地影响着最终产品的功耗水平。据此,为降低功耗,提出在嵌入式Linux下软件编程的几种策略。

1 问题分析
因为最终耗能的是硬件,所以在考虑采用软件方法降低功耗的时候,要充分考虑硬件的功能和性能,即在保障系统实现的基础上怎样组织硬件运作而使功耗降低。全速执行、待机和睡眠等行为都是利用CPU的固有能力,透过降低工作电压或频率来节省功耗。此外,在大多数用户察觉不到的情况下,实际的电源管理能够根据负载状况逐渐改变系统的状态,有时这种情况在l s之内能够产生数百次。

另外,在编写程式时可能会碰到这样的情况,如记录状态寄存器内容,并等待设定标记出现;检查串口的FIFO状态标记,看是否收到数据;监测一个双端口存储器,以确定系统中是否有另外CPU写入了一个变量,以便控制共享资源。从表面上看,这样的代码没有什么问题,但在每个时钟周期里不断记录寄存器状态将无法有效延长设备的电池寿命。

基于这些问题,下面提出几种策略,以有效降低最终产品的功耗水平。

2 利用Linux内核的电源管理
电源管理策略的基础是调整处理器内核的工作电压和频率。但是,现代的嵌入式CPU具备很高的电源效率,以至于CPU并不总是最主要的耗能组件。其他高耗能的组件包括高性能内存、显示屏和射频接口等,因此,假如电源管理系统只能调节CPU内核的电压和频率,那么他的用途将有限。一个真正有效的电源管理方案应该能够采用和CPU内核执行相协调或相单独的方式,支持对一系列电压和频率的快速调节。

Linux支持两种电源管理标准:APM(AdvancedPower Managememt)和ACPI(Advanced Configtlrationand P0wer Interface)。APM是传统的高级电源管理方案,现在仍然使用在许多基于Linus便携式设备中;而ACPI则提供了更为灵活的电脑和设备管理接口。这两个标准不能同时运行。缺省情况下,Linux运行ACPI。APM能够使机器处于Suspend(悬挂)或Standby(待机)状态,连同检查电池容量;而ACPI还能够使外设(如显示器、PCI)单独断电,在节省电能方面有更多的控制。为了让电源管理功能生效,需要在Linux内核打开他,并且在Linux里加载必需的应用软件。

电源管理活动需要对操作系统内核和设备驱动程式进行特别的干预。在嵌入式Linux中,虽然低层电源管理驻留在操作系统内核中,但电源管理策略和机制来源于中介软件和用户应用程式代码,如图l所示。


Linux内核中电源管理机制负责维持整个系统的电源状态。他能够看成是为驱动程式、中介软件和应用程式提供服务的元素。

通过在驱动程式中实现电源管理接口,能够让驱动程式密切监控系统状态。他们在外部事件的驱动下,透过设定不同的状态反映设备的工作情况。为了实现设备电源管理接口,需要实现以下操作:
①使用pm_register对设备的每个实例(instance)进行注册;
②在对硬件进行操作之前调用pm_access(这样可确保设备已被唤醒,并处于ready状态);
③用户自己的pnl_callback函数在系统进入suspend状态,或从suspend状态恢复的时候会被调用;
④当设备不使用时调用pm_dev_idle函数(这个操作是可选的,以增强设备idle状态的监测能力);
⑤当被unIoad的时候,使用pm_unreggister取消设备的注册。

中介程式允许用户预先定义某些策略,然后跟踪电源状态,执行特定的操作。

在应用程式中,利用中介程式提供的API,设立其基本的约束条件,强迫电源管理机制产生和其执行需求相匹配的变化。Linix电源管理的实现机制包括以下API,例如dpm_set_os()(内核)、assert_constraint()、remove_constraint()和set_operatInK—state()(内核和驱动程式)、set_policy()和set_task_state()(经系统的用户级调用)连同/proc接口。

3 在空闲模式下等待事件
很多嵌入式CPU都具备能降低功耗的电源工作模式,最常用的是空闲模式。此时CPU内核指令执行部分关闭,而任何外设和中断信号仍处于工作状态。由于空闲模式比CPU执行指令时的功耗要小得多,因而能够在任何时候,只要Linux检查到任何线程都处于阻塞状态(如等待中断、事件或定时时间),他都能够将CPU置于空闲模式。任何中断(如触摸屏事件、按下按键事件等)都能把CPU从空闲模式中唤醒,然后继续执行后面的代码。假如事件不能直接连接到外部中断,也能够用一个系统定时器定期唤醒CPU。例如在等待一个事件并且知道只要事件发生后在10 ms内能检测到,那么能够启动lO ms定时器,并把CPU置于空闲模式。每次处理定时中断时都要检查事件状态,假如状态没有变化,就立即回到空闲模式。

4 减少事件
通常CPU的定时中断间隔为1 ms,Linux会频繁使CPU置于空闲模式,并一直维持到被中断唤醒。在这种情况下,最有可能唤醒CPU中断的是定时器中断本身。即使任何其他线程被阻塞,在其他中断、内部事件及长时间延迟之前,定时器中断也会以每秒l 00()次的频率把CPU从空闲模式中唤醒,以运行调度程式。就算调度程式确定任何线路都被阻塞,并很快将CPU回复到空闲模式,这样频繁操作也会浪费大量电源。因此,应尽可能长时间地将CPU置于空闲模式,而减少事件是解决这个问题的有效途径。通过分析代码和系统需要,以决定是否能改变处理中断的方式实现。例如,能够在进入空闲模式前关闭时隙中断信号,只有再次出现中断信号时才被唤醒。但是,这种做法通常不太合适。尽管多数阻塞的线程能够直接或间接等待外部中断,有些还依赖于定时中断,如一个驱动器会在等待外设时睡眠500 ms,这时空闲模式下假如完全关闭系统定时器,可能意味着线路不能按时恢复工作。

Linux最好能为调度程式进行可变超时设定。Lintux知道每个线程无法确定等待的是外部还是内部事件,或计划在某特定时间再次运行。Linux可算出第一个线程预定何时运行,并相应地在CPU置于空闲模式之前设定定时器工作。可变超时设定不会对调度程式造成很大的负担,但却能节省电源和处理时间。

可变计划超时限定只是减少事件的一种方法,存储器直接存取(DMA)也可让CPU长时间处于空闲模式,即使数据正在发送至外设或从外设收取。所以只要可能,都应在外围驱动器中使用DMA,省电效果相当令人满意。

例如英特尔公司StrongARM CPU串口接收FIF0时,大约每收到8个字节发生1次中断,在115 2OO bps.速度下,发送到这个端口的11 KB脉冲数据会引起CPU内核每秒中断l 500次,很可能使其从空闲模式中唤醒;但假如实际上无需在这些小的8字节设备中处理数据,浪费是很惊人的。DMA最好和大容量缓冲器一起使用,以使中断发生的水平更加容易管理,或许是每秒10次或l00次,让CPU在两次中断之间空闲。事实证实,在这些场合应用DMA能减少使用率达20%,可降低CPU功耗,并提高供其他线程使用的CPU带宽。

 

5 控制CPU的性能
CPU在降低功耗方面的最新进展表明,CPU消耗的能量和驱动CPU的时钟频率连同应用其内核上的电压平方成正比。

CPU允许动态降低时钟速度。降低一半时钟速度,功耗将成比例下降。但是仅采用这种技术实现节能,还需要一些技巧.因为执行的代码可能要两倍长的时间才能完成,即使这样也不会省电。例如,板上LCD控制器需要使用一个储存在片外SDRAM中的帧缓存。当LCD控制器工作时,需要指定足够高的内存总线频率来满足显示器刷新速率的需要。在LCD不工作的情况下(例如当PDA仅作为MP3播放器使用时),降低SDRAM总线频率,能够节省整个系统的功耗。

动态降低电压是另一种做法。越来越多的CPU允许降低电压,以适应CPU时钟速度的下降,这样在降低时钟速度时也能省电。事实上,只要CPU不饱和,频率和电压就能不断减少,这样还是能完成工作,而消耗的电源总体上却比较低。

考虑到并不是任何线程都消耗同样多CPU带宽,所以即使这些方法也还是能够改进的。有效应用CPU带宽的线程,会随着CPU时钟速度下降而花更长的时间才能完成,这些线程使用分配给他们的每一个周期。另一方面,I/O线程采用分配给他的任何CPU周期,即便CPU时钟速率下降,也要用同样长的时间才能完成。例如,像很多PDA使用的PCMCIA卡接口,当数据写人快闪存储卡时,系统瓶颈不是CPU的速度,而是物理总线接口连同卡的固件为擦掉和重新编程闪存所花的时间。理想情况下,前面讨论的等待事件的技术可在这里应用,以最大程度降低功耗,但是等待时间经常变化很大,远小于操作系统运行时间,这样会影响到性能。这些驱动程式常常检测状态寄存器,此时降低时钟速度将节省一部分电源,但会对数据写入卡的时间产生轻微影响。

使用控制CPU性能的策略,要知道何时能降低时钟频率和电压而不会显著影响性能;考虑什么时候降低驱动器和应用程式的时钟速度比较难处理。这在多任务处理环境中更加富有技巧性。

6 结 论
近年来随着电脑和网络通信、消费电子合一的加速发展,嵌入式产品成为信息产业的主流。Linux在短短的十几年时间已发展成为功能强大设计完善的操作系统之一,可运行在X86、Alpha、Sparc、MIPS、PPC、Motorola、NEC、ARM等多种硬件平台上,而且开放源代码,并能够定制,越来越多的企业和研发机构都转向嵌入式Linux的研发和研究上。本文在系统分析的基础上,研究了在嵌入式Linux系统中通过优化软件编写机制来降低最终产品功耗水平的方法,具备很强的实际应用意义。随着研究的深入,嵌入式Linux必将显示出其在低功耗方面的优越性,将有更多的嵌入式设备普及Linux应用。

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

嵌入式Linux的低功耗策略 的相关文章

  • Xshell显示图形化界面

    前言 很久没用过图形化界面了 xff0c 都忘记怎么使用了 依据以往的经验都是由环境变量DISPLAY设置 xff0c 然后就能连接了 xff0c 每天也是匆匆忙忙的就过了一天 xff0c 都不知道干了啥 xff0c 分配的时间也少 xff
  • 2017--就业分享之IT校招现状和面试经历

    在介绍自己整个春季和夏季实习求职经历之前 xff0c 先给大家公布一则新闻 2017届互联网校招薪酬报告 xff1a 先说下对 16 年 17 届校招的总体看法 xff1a 本该是个不大不小的年 xff0c 结果被华为一己之力搞成了个大年
  • docker常见命令

    文章目录 0 删除重建容器1 打包一个镜像并在另一个服务器上使用 0 删除重建容器 如果觉得镜像被自己搞坏了 xff0c 重启没啥用 xff0c 就要考虑基于之前的镜像重新建立一个新的容器了 span class token comment
  • python代码获取远程电脑IP

    实时的使用邮箱发送IP地址到指定邮箱 使用python代码封装好的软件 xff1a 链接 xff1a https pan baidu com s 1Flz7HHtZM0w3HGDeF 4BhQ pwd 61 yxy2 提取码 xff1a y
  • Collections.singleton();

    span class token comment 删除list某个元素 span List span class token operator lt span Integer span class token operator gt spa
  • 一个程序员所应该具备的精神

    所谓障碍都是主观上的 如果你想研发什么新的技术 xff0c 只需要在冰箱里放满食物和饮料 xff0c 再有一台便宜的计算机 xff0c 和以之献身的决心 xff0c 你即可拥有任何你想拥有的编程深度 xff01 John Carmack
  • Java把字符串中的数字删除的方法和判断字符串里面是否有汉字的方法

    1 把数字删除 String testStr 61 34 大幅度要栽夺工地奇巧地厅革dfdsfdsafd32123313 34 System out println testStr replaceAll 34 0 9 34 34 34 2
  • 氧化还原反应

  • MPI中可能会出现的错误

    1 p1 xxxxx p4 error interrupt SIGSEGV 11 这个错误可能是因为某个进程中出现了段错误引起的 自己编程中曾出现过的错误 1 只在一个进程中给指针申请空间 而在其他进程没有申请 所以在广播的时候出错 2 在
  • 华为2288HV5使用U盘安装ESXI6.7.0

    如题 1 准备U盘做ESXI启动盘2 华为服务器做RADI3 安装ESXI4 配置ESXI 1 准备U盘做ESXI启动盘 准备至少4G的U盘 xff0c 需要格式化U盘 有两种常见的制作U盘启动的工具 xff0c UltraISO和rufu
  • Github Page绑定至个人域名

    前言 此教程主要用于将个人域名映射至Github Page xff0c 同时实现Github Page在个人域名的发布本次所使用的个人域名是在阿里云上申请注册所得注意 xff1a 如果想要取消Github Page发布 xff0c 删除CN
  • gnome桌面无法显示的解决

    前两天安装gtk 43 中间出错了 xff0c apt get install libgtk2 0 过程中突然出错说是sweap什么的错误 xff0c 重启后居然无法登录进入桌面 xff0c 提示libpixbufloader png so
  • 如何使用Visual Studio2010运行C语言

    1 首先打bai开Microsoft Visual Studio 2010如下图 xff1a 2 然后在bai已安装的模板下选Win32 右边选Win32控制台应用程序 最后在下面输入项目名称 xff0c 然后点确定 xff0c 如下图 3
  • 医学影像入门知识——3. 26邻域/8邻域和连通性(neighborhood and connectivity)

    文章目录 1 邻域概念 1 1 6 18 26邻域 空间 1 2 6 18 26 32 56 80 92 116 124 空间 1 3 4 8 平面上的邻域 1 4 python代码表示 2 连通性 连通度 2 1 点连通度 2 2 边连通
  • Spring Security(六) —— CSRF

    一 xff1a CSRF漏洞保护简介 CSRF xff08 Cross site request forgery xff09 跨站请求伪造 xff0c 也叫一键式攻击 xff08 one click attack xff09 xff0c 通
  • git中submodule子模块的添加、使用和删除

    转载 xff1a https blog csdn net qq 29034779 article details 123212589 子模块的添加 添加子模块非常简单 xff0c 命令如下 xff1a git submodule add l
  • centos7中报错ModuleNotFoundError: No module named ‘_ctypes‘解决方法

    分析 python3中有个内置模块叫ctypes xff0c 它是python3的外部函数库模块 xff0c 提供了兼容C语言的数据类型 xff0c 并通过它调用Linux系统下的共享库 Shared library xff0c 此模块需要
  • Ubuntu 12.04 开机启动软件图形界面(无桌面环境)

    在不加载桌面环境的前提下 xff0c 启动图形化软件 xff0c 总体分以下几步 xff1a 禁止桌面环境启动 gt tty1自动登录 gt 软件自动启动 gt 远程维护时保持进程唯一 1 禁止桌面环境启动 路径 xff1a etc ini
  • 16行,使用Python制作简易版QQ自动回复机器人(windows版)

    目录 1 安装go cqhttp 2 使用go cqhttp 2 1 发送信息 2 1 1发送 你好 2 1 2 在群里 64 人 2 2获取群成员列表 2 3 实现QQ机器人 1 安装go cqhttp 点此安装go cqhttp xff
  • 免费的仿真软件LTSpice

    LTSpice是一个免费的仿真软件 xff0c 重要的是它同时提供macOS和Windows版本 下载地址 其他教程 xff1a LTspice仿真命令 weixin 42617385的博客 CSDN博客 LTspice 一个会写代码的烤鸭

随机推荐

  • esp-aliyun undefined reference to `pthread_create‘错误

    FreeRTOS 错误信息 Users esp8266 projects wendeng build esp aliyun libesp aliyun a span class token punctuation span wrapper
  • github cli 创建远程仓库并推送到github

    以下操作基于macOS xff0c 其他系统安装请参阅官方文档cli cli GitHub s official command line tool 1 安装github cli brew span class token function
  • 阿里云生活物联网删除测试设备

    阿里云生活物联网平台 https living aliyun com 的测试设备 xff0c 在生活物联网平台页面是无法进行删除的 xff0c 生活物联网平台的设备列表只能显示量产设备 如果要删除测试设备 xff0c 必须在物联网平台 ht
  • STM32CubeMX学习教程之四:定时器中断

    完整源码下载 xff1a https github com simonliu009 STM32CubeMX TIM1 Interrupt 软件 xff1a STM32CubeMX V4 25 0 System Workbench V2 4
  • 算法——贝塞尔(Bézier)曲线拟合

    文章目录 1 基本概念 1 1 从熟悉的地方入手 1 2 贝塞尔曲线拟合原理 转载 2 公式和物理意义 2 0 阶数和伯恩斯坦多项式等 2 0 1 阶数 2 0 2 伯恩斯坦多项式 2 0 3 杨辉三角和二项式系数 2 1 一阶 次贝塞尔公
  • STM32CubeMX学习教程之五:PWM实现呼吸灯效果

    完整源码下载 xff1a https github com simonliu009 STM32CubeMX PWM Output 软件 xff1a STM32CubeMX V4 25 0 System Workbench V2 4 固件库版
  • STM32CubeMX学习教程之十:硬件I2C读写AT24C02

    完整源码下载 xff1a https github com simonliu009 STM32CubeMX hardware I2C AT24C02 网上有流传已久一种说法 xff0c 就是STM的I2C有bug xff0c 不好用 确实很
  • Visual Studio Code 的 includePath 全局设置

    这几天折腾使用Visual Studio Code 编写 ESP8266 non os 代码 xff0c 基本设置都没问题 xff0c 但是就是自动补全折腾很久没弄好 在折腾了一圈插件之后 xff08 包括Auto Import C 43
  • 使用.gitignore忽略文件或者文件夹及其失效解决方法

    git如果需要忽略某个文件夹 xff0c 可以在初始化之后 xff0c 在仓库根目录下创建一个 gitignore文件 xff0c 添加需要忽略的文件和文件夹即可 我们也不需要从头写 gitignore文件 xff0c GitHub已经为我
  • python源代码文件加密

    由于python设计的初衷是开源的 xff0c 因此py文件是可以直接看到源码的 但开发商业软件 xff0c 代码加密保护就比较重要了 python编译后程序 pyc文件是py文件经过编译后生成的二进制文件 xff0c 因此可以发布pyc文
  • gnu binutils

    The GNU Binutils are a collection of binary tools The main ones are ld the GNU linker as the GNU assembler But they also
  • android wakelock

    1 android休眠控制锁 powermanager acquir 获取控制锁 powermanager release 释放控制锁 2 在powerManagerService中 xff0c 有检测当前framework层中的wakel
  • 产品经理常用术语

    产品经理常用术语 长尾理论 网络时代兴起的一种新理论 xff0c 由于成本和效率的因素 xff0c 当商品储存流通展示的场地和渠道足够宽广 xff0c 商品生产成本急剧下降以至于个人都可以进行生产 xff0c 并且商品的销售成本急剧降低时
  • 传统CD车机面板操作说明

    转自http bbs hifidiy net thread 675597 1 1 html 一般CD车机带USB SD卡的面板操作说明 1 1 控制面板外观图 2 0 基本 共同 功能操作说明 2 1 开启和关闭电源 静音开关 按 钮为开启
  • 汽车总线系统通信协议

    天合汽车零部件 xff08 上海 xff09 有限公司 上海交通大学区域光纤通信网与新型光通信系统国家重点实验室 xff08 上网时间 xff1a 2006 11 xff09 摘要 xff1a 本文主要针对汽车电子控制系统和车载多媒体系统
  • 算法——连续性后处理(把26邻域连续的变成6邻域连续的)

    文章目录 1 概念 1 1 6邻域连续 1 2 18邻域连续 1 3 26邻域连续 1 4 总结 2 目标 3 严格一点的 3 1 原理描述 3 1 1 18邻域连续补充 3 1 2 26邻域连续补充 3 2 代码实现 C 4 宽松一点的
  • RedHat Linux下安装JDK1.7报错Permission denied

    在RedHat Linux5 中安装JDK1 7时 xff0c 当我解压jdk xff0c 并且配置好了环境变量 xff0c 测试的时候 xff0c 报以下错误 root 64 jingfeng01 java version Error d
  • 几种压缩算法的压缩和速度比较

    Quick Benchmark Gzip vs Bzip2 vs LZMA vs XZ vs LZ4 vs LZO EDIT Add zstd Contents hide 1 Selected archives2 Test conditio
  • DDR低功耗模式

    DDR规格 xff1a DDR工作状态图 xff1a DDR 刷新描述 xff1a 电特性 xff1a 工作模式简介 xff1a 1 1 自刷新模式 xff08 Self Refresh Mode xff09 DDR4 SDRAM中自刷新超
  • 嵌入式Linux的低功耗策略

    引 言 由于Linux系统具备嵌入式操作系统需要的很多特色 xff0c 如适应于多种CPU和多种硬件平台 性能稳定 可裁剪性很好 源码开放 研发和使用简单等 现在 xff0c 基于Linux应用的嵌入式设备日益增多 xff0c Linux正