- 博客(157)
- 收藏
- 关注

原创 Cortex-A 系列CP15协处理器简单解析
CP15 协处理器一般用于存储系统管理,但是在中断中也会使用到, CP15 协处理器一共有16 个 32 位寄存器(c0-c15)。 CP15 协处理器的访问通过其独特的语法指令完成,如下所示:(move to register from controller;move to controller to register)MRC: 将** CP15 协处理器中的寄存器数据读到 ARM 寄存器中...
2020-02-13 22:49:21
2352
原创 view draw aosp15
Vsync接收->choreographer处理->ViewRootImpl.performTraversal->draw->ThreadRenderer.draw开始生产新帧内容ViewRootImpl通过finishDrawing完成通知wmsViewGroup的drawChild 和 View的updateDisplayListDirty 都使用了缓存来优化,当一个View没有发生变化时,直接使用上一次绘制的内容绘制到父容器中去。
2024-12-25 11:33:19
1657
原创 android framework ams/wms常见系统日志(main\system\events\crash,protoLog使用)
上面两个图是在aosp11环境中打印的,在AOSP13中tag会发生变化,我们如果想要找到源码中的这行日志打印的地方,可以通过如下的拼接方式找到对应的源码位置。ProtoLog是google增加的动态打开某一个功能日志的开关能力,用于针对某一功能进行调试或者开发时,能够更加方便。例如我将一个app切后台后,重新拉起,直接使用 adb logcat | grep 进程号得到如下的日志信息。main日志:日常使用的Log.e/Log.w/Log.i等等(andoird.util.log)
2024-11-14 15:46:45
1343
原创 DrawState与wms绘制流程梳理
对于add到server端的一个window来说,addWindow时主要完成以下4个关键步骤创建这个窗口的WindowToken,并将其挂载到层级结构树中(一般windowTokend会挂载到leaf下,作为倒数第二层,最后一层往往是个windowState对象)创建一个WindowState对象,与当前window进行绑定(使用当前window的信息进行创建)
2024-08-12 22:29:11
375
原创 java笔记
1. 关于类型的转换与C不同,java的进制转换存在优先级dyte、char、short->int->long->float->double
2021-06-27 21:36:27
254
原创 线性代数复习笔记
复习参考复习过程主要使用b站的宋浩老师线性代数视频笔记使用:1.宋浩线性代数笔记 2.线性代数知识汇总对上述笔记的补充P14 分块矩阵:39:08 分块矩阵的逆对角分块矩阵求逆,直接把所有对角子块变为对应的逆矩阵P22 向量间的线性关系(二)⌚ 00:00 线性相关与无关线性相关:α1,α2,...,αn是n个m维向量组,若存在一组不全为0的k1,k2,...,kn,使得k1α1 + k2α2 + ... + knαn = 0,则向量组线性相关,否则无关向量组中两..
2021-05-22 20:57:51
666
原创 内核中的内联函数及其static修饰
在内核中,对于inline函数的使用时非常常见的,对于体积不是很大并且调用频繁的函数,使用内联函数能够降低函数调用的开销。内核中的内联函数几乎都是与static关键字同时使用。原因:inline函数的定义一般都在.h文件中,且允许多次定义。static保证函数作用域在当前文件。...
2021-05-12 21:23:16
562
原创 验证:两个文件同时引用同一.h头文件时,若头文件中仅包含static函数与变量,则在两个文件中的内存区域中独立存在
特性与问题验证static函数的作用域为当前文件,如果仅将static函数/变量定义到头文件中,而该头文件被不同的文件引用这并不会发生multiple define的错误,其原因在于对于两个文件而言,在引用头文件后存在独立的static函数,只是名字一样而已。测试:使用两个文件引用相同头文件(只有static&&不加预编译指令)使用两个文件引用相同头文件(有其他变量&&不加预编译指令)使用两个文件引用相同头文件(有其他变量&&加预编译指令)两种
2021-05-12 17:30:17
1713
原创 减法器的实现
关于加法器相关的实现看这篇文章:关于ALU中加法器最高位的溢出检测(进位输入与进位输出的异或)减法器的实现是在加法器的基础上完成的,对于运算 A-B 需要的输入有:A、B、减法控制信号这样就可以将减法拆解成 A 与 -B的加法那么控制信号的主要作用就是完成对于 B到-B的转换电路切换。其设计图如下所示:上面在加法器的基础上,添加了图中标注的 1-4;用来控制多路选择器(2)的控制信号,如果是加法则由B不经过(3)向下传递,否则经过(3)传递多路选择器,用来配合控制信号(1)完成对于加减
2020-11-29 12:08:58
4252
3
原创 关于ALU中加法器最高位的溢出检测(进位输入与进位输出的异或)
1. 加法器最高位的概念以32位加法器作为例子,ALU中使用单独1位相加,记录是否进位,逐层传递的方式完成整个32位的加法。注:ALU:Arithmetic and logical unit 算数逻辑单元其中每一个用来计算两个数单独1位的运算器叫作:全加器;其数字逻辑图如下所示:左侧:AB为输入端口,Cin为进位输入端口右侧:S为输出端口(和),Cout为进位输出端口其真值表如下图所示:2.加法器的构成n-bit加法器由n个上面提到的全加器构成,并进行串联,如下图所示这是一个4-bi
2020-11-29 11:45:01
17232
8
原创 计算机网络知识点梳理:零散的一篇
1. 物理层的基本概念:物理层:确定与传输媒体接口的有关特性;(定义标准)4个特性:机械特性、电气特性、功能特性、2. 数据通信基础知识传统的使用公用电话网的数据通信模型数据通信的相关术语:三种通信方式:单工、半双工、全双工两种数据传输方式:串行、并行3. 码元、波特、速率、带宽码元: 一个码元就是一个信号,可以携带多个bit信息,一个码元代表一种离散数值;N进制码元:有N种离散状态(能表示N种信号)--> N种状态需要 log2N 个.
2020-10-12 18:48:52
500
原创 JZ 20 表示数值的字符串:抽象与逻辑练习
题目:请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。例如,字符串"+100"、"5e2"、"-123"、"3.1416"、"-1E-16"、"0123"都表示数值,但"12e"、"1a3.14"、"1.2.3"、"+-5"及"12e+5.4"都不是。思路:面对情况较多并且前后顺序混乱的这种问题,我们应该先抽象出合理数字的模型,再拆分问题进行解决;举个例子:对于数字**-16.321E-16**可以说是这种情况下所有条件都加上了;对这个数字进行拆分:【-16】【.】【321】【E/
2020-08-17 16:15:10
395
原创 地址偏移量取整对齐(向上对齐与向下对齐的代码实现)
起因:为甚么有这俩对齐在存储的时候,为了提高效率,一般都会让偏移量落在2的m次方的位置上,而且常有向上取整和向下取整两种需求。方法1. 向下取整:PALIGN_DOWN(x,align) (x & ~(align-1))例如:x = 5,align = 4;即:期望对5向下取整x = 5 == 0101b ; 4 == 0100;结果为:0101 & ~(0011) = 0101 & 1100 = 0100 = 4;即为5按4字节向下取整的结果即将4所在位后面都清
2020-08-16 22:42:57
3907
原创 最小公倍数与最大公约数求法:辗转相除
题目:正整数A和正整数B 的最小公倍数是指 能被A和B整除的最小的正整数值,设计一个算法,求输入A和B的最小公倍数。思路:最小公倍数 = 两数之和 / 最大公约数所以如何求最大公约数呢辗转相除:A与B(A>B)A / B = C .....D;(if D != 0)next..A = B;B = D; A / B = C ....D;重复这个过程,直到D == 0;此时,B即为最大公约数代码:#include <bits/stdc++.h&g.
2020-07-29 11:26:34
263
原创 LC 116/117填充每个节点的下一个右侧节点指针(层序遍历的应用)
题目:给定一个二叉树struct Node { int val; Node *left; Node *right; Node *next;}填充它的每个 next 指针,让这个指针指向其下一个右侧节点。如果找不到下一个右侧节点,则将 next 指针设置为NULL。初始状态下,所有next 指针都被设置为NULL。进阶:你只能使用常量级额外空间。 使用递归解题也符合要求,本题中递归程序占用的栈空间不算做额外的空间复杂度。示例:输入:r...
2020-07-28 09:52:10
179
原创 LC 二叉树通过两种遍历创建二叉树问题
**题目1 :从中序与后序遍历序列构造二叉树 **根据一棵树的中序遍历与后序遍历构造二叉树。注意:你可以假设树中没有重复的元素。例如,给出中序遍历 inorder = [9,3,15,20,7]后序遍历 postorder = [9,15,7,20,3]返回如下的二叉树: 3 / \ 9 20 / \ 15 7思路:这类问题的解法是统一的,使用递归来完成比较方便,唯一不同的是在建树过程中, 传入的参数可能因为入参的改变而改变;// 1.
2020-07-26 22:28:08
312
原创 LC101 对称二叉树(三种解法:递归、迭代、层序遍历后比较字符)
题目:给定一个二叉树,检查它是否是镜像对称的。 例如,二叉树 [1,2,2,3,4,4,3] 是对称的。 1 / \ 2 2 / \ / \3 4 4 3 但是下面这个 [1,2,2,null,3,null,3] 则不是镜像对称的: 1 / \ 2 2 \ \ 3 3 进阶:你可以运用递归和迭代两种方法解决这个问题吗?思路:方案一:递归通过递归解决的思路是:传入根节点的左右结点分别为 p 和
2020-07-24 10:28:07
215
原创 JZ 16:数值的整数次方(mid)
题目:实现函数double Power(double base, int exponent),求base的exponent次方。不得使用库函数,同时不需要考虑大数问题。 示例 1:输入: 2.00000, 10输出: 1024.00000示例 2:输入: 2.10000, 3输出: 9.26100示例 3:输入: 2.00000, -2输出: 0.25000解释: 2-2 = 1/22 = 1/4 = 0.25 说明:-100.0 < x < 100
2020-07-02 20:40:32
246
原创 JZ :14 剪绳子-I (动态规划 or 贪心)
题目:给你一根长度为 n 的绳子,请把绳子剪成整数长度的 m 段(m、n都是整数,n>1并且m>1),每段绳子的长度记为 k[0],k[1]...k[m-1] 。请问 k[0]*k[1]*...*k[m-1] 可能的最大乘积是多少?例如,当绳子的长度是8时,我们把它剪成长度分别为2、3、3的三段,此时得到的最大乘积是18。示例 1:输入: 2输出: 1解释: 2 = 1 + 1, 1 × 1 = 1示例 2:输入: 10输出: 36解释: 10 = 3 + 3 + 4
2020-07-01 15:28:22
231
原创 JZ 13: 机器人运动范围(DFS / 回溯)
题目:地上有一个m行n列的方格,从坐标 [0,0] 到坐标 [m-1,n-1] 。一个机器人从坐标 [0, 0] 的格子开始移动,它每次可以向左、右、上、下移动一格(不能移动到方格外),也不能进入行坐标和列坐标的数位之和大于k的格子。例如,当k为18时,机器人能够进入方格 [35, 37] ,因为3+5+3+7=18。但它不能进入方格 [35, 38],因为3+5+3+8=19。请问该机器人能够到达多少个格子? 示例 1:输入:m = 2, n = 3, k = 1输出:3示例 2:
2020-07-01 14:16:44
201
原创 JZ:12 矩形中的路径(回溯/ DFS)
题目:请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径。路径可以从矩阵中的任意一格开始,每一步可以在矩阵中向左、右、上、下移动一格。如果一条路径经过了矩阵的某一格,那么该路径不能再次进入该格子。例如,在下面的3×4的矩阵中包含一条字符串“bfce”的路径(路径中的字母用加粗标出)。[["a","b","c","e"],["s","f","c","s"],["a","d","e","e"]]但矩阵中不包含字符串“abfb”的路径,因为字符串的第一个字符b占据了矩阵
2020-07-01 00:25:48
313
原创 C++知识点回忆:总结
C/C++有数组定义int a1[2][2]={{1,2},{2}};则a1[1][1]的值为不确定的错的:这是一种初始化方法,第二排数据都初始化为2;关于宏定义中的# 和##有#define MYPRINT(x) printf("#x") 则MYPRINT(test)的输出结果为test错的:少了一对双引号;#include <stdio.h>#define XNAME (n) x ## n#define PRINT_XN (n) printf("x" #n " =
2020-06-26 23:13:17
779
原创 回忆大端序和小端序
一个地址存储8位数据,也就是1字节对于栈空间数据,地址从上向下增长(从高向低增长)对于堆空间数据,地址从下向上增长(从低地址向高地址)对于大端序和小端序的概念不再赘述大端序:高位数据存在低地址;小端序:高位数据存在高地址;union w{ int a; char b;} c;int checkCPU(){ c.a = 1; return (c.b == 1);}// 返回 1 则为小端序,反之为大端序解释:存储:如果为大端序:高位地址存储0x01如果为小端序:低位地
2020-06-25 22:20:50
206
原创 JZ: 11 旋转数组的最小数字
题目:把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个递增排序的数组的一个旋转,输出旋转数组的最小元素。例如,数组 [3,4,5,1,2] 为 [1,2,3,4,5] 的一个旋转,该数组的最小值为1。 示例 1:输入:[3,4,5,1,2]输出:1示例 2:输入:[2,2,2,0,1]输出:0思路:方案一:简单的知己遍历查找:时间复杂度:O(n),空间O(1)因为题目中所提供的是一个排序的原始数组,因此我们只要循环一次,找到变小的那个元素,这个元素
2020-06-24 21:46:30
222
原创 JZ 07重建二叉树(利用前序遍历和中序遍历还原整个二叉树)
题目:输入某二叉树的前序遍历和中序遍历的结果,请重建该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如,给出前序遍历 preorder = [3,9,20,15,7]中序遍历 inorder = [9,3,15,20,7]返回如下的二叉树: 3 / \ 9 20 / \ 15 7 限制:0 <= 节点个数 <= 5000思路:前序遍历:根左右(例如:【1, 2, 4,7, 3, 5, 6, 8】)中序遍历
2020-06-22 15:02:49
223
原创 JZ 05. 替换空格
题目:思路:方法一:暴力复制:从前向后遍历整个字符串,遇到空格,将后面的全部元素向后移动两个位置并在空格处添加“20%”; 时间复杂度:O(n*m)(对于长度为m,含有n个空格的字符串)方法二:原地复制:从后向前复制,遇到空格就复制20%,直到最初的起点;需要获得字符串的长度并通过遍历一次来得知,替换后的字符串长度为多少;需要注意的是:对于string类型字符串,不可以通过索引直接访问未初始化的内存;这也是为什么在第一次循环时,将s+=“00”*,其目的是将字符串的内存初始化;如果未初始化直接写
2020-06-21 19:06:44
281
原创 JZ:04二维数组中的查找
题目:在一个 n * m 的二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。示例:现有矩阵 matrix 如下:[ [1, 4, 7, 11, 15], [2, 5, 8, 12, 19], [3, 6, 9, 16, 22], [10, 13, 14, 17, 24], [18, 21, 23, 26, 30]]给定 target = 5,返
2020-06-21 13:52:17
191
原创 字母异位词分组: 中等难度(设计hash键值)
题目:给定一个字符串数组,将字母异位词组合在一起。字母异位词指字母相同,但排列不同的字符串。示例:输入: ["eat", "tea", "tan", "ate", "nat", "bat"]输出:[ ["ate","eat","tea"], ["nat","tan"], ["bat"]]说明:所有输入均为小写字母。不考虑答案输出的顺序。思路:分析题目含义:字母相同的即为一个类别,期望分到一个组中并在return vec中组成一个vec如何实现辨别是否为同一组:使用
2020-06-18 21:53:53
140
原创 两个数组的交集 II
题目:给定两个数组,编写一个函数来计算它们的交集。示例 1:输入: nums1 = [1,2,2,1], nums2 = [2,2]输出: [2,2]示例 2:输入: nums1 = [4,9,5], nums2 = [9,4,9,8,4]输出: [4,9]说明:输出结果中每个元素出现的次数,应与元素在两个数组中出现的次数一致。我们可以不考虑输出结果的顺序。进阶:如果给定的数组已经排好序呢?你将如何优化你的算法?如果 nums1 的大小比 nums2 小很多,哪种方法更优
2020-06-17 21:03:11
183
原创 两个列表的最小索引总和:unordered_map
题目:假设Andy和Doris想在晚餐时选择一家餐厅,并且他们都有一个表示最喜爱餐厅的列表,每个餐厅的名字用字符串表示。你需要帮助他们用最少的索引和找出他们共同喜爱的餐厅。 如果答案不止一个,则输出所有答案并且不考虑顺序。 你可以假设总是存在一个答案。示例 1:输入:["Shogun", "Tapioca Express", "Burger King", "KFC"]["Piatti", "The Grill at Torrey Pines", "Hungry Hunter Steakho
2020-06-17 20:00:18
269
原创 两数之和:使用unordered_map遍历一次实现
题目:给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。你可以假设每种输入只会对应一个答案。但是,数组中同一个元素不能使用两遍。 示例:给定 nums = [2, 7, 11, 15], target = 9因为 nums[0] + nums[1] = 2 + 7 = 9所以返回 [0, 1]思路:方法1 :暴力遍历,遍历每一个元素以及其后面的所有元素,找到符合条件的;时间复杂度:n + n -1 +
2020-06-17 18:58:06
2418
原创 7. 利用of函数读取设备树中的信息(test)
知识点:关于设备树of函数的使用知识点请看Linux设备树常用的OF函数总结关于设备树其他相关知识点抢看:Linux驱动相关基础知识实验:目的:本次实验的目的是测试linux下使用of函数读取设备树中某个结点的信息;内容:利用of函数,在上一次实验5. led驱动控制:使用register_chrdev_region的基础上,编写一个函数;在函数中使用of函数,读取arch\arm\boot\dts\imx6ull-alientek-emmc.dts里面的(根节点下)的属性信息属性请查看文
2020-06-14 21:19:21
685
原创 Linux设备树常用的OF函数总结
一 查找结点的OF函数Linux 内核使用 device_node 结构体来描述一个节点,此结构体定义在文件 include/linux/of.h 中,定义如下:struct device_node { const char *name; /* 节点名字 */ const char *type; /* 设备类型 */ phandle phandle; const char *full_name; /* 节点全名 */ struct fwnode_handle fwnode; struct p
2020-06-11 12:53:23
17391
原创 关于树莓派交叉编译环境的配置、ssh、文件传输
原因及目的树莓派的CPU频率不高,与台式机比远远不足,因此使用台式机来编写代码–编译代码,会比在树莓派这样的嵌入式设备上快的多;操作起来也更丝滑;那么我们需要为我们的PC操作系统安装一个树莓派使用的编译工具,用来保证我们在PC机上编译出来的代码能够在树莓派上运行;开启树莓派的ssh服务,以便于我们能在PC机上远程登录树莓派,验证我们编写的可执行文件是否能够正常执行;搞一个文件传输软件,这样就可以在PC机下将我们编译出来的可执行文件直接拷贝到树莓派上去执行了;下面一个一个说:我所使用PC的
2020-06-10 14:59:36
439
原创 6. Linux设备树前置基础
一. 知识点:我们在uboot启动的时候,会下载zImage内核,.dtb文件,这里面的 .dtb文件就是设备树文件1. 什么是设备树: 将这个词分开就是“设备”和“树”,描述设备树的文件叫做 DTS(Device Tree Source),这个 DTS 文件采用树形结构描述板级设备,也就是开发板上的设备信息,比如CPU 数量、 内存基地址、 IIC 接口上接了哪些设备、 SPI 接口上接了哪些设备等等;如上图所示:树的主干就是系统总线, IIC 控制器、 GPIO 控制器、 SPI 控制器等都是接到
2020-06-08 19:55:40
832
原创 三维 背包问题:DP求解
题目:小v是公司的运维工程师,现有一个有关应用程序部署的任务如下:1、一台服务器的磁盘空间、内存是固定的,现在有N个应用程序要部署;2、每个应用程序所需要的磁盘、内存不同,每个应用程序允许访问的用户数也不同,且同一个应用程序不能在一台服务器上部署多个。对于一台服务器而言,如何组合部署应用程序能够使得单台服务器允许访问的用户数最多?输入描述:输入包括三个参数,空格分隔,分别表示服务器的磁盘大小、内存大小,以及应用程序列表;其中第三个参数即应用程序列表,表述方式为:多个应用程序信息之间用 '#'
2020-06-06 15:22:46
1837
原创 Linux驱动相关的基础知识
1. 什么是Linux驱动?在各种书上都有对于驱动程序的介绍,大致的意思都为处于内核与硬件之间的,由操作系统管理的,控制硬件设备的程序;是硬件和内核之间的桥梁我们这里所说的驱动都是软件驱动的概念,是用来驱动硬件,或是提供硬件驱动方法的程序;记住:是内核和硬件之间的桥梁;2. Linux内核的分类:主要分为三大类:字符设备、块设备、网络设备三类设备编写驱动的方式不太一样,目前只接触了字符设备和网络设备的内容;字符设备: IO传输过程中以 字节为单位 进行传输;用户对于字符设备发出读写请求时
2020-06-01 18:26:21
427
原创 复制带随机指针的链表
题目:给定一个链表,每个节点包含一个额外增加的随机指针,该指针可以指向链表中的任何节点或空节点。要求返回这个链表的 深拷贝。 我们用一个由 n 个节点组成的链表来表示输入/输出中的链表。每个节点用一个 [val, random_index] 表示:val:一个表示 Node.val 的整数。random_index:随机指针指向的节点索引(范围从 0 到 n-1);如果不指向任何节点,则为 null 。示例 1:输入:head = [[7,null],[13,0],[11,4],[1
2020-05-25 23:55:26
223
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人