首先给大家分享一个巨牛巨牛的人工智能教程,是我无意中发现的。教程不仅零基础,通俗易懂,而且非常风趣幽默,还时不时有内涵段子,像看小说一样,哈哈~我正在学习中,觉得太牛了,所以分享给大家!点这里可以跳转到教程

Linux低功耗研究也有一段时间了,基本把低功耗的实现方式想清楚了(主要分成机制和策略),这段时间的工作主要在机制上。暂时想实现的主要的机制有:cpu级,设备驱动级,系统平台级。管理颗粒度不断递增,形成三驾马车齐驱的形势。

cpu级:主要实现比较容易的在系统处于目标在于频繁发生、更高粒度的电源状态改变,主要的实现方式为idle,包括今天的主要想讲的动态主频。

       设备驱动级:主要实现对单个设备驱动的管理(suspend,resume等),通过系统监测将闲置的设备,通过从用户态对sys文件目录动态进行单个驱动设备的管理,置于省电模式。

       系统平台级:目标在于管理较大的、非常见的重大电源状态改变,用于减少产品设备在长时间的空闲之后,减少电源消耗 。主要实现方式是依托linux内核所支持的apm技术,实现整个系统的睡眠/恢复(sleep)

这几个层次其实并不是相互独立的,都是相互交叉的,比如系统平台级的睡眠不可避免会涉及到cpu的sleep模式和设备驱动的挂起,而动态主频的实现除了cpu本身的支持也需要外围驱动随着主频变化做出相应的适应活动。因此这里的分级只是一种粗范围的,逻辑上的分层。

前段时间还调研了一下IBM和Monta Vista搞得那套DPM(Dynamic Power Management)机制,看了不少论文和观点,总的感觉就是太过复杂而且也不是很实用,感觉噱头大过实际功效,(因此这套机制始终还不能进入内核的mainline),言归正传,还是重点讲述下cpufreq技术。

1.为什么要cpufreq?

关于要不要实现cpufreq技术,我也纠结过,一个原因是:当时对内核如何提供这么一套动态变频的机制还不了解,只觉得应该非常麻烦,因为涉及到外围驱动的参数更新,另外一个原因是:在SEP4020这种体量的处理器上跑linux,即使运行在最高频率时的处理能力可能也不是很富余,我再给它降频还有没有意义?挣扎之后还是觉得要实现它,我也给自己列了这么几条原因:

1) 虽然cpu在板级中已不是主要的耗电源,但是仍然占着举足轻重的位置,功耗机制到最后就是几毫安几毫安的扣了,降频肯定能在一定程序上节约功耗那我为什么不采用?

2) 细化功耗管理的颗粒度,为应用程序提供更多的功耗节省机制

3) 对普通的应用,系统可以运行在维持平台运作的最低频率,在有处理任务时,变频机制会自动切换到合适的高主频,并且在任务结束时重回省电的低主频,这样就解决了我之前的第二个疑惑。

4) SEP4020在运行在88M时板级功耗为:222mA

5) SEP4020在运行在56M时板级功耗为:190mA,降低14%

6) SEP4020在运行在32M时板级功耗为:160mA,降低28%

7) 实现的一些工作是我们一直需要去做但是一直没有动力做的

8)  变频会涉及到大量模块的参数的重新配置,作为cpu原厂,我们需要把这些参数彻底掌握

9) 对这些参数的充分理解,能对现有系统进行优化,提升整体系统的效率,比如使用发现一些参数还是太过保守(sdram,nand),我们的通用配置在系统降为32M时仍能正常工作。

10) 可行性论证没有问题:偶然看到armkiller同志提供的nand驱动代码中有变频的实现(这里非常感谢armkiller),网上这方面的文章很少,于是翻阅了linux内核源码中自带的/documentation/cpufreq后,对这种机制大概有一定的了解(linux中的documentation是个好东东),也看到了一些处理器厂商为自己的cpu已经实现了的代码,如sa1100,pxa系列。

