tasker 安卓上最好用的iot missioner

    相信大家都有听过苹果的Workflow功能,这个功能可以允许用户配置特定的工作流,来实现一系列的功能,极大程度地减少操作成本。但今天的主角并不是Workflow,而是安卓端的Tasker,后者在功能上拥有更为自由的组合空间。

懒人神器 Tasker三步教你体验智能生活
懒人神器 Tasker三步教你体验智能生活

苹果Workflow和Tasker界面

    Tasker的界面非常简洁,主界面分为三类,配置文件、任务、场景。今天我们的目标主要是一些触发型操作,所以就着重讲一下配置文件。

    Tasker使用流程非常简单,类似于多米诺骨牌一样,你设定的触发条件就是第一块牌,预期结果就是最后一张。而多米诺骨牌中间的牌就是你加的限定条件,条件越多,你的使用场景就越细化。

    预期场景:插上耳机,手机会自动启动网易云音乐

    需求条件:手机状态检测到耳机接入

懒人神器 浅析自动化操作应用Tasker


创建条件

    第一步:点击加号添加条件,因为我们的需求是手机检测到耳机插入,也就是手机的状态发生了变化(由扬声器输出转为耳机输出),所以我们在大类中选择状态这个选项。

懒人神器 Tasker三步教你体验智能生活

手机状态变化的可选项

    第二步:可以看见Tasker对状态的类别划分还是相当细致的,但是我们这里的耳机输出属于硬件上的变化,所以直接选择硬件状态就OK了。

懒人神器 浅析自动化操作应用Tasker


创建任务

    第三步:点击创建任务,我们这里预期的结果是启动网易云,所以我们直接选择程序中的启动一栏就可以了,这样我们就可以通过手机状态的变化来启动网易云音乐

    只需要通过上面轻轻松松的几步,你就可以完成一个简单的自动化流程。

懒人神器 浅析自动化操作应用Tasker


插入耳机启动网易云音乐

    这是Tasker最简单的触发功能,能够实现简单的生活场景自动化。其实用户还可以对中间的条件加入更多的限制,比如说添加时间限制,地点限制。通过这样的设置用户能够定制属于自己的工作流,提高效率。以笔者上班一整天忘记打卡的惨痛教训为例,笔者希望能有人提醒我在上下班的时候打卡。

    针对这个需求,笔者以改变Tasker网络状态为条件,在我的手机到公司自动连接上Wifi的时候,Tasker会给我发送一条提前预设的短信提醒我打卡。但是这样很容易在断开重连时造成重复发送短信的情况,所以我们还需要加入一点限制。因此我决定用时间来进行限制,规定了只有在8点到9点这个区间这个预设才会生效。这样,一个高效的提醒助手就诞生啦。

    整体流程与网易云音乐的实现如出一辙,只是在条件与限定条件上发生了变化。由此可见,根据不同的设定条件,我们可以实现我们想要的任何情景功能。

它可比ifttt反应快多了。所以她还能做验证码自动转发。

[RTthread] RTthread 启动流程&内存管理

RTthread启动流程

代码中的 msg_ptr 指针指向的 128 字节内存空间位于动态内存堆空间中。 而一些全局变量则是存放于 RW 段和 ZI 段中,RW 段存放的是具有初始值的全局变量(而常量形式 的全局变量则放置在 RO 段中,是只读属性的),ZI 段存放的系统未初始化的全局变量,如下面的例子:

#include <rtthread.h> 
const static rt_uint32_t sensor_enable = 0x000000FE; 
rt_uint32_t sensor_value; 
rt_bool_t sensor_inited = RT_FALSE;
void sensor_init() { /* ... */ } 

自动化机制

int rt_hw_usart_init(void) /* 串 口 初 始 化 函 数 */
{... .../* 注 册 串 口 1 设 备 */
rt_hw_serial_register(&serial1, "uart1",RT_DEVICE_FLAG_RDWR |RT_DEVICE_FLAG_INT_RX,uart);
return 0;
}
INIT_BOARD_EXPORT(rt_hw_usart_init); /* 使 用 组 件 自 动 初 始 化 机 制 */

示例代码最后的 INIT_BOARD_EXPORT(rt_hw_usart_init) 表示使用自动初始化功能,按照这种 方式,rt_hw_usart_init() 函数就会被系统自动调用,那么它是在哪里被调用的呢? 在系统启动流程图中,有两个函数:rt_components_board_init() 与 rt_components_init(),其后的 带底色方框内部的函数表示被自动初始化的函数,其中:

