匿名Binder:

即没有向ServiceManager注册的Binder。

Binder通信并不绝对依赖ServiceManager,它只是一个域名解析器。可有可无,有更方便。

所以可以看到ContextImpl$ApplicationThread,ContentProvider$Transport都是没有向ServiceManager addService,只要client进程能获取proxy即可。如果本来已经建立Binder通信的,就可以直接获取到proxy而不用通过ServiceManager。

 

实名Binder:

 

即通过ServiceManager#addService的Binder子类。

client获取proxy:

ServiceManagerNative#getService

public IBinder getService(String name) throws RemoteException {Parcel data = Parcel.obtain();Parcel reply = Parcel.obtain();data.writeInterfaceToken(IServiceManager.descriptor);data.writeString(name);mRemote.transact(GET_SERVICE_TRANSACTION, data, reply, 0);IBinder binder = reply.readStrongBinder();reply.recycle();data.recycle();return binder;}

android_os_parcel.cpp#android_os_Parcel_readStrongBinder

static jobject android_os_Parcel_readStrongBinder(JNIEnv* env, jclass clazz, jlong nativePtr)
{Parcel* parcel = reinterpret_cast<Parcel*>(nativePtr);if (parcel != NULL) {return javaObjectForIBinder(env, parcel->readStrongBinder());}return NULL;
}

上面的javaObjectForIBinder方法会把native的Ibinder对象变成一个java层的Ibinder,native层的IBinder应该是被封装在so库里,在源码中搜索不到。

 

Parcel.cpp#readStrongBinder()

sp<IBinder> Parcel::readStrongBinder() const
{sp<IBinder> val;unflatten_binder(ProcessState::self(), *this, &val);return val;
}

Parcel.cpp#unflatten_binder

status_t unflatten_binder(const sp<ProcessState>& proc,const Parcel& in, sp<IBinder>* out)
{const flat_binder_object* flat = in.readObject(false);if (flat) {switch (flat->type) {case BINDER_TYPE_BINDER:*out = reinterpret_cast<IBinder*>(flat->cookie);return finish_unflatten_binder(NULL, *flat, in);case BINDER_TYPE_HANDLE:*out = proc->getStrongProxyForHandle(flat->handle);return finish_unflatten_binder(static_cast<BpBinder*>(out->get()), *flat, in);}}return BAD_TYPE;
}

ProccessState.cpp#getStrongProxyForHandle