2. 内核所提供的这种cpufreq技术的机制

1) 目的:

变频技术是指CPU硬件本身支持在不同的频率下运行,系统在运行过程中可以根据随时可能发生变化的系统负载情况动态在这些不同的运行频率之间进行切换,从而达到对性能和功耗做到二者兼顾的目的。

2) 来源:

虽然多个处理器生产厂家都提供了对变频技术的支持,但是其硬件实现和使用方法必然存在着细微甚至巨大的差别。这就使得每个处理器生产厂家都需要按照其特殊的硬件实现和使用方法向内核中添加代码,从而让自己产品中的变频技术在Linux 中得到支持和使用。然而,这种内核开发模式所导致的后果是各个厂家的实现代码散落在 Linux 内核代码树的各个角落里,各种不同的实现之间没有任何代码是共享的,这给内核的维护以及将来添加对新的产品的支持都带来了巨大的开销,并直接导致了 cpufreq 内核子系统的诞生。

3) 管理策略:

Linux内部共有五种对频率的管理策略userspace,conservative,ondemand,powersave 和 performance

1.performance :CPU会固定工作在其支持的最高运行频率上;

2.powersave :CPU会固定工作在其支持的最低运行频率上。因此这两种 governors 都属于静态 governor ,即在使用它们时 CPU 的运行频率不会根据系统运行时负载的变化动态作出调整。这两种 governors 对应的是两种极端的应用场景,使用 performance governor 体现的是对系统高性能的最大追求,而使用 powersave governor 则是对系统低功耗的最大追求。

3.Userspace:最早的 cpufreq 子系统通过 userspace governor 为用户提供了这种灵活性。系统将变频策略的决策权交给了用户态应用程序,并提供了相应的接口供用户态应用程序调节 CPU 运行频率使用。 (可以使用Dominik 等人开发了cpufrequtils 工具包 )

4.ondemand :userspace是内核态的检测,效率低。而ondemand正是人们长期以来希望看到的一个完全在内核态下工作并且能够以更加细粒度的时间间隔对系统负载情况进行采样分析的 governor。

5.conservative : ondemand governor 的最初实现是在可选的频率范围内调低至下一个可用频率。这种降频策略的主导思想是尽量减小对系统性能的负面影响,从而不会使得系统性能在短时间内迅速降低以影响用户体验。但是在 ondemand governor 的这种最初实现版本在社区发布后,大量用户的使用结果表明这种担心实际上是多余的, ondemand governor在降频时对于目标频率的选择完全可以更加激进。因此最新的 ondemand governor 在降频时会在所有可选频率中一次性选择出可以保证 CPU 工作在 80% 以上负荷的频率,当然如果没有任何一个可选频率满足要求的话则会选择 CPU 支持的最低运行频率。大量用户的测试结果表明这种新的算法可以在不影响系统性能的前提下做到更高效的节能。在算法改进后, ondemand governor 的名字并没有改变,而 ondemand governor 最初的实现也保存了下来,并且由于其算法的保守性而得名 conservative 。

Ondemand降频更加激进,conservative降频比较缓慢保守,事实使用ondemand的效果也是比较好的。

4) Cpufreq在用户态所呈现的接口:

•cpuinfo_max_freq  cpuinfo_min_freq: 分别给出了 CPU 硬件所支持的最高运行频率及最低运行频率,

•cpuinfo_cur_freq: 则会从 CPU 硬件寄存器中读取 CPU 当前所处的运行频率。

•governor:在选择合适的运行频率时只会在 scaling_max_freq 和 scaling_min_freq 所确定的范围内进行选择

•scaling_cur_freq: 返回的是 cpufreq 模块缓存的 CPU 当前运行频率,而不会对 CPU 硬件寄存器进行检查。

•scaling_available_governors: 会告诉用户当前有哪些 governors 可供用户使用

•scaling_driver: 则会显示该 CPU 所使用的变频驱动程序