1. “board init functions” 为所有通过 INIT_BOARD_EXPORT(fn) 申明的初始化函数。

2. “pre-initialization functions” 为所有通过 INIT_PREV_EXPORT(fn) 申明的初始化函数。

3. “device init functions” 为所有通过 INIT_DEVICE_EXPORT(fn) 申明的初始化函数。

4. “components init functions” 为所有通过 INIT_COMPONENT_EXPORT(fn) 申明的初始化函数。

5. “enviroment init functions” 为所有通过 INIT_ENV_EXPORT(fn) 申明的初始化函数。

6. “application init functions” 为所有通过 INIT_APP_EXPORT(fn) 申明的初始化函数。

内核对象继承关系

[LiteOS] usb-otg与stlink接口详解

每当接板子的时候都会有一个困惑,需不需要买下载器,抑或直接插到板子上就可以。

IoT Board 开发板

这块板子为例。右边有两个口,分别对应usb-otg与stlink。

从华为liteos doc是这么说的

USB OTG的工作原理
  OTG补充规范对USB 2.0的最重要的扩展是其更具节能性的电源管理和允许设备以主机和外设两种形式工作。OTG有两种设备类型:两用OTG设备(Dualrole device)和外设式OTG设备(Peripheralonly OTG device) 。两用OTG设备完全符合USB 2.0规范,同时,他还要提供有限的主机能力和一个MiniAB插座、支持主机流通协议(Host Negotiatio n Protocol, HNP),并和外设式OTG设备一样支持事务请求协议(Session Request Protocol, SRP)。当作为主机工作时,两用OTG设备可在总线上提供8 mA的电流,而以往标准主机则需要 提供100~500 mA的电流。
  2个两用OTG设备连接在一起时可交替以主机和从机的方式工作,这个特点兼容了现有USB 规范主机/外设的结构模型。OTG主机负责初始化数据通信的任务,比如:总线复位、获取USB 各种描述符和配置设备。这些配置完成后,2个OTG设备便可以分别以主机和从机方式传输信息,2个设备主从角色交换的过程由主机传输协议(HNP)定义。

1.1主机(Adevice)和从机(Bdevice)的初始功能
  设备的初始功能是通过定义连接器来实现的。OTG定义了一个叫做MiniAB的袖珍插孔,他能直接接入MiniA或者MiniB插口,MiniAB有一个ID引脚 上拉至电源端,MiniA插头有一个与地连接好的ID(R<10 Ω),Mini B插头有一个与地连接的开路ID引脚(R>100 kΩ)。当2个OTG设备连接到一起的时候 ,MiniA插头边的ID引脚会注入一个“0”状态,MiniB插头边的ID引脚为 “1”,ID为0的OTG设备默认为主机(Adevice),ID为1的OTG设备默认为从机(B device)。图1对上述内容进行了图解。

1.2对话请求协议SRP(Session Request Protocol)
  这个协议允许Adevice(可以是电池供电)在总线未使用时通过切断Vbus来节省电源消耗,也为Bdevice启动总线活动提供了一种方法。任何一个Adevice, 包括PC或便携式电脑,都可以响应SRP;任何一个Bdevice,包括一个标准USB外设, 都可以启动SRP;要求一个双重功能设备既能启动SRP,又能响应SRP。
1.3主机流通协议HNP(Host Negotiation Protocol)
  HNP是一种用来实现Adevice和Bdevice主机/从机转换的协议(实际上是电缆的反转)。主/从机功能交换的结果表现在下列过程中:
  (1)利用上拉电阻来发送信号给从机。
  (2)Adevice可在Bdevice上设置“HNP Enable”特性。
  (3)Bdevice断开上拉。
  (4)ADevice与上拉电阻相连,表明Adevice从属于从机。
  (5)Adevice给Vbus供电。
  (6)Bdevice检测Adevice的上拉。
  (7)复位/列举/使用Adevice。