sp<IBinder> ProcessState::getStrongProxyForHandle(int32_t handle)
{sp<IBinder> result;AutoMutex _l(mLock);handle_entry* e = lookupHandleLocked(handle);if (e != NULL) {// We need to create a new BpBinder if there isn't currently one, OR we// are unable to acquire a weak reference on this current one.  See comment// in getWeakProxyForHandle() for more info about this.IBinder* b = e->binder;if (b == NULL || !e->refs->attemptIncWeak(this)) {if (handle == 0) {// Special case for context manager...// The context manager is the only object for which we create// a BpBinder proxy without already holding a reference.// Perform a dummy transaction to ensure the context manager// is registered before we create the first local reference// to it (which will occur when creating the BpBinder).// If a local reference is created for the BpBinder when the// context manager is not present, the driver will fail to// provide a reference to the context manager, but the// driver API does not return status.//// Note that this is not race-free if the context manager// dies while this code runs.//// TODO: add a driver API to wait for context manager, or// stop special casing handle 0 for context manager and add// a driver API to get a handle to the context manager with// proper reference counting.Parcel data;status_t status = IPCThreadState::self()->transact(0, IBinder::PING_TRANSACTION, data, NULL, 0);if (status == DEAD_OBJECT)return NULL;}b = new BpBinder(handle); e->binder = b;if (b) e->refs = b->getWeakRefs();result = b;} else {// This little bit of nastyness is to allow us to add a primary// reference to the remote proxy when this team doesn't have one// but another team is sending the handle to us.result.force_set(b);e->refs->decWeak(this);}}return result;
}

上面的方法就根据handle产生了一个BpBinder

可以看到从ServiceManager得到的proxy是一个BpBinder,而后面是怎么从java层调用到这个BpBinder的,在java层的Binder的代码中没有体现出来。在proxy的代码中,最终会调用mRemote.transact(...),然而在java层的Binder代码中transact方法代码如下:

public final boolean transact(int code, Parcel data, Parcel reply,int flags) throws RemoteException {if (false) Log.v("Binder", "Transact: " + code + " to " + this);if (data != null) {data.setDataPosition(0);}boolean r = onTransact(code, data, reply, flags);if (reply != null) {reply.setDataPosition(0);}return r;}

 

 

 

Proxy中mRemote的由来:

mRemote是一个BinderProxy对象,BinderProxy在Binder.java中。

mRemote是怎么来的呢,看下面:

在传递IBinder对象时(比如:Proxy对象中的mRemote,即服务端),会使用Parcel的方法把IBinder写到Binder驱动中。

/*** Write an object into the parcel at the current dataPosition(),* growing dataCapacity() if needed.*/public final void writeStrongBinder(IBinder val) {nativeWriteStrongBinder(mNativePtr, val);}

jni如下:

static void android_os_Parcel_writeStrongBinder(JNIEnv* env, jclass clazz, jlong nativePtr, jobject object)
{Parcel* parcel = reinterpret_cast<Parcel*>(nativePtr);if (parcel != NULL) {const status_t err = parcel->writeStrongBinder(ibinderForJavaObject(env, object));if (err != NO_ERROR) {signalExceptionForError(env, clazz, err);}}
}

 

native源码如下:

 

 

status_t Parcel::writeStrongBinder(const sp<IBinder>& val)
{return flatten_binder(ProcessState::self(), val, this);}

 

 

 

status_t flatten_binder(const sp<ProcessState>& /*proc*/,const sp<IBinder>& binder, Parcel* out)
{flat_binder_object obj;obj.flags = 0x7f | FLAT_BINDER_FLAG_ACCEPTS_FDS;if (binder != NULL) {IBinder *local = binder->localBinder();if (!local) {BpBinder *proxy = binder->remoteBinder();if (proxy == NULL) {ALOGE("null proxy");}const int32_t handle = proxy ? proxy->handle() : 0;obj.type = BINDER_TYPE_HANDLE;obj.binder = 0; /* Don't pass uninitialized stack data to a remote process */obj.handle = handle;obj.cookie = 0;} else {obj.type = BINDER_TYPE_BINDER;obj.binder = reinterpret_cast<uintptr_t>(local->getWeakRefs());obj.cookie = reinterpret_cast<uintptr_t>(local);}} else {obj.type = BINDER_TYPE_BINDER;obj.binder = 0;obj.cookie = 0;}return finish_flatten_binder(binder, obj, out);
}

上面的方法就是将IBinder扁平化,有点像序列化,就是将IBinder子类对象(即服务端对象)作类似序列化,但是不是完全按照原来的样子序列化,还会做其他创建对象或者修改的操作。

 

然后client端,拿到这个从服务端进程传过来的服务端对象,需要通过Parcel#readStrongBinder()来获取可以跟驱动打交道,还可以让驱动知道要找哪个服务端的IBinder对象。这个获取到IBinder就是Proxy中的mRemote,这是一个BinderProxy对象。看Parcel#readStrongBinder()

/*** Read an object from the parcel at the current dataPosition().*/public final IBinder readStrongBinder() {return nativeReadStrongBinder(mNativePtr);}

jni方法如下(在parcel.cpp):

 

static jobject android_os_Parcel_readStrongBinder(JNIEnv* env, jclass clazz, jlong nativePtr)
{Parcel* parcel = reinterpret_cast<Parcel*>(nativePtr);if (parcel != NULL) {return javaObjectForIBinder(env, parcel->readStrongBinder());}return NULL;
}

 

native方法如下:

 

 

sp<IBinder> Parcel::readStrongBinder() const
{sp<IBinder> val;unflatten_binder(ProcessState::self(), *this, &val);return val;
}

 

status_t unflatten_binder(const sp<ProcessState>& proc,const Parcel& in, sp<IBinder>* out)
{const flat_binder_object* flat = in.readObject(false);if (flat) {switch (flat->type) {case BINDER_TYPE_BINDER:*out = reinterpret_cast<IBinder*>(flat->cookie);return finish_unflatten_binder(NULL, *flat, in);case BINDER_TYPE_HANDLE:*out = proc->getStrongProxyForHandle(flat->handle);return finish_unflatten_binder(static_cast<BpBinder*>(out->get()), *flat, in);}}return BAD_TYPE;
}

 

现在看看

ibinderForJavaObject(env, object) //把java层 IBinder变成native层的IBinder对象

javaObjectForIBinder(env, parcel->readStrongBinder())//把native层的IBinder对象变成java层的IBinder对象

就是ibinderForJavaObject方法把服务端IBinder扁平化写到Binder驱动,而javaObjectForIBinder根据在Binder驱动中扁平化的服务端IBinder,创建一个BinderProxy对象。

最终BinderProxy使用transact方法和Binder驱动交互,并最终将信息传到对应的服务端Binder,会调用Binder#execTransact()->Binder子类#onTransact()

下面是BinderProxy#transact

public boolean transact(int code, Parcel data, Parcel reply, int flags) throws RemoteException {Binder.checkParcel(this, code, data, "Unreasonably large binder buffer");return transactNative(code, data, reply, flags);}

jni方法(android_util_binder.cpp):

static jboolean android_os_BinderProxy_transact(JNIEnv* env, jobject obj,jint code, jobject dataObj, jobject replyObj, jint flags) // throws RemoteException
{if (dataObj == NULL) {jniThrowNullPointerException(env, NULL);return JNI_FALSE;}Parcel* data = parcelForJavaObject(env, dataObj);if (data == NULL) {return JNI_FALSE;}Parcel* reply = parcelForJavaObject(env, replyObj);if (reply == NULL && replyObj != NULL) {return JNI_FALSE;}IBinder* target = (IBinder*)env->GetLongField(obj, gBinderProxyOffsets.mObject);if (target == NULL) {jniThrowException(env, "java/lang/IllegalStateException", "Binder has been finalized!");return JNI_FALSE;}ALOGV("Java code calling transact on %p in Java object %p with code %" PRId32 "\n",target, obj, code);bool time_binder_calls;int64_t start_millis;if (kEnableBinderSample) {// Only log the binder call duration for things on the Java-level main thread.// But if we don'ttime_binder_calls = should_time_binder_calls();if (time_binder_calls) {start_millis = uptimeMillis();}}//printf("Transact from Java code to %p sending: ", target); data->print();status_t err = target->transact(code, *data, reply, flags);//if (reply) printf("Transact from Java code to %p received: ", target); reply->print();if (kEnableBinderSample) {if (time_binder_calls) {conditionally_log_binder_call(start_millis, target, code);}}if (err == NO_ERROR) {return JNI_TRUE;} else if (err == UNKNOWN_TRANSACTION) {return JNI_FALSE;}signalExceptionForError(env, obj, err, true /*canThrowRemoteException*/, data->dataSize());return JNI_FALSE;
}

 

Parcel类

 

这个类和Parcelable类是完全不同的,这个是为Binder通信定制的类,native层对应了Parcel.cpp。这个类可以产生BpBinder

 

关于ServiceManager与Binder的关系看下面的优秀博文即可,不重复写了。

 

BinderInternal.getContextObject()

 

Binder IPC通信:形式上对象只能传递parcel和IBinder类型的参数,但是parcel中可以传递object类型,也就是可以传递任何类型的变量。

 

binder通信和共享内存的区别和联系

 下图是binder通信,首先是应用程序把数据通过parcel,应该是通过malloc分配一个空间,虽然是在使用jni调用,并最终在native实现的程序中去把一个object进行扁平化存储在上面分配的空间的,但是无论是java层还是native,只要是是非内核程序(内核程序包括操作系统的核心进程和驱动程序),而在parcel进行的分配空间和对object扁平化时,程序是运行在用户空间的(cpu处于用户态),因为这个应用程序主动调用的程序,而这个此时还不涉及到系统调用,所以没有主动进入内核态运行。所以parcel的write方法写入的东西都是写入了应用进程的用户态空间,最终会把把这些东西通过系统调用去访问binder驱动设备,并写入属于binder驱动的内核空间中,而具体是binder驱动的内核空间的哪一块,就得看binder怎么分了。binder会为每个binder通信的进程分一块空间,而应用进程访问binder驱动并且把东西写入驱动的内核空间时,是写入到binder驱动内核空间中分给接收应用进程的那一块内存。这就是通过把用户空间中的数据复制到内核空间中,然后把binder驱动作为一个中介存储空间;即发送进程把数据写到binder驱动的内和空间中,然后接收进程从内核空间中把内容复制到属于自己的用户空间。

共享内存:有两种方式,一种是shmget,这种方式是直接把多个进程各自的一个逻辑地址(各个进程的逻辑地址都不同)映射到同一个物理内存空间,这种方式是读写是最快,而且各进程无需去复制到自己的进程空间中,多进程通信的效率比较高,但是使用起来比较复杂,shmget方式和mmap内存映射方式就类似低级语言和高级语言的区别,性能和代码读写维护的便利的权衡。mmap内存映射,使用相对于shmget方式比较简便,而且虽然最终映射的文件还是说占用物理内存空间,但是一个文件可以分块载入到内存中,那么mmap就可以使用更大的共享内存区了,而shmget是直接映射物理内存,所以共享区大小受限。而且mmap因为是映射磁盘的文件,所以在关闭或者关机时载入到内存中的文件会保存到磁盘中,就是mmap实现的共享内存中的内容可以断电永久保存。

shmget的api:

(1)通过int shmget(key_t key, size_t size, int shmflg);在物理内存创建一个共享内存,返回共享内存的编号。
(2)通过void *shmat(int shmid, constvoid shmaddr,int shmflg);连接成功后把共享内存区对象映射到调用进程的地址空间
(3)通过void *shmdt(constvoid* shmaddr);断开用户级页表到共享内存的那根箭头。
(4)通过int shmctl(int shmid, int cmd, struct shmid_ds* buf);释放物理内存中的那块共享内存。

 

总结mmap和shm:
1、mmap是在磁盘上建立一个文件,每个进程地址空间中开辟出一块空间进行映射。
而对于shm而言,shm每个进程最终会映射到同一块物理内存。shm保存在物理内存,这样读写的速度要比磁盘要快,但是存储量不是特别大。
2、相对于shm来说,mmap更加简单,调用更加方便,所以这也是大家都喜欢用的原因。
3、另外mmap有一个好处是当机器重启,因为mmap把文件保存在磁盘上,这个文件还保存了操作系统同步的映像,所以mmap不会丢失,但是shmget就会丢失。

内存的知识可以查看:https://blog.csdn.net/qq_34228570/article/details/72995997

鱼思故渊的专栏:linux内存映射mmap原理分析

 

Android系统进程间通信Binder机制在应用程序框架层的Java接口源代码分析

https://blog.csdn.net/freshui/article/details/55051268:parcel

Android Bander设计与实现 - 设计篇设计

 

 

Binder相关的jni代码和c代码及头文件路径:

frameworks/base/core/jni

frameworks/native/include

frameworks/native/libs/binder

 

 

 

查看全文
如若内容造成侵权/违法违规/事实不符,请联系编程学习网邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!

相关文章

  1. button 中的内容居中

    在button中,如果使用默认的button宽高,button中的内容是垂直居中的,但是自定义button内容就不是垂直居中了,可以通过设置line-height来调节。如下,这是我设置的宽高后的button:.login{width: 66px;height: 35px;vertical-align:middle;text-align: center; }现在设置line…...

    2024/4/17 4:34:03
  2. 《高效能人士的七个习惯》分享

    习惯决定成败品德实质上是习惯的合成。俗语说:“思想决定行动,行动决定习惯,习惯决定品德,品德决定命运。”习惯对我们的生活有极大的影响,因为它是一贯的,在不知不觉中,经年累月影响着我们的品德,暴露出我们的本性,左右着我们的成败。 习惯一 : 积极主动——个人愿景…...

    2024/4/17 4:33:45
  3. 一些数据库技术书的资源

    我是清华社编辑,这些资源是我的图书作者授权发布这里,包括源码、课件、教学视频,可以独立使用,的确有参考价值。请求给予通过,感谢。《MySQL 8从零开始学(视频教学版)》https://pan.baidu.com/s/1q8utMh2n8Qv2lXDdOXDcJw 提取码:2juf 《MySQL 5.7从零开始学(视频教学版…...

    2024/4/17 4:32:45
  4. springcloud 高效率本地加Redis双级缓存

    在springcloud中我们可以使用spring-boot-starter-data-redis已经为我们处理好分布式缓存,但是我们还是不满足于只存在于网络中传输的缓存,我们现在来扩展成本地加Redis双级缓存,这样就可以减少网络传输带来的传输效率。springcloud以下是针对已经整理好的项目进行直接使用打…...

    2024/4/19 21:02:44
  5. binder机制优点

    在Linux中使用的IPC通信机制如下: 传统IPC:无名pipe, signal, trace, 有名管道AT&T Unix 系统V:共享内存,信号灯,消息队列BSD Unix:Socket而在Android中,并没有使用这些,取而代之的是Binder机制。Binder机制是采用OpenBinder演化而来,在Android中使用它的原因如下…...

    2024/4/17 4:34:45
  6. ActivityGroup的浅薄理解

    用ActivityGroup可以实现多个Activity的切换,ActivityGroup的出现打破了android单窗口管理的理念,但是google在3.0版本后就用新的类来代替它了,这个类叫fragment ,但是现在还是有很多应用都在用ActivityGroup,还是值得了解的。 本例将介绍ActivityGroup+ScrollView来实现Ta…...

    2024/4/17 4:34:45
  7. HTML中input和button解决等高不对齐的原因

    在HTML中input和button有不能一样高的原因吗怎么去解决他,下面给你一个解决方法<style> .text{ height: 45px; width: 180px; background: yellow; } .button{ height: 45px; width: 90px; background: red; } </style> </head> <body>…...

    2024/4/17 4:34:57
  8. Python网络爬虫——1、网络爬虫简介

    什么是网络爬虫 网络爬虫又称网络蜘蛛、网络蚂蚁、网络机器人,它可以自动化浏览网络中的信息,当然浏览信息的时候需要按照我们制定的规则进行,这些规则我们称之为网络爬虫算法。使用Python可以方便的编写出爬虫程序,进行互联网信息的自动化检索。  搜索引擎离不开爬…...

    2024/4/17 4:34:51
  9. Ubuntu16.04安装gitlab runner并配置CI

    Ubuntu16.04安装gitlab runner并配置CI 持续集成 GitLab-CI GitLab-CI就是一套配合GitLab使用的持续集成系统(当然,还有其它的持续集成系统,同样可以配合GitLab使用,比如Jenkins)。而且GitLab8.0以后的版本是默认集成了GitLab-CI并且默认启用的。.gitlab-ci.yml的脚本解析…...

    2024/4/17 4:35:09
  10. SQL Server从入门到精通(五)

    哈喽,好久没有更新了,今天阿猪就带领大家来对表的管理进行详细的学习 往期精选 SQL Server从入门到精通(一) SQL Server从入门到精通(二) SQL Server从入门到精通(二)精讲 SQL Server从入门到精通(三) SQL Server从入门到精通(四) 目录 一、运算符 二、插入数据 三…...

    2024/3/28 20:42:40
  11. 高效能人士的七个习惯(一)由内而外全面造就自己

    目录一.主要内容1.1 品德 VS 个人魅力1.2 思维定式1.3 以原则为中心的思维定式1.4 总结1.5 课后练习推测过于匆忙的经验到其他国家或地区感到陌生的事转换思维定式影响我生活的5个原则系列文章 一.主要内容 1.1 品德 VS 个人魅力 本章从作者儿子个人成长的故事入手,探究了在获…...

    2024/4/19 21:01:12
  12. Unity之Button响应事件

    public class btn01 : MonoBehaviour { void Start (){GetComponent<Button>().onClick.AddListener(() => { OnClickShot(); });}void OnClickShot(){audio.Play();Application.CaptureScreenshot("tupian.png");}}功能:将该脚本挂在button组件下,当点…...

    2024/4/17 4:34:57
  13. Java层Binder机制详解

    本文是我阅读《Android内核剖析》一书的笔记,在此写下来是希望能够加深理解,也希望朋友们能够指出其中的不足。 Binder是一种基于C/S的架构,主要包括四个部分:服务端(Server),客户端(Client),Binder驱动,ServiceManager。Binder是Android系统中非常重要的一种IPC机制,如…...

    2024/4/20 7:06:56
  14. 【Hibernate】从入门到精通(一)概览

    今天我们来谈谈Hibernate的前世今生。是什么?Hibernate是一个开放源代码的对象关系映射框架,是java应用和关系数据库的桥梁。它能进行java对象和 关系数据之间的映射。Hibernate内部封装了通过jdbc访问数据库的操作,向上层应用提供面向对象的数据访问API。 上图的 演变大家都…...

    2024/4/17 4:35:15
  15. php 获取本周开始时间戳和结束时间戳

    //当前日期 $nowDate = date("Y-m-d");//$first =1 表示每周星期一为开始日期 0表示每周日为开始日期 $first=1;//获取当前周的第几天 周日是 0 周一到周六是 1 - 6 $w=date(w,strtotime($nowDate));//获取本周开始日期,如果$w是0,则表示周日,减去 6 天 $week_sta…...

    2024/4/17 4:35:03
  16. 《高效能人士的七个习惯》:有图有真相

    《高效能人士的七个习惯》,作者史蒂芬柯维(Stephen R. Covey),被誉为影响人类思想的新智慧学家,美国学界的“思想巨匠”,入选“影响美国历史进程的25位人物”。2002年,福布斯将《高效能人士的七个习惯》评为有史以来最具影响力的10大管理类书籍之一。...

    2024/4/4 5:16:23
  17. 关于ActivityGroup一些常用方法

    1.加载子Activity到ActivityGroup中 <span style="white-space:pre"> </span>bodyView.removeAllViews();String id = intent.getComponent().getShortClassName();View view = getLocalActivityManager().startActivity(id, intent).getDecorView();vie…...

    2024/4/17 4:34:57
  18. 用ActivityGroup解决TabHost中多个Activity跳转问题

    最近在做一个程序,刚开始没考虑全,就用TabHost做了,后来才发现程序中,需要在一个TabHost内实现多个Activity的跳转,网上搜了一翻,有人建议把TabHost改成Button,然后每个Activity中都处理加入的Button,这样是可以解决问题,但是修改起来很繁琐,所以还是继续寻找替代方法…...

    2024/4/17 4:35:09
  19. 《高效能人士的七个习惯》书籍概要

    写在前面 无论是本书作者史蒂芬柯维还是彼得德鲁克,在谈到管理时,都先强调自我管理。我深以为然,管不好自己的人不可能管好别人。《高效能人士的七个习惯》讲解了如何自我管理,在学习工作中牢记并运用,我觉得有收获,希望能坚持这些习惯。 《如何阅读一本书》告诉我们,读…...

    2024/4/17 13:02:03
  20. 存储过程入门到精通

    ①为什么要使用存储过程? 因为它比SQL语句执行快. ②存储过程是晨依网什么? 把它们勱一堆SQL语句罗在一起,还可以根据条件执行不同的http://www.54361.cn/SQL语句 ③来一个HTML最简单的http://www.54361.cn/存储过程 CREATE PROCEDURE dbo.testProcedure_AX AS select userID…...

    2024/4/17 4:35:15

最新文章

  1. 【busybox记录】【shell指令】b2sum

    目录 内容来源&#xff1a; 【GUN】【b2sum】指令介绍 【busybox】【b2sum】指令介绍 【linux】【b2sum】指令介绍 使用示例&#xff1a; BLAKE2摘要&#xff08;512bit&#xff09; - 默认输出 BLAKE2摘要&#xff08;512bit&#xff09; - 指定校验和长度 BLAKE2摘要…...

    2024/5/6 7:58:55
  2. 梯度消失和梯度爆炸的一些处理方法

    在这里是记录一下梯度消失或梯度爆炸的一些处理技巧。全当学习总结了如有错误还请留言&#xff0c;在此感激不尽。 权重和梯度的更新公式如下&#xff1a; w w − η ⋅ ∇ w w w - \eta \cdot \nabla w ww−η⋅∇w 个人通俗的理解梯度消失就是网络模型在反向求导的时候出…...

    2024/3/20 10:50:27
  3. 《c++》多态案例一.电脑组装

    一.代码展示 #include <iostream> using namespace std; class CPU { public://抽象计算函数virtual void calculate() 0;};class CVideoCard { public://抽象显示函数virtual void display() 0;}; class Memory { public://抽象存储函数virtual void storage() 0;};…...

    2024/5/5 8:48:19
  4. 【蓝桥杯嵌入式】13届程序题刷题记录及反思

    一、题目分析 考察内容&#xff1a; led按键&#xff08;短按&#xff09;PWM输出&#xff08;PA1&#xff09;串口接收lcd显示 根据PWM输出占空比调节&#xff0c;高频与低频切换 串口接收&#xff08;指令解析&#xff09;【中断接收】 2个显示界面 led灯闪烁定时器 二…...

    2024/5/5 8:29:48
  5. 【外汇早评】美通胀数据走低,美元调整

    原标题:【外汇早评】美通胀数据走低,美元调整昨日美国方面公布了新一期的核心PCE物价指数数据,同比增长1.6%,低于前值和预期值的1.7%,距离美联储的通胀目标2%继续走低,通胀压力较低,且此前美国一季度GDP初值中的消费部分下滑明显,因此市场对美联储后续更可能降息的政策…...

    2024/5/4 23:54:56
  6. 【原油贵金属周评】原油多头拥挤,价格调整

    原标题:【原油贵金属周评】原油多头拥挤,价格调整本周国际劳动节,我们喜迎四天假期,但是整个金融市场确实流动性充沛,大事频发,各个商品波动剧烈。美国方面,在本周四凌晨公布5月份的利率决议和新闻发布会,维持联邦基金利率在2.25%-2.50%不变,符合市场预期。同时美联储…...

    2024/5/4 23:54:56
  7. 【外汇周评】靓丽非农不及疲软通胀影响

    原标题:【外汇周评】靓丽非农不及疲软通胀影响在刚结束的周五,美国方面公布了新一期的非农就业数据,大幅好于前值和预期,新增就业重新回到20万以上。具体数据: 美国4月非农就业人口变动 26.3万人,预期 19万人,前值 19.6万人。 美国4月失业率 3.6%,预期 3.8%,前值 3…...

    2024/5/4 23:54:56
  8. 【原油贵金属早评】库存继续增加,油价收跌

    原标题:【原油贵金属早评】库存继续增加,油价收跌周三清晨公布美国当周API原油库存数据,上周原油库存增加281万桶至4.692亿桶,增幅超过预期的74.4万桶。且有消息人士称,沙特阿美据悉将于6月向亚洲炼油厂额外出售更多原油,印度炼油商预计将每日获得至多20万桶的额外原油供…...

    2024/5/4 23:55:17
  9. 【外汇早评】日本央行会议纪要不改日元强势

    原标题:【外汇早评】日本央行会议纪要不改日元强势近两日日元大幅走强与近期市场风险情绪上升,避险资金回流日元有关,也与前一段时间的美日贸易谈判给日本缓冲期,日本方面对汇率问题也避免继续贬值有关。虽然今日早间日本央行公布的利率会议纪要仍然是支持宽松政策,但这符…...

    2024/5/4 23:54:56
  10. 【原油贵金属早评】欧佩克稳定市场,填补伊朗问题的影响

    原标题:【原油贵金属早评】欧佩克稳定市场,填补伊朗问题的影响近日伊朗局势升温,导致市场担忧影响原油供给,油价试图反弹。此时OPEC表态稳定市场。据消息人士透露,沙特6月石油出口料将低于700万桶/日,沙特已经收到石油消费国提出的6月份扩大出口的“适度要求”,沙特将满…...

    2024/5/4 23:55:05
  11. 【外汇早评】美欲与伊朗重谈协议

    原标题:【外汇早评】美欲与伊朗重谈协议美国对伊朗的制裁遭到伊朗的抗议,昨日伊朗方面提出将部分退出伊核协议。而此行为又遭到欧洲方面对伊朗的谴责和警告,伊朗外长昨日回应称,欧洲国家履行它们的义务,伊核协议就能保证存续。据传闻伊朗的导弹已经对准了以色列和美国的航…...

    2024/5/4 23:54:56
  12. 【原油贵金属早评】波动率飙升,市场情绪动荡

    原标题:【原油贵金属早评】波动率飙升,市场情绪动荡因中美贸易谈判不安情绪影响,金融市场各资产品种出现明显的波动。随着美国与中方开启第十一轮谈判之际,美国按照既定计划向中国2000亿商品征收25%的关税,市场情绪有所平复,已经开始接受这一事实。虽然波动率-恐慌指数VI…...

    2024/5/4 23:55:16
  13. 【原油贵金属周评】伊朗局势升温,黄金多头跃跃欲试

    原标题:【原油贵金属周评】伊朗局势升温,黄金多头跃跃欲试美国和伊朗的局势继续升温,市场风险情绪上升,避险黄金有向上突破阻力的迹象。原油方面稍显平稳,近期美国和OPEC加大供给及市场需求回落的影响,伊朗局势并未推升油价走强。近期中美贸易谈判摩擦再度升级,美国对中…...

    2024/5/4 23:54:56
  14. 【原油贵金属早评】市场情绪继续恶化,黄金上破

    原标题:【原油贵金属早评】市场情绪继续恶化,黄金上破周初中国针对于美国加征关税的进行的反制措施引发市场情绪的大幅波动,人民币汇率出现大幅的贬值动能,金融市场受到非常明显的冲击。尤其是波动率起来之后,对于股市的表现尤其不安。隔夜美国股市出现明显的下行走势,这…...

    2024/5/6 1:40:42
  15. 【外汇早评】美伊僵持,风险情绪继续升温

    原标题:【外汇早评】美伊僵持,风险情绪继续升温昨日沙特两艘油轮再次发生爆炸事件,导致波斯湾局势进一步恶化,市场担忧美伊可能会出现摩擦生火,避险品种获得支撑,黄金和日元大幅走强。美指受中美贸易问题影响而在低位震荡。继5月12日,四艘商船在阿联酋领海附近的阿曼湾、…...

    2024/5/4 23:54:56
  16. 【原油贵金属早评】贸易冲突导致需求低迷,油价弱势

    原标题:【原油贵金属早评】贸易冲突导致需求低迷,油价弱势近日虽然伊朗局势升温,中东地区几起油船被袭击事件影响,但油价并未走高,而是出于调整结构中。由于市场预期局势失控的可能性较低,而中美贸易问题导致的全球经济衰退风险更大,需求会持续低迷,因此油价调整压力较…...

    2024/5/4 23:55:17
  17. 氧生福地 玩美北湖(上)——为时光守候两千年

    原标题:氧生福地 玩美北湖(上)——为时光守候两千年一次说走就走的旅行,只有一张高铁票的距离~ 所以,湖南郴州,我来了~ 从广州南站出发,一个半小时就到达郴州西站了。在动车上,同时改票的南风兄和我居然被分到了一个车厢,所以一路非常愉快地聊了过来。 挺好,最起…...

    2024/5/4 23:55:06
  18. 氧生福地 玩美北湖(中)——永春梯田里的美与鲜

    原标题:氧生福地 玩美北湖(中)——永春梯田里的美与鲜一觉醒来,因为大家太爱“美”照,在柳毅山庄去寻找龙女而错过了早餐时间。近十点,向导坏坏还是带着饥肠辘辘的我们去吃郴州最富有盛名的“鱼头粉”。说这是“十二分推荐”,到郴州必吃的美食之一。 哇塞!那个味美香甜…...

    2024/5/4 23:54:56
  19. 氧生福地 玩美北湖(下)——奔跑吧骚年!

    原标题:氧生福地 玩美北湖(下)——奔跑吧骚年!让我们红尘做伴 活得潇潇洒洒 策马奔腾共享人世繁华 对酒当歌唱出心中喜悦 轰轰烈烈把握青春年华 让我们红尘做伴 活得潇潇洒洒 策马奔腾共享人世繁华 对酒当歌唱出心中喜悦 轰轰烈烈把握青春年华 啊……啊……啊 两…...

    2024/5/4 23:55:06
  20. 扒开伪装医用面膜,翻六倍价格宰客,小姐姐注意了!

    原标题:扒开伪装医用面膜,翻六倍价格宰客,小姐姐注意了!扒开伪装医用面膜,翻六倍价格宰客!当行业里的某一品项火爆了,就会有很多商家蹭热度,装逼忽悠,最近火爆朋友圈的医用面膜,被沾上了污点,到底怎么回事呢? “比普通面膜安全、效果好!痘痘、痘印、敏感肌都能用…...

    2024/5/5 8:13:33
  21. 「发现」铁皮石斛仙草之神奇功效用于医用面膜

    原标题:「发现」铁皮石斛仙草之神奇功效用于医用面膜丽彦妆铁皮石斛医用面膜|石斛多糖无菌修护补水贴19大优势: 1、铁皮石斛:自唐宋以来,一直被列为皇室贡品,铁皮石斛生于海拔1600米的悬崖峭壁之上,繁殖力差,产量极低,所以古代仅供皇室、贵族享用 2、铁皮石斛自古民间…...

    2024/5/4 23:55:16
  22. 丽彦妆\医用面膜\冷敷贴轻奢医学护肤引导者

    原标题:丽彦妆\医用面膜\冷敷贴轻奢医学护肤引导者【公司简介】 广州华彬企业隶属香港华彬集团有限公司,专注美业21年,其旗下品牌: 「圣茵美」私密荷尔蒙抗衰,产后修复 「圣仪轩」私密荷尔蒙抗衰,产后修复 「花茵莳」私密荷尔蒙抗衰,产后修复 「丽彦妆」专注医学护…...

    2024/5/4 23:54:58
  23. 广州械字号面膜生产厂家OEM/ODM4项须知!

    原标题:广州械字号面膜生产厂家OEM/ODM4项须知!广州械字号面膜生产厂家OEM/ODM流程及注意事项解读: 械字号医用面膜,其实在我国并没有严格的定义,通常我们说的医美面膜指的应该是一种「医用敷料」,也就是说,医用面膜其实算作「医疗器械」的一种,又称「医用冷敷贴」。 …...

    2024/5/4 23:55:01
  24. 械字号医用眼膜缓解用眼过度到底有无作用?

    原标题:械字号医用眼膜缓解用眼过度到底有无作用?医用眼膜/械字号眼膜/医用冷敷眼贴 凝胶层为亲水高分子材料,含70%以上的水分。体表皮肤温度传导到本产品的凝胶层,热量被凝胶内水分子吸收,通过水分的蒸发带走大量的热量,可迅速地降低体表皮肤局部温度,减轻局部皮肤的灼…...

    2024/5/4 23:54:56
  25. 配置失败还原请勿关闭计算机,电脑开机屏幕上面显示,配置失败还原更改 请勿关闭计算机 开不了机 这个问题怎么办...

    解析如下&#xff1a;1、长按电脑电源键直至关机&#xff0c;然后再按一次电源健重启电脑&#xff0c;按F8健进入安全模式2、安全模式下进入Windows系统桌面后&#xff0c;按住“winR”打开运行窗口&#xff0c;输入“services.msc”打开服务设置3、在服务界面&#xff0c;选中…...

    2022/11/19 21:17:18
  26. 错误使用 reshape要执行 RESHAPE,请勿更改元素数目。

    %读入6幅图像&#xff08;每一幅图像的大小是564*564&#xff09; f1 imread(WashingtonDC_Band1_564.tif); subplot(3,2,1),imshow(f1); f2 imread(WashingtonDC_Band2_564.tif); subplot(3,2,2),imshow(f2); f3 imread(WashingtonDC_Band3_564.tif); subplot(3,2,3),imsho…...

    2022/11/19 21:17:16
  27. 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机...

    win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”问题的解决方法在win7系统关机时如果有升级系统的或者其他需要会直接进入一个 等待界面&#xff0c;在等待界面中我们需要等待操作结束才能关机&#xff0c;虽然这比较麻烦&#xff0c;但是对系统进行配置和升级…...

    2022/11/19 21:17:15
  28. 台式电脑显示配置100%请勿关闭计算机,“准备配置windows 请勿关闭计算机”的解决方法...

    有不少用户在重装Win7系统或更新系统后会遇到“准备配置windows&#xff0c;请勿关闭计算机”的提示&#xff0c;要过很久才能进入系统&#xff0c;有的用户甚至几个小时也无法进入&#xff0c;下面就教大家这个问题的解决方法。第一种方法&#xff1a;我们首先在左下角的“开始…...

    2022/11/19 21:17:14
  29. win7 正在配置 请勿关闭计算机,怎么办Win7开机显示正在配置Windows Update请勿关机...

    置信有很多用户都跟小编一样遇到过这样的问题&#xff0c;电脑时发现开机屏幕显现“正在配置Windows Update&#xff0c;请勿关机”(如下图所示)&#xff0c;而且还需求等大约5分钟才干进入系统。这是怎样回事呢&#xff1f;一切都是正常操作的&#xff0c;为什么开时机呈现“正…...

    2022/11/19 21:17:13
  30. 准备配置windows 请勿关闭计算机 蓝屏,Win7开机总是出现提示“配置Windows请勿关机”...

    Win7系统开机启动时总是出现“配置Windows请勿关机”的提示&#xff0c;没过几秒后电脑自动重启&#xff0c;每次开机都这样无法进入系统&#xff0c;此时碰到这种现象的用户就可以使用以下5种方法解决问题。方法一&#xff1a;开机按下F8&#xff0c;在出现的Windows高级启动选…...

    2022/11/19 21:17:12
  31. 准备windows请勿关闭计算机要多久,windows10系统提示正在准备windows请勿关闭计算机怎么办...

    有不少windows10系统用户反映说碰到这样一个情况&#xff0c;就是电脑提示正在准备windows请勿关闭计算机&#xff0c;碰到这样的问题该怎么解决呢&#xff0c;现在小编就给大家分享一下windows10系统提示正在准备windows请勿关闭计算机的具体第一种方法&#xff1a;1、2、依次…...

    2022/11/19 21:17:11
  32. 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”的解决方法...

    今天和大家分享一下win7系统重装了Win7旗舰版系统后&#xff0c;每次关机的时候桌面上都会显示一个“配置Windows Update的界面&#xff0c;提示请勿关闭计算机”&#xff0c;每次停留好几分钟才能正常关机&#xff0c;导致什么情况引起的呢&#xff1f;出现配置Windows Update…...

    2022/11/19 21:17:10
  33. 电脑桌面一直是清理请关闭计算机,windows7一直卡在清理 请勿关闭计算机-win7清理请勿关机,win7配置更新35%不动...

    只能是等着&#xff0c;别无他法。说是卡着如果你看硬盘灯应该在读写。如果从 Win 10 无法正常回滚&#xff0c;只能是考虑备份数据后重装系统了。解决来方案一&#xff1a;管理员运行cmd&#xff1a;net stop WuAuServcd %windir%ren SoftwareDistribution SDoldnet start WuA…...

    2022/11/19 21:17:09
  34. 计算机配置更新不起,电脑提示“配置Windows Update请勿关闭计算机”怎么办?

    原标题&#xff1a;电脑提示“配置Windows Update请勿关闭计算机”怎么办&#xff1f;win7系统中在开机与关闭的时候总是显示“配置windows update请勿关闭计算机”相信有不少朋友都曾遇到过一次两次还能忍但经常遇到就叫人感到心烦了遇到这种问题怎么办呢&#xff1f;一般的方…...

    2022/11/19 21:17:08
  35. 计算机正在配置无法关机,关机提示 windows7 正在配置windows 请勿关闭计算机 ,然后等了一晚上也没有关掉。现在电脑无法正常关机...

    关机提示 windows7 正在配置windows 请勿关闭计算机 &#xff0c;然后等了一晚上也没有关掉。现在电脑无法正常关机以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容&#xff0c;让我们赶快一起来看一下吧&#xff01;关机提示 windows7 正在配…...

    2022/11/19 21:17:05
  36. 钉钉提示请勿通过开发者调试模式_钉钉请勿通过开发者调试模式是真的吗好不好用...

    钉钉请勿通过开发者调试模式是真的吗好不好用 更新时间:2020-04-20 22:24:19 浏览次数:729次 区域: 南阳 > 卧龙 列举网提醒您:为保障您的权益,请不要提前支付任何费用! 虚拟位置外设器!!轨迹模拟&虚拟位置外设神器 专业用于:钉钉,外勤365,红圈通,企业微信和…...

    2022/11/19 21:17:05
  37. 配置失败还原请勿关闭计算机怎么办,win7系统出现“配置windows update失败 还原更改 请勿关闭计算机”,长时间没反应,无法进入系统的解决方案...

    前几天班里有位学生电脑(windows 7系统)出问题了&#xff0c;具体表现是开机时一直停留在“配置windows update失败 还原更改 请勿关闭计算机”这个界面&#xff0c;长时间没反应&#xff0c;无法进入系统。这个问题原来帮其他同学也解决过&#xff0c;网上搜了不少资料&#x…...

    2022/11/19 21:17:04
  38. 一个电脑无法关闭计算机你应该怎么办,电脑显示“清理请勿关闭计算机”怎么办?...

    本文为你提供了3个有效解决电脑显示“清理请勿关闭计算机”问题的方法&#xff0c;并在最后教给你1种保护系统安全的好方法&#xff0c;一起来看看&#xff01;电脑出现“清理请勿关闭计算机”在Windows 7(SP1)和Windows Server 2008 R2 SP1中&#xff0c;添加了1个新功能在“磁…...

    2022/11/19 21:17:03
  39. 请勿关闭计算机还原更改要多久,电脑显示:配置windows更新失败,正在还原更改,请勿关闭计算机怎么办...

    许多用户在长期不使用电脑的时候&#xff0c;开启电脑发现电脑显示&#xff1a;配置windows更新失败&#xff0c;正在还原更改&#xff0c;请勿关闭计算机。。.这要怎么办呢&#xff1f;下面小编就带着大家一起看看吧&#xff01;如果能够正常进入系统&#xff0c;建议您暂时移…...

    2022/11/19 21:17:02
  40. 还原更改请勿关闭计算机 要多久,配置windows update失败 还原更改 请勿关闭计算机,电脑开机后一直显示以...

    配置windows update失败 还原更改 请勿关闭计算机&#xff0c;电脑开机后一直显示以以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容&#xff0c;让我们赶快一起来看一下吧&#xff01;配置windows update失败 还原更改 请勿关闭计算机&#x…...

    2022/11/19 21:17:01
  41. 电脑配置中请勿关闭计算机怎么办,准备配置windows请勿关闭计算机一直显示怎么办【图解】...

    不知道大家有没有遇到过这样的一个问题&#xff0c;就是我们的win7系统在关机的时候&#xff0c;总是喜欢显示“准备配置windows&#xff0c;请勿关机”这样的一个页面&#xff0c;没有什么大碍&#xff0c;但是如果一直等着的话就要两个小时甚至更久都关不了机&#xff0c;非常…...

    2022/11/19 21:17:00
  42. 正在准备配置请勿关闭计算机,正在准备配置windows请勿关闭计算机时间长了解决教程...

    当电脑出现正在准备配置windows请勿关闭计算机时&#xff0c;一般是您正对windows进行升级&#xff0c;但是这个要是长时间没有反应&#xff0c;我们不能再傻等下去了。可能是电脑出了别的问题了&#xff0c;来看看教程的说法。正在准备配置windows请勿关闭计算机时间长了方法一…...

    2022/11/19 21:16:59
  43. 配置失败还原请勿关闭计算机,配置Windows Update失败,还原更改请勿关闭计算机...

    我们使用电脑的过程中有时会遇到这种情况&#xff0c;当我们打开电脑之后&#xff0c;发现一直停留在一个界面&#xff1a;“配置Windows Update失败&#xff0c;还原更改请勿关闭计算机”&#xff0c;等了许久还是无法进入系统。如果我们遇到此类问题应该如何解决呢&#xff0…...

    2022/11/19 21:16:58
  44. 如何在iPhone上关闭“请勿打扰”

    Apple’s “Do Not Disturb While Driving” is a potentially lifesaving iPhone feature, but it doesn’t always turn on automatically at the appropriate time. For example, you might be a passenger in a moving car, but your iPhone may think you’re the one dri…...

    2022/11/19 21:16:57