•scaling_governor: 则会显示当前的管理策略,往这个上echo其他类型会有相应的转变。

•scaling_setspeed:需将governor类型切换为userspace,才会出现,往这个文件echo数值,会切换主频

以下是将governor切换为ondemand后生成的ondemand文件夹下出现的配置文件。(conservative就不说了,不准备使用)

• sampling_rate:当前使用的采样间隔 ,单位:微秒

• sampling_rate_min:允许使用的最短采样间隔

• sampling_rate_max:允许使用的最长采样间隔

• up_threshold :表明了系统负载超过什么百分比时 ondemand governor 会自动提高 CPU 的运行频率

• ignore_nice_load:ignore_nice_load 文件可以设置为 0 或 1(0 是默认设置)。当这个参数设置为 1 时,任何具有 “nice”值的处理器不计入总处理器利用率。在设置为 0 时,所有处理器都计入利用率。

• sampling_down_factor:

• 使用方法:

#cd /sys/devices/system/cpu/cpu0/cpufreq/目录

#echo 32000 > scaling_min_freq 设置最小工作频率(khz,32000~88000)

• 若想使用userspace策略

#echo userspace > scaling_governor切换工作方式为userspace

#echo 64000 > scaling_setspeed  设置成想要的工作频率(khz)

• 若想使用ondemand策略

# echo ondemand > scaling_governor切换工作方式为ondemand

3.如何实现?

       首先需要干一些杂活,修改kconfig makefile把系统屏蔽的cpufreq打开,对于我们来说主要的核心有两部分:

系统相关:主要有cpu,timer(变了频率一定要更新系统timer,否则系统时间就不准了),sdram等。

主要就是实现下面这个结构体:

static struct cpufreq_driver sep4020_driver =

{

.flags      = CPUFREQ_STICKY,

.verify     = sep4020_verify_speed,

.target     = sep4020_target,

.get         = sep4020_getspeed,

.init         = sep4020_cpu_init,

.name     = "SEP4020 Freq",

};

代码还是很简陋,很多细节都没考虑,所以具体的暂时先不讲了,大家可以先参考pxa和sa1100的实现。

然后就是收频率影响的驱动:

简单的来说就是:系统在变化cpu主频的时候会调用cpufreq_notify_transition(&freqs, CPUFREQ_POSTCHANGE);函数,向挂载在这个cpu上所有的驱动发出一个信号,驱动接收到这个信号则调用相应的处理函数。

这里把串口部分的实现简化,如下:

#ifdef CONFIG_CPU_FREQ

static int sep4020_serial_cpufreq_transition(struct notifier_block *nb, unsigned long val, void *data)

{

// printk("in the serial cpufreq_transition/n");

int pmcr_pre;

unsigned long cpu_clk,baud,baudh,baudl;

pmcr_pre = *(volatile unsigned long*)PMU_PMCR_V;

if(pmcr_pre > 0x4000)

cpu_clk = (pmcr_pre-0x4000)*8000000;

else

cpu_clk = (pmcr_pre)*4000000;

baud = cpu_clk/16/115200;

baudh = baud >>8;

baudl = baud&0xff;

*(volatile unsigned char*)UART0_LCR_V |= (0x80);

*(volatile unsigned char*)UART0_DLBL_V   = baudl;

*(volatile unsigned char*)UART0_DLBH_V   = baudh;

*(volatile unsigned char*)UART0_LCR_V &= ~(0x80);

printk("in the serial cpufreq_transition/n");

return 0;

}

static inline int sep4020_serial_cpufreq_register(void)

{

sep4020_serial_freq_transition.notifier_call = sep4020_serial_cpufreq_transition;

return cpufreq_register_notifier(&sep4020_serial_freq_transition,

CPUFREQ_TRANSITION_NOTIFIER);

}

static inline void sep4020_serial_cpufreq_deregister(void)