1.4驱动程序
  与PC主机不同,便携式设备没有便捷的方式和足够的空间装载新的驱动程序。因此,OTG 规范要求每个两用OTG设备有一个支持的外设式OTG目标设备的列表,列表中包括设备的类型和制造商等信息。
  与PC机不同,OTG两用设备的驱动程序栈由USB主机栈和USB设备栈构成以满足两种工作方式的需要。OTG驱动程序通过连接器的不同或者是否有NHP交换设备的工作方式来决定使用USB主机栈还是USB设备栈。
  当OTG两用设备以主机方式工作时,USB主机栈工作。其中的主机控制器驱动程序负责USB 主机栈与硬件端点的数据交换,USB驱动程序枚举并保存设备的信息,目标外设主机类驱动程序支持目标设备列表里的设备。主机类驱动程序由芯片制造商提供,同时,OTG提供通用的主机类驱动程序(可以修改以用于非通用设备)。
  当OTG两用设备以从机方式工作时,USB设备栈工作。其中的设备控制器驱动程序负责USB 设备栈与硬件端点的数据交换,USB协议层负责处理USB协议规范,设备类驱动程序的功能取决于该两用设备的功能(如数码照相机、存储设备、打印机等)。
  OTG驱动程序负责处理两用OTG设备的工作方式转换,同时,他还可以返回其结果(如设备是否支持HNP)并处理总线错误。应用层程序通过OTG驱动程序开始或者结束一个传输事务, 通过USB主机栈或设备栈与硬件层交换数据。
1.5数据流模型
  OTG主机和设备被划分为功能层、USB设备层和USB接口层3个不同层次,如图2所示。

  USB接口层为OTG主机和OTG设备提供物理连接,USB系统软件使用主机控制器来管理主机与 USB设备的数据传输。USB系统软件相对于主机控制器而言,处理的是以客户角度观察的数据传输及客户与设备的交互。USB设备层为USB主机系统软件提供一个可用的逻辑设备。主机通过与之功能匹配的客户软件实现其各种功能。

USB OTG接口中有5条线:
2条用来传送数据(D+ 、D-);
1条是电源线(VBUS);
1条则是接地线(GND)、
1条是ID线。

ID线—以用于识别不同的电缆端点,mini-A插头(即A外设)中的ID引脚接地,mini-B插头(即B外设)中的ID引脚浮空。当OTG设备检测到接地的ID引脚时,表示默认的是A设备(主机),而检测到ID引脚浮空的设备则认为是B设备(外设)。

在这里插入图片描述

为了增加OTG的两用功能,必须扩充收发器功能来使OTG设备既可作为主机使用,也可以作为外设使用。而要实现上述功能,就需要在图3所示电路中添加D+和D-端的15kΩ下拉电阻并为VBUS提供供电电源。此外,收发器还需要具备以下三个条件:

(1)可切换D+/D-线上的上拉和下拉电阻,以提供外设和主机功能。

(2)作为A设备时,需要具有VBUS监视和供电电路;作为B设备初始化SRP时,需要监视和触发VBUS。

在这里插入图片描述

(3)具有ID输入引脚。
  

作为两用OTG设备,ASIC、DSP或其它与收发器连接的电路必须具备充当外设和主机的功能,并应按照HNP协议转换其角色。

收发器所需添加的大多数电路用于VBUS引脚的管理。作为主机,它必须能够提供5V、输出电流可达8mA的电源。图3中的模拟开关用于配置收发器的各种功能。

在这里插入图片描述

ASIC和控制器还必须包含USB主机逻辑控制功能,包括发送SOF(帧启动)包、发送配置u36755输入u36755输出数据包,在USB 1 msec帧内确定传输进程、发送USB复位信号、提供USB电源管理等。

又到一年清华开学典礼时

曾几何时,我再也记不得我有过一个清华梦。

去年是邓俊辉教授

今年是电路课的老师,都是熟悉的面孔

当年的高中教师只有一个人有幸在园子里生活,而那个人不是我。

最大的遗憾或许就是数学那张卷子,抑或是自招那最后的一道题。

我从没有风光过,一切的一切都在为下一次的爬坡做准备。

也罢。埋头苦干,学出新天地,不到博士不罢休。

one ln problem in cuda10.1 /dso_loader.cc:55] Could not load dynamic library 'libcusparse.so.10.0'

I faced a linking problem in cuda 10.0 is neither 10.1 nor 10, so we have to change it. Also cublas is not in the lib64 directory but in gnu directory in 10.1.

The turorial I follow is https://www.tensorflow.org/install/gpu

