操你啦操bxx发烧友网 > 嵌入式操你啦日日操 > 正文

Linux电源管理:Runtime PM的软件框架

2020年09月15日 15:57 次阅读

1. 前言

终于可以写Runtime PM(后面简称RPM)了,说实话,蜗蜗有点小激动。因为从个人的角度讲,我很推崇使用RPM进行日常的动态电源管理,而不是suspend机制。

软件工程的基本思想就是模块化:高内聚和低耦合。通俗地讲呢,就是“各人自扫门前雪”,尽量扫好自己的(高内聚),尽量不和别人交互(低耦合)。而RPM正体现了这一思想:每个设备(包括CPU)都处理好自身的电源管理工作,尽量以最低的能耗完成交代的任务,尽量在不需要工作的时候进入低功耗状态,尽量不和其它模块有过多耦合。每个设备都是最节省的话,整个系统一定是最节省的,最终达到无所谓睡、无所谓醒的天人合一状态。

讲到这里想到自己的一则趣事:大学时,蜗蜗是寝室长,但不爱打扫卫生,于是就提出一个口号,“不污染,不治理;谁污染,谁治理”。结果呢,大家猜就是了,呵呵。言归正传,开始吧。

2. RunTIme PM的软件框架

听多了RPM的传说,有种莫名的恐惧,觉的会很复杂。但看代码,也就是“drivers/base/power/runTIme.c”中1400行而已。

从设计思路上讲,它确实简单。下面是一个大概的软件框架:

device driver(或者driver所在的bus、class等)需要提供3个回调函数,runTIme_suspend、runTIme_resume和runtime_idle,分别用于suspend device、resume device和idle device。它们一般由RPM core在合适的时机调用,以便降低device的power consumption。

而调用的时机,最终是由device driver决定的。driver会在适当的操作点,调用RPM core提供的put和get系列的helper function,汇报device的当前状态。RPM core会为每个device维护一个引用计数,get时增加计数值,put时减少计数值,当计数为0时,表明device不再被使用,可以立即或一段时间后suspend,以节省功耗。

好吧,说总是简单,那做呢?很不幸,到目前为止,linux kernel的runtime PM还是很复杂。这里的复杂,不是从实现的角度,而是从对外的角度。在“include\linux\pm_runtime.h”中,RPM提供了将近50个接口。软件模块化的设计理念中,最重要的一个原则就是提供简洁的接口。很显然,RPM没有做到!

无论RPM面对的问题有多么复杂,无论理由有多么充分,它也应坚守“简洁性”这一原则。否则,结果只有一个----无人敢用。这就是当前Linux kernel电源管理中“Opportunistic suspend”和RPM两种机制并存的原因。但是,就算现状不理想,也不能否认RPM的先进性,在当前以及未来很长的一段时间内,它会是kernel电源管理更新比较活跃的部分,因为可以做的还很多。

鉴于这个现状,本文以及后续RPM有关的文章,会选取最新的kernel(当前为linux-3.17),以便及时同步相关的更新。

3. Runtime PM的运行机制

3.1 核心机制

RPM的核心机制是这样的:

1)为每个设备维护一个引用计数(device-》power.usage_count),用于指示该设备的使用状态。

2)需要使用设备时,device driver调用pm_runtime_get(或pm_runtime_get_sync)接口,增加引用计数;不再使用设备时,device driver调用pm_runtime_put(或pm_runtime_put_sync)接口,减少引用计数。

3)每一次put,RPM core都会判断引用计数的值。如果为零,表示该设备不再使用(idle)了,则使用异步(ASYNC)或同步(SYNC)的方式,调用设备的.runtime_idle回调函数。

4).runtime_idle的存在,是为了在idle和suspend之间加一个缓冲,避免频繁的suspend/resume操作。因此它的职责是:判断设备是否具备suspend的条件,如果具备,在合适的时机,suspend设备。

可以不提供,RPM core会使用异步(ASYNC)或同步(SYNC)的方式,调用设备的.runtime_suspend回调函数,suspend设备,同时记录设备的PM状态;

可以调用RPM core提供helper函数(pm_runtime_autosuspend_expiration、pm_runtime_autosuspend、pm_request_autosuspend),要求在指定的时间后,suspend设备。