{

cpufreq_unregister_notifier(&sep4020_serial_freq_transition,

CPUFREQ_TRANSITION_NOTIFIER);

}

#else

...

#endif

4.效果

在sys下开启ondeman模式,串上电流表:

1) 板级电流从220mA调至160mA(因为此时内核检测系统无负载,降频)

2) 执行一个nandflash的拷贝命令,拷贝一个5M左右的文件到其他文件夹,

3) 在拷贝执行时间在3秒时(我给内核设的扫描周期为2.5秒)系统发现有负载,升频,电流从160mA变为220mA(可见已是系统最高主频)

4) 此后的拷贝的整个过程中电流保持为220mA

5) 在拷贝结束后不久(2-3s内),系统电流又跳变至160mA。

5. 内核选项

Linux 动态变频管理 cpufreq 提供了操作系统级别的变频功能,同时需要用户层来制定和执行策略。cpufreq后台进程cpufreqd 就是用来监测系统的运行状况,并根据不同的状况设定 CPU 的工作频率的。

要想在用户层使用后台进程cpufreqd,首先需要在配置Linux内核编译选项时选择CPU Frequency scaling功能选项, 其内有一些子选项,包含governor的选择和是否Enable CPUfreq debugging。 cpufreq有五种governor,要使cpufreqd正常运行,至少需要选择performance governor;在测试阶段往往希望看到系统变频信息,那么需要Enable CPUfreq debugging。在Enable CPUfreq debugging的前提下,在u-boot的linux启动参数bootargs加上loglevel=8 cpufreq.debug=<value>,就可以看到cpufreq的相应级别的运行信息。 <value>的值可以是 1、2、4,也可以是它们的或(3、5、6、7),具体意义如下:

1 to activate CPUfreq core debugging,

2 to activate CPUfreq drivers debugging(这是和SEP4020相关的调试), and

4 to activate CPUfreq governor debugging

后台进程 cpufreqd 需要用到三个库,分别是cpufreqd-2.2.1、cpufrequtils-002和 sysfsutils-2.1.0,这三个库都是 GNU 免费开源软件,我们对 cpufreqd-2.2.1、cpufrequtils-002 进行了一些修改,由于编译这三个库还是蛮麻烦的,因此我在君正发布的cpufreqd的开发包上对arm平台进行二次编译,这样减少了不少工作(做事要站在巨人的肩膀上,呵呵)首先你可以君正的官方ftp上下载这个包。

附:在开启DVFS的时候做老化测试的时候出现死机的状况,这可能在配置核心电压的时候出现死机的状况,所以在配置核心电压的时候可以稍微高一点!一般电压浮动是上下5%!如果不行还可以稍微高一点!

转自:http://blog.chinaunix.net/uid-24666775-id-3328064.html

浏览人工智能教程