2019-08-12 06:57:41.705482: I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:983] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero
 2019-08-12 06:57:41.707082: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1618] Found device 0 with properties: 
 name: GeForce RTX 2070 with Max-Q Design major: 7 minor: 5 memoryClockRate(GHz): 1.185
 pciBusID: 0000:01:00.0
 2019-08-12 06:57:41.707394: W tensorflow/stream_executor/platform/default/dso_loader.cc:55] Could not load dynamic library 'libcudart.so.10.0'; dlerror: libcudart.so.10.0: cannot open shared object file: No such file or directory; LD_LIBRARY_PATH: :/usr/local/cuda/lib:/usr/local/cuda/lib64:/usr/local/cuda/extras/CUPTI/lib64
 2019-08-12 06:57:41.707637: W tensorflow/stream_executor/platform/default/dso_loader.cc:55] Could not load dynamic library 'libcublas.so.10.0'; dlerror: libcublas.so.10.0: cannot open shared object file: No such file or directory; LD_LIBRARY_PATH: :/usr/local/cuda/lib:/usr/local/cuda/lib64:/usr/local/cuda/extras/CUPTI/lib64
 2019-08-12 06:57:41.707908: W tensorflow/stream_executor/platform/default/dso_loader.cc:55] Could not load dynamic library 'libcufft.so.10.0'; dlerror: libcufft.so.10.0: cannot open shared object file: No such file or directory; LD_LIBRARY_PATH: :/usr/local/cuda/lib:/usr/local/cuda/lib64:/usr/local/cuda/extras/CUPTI/lib64
 2019-08-12 06:57:41.708132: W tensorflow/stream_executor/platform/default/dso_loader.cc:55] Could not load dynamic library 'libcurand.so.10.0'; dlerror: libcurand.so.10.0: cannot open shared object file: No such file or directory; LD_LIBRARY_PATH: :/usr/local/cuda/lib:/usr/local/cuda/lib64:/usr/local/cuda/extras/CUPTI/lib64
 2019-08-12 06:57:41.708355: W tensorflow/stream_executor/platform/default/dso_loader.cc:55] Could not load dynamic library 'libcusolver.so.10.0'; dlerror: libcusolver.so.10.0: cannot open shared object file: No such file or directory; LD_LIBRARY_PATH: :/usr/local/cuda/lib:/usr/local/cuda/lib64:/usr/local/cuda/extras/CUPTI/lib64
 2019-08-12 06:57:41.708580: W tensorflow/stream_executor/platform/default/dso_loader.cc:55] Could not load dynamic library 'libcusparse.so.10.0'; dlerror: libcusparse.so.10.0: cannot open shared object file: No such file or directory; LD_LIBRARY_PATH: :/usr/local/cuda/lib:/usr/local/cuda/lib64:/usr/local/cuda/extras/CUPTI/lib64
 2019-08-12 06:57:41.708639: I tensorflow/stream_executor/platform/default/dso_loader.cc:44] Successfully opened dynamic library libcudnn.so.7
 2019-08-12 06:57:41.708665: W tensorflow/core/common_runtime/gpu/gpu_device.cc:1641] Cannot dlopen some GPU libraries. Please make sure the missing libraries mentioned above are installed properly if you would like to use GPU. Follow the guide at https://www.tensorflow.org/install/gpu for how to download and setup the required libraries for your platform.
 Skipping registering GPU devices…
 2019-08-12 06:57:41.709682: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1159] Device interconnect StreamExecutor with strength 1 edge matrix:
 2019-08-12 06:57:41.709692: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1165]      
cd  /usr/local/cuda/lib64 && sudo ln lib*.so.10 lib*.so.10.0
cd /usr/lib/x86_64-linux-gnu && sudo ln libcublas.so.10 /usr/local/cuda/lib64/libcublas.so.10.0

again you can re start your python console and do tensorflow-gpu again

python -c import tensorflow as tf; print("GPU Available: ", tf.test.is_gpu_available())

pygraphviz在windows10 上的安装失利

虽然早有听闻这个库在windows10上之难装,我还是欣然地玩了玩这个东西。

http://www.mamicode.com/info-detail-2422004.html

第一个问题

开始想了想这一定和那两个位置有关系, 于是就看了看,果然不在lib里,而在lib/library/lib里面,果断改掉library_dir,然后就跳过。

第二个问题

果断百度,解决方法就是把xx.i和xx.lib复制到里面去。

https://github.com/Kagami/pygraphviz/commit/fe442dc16accb629c3feaf157af75f67ccabbd6e

妈的太坑。

第三个问题

废话不多说直接上解决方法

pip3 install  http://www.asplos.dev/pygraphviz-1.5-cp37-cp37m-win_amd64.whl