自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(36)
  • 收藏
  • 关注

转载 C++多态

当子类继承了父类的虚函数并完成重写,则就构成了多态,其底层是父类和子类都有一个虚表指针指向了一个虚表,这个虚表是用来存放虚函数的地址的(不是真正的地址,可以理解为间接地址),当父类的指针和引用来调用虚函数时,取决于对象本身(即接受的父类就调用父类,接受的是子类就调用子类),父类和子类就会分别去各自的虚表指针里找到相应的虚函数。也正说明了不同的人做相同的事,结果却不同,这就是多态。对象中的这个指针叫做虚函数表指针,简称虚表指针,虚表指针指向一个虚函数表,简称虚表,每一个含有虚函数的类中都至少有一个虚表指针。

2024-03-23 16:41:00 17

原创 UT_hash实例

题目描述:给一非空的单词列表,返回前 k 个出现次数最多的单词。返回的答案应该按单词出现频率由高到低排序。如果不同的单词有相同出现频率,按字母顺序排序。示例 1:输入: [“i”, “love”, “leetcode”, “i”, “love”, “coding”], k = 2输出: [“i”, “love”]解析: “i” 和 “love” 为出现次数最多的两个单词,均为2次。注意,按字母顺序 “i” 在 “love” 之前。示例 2:输入: [“the”, “day”, “is”,

2021-08-14 17:42:25 638

转载 C语言开源uthash用法总结

uthash 是C的比较优秀的开源代码,它实现了常见的hash操作函数,例如查找、插入、删除等等。该套开源代码采用宏的方式实现hash函数的相关功能,支持C语言的任意数据结构最为key值,甚至可以采用多个值作为key,无论是自定义的struct还是基本数据类型,需要注意的是不同类型的key其操作接口方式略有不同。使用uthash代码时只需要包含头文件"uthash.h"即可。由于该代码采用宏的方式实现,所有的实现代码都在uthash.h文件中,因此只需要在自己的代码中包含该头文件即可。1.uthash的

2021-07-02 10:03:18 1209

转载 OSI七层模型与TCP/IP模型

一、什么是OSI七层模型七层模型,亦称OSI(Open System Interconnection)参考模型,是参考模型是国际标准化组织(ISO)制定的一个用于计算机或通信系统间互联的标准体系。它是一个七层的、抽象的模型体,不仅包括一系列抽象的术语或概念,也包括具体的协议。1、OSI的来源OSI(Open System Interconnect),即开放式系统互联。 一般都叫OSI参考模型,是ISO(国际标准化组织)组织在1985年研究的网络互连模型。ISO为了更好的使网络应用更为普及,推出了O

2021-06-04 17:08:35 1984

转载 编译与链接

源文件:在开发软件的过程中,我们需要将编写好的代码(Code)保存到一个文件中,这样代码才不会丢失,才能够被编译器找到,才能最终变成可执行文件。这种用来保存代码的文件就叫做源文件(Source File)。每种编程语言的源文件都有特定的后缀,以方便被编译器识别,被程序员理解。源文件后缀大都根据编程语言本身的名字来命名,例如:C语言源文件的后缀是.c;C++语言(C Plus Plus)源文件的后缀是.cpp;Java 源文件的后缀是.java;Python 源文件的后缀是.py;JavaScr

2021-06-01 11:27:03 229

原创 多线程安全与调度

多线程安全:不是线程的安全面试官问:“什么是线程安全”,如果你不能很好的回答,那就请往下看吧。论语中有句话叫“学而优则仕”,相信很多人都觉得是“学习好了可以做官”。然而,这样理解却是错的。切记望文生义。同理,“线程安全”也不是指线程的安全,而是指内存的安全。为什么如此说呢?这和操作系统有关。目前主流操作系统都是多任务的,即多个进程同时运行。为了保证安全,每个进程只能访问分配给自己的内存空间,而不能访问别的进程的,这是由操作系统保障的。在每个进程的内存空间中都会有一块特殊的公共区域,通常称为堆(内

2021-06-01 11:01:46 306

原创 系统启动流程

系统启动依次经历xloader、fastboot、kernel初始化、Android初始化。Android 系统启动总结 : Android 系统启动分底层 Linux 内核启动 和 应用系统启动;– 底层系统启动 : 系统上电, bootloader 启动, linux kernel 启动, init 进程启动;– 应用系统启动 : init 进程启动关键的进程如 Zygote 进程 和 System Server 等系统服务, 之后进入 Home 界面;一. Android 底层系统启动流程(B

2021-06-01 10:58:18 551

转载 C语言内存布局

C程序内存布局:正文段(.text)。这是由CPU执行的机器指令部分。通常,正文段是可共享的,所以即使是频繁执行的程序(如文本编辑器、C编译器和shell等)在存储器中也只需有一个副本,另外,正文段常常是只读的,心防止程序由于意外而修改其指令。初始化数据段(.data)。通常将此段称为数据段,它包含了程序中需明确地赋初值的变量(已经初始化的非零全局变量)。例如,C程序中任何函数之外的声明:int maxcount = 99;使此变量以其初值存放在初始化数据段中。未初始化数据段(.bss)。通常

2021-06-01 10:55:27 169

原创 C语言字符串

字符串:字符串是一种非常重要的数据类型,但是C语言不存在显式的字符串类型,C语言中的字符串都以字符串常量的形式出现或存储在字符数组中。同时,C 语言提供了一系列库函数来对操作字符串,这些库函数都包含在头文件 string.h 中。1.1、什么是字符串常量  C 语言虽然没有字符串类型,但是 C语言是存在字符串这个概念的,也就是字符串常量:以 NUL 字节结尾的 0 个或多个字符组成的序列。字符串常量是不可被修改的,一般用一对双引号(" “)括起的一串字符来表示字符串常量,如:  “Hello!”、”

2021-06-01 10:48:30 303

原创 缓冲与缓存

缓冲区(buffer)与缓存(cache):一、什么是缓冲区缓冲区(buffer),它是内存空间的一部分。也就是说,在内存空间中预留了一定的存储空间,这些存储空间用来缓冲输入或输出的数据,这部分预留的空间就叫做缓冲区,显然缓冲区是具有一定大小的。缓冲区根据其对应的是输入设备还是输出设备,分为输入缓冲区和输出缓冲区。二、为什么要引入缓冲区我们为什么要引入缓冲区呢?高速设备与低速设备的不匹配,势必会让高速设备花时间等待低速设备,我们可以在这两者之间设立一个缓冲区。缓冲区的作用:1.可以解除两者的

2021-06-01 10:42:49 163

原创 内存基础知识(一)

载入内存(Load into Memory):如果你的电脑上安装了QQ,你希望和好友聊天,会双击QQ图标,打开QQ软件,输入账号和密码,然后登录就可以了。那么,QQ是怎么运行起来的呢?首先,有一点你要明确,你安装的QQ软件是保存在硬盘中的。双击QQ图标,操作系统就会知道你要运行这个软件,它会在硬盘中找到你安装的QQ软件,将数据(安装的软件本质上就是很多数据的集合)复制到内存。对!就是复制到内存!QQ不是在硬盘中运行的,而是在内存中运行的。为什么呢?因为内存的读写速度比硬盘快很多。对于读写速度,内

2021-06-01 10:30:32 182

原创 FATFS文件系统

FATFS文件系统1、什么是文件系统负责管理和存储文件信息的软件机构,在磁盘上组织文件的方法。2、常用的文件系统FAT/FATFS 小型嵌入式系统NTFS WINDOWSCDFS 光盘exFAT 更适用于闪存3、FATFS优点免费开源,专门为小型嵌入式系统设计,c编写,支持FAT12, FAT16 与 FAT32,支持多种存储媒介,有独立的缓冲区,可对多个文件进行读写,可裁剪的文件系统(极为重要)4、FATFS的特点5、FATFS层次结构①底层接口,包括存储媒介读/写接口

2021-03-22 20:42:51 3073

原创 FreeRTOS事件组

一、FreeRTOS事件组之事件组的创建(xEventGroupCreate())1.使用事件组的前提:(1)与互斥量、队列集等其他内核资源不同,想要使用事件组(xEventGroup)重点不在宏定义上是否配置为1,重点在组织程序以及程序编译的时候是否包括event_groups.c源代码以及event_groups.h头文件。(2)另外需要将宏configSUPPORT_DYNAMIC_ALLOCATION设置为1,否则不能应用事件组创建函数(xEventGroupCreate());2.函数说明

2021-03-15 10:04:48 2254

原创 函数名与函数指针

一 、通常的函数调用//自行包含头文件void MyFun(int x); //此处的申明也可写成:void MyFun( int );int main(int argc, char* argv[]){ MyFun(10); //这里是调用MyFun(10);函数 return 0;}void MyFun(int x) //这里定义一个MyFun函数{ printf(“%d\n”,x);}二、 函数指针变量的申明就象某一数据变量的内存地

2021-02-27 15:02:01 370 1

原创 C语言标准库函数

C 标准库标准库<ctype.h>C 标准库的 ctype.h 头文件提供了一些函数,可用于测试和映射字符。这些函数接受 int 作为参数,它的值必须是 EOF 或表示为一个无符号字符。如果参数 c 满足描述的条件,则这些函数返回非零(true)。如果参数 c 不满足描述的条件,则这些函数返回零。1、库函数 - isalnum()C 库函数 void isalnum(int c) 检查所传的字符是否是字母和数字。函数的声明:int isalnum(int c);c – 这是要检查

2021-02-27 14:58:52 1179

原创 qsort 函数的使用——对普通数组、指针数组、二维数组中的元素进行排序

在ANSI C中,qsort函数的原型是#include <stdlib.h>void qsort(void *base, size_t nmemb, size_t size, int (*compar) (const void *, const void *));解释:qsort函数对含有nmemb个元素的数组进行排序,而base指针指向数组的第一个元素。这个数组的元素个数由size指定。compar函数对qsort的比较操作进行定义,所以可以定制数字的比较,字符串的比较,甚至结构体

2021-02-27 14:26:46 1466

转载 qsort对二维数组排序

qsort对二维数组进行排序1、对于malloc动态申请的多维数组(指针数组)以一个例子解析:打算操作一个数组,数组的每个元素是一个指针,指向2个元素的数组。元素的大小关系为先比较第一个元素,第一个元素相同比较第二个元素。首先,通过malloc对指针数组进行分配:先分配一个指向元素为int 的一维数组,所以数组类型为int *;然后,针对每一个数组里的int *型指针,分配一个一维数组,数组类型为int。 int *b,**a; a = (int**)malloc(100000*

2021-02-27 11:34:14 1630 1

原创 FIQ与IRQ中断

快速中断请求(Fast Interrupt Request,FIQ)与外部中断请求IRQFIQ和IRQ是两种不同类型的中断,ARM为了支持这两种不同的中断,提供了对应的叫做FIQ和IRQ处理器模式(ARM有7种处理模式)。一般的中断控制器里我们可以配置与控制器相连的某个中断输入是FIQ还是IRQ,所以一个中断是可以指定为FIQ或者IRQ的,为了合理,要求系统更快响应,自身处理所耗时间也很短的中断设置为FIQ,否则就设置了IRQ。如果该中断设置为了IRQ,那么当该中断产生的时候,中断处理器通过IRQ请求

2021-02-04 13:54:54 7852

原创 GIC通用中断控制器

1. GIC简介操作系统中,中断是很重要的组成部分。有了中断系统才可以不用一直轮询(polling)是否有事件发生,系统效率才得以提高。一般在系统中,中断控制分为三个部分:模块、中断控制器和处理器。其中模块通常由寄存器控制是否使能中断和中断触发条件等;中断控制器可以管理中断的优先级等,而处理器则由寄存器设置用来响应中断。1.1 GIC结构作为 ARM 系统中通用中断控制器的是 GIC(Generic Interrupt Controller),目前有四个版本,V1~V4(V2最多支持8个ARM cor

2021-02-02 09:05:15 927

原创 ATF实现原理

ATF(ARM Trusted firmware)实现原理1、Secure world 与 Non Secure world在Android系统中应用程序运行在Non-secure EL0,linux kernel运行在Non-secure EL1 ,TEE比如trustonic运行在Secure EL0和Secure EL1。Android和TEE的切换都必须经过EL3的monitor,在mtk平台上ATF就是一个运行在EL3上面的monitor。Non Secure world切换到Secure

2021-01-28 15:29:41 2807

原创 Linux设备驱动程序(一)

1、驱动程序的角色:一个驱动程序的角色是提供机制,而不是策略。机制:提供什么能力;策略:如何使用这些能力。编写内核代码来存取硬件, 但是不能强加特别的策略给用户, 因为不同的用户有不同的需求. 驱动应当做到使硬件可用, 将所有关于如何使用硬件的事情留给应用程序. 一个驱动, 这样, 就是灵活的, 如果它提供对硬件能力的存取, 没有增加约束. 然而, 有时必须作出一些策略的决定. 例如, 一个数字 I/O 驱动也许只提供对硬件的字符存取, 以便避免额外的代码处理单个位。2、划分内核:进程管理:内核

2021-01-26 20:06:30 298

原创 Git-Repo-Gerrit

Git是一个开源的分布式版本控制系统,可以有效、高速的处理从很小到非常大的项目版本管理,是目前使用范围最广的版本管理工具。Repo是Android为了方便管理多个git库而开发的Python脚本。repo的出现,并非为了取代git,而是为了让Android开发者更为有效的利用git。Android源码包含数百个git库,仅仅是下载这么多git库就是一项繁重的任务,所以在下载源码时,Android就引入了repo。Android推荐的开发流程是:1、repo init初始化工程,指定待下载的分支2、r

2021-01-18 16:21:03 356

原创 Git常用指令

创建版本库版本库又名仓库,英文名repository,你可以简单理解成一个目录,这个目录里面的所有文件都可以被Git管理起来,每个文件的修改、删除,Git都能跟踪,以便任何时刻都可以追踪历史,或者在将来某个时刻可以“还原”。创建一个版本库非常简单,首先,选择一个合适的地方,创建一个空目录:$ mkdir learngit$ cd learngit$ pwd/Users/ren/learngit然后通过git init命令把这个目录变成Git可以管理的仓库:$ git initInitia

2021-01-15 20:16:37 73

原创 Git基础知识

Git 是一个开源的分布式版本控制系统,用于敏捷高效地处理任何或小或大的项目。Git 与 SVN 区别Git 不仅仅是个版本控制系统,它也是个内容管理系统(CMS),工作管理系统等。如果你是一个具有使用 SVN 背景的人,你需要做一定的思想转换,来适应 Git 提供的一些概念和特征。Git 与 SVN 区别点:1、Git 是分布式的,SVN 不是:这是 Git 和其它非分布式的版本控制系统,例如 SVN,CVS 等,最核心的区别。2、Git 把内容按元数据方式存储,而 SVN 是按文件:所有的资

2021-01-15 19:09:04 99

原创 Linux常用指令

1、ls命令就是 list 的缩写,通过 ls 命令不仅可以查看 linux 文件夹包含的文件,而且可以查看文件权限(包括目录、文件夹、文件权限)查看目录信息等等。常用参数搭配:ls -a 列出目录所有文件,包含以.开始的隐藏文件ls -A 列出除.及…的其它文件ls -r 反序排列ls -t 以文件修改时间排序ls -S 以文件大小排序ls -h 以易读大小显示ls -l 除了文件名之外,还将文件的权限、所有者、文件大小等信息详细列出来2、cd 命令cd(changeDirector

2021-01-15 16:16:46 229

原创 Linux系统结构

Linux系统结构:

2021-01-15 15:03:53 143

原创 Linux基础知识

操作系统的作用:    一、内核态:向下与计算机的硬件打交道,即管理、调用硬件资源等。    二、用户态:向上为用户提供系统接口,对应用程序提供支持等。    

2021-01-15 14:01:28 56

原创 Python异常处理

python提供了两个非常重要的功能来处理python程序在运行中出现的异常和错误。你可以使用该功能来调试python程序。异常处理 和 断言(Assertions)异常名称 描述BaseException 所有异常的基类SystemExit 解释器请求退出KeyboardInterrupt 用户中断执行(通常是输入^C)Exception 常规错误的基类StopIteration ...

2019-12-26 22:01:22 56

原创 Python文件读写代码

print “\thello world!”‘’’#同一文件夹里with open(‘pi.cpp’) as file_obj:content = file_obj.read()print(content)‘’’‘’’#相对路径with open(‘text_file\pi2.cpp’) as file_obj2:content2 = file_obj2.read()print(...

2019-12-26 21:23:01 656

原创 Python文件读写

文件读写读写文件是最常见的IO操作。Python内置了读写文件的函数,用法和C是兼容的。读写文件前,我们先必须了解一下,在磁盘上读写文件的功能都是由操作系统提供的,现代操作系统不允许普通的程序直接操作磁盘,所以,读写文件就是请求操作系统打开一个文件对象(通常称为文件描述符),然后,通过操作系统提供的接口从这个文件对象中读取数据(读文件),或者把数据写入这个文件对象(写文件)。读文件要以读文件...

2019-12-26 19:28:43 161

原创 Python函数

定义函数在Python中,定义一个函数要使用def语句,依次写出函数名、括号、括号中的参数和冒号:,然后,在缩进块中编写函数体,函数的返回值用return语句返回。我们以自定义一个求绝对值的my_abs函数为例:def my_abs(x):if x >= 0:return xelse:return -x空函数如果想定义一个什么事也不做的空函数,可以用pass语句:def ...

2019-12-26 16:21:39 76

原创 Python中dict字典和set集合

dictPython内置了字典:dict的支持,dict全称dictionary,在其他语言中也称为map,使用键-值(key-value)存储,具有极快的查找速度。举个例子,假设要根据同学的名字查找对应的成绩,如果用list实现,需要两个list:names = [‘Michael’, ‘Bob’, ‘Tracy’]scores = [95, 75, 85]给定一个名字,要查找对应的成...

2019-12-26 16:06:28 102

原创 Python条件判断和循环

条件判断:age = 20if age >= 18:print(‘your age is’, age)print(‘adult’)根据Python的缩进规则,如果if语句判断是True,就把缩进的两行print语句执行了,否则,什么也不做。也可以给if添加一个else语句,意思是,如果if判断是False,不要执行if的内容,去把else执行了:age = 3if age &...

2019-12-26 16:01:23 343

原创 Python中list列表和tuple元组

listPython内置的一种数据类型是列表:list。list是一种有序的集合,可以随时添加和删除其中的元素。比如,列出班里所有同学的名字,就可以用一个list表示:classmates = [‘Michael’, ‘Bob’, ‘Tracy’]classmates[‘Michael’, ‘Bob’, ‘Tracy’]变量classmates就是一个list。用len()...

2019-12-26 15:53:40 113

原创 Python字符串

字符串字符串是以单引号’或双引号"括起来的任意文本,比如’abc’,“xyz"等等。请注意,’ '或” “本身只是一种表示方式,不是字符串的一部分,因此,字符串’abc’只有a,b,c这3个字符。如果’本身也是一个字符,那就可以用” "括起来,比如"I’m OK"包含的字符是I,’,m,空格,O,K这6个字符。如果字符串内部既包含’又包含"怎么办?可以用转义字符\来标识,比如:‘I’m “O...

2019-12-26 15:40:42 100

原创 Python输入和输出

输出用print()在括号中加上字符串,就可以向屏幕上输出指定的文字。print(‘hello, world’)print()函数也可以接受多个字符串,用逗号“,”隔开,就可以连成一串输出:print()会依次打印每个字符串,遇到逗号“,”会输出一个空格.print(‘The quick brown fox’, ‘jumps over’, ‘the lazy dog’)...

2019-12-26 15:33:23 149 1

空空如也

空空如也

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

TA关注的人

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