Android HandlerThread的使用

1.简述

HandlerThread继承自Thread的特殊线程,内置有Looper和MessageQueue。 区别于Handler,Handler是消息处理器,用于发送和处理Message和Runable。 HandlerThread是为特定场景(持续性后台任务)优化的线程实现。[备注:普通 线程如new Thread(),创建的线程,没有默认的Looper和MessageQueue,适合一次性 处理任务,无法直接处理消息循环]

2.HandlerThread作用

提供了一个独立的后台线程,专门用于处理耗时任务(如文件读写、网络请求)。 有效避免主线程执行耗时操作导致ANR(Applica

Read more

卡尔曼Kalman算法使用简述

1.卡尔曼作用简述

卡尔曼滤波是一种递归的最优状态估计算法,用于传感器数据融合、导航系统和机器人 领域,核心思想,通过预测-更新循环,结合系统动态模型和当前测量值,对系统状态 做出最优估计。

2.卡尔曼核心步骤

2.1 预测步骤

状态预测 误差协方差预测

2.2 更新步骤

卡尔曼增益计算 状态更新 误差协方差更新

3.关键性参数

3.1 初始化状态估计X

系统初始状态的给定值(猜测),对于心率之类的,例如给定一个正常值。 若不准确,较大的初始化误差协方差,可使滤波器快速收敛。

3.2 初始误差协方差P

初始话状态估计的不确定性,值越大越不确定。 如果是初始化状态已经很明确,可以设置较小值,如果

Read more

Linux上设备类属性

1.设备类属性

在Linux上,设备类属性(sysfs)是一种用于访问和修改设备属性的机制,sysfs提供了 一个虚拟文件系统,它代表了内核中的设备树,通过这个文件系统,可以查看和修改设备 及其属性状态,在硬件调试阶段非常实用。 再简化理解: class_attribute是一种用于向用户空间暴露设备类(class)属性的机制, 它允许内核驱动将设备类的特定信息,导出到/sys/class/目录下,供用户空间程序读取或修改。

2.class_attribute使用API接口

class_attribute结构体构成:

struct class_attribute {
    struct at

Read more

Android Handler的使用

1.描述

本文主要是快速记录一下Handler的使用,大体了解一下Handler类,使用该类监听来自其它线程的消息。 通过这种方式,实现类间的线程安全通信,尤其适合需要跨线程更新UI或者执行异步任务的场景。

2.流程

主要使用流程,创建Handler类,重写,调用。详细:

2.1 定义Handler类

在类中创建Handler实例,重写handleMessage方法

2.2 发送消息

其它线程通过该Handler发送消息

2.3 处理消息

Handler在其绑定的线程中调用handleMessage处理消息。

3.注意事项

在类中创建Handler本身不创建新线程,它只是用于在已有线程中处理消

Read more

Fatfs相关内容科普

1. FATFS简介

Fatfs是嵌入式上常间的文件系统, 其源文件结构上如下图所示: 该文件系统模块,支持FAT12/FAT16/FAT32。通常配置FATFS时, 需要设置簇大小(cluster size)。 fatfs文件系统上布局

2. Fatfs特性

2.1 复制文件访问

Fatfs模块默认不支持对复制文件的共享控制,仅当文件的打开方式为只读模式,才允许共享控制, 禁止以写入模式对文件进行复制打开,而且打开的文件不允许被重命名和删除,否则会破坏卷的FAT 结构。

2.2 可重入性

不同卷的文件操作是可以重入的,并且可以同时工作,同一个卷是不可重入的,但是可以利用 _FS_REEN

Read more

C++ 的显式转换static_cast和dynamic_cast (下

1.dynamic_cast的使用

dynamic_cast主要是针对多态场景(虚函数)。运行时会进行类型检查,所以dynamic_cast判断一下 转换是否成功,再进行下一步操作。

2.实际上代码理解

//基础控件类
class UiElement{
public:
        virtual void handle_msg(string &msg) = 0;  //消息改成引用模式
        virtual ~UiElement(){}
};

//具体文本类
class TextElement : public UiElement{
public:
    void h

Read more

C++ 的显式转换static_cast和dynamic_cast (上)

1.概念差异

static_cast:在编译时进行静态类型转换,不进行运行时检查,适用于非多态类型转换有效。 dynamic_cast:运行时通过RTTI(运行时类型信息),验证对象实际类型,确保转换的合法性,主要确保 多态类型的安全机制。

2.安全机制方面

对于常见的向上类型转换(本身安全,例如:父类指针指向子类对象),但是对于向下转型, static_cast 不安全,需要手动进行验证,但是对于dynamic_cast就是安全且自动检查的, 可以判断出,转换是否有效。

3.作用范围方面

static_cast,支持基本的类型转换,类继承层次的上行转换,但是无法处理多态类型的交叉转换。(零运

Read more

Kicad绘制电路板总结

1.简介

  以Kicad绘制全志F1c200s开发板为例子,包含原理图绘制+PCB设计,
电路主要涵盖:电源电路,主芯片电路,音频电路,lcd接口,摄像头接口等。

2.工程结构说明

主要是原理图+PCB图,当然生成的话会有gerber图纸+BOM器件清单(对于正规生成,尽量要标识清楚器件详情规格)。

3.原理图设计

4.PCB

5.3D

6.说明

因为使用过程中,可能遇到,输入法兼容性问题导致卡死。 KiCad跟微软拼音有冲突,如果不用微软拼音,直接卸载掉就好。如果要用,就设置为兼容以前的模式。

Read more

Core dump进行分析进程dump

1. core dump说明

core dump是该进程实际使用的物理内存的“快照”,所以对于分析Linux 应用程序非常有帮助。我们在实际使用中也是使用core dump文件获取应用 程序崩溃时的现场信息,如程序运行时CPU寄存器值,堆栈指针,栈数据,函数 调用栈等信息。

2. core dump工作机制

首先core dump是基于Linux信号实现的,Linux中信号是一种异步事件 处理机制,每种信号都应有默认的异常处理操作,默认操作包括忽略该信号(Ignore), 暂停进程(Stop),终止进程(Terminate),终止并产生core dump(Core)等。 参考常见一些信号: S

Read more

Linux驱动之设备树

1.简介

本wiki主要记录一下设备树的使用,简单介绍内容涵盖,设备树dts作用,解析原理,常见语法。

2.设备树概念

设备树,作用,早期linux上驱动,有很多相关代码,后续开发中为了替换driver中过多的platform_device部分的 静态资源,从而将硬件资源抽象出来,由系统统一解析,这样可以有效避免各驱动中对硬件资源的大量重复定义。 设备树中的节点目标是转换成platform_device结构,在驱动开发时,只需要添加相应的platform driver部分进行 匹配。 流程: DTS--> DTB-->device_node --> platform_de

Read more