5)pm_runtime_autosuspend、pm_request_autosuspend等接口,会起一个timer,并在timer到期后,使用异步(ASYNC)或同步(SYNC)的方式,调用设备的.runtime_suspend回调函数,suspend设备,同时记录设备的PM状态。

6)每一次get,RPM core都会判断设备的PM状态,如果不是active,则会使用异步(ASYNC)或同步(SYNC)的方式,调用设备的.runtime_resume回调函数,resume设备。

注1:Runtime PM中的“suspend”,不一定要求设备必须进入低功耗状态,而是要求设备在suspend后,不再处理数据,不再和CPUs、RAM进行任何的交互,直到设备的.runtime_resume被调用。因为此时设备的parent(如bus controller)、CPU是、RAM等,都有可能因为suspend而不再工作,如果设备再有任何动作,都会造成不可预期的异常。下面是“Documentation\power\runtime_pm.txt”中的解释,供大家参考:

* Once the subsystem-level suspend callback (or the driver suspend callback,

if invoked directly) has completed successfully for the given device, the PM

core regards the device as suspended, which need not mean that it has been

put into a low power state. It is supposed to mean, however, that the

device will not process data and will not communicate with the CPU(s) and

RAM until the appropriate resume callback is executed for it. The runtime

PM status of a device after successful execution of the suspend callback is

‘suspended’。

注2:回忆一下wakeup events和wakeup lock,Runtime PM和它们在本质上是一样的,都是实时的向PM core报告“我不工作了,可以睡了”、“我要工作了,不能睡(或醒来吧)”。不同的是:wakeup events和RPM的报告者是内核空间drivers,而wakeup lock是用户空间进程;wakeup events和wakelock涉及的睡眠对象是整个系统,包括CPU和所有的devices,而RPM是一个一个独立的device(CPU除外,它由cpu idle模块处理,可看作RPM的特例)。

3.2 get和put的时机

这个话题的本质是:device idle的判断标准是什么?

再回忆一下“autosleep”中有关“Opportunistic suspend”的讨论,对“Opportunistic suspend”而言,suspend时机的判断是相当困难的,因为整机的运行环境比较复杂。而每一个具体设备的idle,就容易多了,这就是Runtime PM的优势。回到这个话题上,对device而言,什么是idle?

device是通过用户程序为用户提供服务的,而服务的方式分为两种:接受指令,做事情(被动);上报事件(主动,一般通过中断的方式)。因此,设备active的时间段,包括【接受指令,完成指令】和【事件到达,由driver记录下来】两个。除此之外的时间,包括driver从用户程序获得指令(以及相关的数据)、driver将事件(以及相关的数据)交给应用程序,都是idle时间。

那idle时间是否应立即suspend以节省功耗?不一定,要具体场景具体对待:例如网络传输,如果网络连接正常,那么在可预期的、很短的时间内,设备又会active(传输网络数据),如果频繁suspend,会降低性能,且不会省电;比如用户按键,具有突发性,因而可以考虑suspend;等等。

由于get和put正是设备idle状态的切换点,因此get和put的时机就容易把握了:

1)主动访问设备时,如写寄存器、发起数据传输等等,get,增加引用计数,告诉RPM core设备active;访问结束后,put,减小引用计数,告诉RPM core设备可能idle。

2)设备有事件通知时,get(可能在中断处理中);driver处理完事件后,put。

注3:以上只是理论场景,实际可以放宽,以减小设计的复杂度。

3.3 异步(ASYNC)和同步(SYNC)

设备驱动代码可在进程和中断两种上下文执行,因此put和get等接口,要么是由用户进程调用,要么是由中断处理函数调用。由于这些接口可能会执行device的.runtime_xxx回调函数,而这些接口的执行时间是不确定的,有些可能还会睡眠等待。这对用户进程或者中断处理函数来说,是不能接受的。

因此,RPM core提供的默认接口(pm_runtime_get/pm_runtime_put等),采用异步调用的方式(由ASYNC flag表示),启动一个work queue,在单独的线程中,调用.runtime_xxx回调函数,这可以保证设备驱动之外的其它模块正常运行。