DVFS--动态电压频率调整相关推荐

  1. 传统电力系统有功负荷和频率调整方法

    衡量电能质量的指标有频率.电压和波形质量:其分别用频率偏移.电压偏移和波形畸变率表征. 衡量运行经济型指标为:比耗量和线损率. 传统电力系统一般有三种负荷,第一种特点是变化幅度小.周期短.具有很大偶然 ...

  2. 电力系统【第5章:电力系统的有功功率和频率调整】

    一.电力系统频率调整 频率和电压都是衡量电能质量的重要指标,但系统中对频率恒定的要求比对电压恒定的要求要更为严格.因为系统中的电压等级较多,电压可以分散调整,且调压的方法较多.二系统的频率调整涉及全电 ...

  3. 电压频率转换电路(集成运放)

    一.实验目的 1.了解波形发生器中频率变换的方法. 2.掌握电压/频率转换电路的原理及测试方法. 二.实验原理 实验电路如图1-1所示.该图实际上就是锯齿波发生电路,只不过这里是通过改变输入电压Vi的 ...

  4. 发电机频率调整基础知识

    1 电力系统频率调整 1.1.  负荷分类: 一般将负荷变化分解成三种成分. 1.1.1    偶然性负荷 幅度很小, 周期又很短, 一般小于10秒, 具有随机性质, 称为微小变动分量.---1次调频 ...

  5. 实现Log4j和Logback的统一日志封装与动态日志级别调整

    一.背景 项目中使用日志的地方非常广泛, 如果要做统一的处理,比如调整格式, 增加信息打印, 要修改很多地方,难以维护,所以需要能够将日志做一个统一的封装, 便于扩展使用:同时想做到动态调整日志级别, ...

  6. 电力电子matlab 徐德鸿,动态电压恢复器DVRMATLAB仿真.doc

    动态电压恢复器DVRMATLAB仿真 目 录 1绪 论1 1.1 电能质量问题概述1 1.1.1电能质量概念1 1.1.2 电能质量问题分类1 1.2 电压跌落3 1.2.1电压跌落产生的原因3 1. ...

  7. Linux(debian7)操作基础(四)之CPU频率调整

    在Linux中,内核的开发者定义了一套框架模型来完成CPU频率动态调整这一目的,它就是CPU Freq系统.如下为CPU的几种模式(governor参数): ondemand:系统默认的超频模式,按需 ...

  8. 根据大脑频率调整状态

    大脑的4个波段 一.α波 状态: 闭目,安静的时候,此时人的意识清醒而身体处于完全的放松状态 作用: 有利于创造力的发挥 二.β波 状态: 意识清醒的时候 作用: 随着��波的增加,身体逐渐变得紧张 ...

  9. 世界各国的标准用电电压频率是多少

    变频电源可以模仿世界各国的用电标准电压怕频率,所以很多的出口电器的厂商就用变频电源来测试出口电器的使用情况.每个国家的用电标准频率都是不同的,今天中港扬盛的技术员带大家了解不同国家的用电标准频率是怎样 ...

最新文章

  1. 讲解 Redis 的一篇深度好文!
  2. 安全退出调用多个Activity的Application
  3. go语言学习(二)——Gin 框架简介
  4. 去掉Phoca Download的Powered By
  5. java面板中添加面板_如何把窗体加入面板中 java
  6. 基础篇:3.3.2)压铸件-材料选择
  7. 呕心沥血 JavaScript知识点梳理大全,超详细 建议收藏!!!
  8. [链表遍历|模拟] leetcode 2 两数相加
  9. 性能测试很难吗?一文带你学会性能测试核心流程和概念
  10. grep搜索字串包含特殊字符怎么办
  11. 继承学习第一天 共有派生
  12. 中科大EPC课程爬取
  13. 一套非常精美的全球地貌晕渲图,有想要的吗?
  14. 热敏打印机数据截取+追加打印二维码
  15. ZigBee入门之基础概念3
  16. 机房收费系统之思想性总结
  17. BeagleBone Black 从零到一 (2 MLO、U-Boot)_spl
  18. 烙铁-电子工程师的画笔
  19. 蚂蚁区块链BaaS平台架构与实践
  20. matlab编程勒让德多项式展开例题解析,第19 勒让德多项式 球函数习题及解答

热门文章

  1. 生成对抗网络 – Generative Adversarial Networks | GAN
  2. 《增长黑客实战》(第4-6章)
  3. 【Java|Swing】关于JLabel换行
  4. 第八课 k8s源码学习和二次开发原理篇-KubeBuilder使用和Controller-runtime原理
  5. 温度测量基于c语言,基于PN结的温度测量系统设计论文(C语言)--189876772.doc
  6. QT源码剖析-QT对象通信机制信号槽的绑定具体实现
  7. Python判断字符串是否为字母或者数字或者数字字母组合
  8. OCR EasyOCR + PaddleHub 光学字符识别(Optical Character Recognition, OCR)
  9. 微商城模式适合什么规模企业?新商云,满足多种行业需求!
  10. 人际沟通中的亲密关系