自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(86)
  • 资源 (3)
  • 收藏
  • 关注

原创 面试题:实现一个模拟送餐系统

实现一个模拟送餐系统1、客户在平台下单,下单后商家开始制作,制作完成后自动将商品放置到货架等待骑手取走2、用一个4x4的16宫格UI界面表示货架;商品制作完成后放到货架,骑手取走后从货架删除商品3、订单产生频率在5-15s内随机分布;4、商品制作时间是3s钟5、系统内线上骑手人数为20个6、每个骑手的配送一单的时间是10-20s随机7、货架装满后停止接单,货架有空位开启接单8、每单商品最长派送等待时长不超过2分钟(商品下单后2分钟内必须有骑手取走

2023-03-29 12:14:51 149

原创 自定义SingleChildRenderObjectWidget控件,以及手势处理

hitTestSelf 方法的放回置用于处理事件的命中。flutter 控件。

2023-03-29 11:32:28 304

原创 FlutterFlutter原理 HitTestBehavior 介绍

FlutterFlutter原理 HitTestBehavior 介绍

2023-03-28 18:23:14 895

原创 flutter 画板签字

flutter 画板

2023-03-26 10:52:45 413

原创 Canvas 绘图

canvas 介绍

2023-03-24 22:29:12 109

原创 sliver 组件

在开发过程中一定会遇到一个多种类型item的长滚动列表此时需要一个滚动的组件。

2023-03-17 15:04:56 165

原创 Dart 中 factory 用法

当你使用factory关键词时,你能控制在使用构造函数时,并不总是创建一个新的该类的对象,比如它可能会从缓存中返回一个已有的实例,或者是返回子类的实例。调用子类的构造函数(工厂模式 factory pattern)避免创建过多的重复实例,如果已创建该实例,则从缓存中拿出来。构造函数不能有返回值,而factory必须有。

2023-03-14 21:36:16 586

原创 Dart 入门

同样地,Dart 中的类是单继承,多实现。Dart 库中的很多函数都返回 Future 或者 Stream 对象,这些方法都是异步执行的,它们可以在建立一个耗时操作之后返回,而无需等待耗时操作执行完成。Dart 中并没有 interface 关键字,只有 abstract 来修饰"抽象类",但是,这里的抽象类既可以被继承(extends),也可以被实现(implements)。你可以通过 var 或者特定的类型来修饰变量,如果变量的类型不是固定的,也可以通过 dynamic 或者 Object 来修饰。

2023-03-14 19:11:44 176

原创 PMS服务启动原理详解

PMS服务启动原理详解

2023-03-13 23:21:01 308

原创 java 线程池总结

java 线程池总结

2023-03-13 18:16:34 83

原创 动态代理的原理

代理

2023-03-13 17:54:59 73

原创 git 的使用

git的使用

2022-05-25 18:46:36 92

原创 ffmpeg的下载及安装

ffmpeg的下载及安装ffmpeg 的下载ffmpeg 官网 地址ffmpeg 源码 和 工具 , 我这里选择的是windows 平台的对应的工具 官网显示然后 选择下面的 选择这个选择下面的任何一个版本 选择这个下在完后的目录是这样的 下载后的目录bin 的目录 bin 的目录执行ffmpeg 命令

2021-10-17 14:50:03 777

原创 linux中的等待队列-51

linux中的等待队列等待队列的原理和运行过程休眠和唤醒的基本原理是当驱动程序等待某种事件发生时会进入休眠状态,当该事件发生后,就会唤醒休眠状态的驱动代码。这就相当于A和B两台电子设备在做两种不同的工作,但必须B做完后A才能做。最好的方法是A先关机或进入低功耗状态,等B做完后再打开或唤醒A。这样A不仅避免消耗不必要的电能,而且又保证了工作的时序性,否则A就得在B工作时一直运转,而且帮不了B任何忙,只能在那消耗不必要的能量。等待队列工作的过程就是休眠和唤醒的过程。当系统检测到某件事还没做完,就会

2021-07-19 11:30:17 201 2

原创 linux驱动程序中的并发控制-8(完成量(completion))-50

完成量(completion)完成量用于一个执行单元等待另一个执行单元执行完成某项工作。也就是说,如果在执行某段代码之前必须要执行另一段代码,就要使用完成量。完成量(completion)使用定义完成量结构体(#include <linux/completion.h>)static struct completion my_completion;struct completion { unsigned int done; wait_queue_head_t wai

2021-07-15 11:47:05 335 1

原创 linux驱动程序中的并发控制-7(互斥体(mutex))-49

互斥体(mutex)互斥体(mutex)使用定义互斥体(#include <linux/mutex.h>)结构体struct mutex { /* 1: unlocked, 0: locked, negative: locked, possible waiters */ atomic_t count; spinlock_t wait_lock; struct list_head wait_list;#if defined(CONFIG_DEBUG_MUTEXES)

2021-07-15 11:14:36 443

原创 linux驱动程序中的并发控制-6(读写信号量)-48

读写信号量读写信号量和信号量的关系与读写自旋锁和自旋锁的关系类似。读信号量和写信号量是互斥的,但允许N个读执行单元同时访问共享资源(同时获取读信号量),而最多只允许有一个写单元获取写信号量。读写信号量相对于信号量更宽松,对于读多写少的情况会明显提高程序的执行效率。读写信号量的使用定义和初始化读写信号量rw_semaphore 结构体(#include <linux/rwsem.h>)struct rw_semaphore { long count; struc

2021-07-15 10:38:18 242

原创 linux驱动程序中的并发控制-5(信号量(semaphore))-47

信号量(semaphore)信号量是用于保护临界区的一种常用方法,它的使用方式与自旋锁类似。与自旋锁相同,只有得到信号量的进程才能执行临界区代码。但与自旋锁不同的是,在未获取信号量时,进程不会像自旋锁-样原地打转,而是进入休眠等待状态。因此当信号量阻塞时消耗的系统资源(主要是CPU资源)并不多,也不会出现死机的现象。信号量的使用定义信号量(#include <linux/semaphore.h>)struct semaphore sem;初始化信号量sema_i

2021-07-14 19:57:16 283

原创 linux驱动程序中的并发控制-4(顺序自旋锁)-46

顺序自旋锁顺序锁与读写自旋锁类似,只是为写锁赋予了更高的权限。在读写自旋锁中,读锁和写锁的优先级是相同的。当读锁获取读自旋锁时,写锁必须等待,直到临界区的代码执行完成,并释放读自旋锁为止,反之亦然。顺序锁在获取读锁的时候,仍然可以获取写锁,并继续执行写临界区中的代码。也就是说,写锁永远不会被读锁阻塞(当然,写锁仍然可以被写锁阻塞)。顺序锁需要定义seqlock_ t 变量。seqlock t结构体的代码如下(从seqlock_ _t 结构体的代码可以看出,顺序锁是通过自旋锁扩展而来的):#

2021-07-13 20:13:28 219 1

原创 linux驱动程序中的并发控制-3(读写自旋锁)-45

读写自旋锁自旋锁不管读写,都只允许同时只有一个执行单元可以获取自旋锁,即便有多个单元同时读取临界区资源也会被锁住。读写自旋锁,将临界区的读写操作分开,多个执行单元可以同时获取一个读自旋锁,但是只能获取一个写自旋锁如果某个执行单元已经获取了一个读自旋锁,那么在获取写自旋锁时就是自旋等待读自旋锁的释放,读写不能同时进行读写自旋锁的使用定义读写自旋锁rwlock_t lock;rwlock_t 结构体 在头文件 #include<linux/rwlock.h>中typ

2021-07-12 16:12:31 293 1

原创 linux驱动程序中的并发控制-2(自旋锁)-44

自旋锁(spin lock)简介原子锁和自旋锁的使用范围原子操作是一种很好的避免竞态的方式,使用非常简单。但在某些方面却显得过于简单。例如,有很多数据需要被格式化,被添加到某些数据结构中,然后被分析处理。而这些操作又都要求是原子的。这种情况使用控制原子操作的原则变量很难处理或根本无法处理。因此,处理更复杂的并发和竞态就要使用自旋锁。自旋锁特点自旋锁从本质上讲就是保证代码段(也称为临界区)的操作是原子的。也就是说,如果要保证某段代码在执行期间不会被打断(原子操作),就要在代码段执行之前申请自旋锁

2021-07-08 16:18:34 249

原创 linux驱动程序中的并发控制-1(原子操作)-43

原子操作整型的原子操作使对整型的int 的操作变成原子操作,要依靠一个数据类型:atomic_t。此结构体定义在 include/linux/types.h 文件中,定义如下:typedef struct { int counter;} atomic_t;相关的api#include<asm/atomic.h>函数描述ATOMIC_INIT(int i)定义原子变量的时候初始化int atomic_read(atomic_t *v)读取原子

2021-07-07 15:48:11 144

原创 Windows10下利用Visual Studio Code搭建C语言开发环境以及驱动的开发环境

Windows10下利用Visual Studio Code搭建C语言开发环境以及驱动的开发环境1.1 前言Visual Studio Code搭建C语言的开发环境,网上有一大堆的教程,但是很多都要么过时了,要么就是不能运行,自己也踩了好几个坑。比较好的策略就是官网教程+B站+知乎,尤其是B站的教学视频非常的多,播放量前几的都是很良心的。本文最后也会给出相应的B站链接,感谢这些博主的贡献。2.1 下载安装VSCode以及MinGW下载安装VSCode官网下载安装符合自己操作系统的安装包,我这

2021-07-01 15:06:19 883 1

原创 实现自己的HAL-15 控制led(Android 8.1 selinux 配置(自定义系统服务,以及节点的读写)),从app 到 hal 到底层内核kernel层的驱动 的实现(七)

Android 8.1 selinux 配置(自定义系统服务,以及节点的读写)SELinux概述SELinux 简述SELinux,安全增强Linux(Security-Enhanced Linux),是由美国国家安全局(NSA)发起, 多个非营利组织和高校参与开发的强制性安全审查机制(Mandatory Access control,简称MAC)。SELinux最早于2000年12月采用GPL许可发布。目前,Linux Kernel 2.6 及以上的版本都已经集成了SELinux。SELinu

2021-07-01 14:53:06 824

原创 实现自己的HAL-14 控制led(内核设备节点的访问权限的动态配置),从app 到 hal 到底层内核kernel层的驱动 的实现(六)

内核设备节点的访问权限的动态配置在控制led,从app 到 hal 到底层内核kernel层的驱动 的实现(一)中我们创建了led 控制驱动,同时

2021-06-29 19:05:39 382

原创 实现自己的HAL-13 控制led(控制led 的app),从app 到 hal 到底层内核kernel层的驱动 的实现(五)

控制led 的appMainActivity.java 代码package com.example.myapplication;import android.app.Activity;import android.os.Bundle;import android.app.HelloWorldServiceManger;import android.util.Log;import android.view.View;import android.widget.TextView;pub

2021-06-29 17:40:38 259

原创 实现自己的HAL-12 控制led(自定义的系统service的实现),从app 到 hal 到底层内核kernel层的驱动 的实现(四)

控制led的自定义的系统service的实现Z:\itop-3399_8.1\frameworks\base\core\java\android\os 下创建 IHelloWorldService.aidlIHelloWorldService.aidl 代码/** * Copyright (c) 2007, The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "Lice

2021-06-29 17:24:31 287

原创 实现自己的HAL-11 控制led(jni 的编写),从app 到 hal 到底层内核kernel层的驱动 的实现(三)

led 驱动的framwork 的jni 的编写在文件夹Z:\itop-3399_8.1\frameworks\base\services\core\jni 下创建 com_android_server_HelloWorldService.cppcom_android_server_HelloWorldService.cpp 代码#include <nativehelper/JNIHelp.h>#include <jni.h>#include <android_

2021-06-29 16:43:48 256

原创 实现自己的HAL-10 控制led(内核驱动的hal),从app 到 hal 到底层内核kernel层的驱动 的实现(二)

控制led内核驱动的halZ:\itop-3399_8.1\hardware\libhardware\include\hardware 下创建 helloworld.hhelloworld.h 代码#define ANDROID_HELLOWORLD_INTERFACE_H#include <hardware/hardware.h>__BEGIN_DECLS//定义模块ID#define HELLOWORLD_HARDWARE_MODULE_ID "helloworld"

2021-06-29 16:32:14 378

原创 实现自己的HAL-9 控制led(驱动),从app 到 hal 到底层内核kernel层的驱动 的实现(一)

控制led,从app 到 hal 到底层内核kernel层的驱动 的实现(一)led 驱动设备树的修改Z:\itop-3399_8.1\kernel\arch\arm64\boot\dts\rockchip\itop-3399.dtsi 文件 添加自己的test_led 节点 /* itop_led { compatible = "itop_led"; pinctrl-names = "default"; pinctrl-0 = <&led1

2021-06-29 16:14:38 449

原创 实现自己的HAL-8 通过Android 系统编译自己的app,用于控制hal

通过Android 系统编译自己的app,用于控制hal系统app 是在 Z:\itop-3399_8.1\packages\apps 这个路径下在Z:\itop-3399_8.1\packages\apps 创建 HelloWorldHelloWorld 下创建res、src文件夹,以及 Android.mk将Android studio 中 或则 eclipse 中生成的AndroidManifest.xml 拷贝过来<?xml version="1.0" encoding=

2021-06-22 15:37:03 349

原创 实现自己的HAL-7 Android 系统的各个模块的单独编译

Android 系统的各个模块的单独编译在编译单独模块前,需要先将Android 源码编译通过下Android 源码的根目录下会有.mk 或者 **.sh 文件,一般是.sh文件然后执行 **.sh 文件./**.sh执行.mkmake单独编译 system.img 镜像make systemimage作用它包含了整个Android系统,android的framework等等,会被挂接到 “/” 上,包含了系统中所有的二进制文件。(system.img是out/ta

2021-06-22 11:45:17 543

原创 app,控制led 代码-42

在内核中可以找到led的设备树 /* itop_led { compatible = "itop_led"; pinctrl-names = "default"; pinctrl-0 = <&led1_ctl>; gpios = <&gpio0 12 GPIO_ACTIVE_LOW>; status = "okay"; };*/将上面的代码注释掉,添加自.

2021-06-16 14:16:54 304 1

原创 tslib触摸校准实验-41

tslib触摸校准实验​ ft5x06触摸驱动添加成功后,发现触摸可能不太准确,这时可以使用一个第三方开源库tslib来调试触摸屏。下面来看一下 tslib源码如何移植。tslib源码可以从官方地址获取: https://github.com/libts/tslib ,打开网址可以看到最新的版本是1.21。可以从官网获取,也可以从网盘资料中获取获取到 tslib源码后,拷贝到Ubuntu系统下并解压,得到 tslib-1.21文件夹。编译tslibl获取到tslib源码后,可以编译tslib源

2021-06-16 14:16:07 348

原创 2021-06-16FT5X06触摸实验-40

FT5X06触摸实验安装完以下ft5x06触摸驱动会打印一下内容,说明驱动编写成功[12727.015690] ft5x06_driver_init[12727.015821] this is ft5x06_probe ft5x06_device_node is ft5x06[12727.015963] ft5x06_irp_gpio is 52[12727.015973] ft5x06_reset_gpio is 41[12727.027780] input: ft5x06_input

2021-06-16 14:15:34 270

原创 驱动程序实现i2c通讯-39

驱动程序实现i2c通讯i2c对寄存器的读写​ 在 I2C 设备驱动中首先要完成 i2c_driver 结构体的创建、初始化和注册,当设备和驱动匹配成功后,就会执行 probe 函数,probe 函数中就是执行字符设备驱动的一套流程。​ 一般需要在 probe 函数里面初始化 I2C 设备,要初始化 I2C 设备就必须能够对 I2C 设备寄存器进行读写操作,这里就要用到 i2c_transfer 函数了。i2c_transfer 函数最终会调用 I2C 适配器中 i2c_algorithm 里面的

2021-06-16 14:14:46 837

原创 i2c总线实现driver驱动-38

i2c总线实现driver驱动然后我们再来看driver部分。不管是使用设备树还是非设备树,driver部分就比较复杂了。和注册一个杂项设备或者是字符设备的套路一样,我们也是要先定一个一个i2c_driver的结构体,然后在对他进行初始化,我们来看一下这个结构体的定义,如下图所示:;struct i2c_driver { unsigned int class; /* Notifies the driver that a new bus has appeared. You should avoid

2021-06-16 14:08:14 459

原创 i2c总线实现client设备(2)-37

i2c总线实现client设备Linux l2C 驱动框架简介Linux中的I2C也是按照平台总线模型设计的,既然也是按照平台总线模型设计的,是不是也分为一个device和一个driver呢?但是I2C这里的 device在讲 platform 的时候就说过, platform是虚拟出来的一条总线;目的是为了实现总线、设备、驱动框架。对于I2C而言,不需要虚拟出一条总线,直接使用I2C总线即可。同样,我们也是先从非设备树开始,先来看一下,在没有设备树之前我们是怎么实现的i2C的device 部分

2021-06-16 14:07:21 684

原创 应用层实现i2c通信 - 36

i2c总线实现client设备Linux l2C 驱动框架简介Linux中的I2C也是按照平台总线模型设计的,既然也是按照平台总线模型设计的,是不是也分为一个device和一个driver呢?但是I2C这里的 device在讲 platform 的时候就说过, platform是虚拟出来的一条总线;目的是为了实现总线、设备、驱动框架。对于I2C而言,不需要虚拟出一条总线,直接使用I2C总线即可。同样,我们也是先从非设备树开始,先来看一下,在没有设备树之前我们是怎么实现的i2C的device 部分

2021-06-16 14:06:43 619

原创 输入子系统(二)-35

输入子系统(二)使用输入子系统设计按键驱动我们可以将开发板上的按键值设置为input.h文件里面的宏定义的任意一个,比如我们本次实验将开发板_上的KEY按键值设置为KEY__0在编写input设备驱动的时候我们需要先申请一个input dev结构体变量,使用input allocate device 函数来申请一个input dev.此函数原型如下所示:struct input dev *input_allocate_device(void)函数参数和返回值含义如下:参数:无。返

2021-06-16 14:06:04 320

HelloWorld.7z

HelloWorld.7z

2021-06-29

HelloWorld.zip

Android 系统编译 app源文件

2021-06-22

opengl.rar

opengl 的学习书籍 包括opengl 的sl 着色器语言,希望大家愉快的学习

2019-11-07

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除