另外,如果设备驱动清楚地知道自己要做什么,也可以使用同步接口(pm_runtime_get_sync/pm_runtime_put_sync等),它们会直接调用.runtime_xxx回调函数,不过,后果自负!

3.4 Runtime PM过程中的同步问题

由于.runtime_xxx回调函数可能采用异步的形式调用,以及Generic PM suspend和RPM并存的现状,要求RPM要小心处理同步问题,包括:

多个.runtime_suspend请求之间的同步;

多个.runtime_resume请求之间的同步;

多个.runtime_idle请求之间的同步;

.runtime_suspend请求和.runtime_resume请求之间的同步;

.runtime_suspend请求和system suspend之间的同步;

.runtime_resume请求和system resume之间的同步;

等等。

由此可知,RPM core将会有相当一部分代码,用来处理同步问题。

3.5 级联设备之间的Runtime PM

struct device结构中,有一个parent指针,指向该设备的父设备(没有的话为空)。父设备通常是Bus、host controller,设备的正常工作,依赖父设备。体现在RPM中,就是如下的行为:

1)parent设备下任何一个设备处于active状态,parent必须active。

2)parent设备下任何一个设备idle了,要通知parent,parent以此记录处于active状态的child设备个数。

3)parent设备下所有子设备都idle了,parent才可以idle。

以上行为RPM core会自动处理,不需要驱动工程师太过操心。

3.6 device的runtime status及其初始状态

在Runtime Power Management的过程中,device可处于四种状态:RPM_ACTIVE、RPM_RESUMING、RPM_SUSPENDED和RPM_SUSPENDING。

RPM_ACTIVE,设备处于正常工作的状态,表示设备的.runtime_resume回调函数执行成功;

RPM_SUSPENDED,设备处于suspend状态,表示设备.runtime_suspend回调函数执行成功;

RPM_RESUMING,设备的.runtime_resume正在被执行;

RPM_SUSPENDING,设备的.runtime_suspend正在被执行。

注4:前面说过,.runtime_idle只是suspend前的过渡,因此runtime status和idle无关。

device注册时,设备模型代码会调用pm_runtime_init接口,将设备的runtime status初始化为RPM_SUSPENDED,而kernel并不知道某个设备初始化时的真正状态,因此设备驱动需要根据实际情况,调用RPM的helper函数,将自身的status设置正确。

4. runtime PM的API汇整

RPM提供的API位于“include/linux/pm_runtime.h”中,在这里先浏览一下,目的有二:一是对前面描述的RPM运行机制有一个感性的认识;二是为后面分析RPM的运行机制做准备。

注5:我会把和驱动编写相关度较高的API加粗,其它的能不用就不用、能不看就不看!

extern int __pm_runtime_idle(struct device *dev, int rpmflags);

extern int __pm_runtime_suspend(struct device *dev, int rpmflags);

extern int __pm_runtime_resume(struct device *dev, int rpmflags);

这三个函数是RPM的idle、put/suspend、get/resume等操作的基础,根据rpmflag,有着不同的操作逻辑。后续很多API,都是基于它们三个。一般不会在设备驱动中直接使用。

extern int pm_schedule_suspend(struct device *dev, unsigned int delay);

在指定的时间后(delay,单位是ms),suspend设备。该接口为异步调用,不会更改设备的引用计数,可在driver的.rpm_idle中调用,免去driver自己再启一个timer的烦恼。

extern void pm_runtime_enable(struct device *dev);

extern void pm_runtime_disable(struct device *dev);

设备RPM功能的enable/disable,可嵌套调用,会使用一个变量(dev-》power.disable_depth)记录disable的深度。只要disable_depth大于零,就意味着RPM功能不可使用,很多的API调用(如suspend/reesume/put/get等)会返回失败。

RPM初始化时,会将所有设备的disable_depth置为1,也就是disable状态,driver初始化完毕后,要根据设备的时机状态,调用这两个函数,将RPM状态设置正确。

extern void pm_runtime_allow(struct device *dev);

extern void pm_runtime_forbid(struct device *dev);

RPM core通过sysfs(drivers/base/power/sysfs.c),为每个设备提供一个“/sys/devices/。。./power/control”文件,通过该文件可让用户空间程序直接访问device的RPM功能。这两个函数用来控制是否开启该功能(默认开启)。

extern int pm_runtime_barrier(struct device *dev);

这名字起的!!!

由3.3的描述可知,很多RPM请求都是异步的,这些请求会挂到一个名称为“pm_wq”的工作队列上,这个函数的目的,就是清空这个队列,另外如果有resume请求,同步等待resume完成。好复杂,希望driver永远不要用到它!!

extern int pm_generic_runtime_idle(struct device *dev);

extern int pm_generic_runtime_suspend(struct device *dev);

extern int pm_generic_runtime_resume(struct device *dev);

几个通用的函数,一般给subsystem的RPM driver使用,直接调用devie driver的相应的callback函数。

extern void pm_runtime_no_callbacks(struct device *dev);

告诉RPM core自己没有回调函数,不用再调用了(或者调用都是成功的),真啰嗦。

extern void pm_runtime_irq_safe(struct device *dev);

告诉RPM core,如下函数可以在中断上下文调用:

pm_runtime_idle()

pm_runtime_suspend()

pm_runtime_autosuspend()

pm_runtime_resume()

pm_runtime_get_sync()

pm_runtime_put_sync()

pm_runtime_put_sync_suspend()

pm_runtime_put_sync_autosuspend()

static inline int pm_runtime_idle(struct device *dev)

static inline int pm_runtime_suspend(struct device *dev)

static inline int pm_runtime_resume(struct device *dev)

直接使用同步的方式,尝试idle/suspend/resume设备,如果条件许可,就会执行相应的callback函数。driver尽量不要使用它们。

static inline int pm_request_idle(struct device *dev)

static inline int pm_request_resume(struct device *dev)

和上面类似,不过调用方式为异步。尽量不要使用它们。

static inline int pm_runtime_get(struct device *dev)

static inline int pm_runtime_put(struct device *dev)

增加/减少设备的使用计数,并判断是否为0,如果为零,尝试调用设备的idle callback,如果不为零,尝试调用设备的resume callback。

这两个接口是RPM的正统接口啊,多多使用!

static inline int pm_runtime_get_sync(struct device *dev)

static inline int pm_runtime_put_sync(struct device *dev)

static inline int pm_runtime_put_sync_suspend(struct device *dev)

和上面类似,只不过为同步调用。另外提供了一个可直接调用suspend的put接口,何必的!

static inline int pm_runtime_autosuspend(struct device *dev)

static inline int pm_request_autosuspend(struct device *dev)

static inline int pm_runtime_put_autosuspend(struct device *dev)

static inline int pm_runtime_put_sync_autosuspend(struct device *dev)

autosuspend相关接口。所谓的autosuspend,就是在suspend的基础上,增加一个timer,还是觉得有点啰嗦。不说了。

static inline void pm_runtime_use_autosuspend(struct device *dev)

static inline void pm_runtime_dont_use_autosuspend(struct device *dev)

extern void pm_runtime_set_autosuspend_delay(struct device *dev, int delay);

extern unsigned long pm_runtime_autosuspend_expiration(struct device *dev);

控制是否使用autosuspend功能,以及设置/获取autosuspend的超时值。

总结一下:总觉得这些API所提供的功能有些重叠,重叠的有点啰嗦。可能设计者为了提供更多的便利,可过渡的便利和自由,反而是一种束缚和烦恼!

5. runtime PM的使用步骤

觉得上面已经讲了,就不再重复了。

下载发烧友APP

打造属于您的人脉操你啦操bxx圈

关注操你啦操bxx发烧友微信

有趣有料的资讯及操你啦日日操干货

关注发烧友课堂

锁定最新课程活动及操你啦日日操直播

操你啦操bxx发烧友观察

一线报道 · 深度观察 · 最新资讯
收藏 人收藏
分享:

评论

相关推荐

《嵌入式操你啦日日操 基础课程》之逆向-X86汇编

我们将《嵌入式工程师-系列课程》分成两大阶段:第一阶段:《计算机体系结构》课程   分成4篇:分别是
发烧友学院发表于 2019-01-21 00:00 1630次阅读
《嵌入式操你啦日日操 基础课程》之逆向-X86汇编

三星FinFET专利侵权案宣布和解,多款处理器均...

FinFET(鳍式场效应晶体管)在当前的晶圆代工领域可谓是大放异彩的核心操你啦日日操,台积电甚至打算一路用到....
发表于 2020-09-15 15:42 13次阅读
三星FinFET专利侵权案宣布和解,多款处理器均...

一行代码教你如何隐藏Linux进程

总有朋友问隐藏Linux进程的方法,我说你想隐藏到什么程度,是大隐于内核,还是小隐于用户。网上通篇论....
发表于 2020-09-15 15:16 53次阅读
一行代码教你如何隐藏Linux进程

谷歌通过在处理数据时宣布了机密虚拟机的测试版可用...

据外媒报道,谷歌云已经扩展了其机密虚拟机(VMs)组合,这些虚拟机将提供加密服务,用户可以确信他们的....
发表于 2020-09-15 14:18 30次阅读
谷歌通过在处理数据时宣布了机密虚拟机的测试版可用...

Linux内核的发展史

1991 年,21 岁的芬兰大学生 Linus Torvalds 写下第一行 Linux 内核代码时....
发表于 2020-09-15 14:07 68次阅读
Linux内核的发展史

英特尔将考虑芯片外包,但将投入千亿人民币研发制造...

前Intel CEO司睿博表态会考虑芯片外包生产,但是对Intel来说,自己制造CPU等产品依然是极....
发表于 2020-09-15 12:10 177次阅读
英特尔将考虑芯片外包,但将投入千亿人民币研发制造...

客户依赖即时服务交付 复杂性、计算强度和带宽耗用...

作者:Mike Thompson AI 无处不在、随时在线和以数据为中心的时代,正催升对更高带宽的需....
发表于 2020-09-15 11:53 58次阅读
客户依赖即时服务交付 复杂性、计算强度和带宽耗用...

华硕推新型2U单插槽GPU服务器,配备ARM 6...

华硕近年来也加强了工作站/服务器业务,日前正式推出了最新一代的2U单插槽GPU服务器ESC4000A....
发表于 2020-09-15 10:29 64次阅读
华硕推新型2U单插槽GPU服务器,配备ARM 6...

基于微处理器LPC2210实现μC/OS-Ⅱ关键...

宏观的讲,μC/OS-Ⅱ大致分成内核结构、任务管理、时间管理、任务之间的通信与同步和CPU的移植等5....
发表于 2020-09-14 17:59 379次阅读
基于微处理器LPC2210实现μC/OS-Ⅱ关键...

Linux电源管理总体框架及实现原理

suspend过程中,有可能会发生wakeup events,所以某些时间点,会调用接口(pm_wa....
发表于 2020-09-14 17:00 34次阅读
Linux电源管理总体框架及实现原理

Linux电源管理系统结构介绍

1. 前言 在这个世界中,任何系统的运转都需要能量。如树木依靠光能生长,如马儿依靠食物奔跑,如计算机....
发表于 2020-09-14 16:17 352次阅读
Linux电源管理系统结构介绍

研究人员发现:更多黑客的网络攻击针对于基于Lin...

研究人员发现,更多高级攻击组织正在创建工具和平台来针对基于Linux的设备。因此,本文希望分析有关L....
发表于 2020-09-14 15:46 90次阅读
研究人员发现:更多黑客的网络攻击针对于基于Lin...

freebsd和linux区别

FreeBSD和Linux是两个自由开源的软件。实际上,它们的用户可以很容易的检查并修改源代码,用户....
发表于 2020-09-14 15:34 31次阅读
freebsd和linux区别

Linux操作环境下安装Python 3.6的步...

Python3在安装的过程中可能会用到各种依赖库,所以在正式安装Python3之前,需要将这些依赖库....
发表于 2020-09-14 15:20 59次阅读
Linux操作环境下安装Python 3.6的步...

Linux端口转发的常用方法,来绕过网络访问限制...

在一些实际的场景里,我们需要通过利用一些端口转发工具,比如系统自带的命令行工具或第三方小软件,来绕过....
发表于 2020-09-14 15:07 112次阅读
Linux端口转发的常用方法,来绕过网络访问限制...

Linux操作系统的Shell命令:日期格式

不管是哪种语言,日期/时间都是一个非常重要的值。比如我们保存日志的时候,往往是某个前缀再加上当前时间....
发表于 2020-09-14 14:57 64次阅读
Linux操作系统的Shell命令:日期格式

TOREX做客唯样直播间,看电源IC如何在5G光...

提到电源管理IC,不少人一定会想起【TOREX】(特瑞仕半导体) 。特瑞仕是电源IC专业制造商。独特....
发表于 2020-09-14 13:11 251次阅读
TOREX做客唯样直播间,看电源IC如何在5G光...

Linux下的动态电源管理(DPM)操你啦日日操分析

就目前掌握的资料来看,用嵌入式Linux系统的动态电源管理只有IBM奥斯汀实验室和MontaVist....
发表于 2020-09-14 12:51 64次阅读
Linux下的动态电源管理(DPM)操你啦日日操分析

Android电源管理监听充电状态的变化

应用程序应当一直监视设备电量的状态变化,在设备电量不足时,尽量降低更新频率,或者干脆停止数据更新。
发表于 2020-09-14 12:02 84次阅读
Android电源管理监听充电状态的变化

大手牵小手 中国芯我们一起走!

2020年8月27日,芯创空间今年首次大手拉小手活动成功举办!本次拉手活动也是今年相约芯创 筑梦未来....
发表于 2020-09-14 09:41 139次阅读
大手牵小手 中国芯我们一起走!

国产CPU的发展历程与当前产业链各领军企业的布局

CPU作为计算机设备的运算和控制核心,负责指令读取、译码与执行,因研发门槛高、生态构建难,被认为是集....
发表于 2020-09-13 09:42 625次阅读
国产CPU的发展历程与当前产业链各领军企业的布局

如何正确认识Linux设驱动模型

Linux设备林林总总,嵌入式开发一个绕不开的话题就是设备驱动开发,在做具体设备驱动开发之前,有必要....
发表于 2020-09-13 09:30 135次阅读
如何正确认识Linux设驱动模型

如何编写基于ARM的裸机程序和基于Linux的驱...

在嵌入式开发中,ADC应用比较频繁,本文主要讲解ADC的基本原理以及如何编写基于ARM的裸机程序和基....
发表于 2020-09-13 09:25 221次阅读
如何编写基于ARM的裸机程序和基于Linux的驱...

处理器开启/关闭超线程后,游戏帧数将发生什么变化...

CPU处理器的核心数在不断提升,如今桌面端消费级市场基本起步都是4核心,高端一些的都达到了8核心,A....
发表于 2020-09-13 09:16 166次阅读
处理器开启/关闭超线程后,游戏帧数将发生什么变化...

MAX3485串口通信,无法接收数据

现象: 当主机发送数据时(RTX),接收端能接收数据,本机同样能接收数据 当接收机发送数据,本机却接收不到 跪...
发表于 2020-09-12 18:49 202次阅读
MAX3485串口通信,无法接收数据

PLC的工作原理和应用领域及未来展望详细说明

plc教程在于帮助大家更好学习plc相关内容,往期plc教程内容中,小编对plc有过初步介绍。此次p....
发表于 2020-09-12 11:47 496次阅读
PLC的工作原理和应用领域及未来展望详细说明

PLC的内部结构和基本结构的教程说明

 plc教程近来成为百度热词,原因在于一份好的plc教程往往难求。为此,小编特建立plc教程系列文章....
发表于 2020-09-12 11:47 184次阅读
PLC的内部结构和基本结构的教程说明

Windows CE操作系统的电源状态转换策略

基本的电源管理功能所采用的节能方法是使系统适时的进入休眠状态,当下面的一种事件发生时,系统将进入休眠....
发表于 2020-09-12 11:08 66次阅读
Windows CE操作系统的电源状态转换策略

以AM33XX为实例的OMAP的电源管理功能

本系列文章将分析Linux对于OMAP的电源管理功能,以AM33XX作为实例(目前的硬件平台先主要关....
发表于 2020-09-12 10:56 54次阅读
以AM33XX为实例的OMAP的电源管理功能

如何认识Windows 7三种电源计划

如果用户所使用的是笔记本电脑,则可以将鼠标移动指针至通知区域中的“电池”图标上单击,会出现电池状态以....
发表于 2020-09-12 10:46 92次阅读
如何认识Windows 7三种电源计划

灵动微课堂 (第136讲) 基于MM32 MCU的OS移植与应用——RT-Thread 电源管理

简介 随着物联网(IoT)的兴起,产品对功耗的需求越来越强烈。作为数据采集的传感器节点通常需要在电池供电时长期工作...
发表于 2020-09-11 18:02 0次阅读
灵动微课堂 (第136讲) 基于MM32 MCU的OS移植与应用——RT-Thread 电源管理

CPU有个禁区 大部分人不知道!

来源:编程世界宇宙 神秘项目我是CPU一号车间的阿Q,是的,我又来了。 最近一段时间,我几次下班约隔....
发表于 2020-09-11 17:37 142次阅读
CPU有个禁区 大部分人不知道!

单片机是控制操你啦操bxx产品的大脑

现如今,我们生活中的许多电器都使用了单片机。例如:手机、电视机、冰箱、洗衣机、以及按下开关,LED就....
发表于 2020-09-11 16:21 121次阅读
单片机是控制操你啦操bxx产品的大脑

电脑都常用的操作系统有哪些

如果我们到电脑城去购买一台组装电脑,操你啦日日操员在装机后,都是要给我们安装好操作系统的,没有操作系统的电脑....
发表于 2020-09-11 16:20 129次阅读
电脑都常用的操作系统有哪些

Linux操作系统:三种最基本的文件重命名方法

在我们的工作生活中,不管是程序员还是非程序员,我们都会遇到过一个需求,那就是对一堆的文件进行重命名。....
发表于 2020-09-11 14:48 99次阅读
Linux操作系统:三种最基本的文件重命名方法

Linux 自旋锁spinlock

背景 由于在多处理器环境中某些资源的有限性,有时需要互斥访问(mutual exclusion),这....
发表于 2020-09-11 14:36 51次阅读
Linux 自旋锁spinlock

【信盈达】鸿蒙操作系统移植--3、安装Python环境

安装Python环境打开Linux编译服务器终端,输入命令“python3 -v”或“python -v”,查看Python版本号。可使用pytho...
发表于 2020-09-11 13:55 33次阅读
【信盈达】鸿蒙操作系统移植--3、安装Python环境

Orange Pi 3开发板在Armbian系统下使用SPI的方法

香橙派Orange Pi 3开发板,采用全志H6系统级芯片,同时拥有1GB或2GB LPDDR3 内存,可选8GB EMMC F...
发表于 2020-09-11 11:46 0次阅读
Orange Pi 3开发板在Armbian系统下使用SPI的方法

cpu的程序是如何运行起来的

作者:良知犹存 转自:羽林君 1 CPU的硬件最小原子 计算机从上世纪四十年代发展到现在有八十多年了....
发表于 2020-09-11 09:26 138次阅读
cpu的程序是如何运行起来的

Windows CE.NET电源管理器状态转换方...

虽然通过用户操作、应用程序或者外设都可以使系统进入或者退出休眠状态,但基本的电源管理功能所能控制的粒....
发表于 2020-09-10 17:19 69次阅读
Windows CE.NET电源管理器状态转换方...

一种低功耗电源管理操你啦影院设计方案

系统断电管理方案即为对整个系统电源进行自动控制,当系统未测距时间超过10s,那整个系统的供电系统就会....
发表于 2020-09-10 17:07 598次阅读
一种低功耗电源管理操你啦影院设计方案

Linux基金会宣布计划成立新的气候金融基金会

Linux 基金会本周宣布计划成立新的气候金融基金会(LF Climate Finance Foun....
发表于 2020-09-10 16:44 118次阅读
Linux基金会宣布计划成立新的气候金融基金会

Android是基于Linux的开源操作系统

Android是基于Linux的开源操作系统,主要用于嵌入式设备,如大香蕉网站手机、平板电脑、大香蕉网站电视、车....
发表于 2020-09-10 16:35 197次阅读
Android是基于Linux的开源操作系统

英伟达首次超越英特尔 成为全美最大芯片企业

作 者丨张静波 美东时间2020年7月8日,已在不少人意料之中的一件历史分水岭式事件发生了: 纳斯达....
发表于 2020-09-10 16:00 936次阅读
 英伟达首次超越英特尔 成为全美最大芯片企业

【免费申请】DIY狂热粉不可错过,HiSpark IPC DIY Camera等你改造

相信很多操你啦操bxx爱好者对操你啦操bxxDIY都不陌生,本次操你啦操bxx发烧友要说摄像头也能DIY你相信吗?接下来介绍的一款开发板可以...
发表于 2020-09-10 15:11 462次阅读
【免费申请】DIY狂热粉不可错过,HiSpark IPC DIY Camera等你改造

不懂正则表达式?不如借助这三个神器

正则表达式可以说一直是大家的梦魇,但是正则在工作中实在是使用太广泛了,又不得不学习,但是却很难掌握其....
发表于 2020-09-10 15:00 98次阅读
不懂正则表达式?不如借助这三个神器

【免费申请】守卫安全的“黑科技”,HiSpark AI Camera勇担重任

AI这个词正日益变得耳熟能详,那么AI操你啦日日操在哪些方面应用得最广?又能给人们的生活带来什么样的改变?以人脸图像识...
发表于 2020-09-10 14:43 860次阅读
【免费申请】守卫安全的“黑科技”,HiSpark AI Camera勇担重任

P4610是基于3D NAND介质的NVMeSS...

第一个是IOPS吞吐能力,P4610是基于3D NAND介质的NVMeSSD,在混合读写情况下,基于....
发表于 2020-09-10 12:01 362次阅读
P4610是基于3D NAND介质的NVMeSS...

ACAP 将分布式异构与高速互联融为一体 提供面...

作者:Mike Thompson,赛灵思 Virtex UltraScale+ FPGA 与 Ver....
发表于 2020-09-10 11:21 258次阅读
ACAP 将分布式异构与高速互联融为一体 提供面...

TLZ7xH-EVM开发板CPU/FLASH/RAM

TLZ7xH-EVM是一款由创龙基于SOM-TLZ7xH核心板设计的开发板,底板采用沉金无铅工艺的6层板设计,为用户提...
发表于 2020-09-10 10:59 101次阅读
TLZ7xH-EVM开发板CPU/FLASH/RAM

Arm公司发布兼具存储和数据处理能力的Corte...

但是,有一种新兴的硬件类别被称为计算存储,即在数据驻留的地方进行处理,而不是将其移动到内存中。数据通....
发表于 2020-09-10 10:21 355次阅读
Arm公司发布兼具存储和数据处理能力的Corte...

首款支持Linux的64位处理器Cortex-R82,用于存储计算

Arm推出Cortex-R82,这是其首款支持Linux的64位处理器,可实时计算固态驱动器(SSD),硬盘驱动器(HDD)...
发表于 2020-09-09 16:57 101次阅读
首款支持Linux的64位处理器Cortex-R82,用于存储计算

51单片机的cpu主要由什么组成_51单片机的字...

51单片机的cpu主要组成部分有中央处理器( CPU )、内部数据存储器( RAM)、内部程序存储器....
发表于 2020-09-09 15:43 164次阅读
51单片机的cpu主要由什么组成_51单片机的字...

PC的组成是利用CPU和GPU的计算单元再用高速...

于是有了最早的2D显示芯片,2D显示芯片经过多年的发展,到了90年代开始有了3D显示的概念。而3D显....
发表于 2020-09-09 15:38 142次阅读
PC的组成是利用CPU和GPU的计算单元再用高速...

FPGA开发指南和操你啦影院图集!(原理图&例程代码)

       FPGA 的用处比我们平时想象的用处更广泛,原因在于其中集成的模块种类更多,而不仅仅...
发表于 2020-09-08 22:43 101次阅读
FPGA开发指南和操你啦影院图集!(原理图&例程代码)

linux设备树中的chosen一项该怎么写

      设备树中的chosen节点会直接影响启动的结果,但是不知道里边的内容与什么有关。参考别人的...
发表于 2020-09-07 11:16 0次阅读
linux设备树中的chosen一项该怎么写