- 博客(178)
- 资源 (1)
- 收藏
- 关注
原创 Pinctrl子系统_05_Pincontroller构造过程情景分析
上一节我们了解了Pinctrl子系统主要的数据结构,要想更好的掌握Pinctrl子系统,还需要知道他的。本节我们就来分析一下Pinctrl子系统的构造过程。以内核面向对象的思想,设备树可以分为两部分,左边是Pinctrl子系统节点,用来描述Pincontroller,右边是使用Pincontroller的设备,本节我们就来分析左边。学习Pinctrl子系统时,抓住他的,就可以比较清楚的分析。本节主要说明。以imx6ull为例。
2024-03-24 23:36:39
942
原创 Pinctrl子系统_04_Pinctrl子系统主要数据结构
用于描述一个特定的引脚控制器(pinctrl)的配置信息,包括该控制器管理的引脚数量、引脚的功能、引脚的默认状态等。代表一个具体的引脚控制器设备,它与`pinctrl_desc`结构体相关联,用于在系统中表示和管理一个特定的引脚控制器。定义了对引脚控制器进行操作的一组函数指针,包括引脚的配置、引脚的状态读取、引脚的状态设置等操作。定义了对引脚复用(pin multiplexing)进行操作的一组函数指针,用于配置引脚的不同功能模式,例如将一个引脚配置为GPIO模式或者特定外设的模式。
2024-03-05 00:57:58
968
1
原创 Pinctrl子系统_03_Pinctrl子系统使用示例
本节演示,如何使用Pinctrl子系统配置I2C通信所使用的引脚,以IMX6ULL为例。如下图所示,在芯片内部,有I2C模块。
2023-10-06 16:00:00
406
原创 Pinctrl子系统_02_使用Pinctrl要掌握的重要概念
对于上面的配置,我们可以将左右分为两部分,左边是controller,右边是client。在client中,配置不同的状态,给不同的状态指定不同的节点,而这些节点位于controller中,将哪些管脚配置为哪些功能或者状态。对于client,它的格式通常都是固定的,但是对于controller,就没有统一的格式了。虽然controller没有统一的格式,但是group,function,复用,配置,这些概念都是统一的。
2023-09-15 01:08:29
1128
原创 5.3中断系统中的设备树——中断号的演变与irq_domain
与sub_intc类似,external intc对应intc的m号中断,我们让external intc的0号中断对应数组项的第48项。(想想要定义上千个宏,很恐怖的。如果再加一个中断控制器sub_intc,它也会发出中断,并且sub_intc发出的中断会触发上一级的中断控制器的n号中断。假设只有一个中断控制器,有32个中断,那么中断和irq_desc数组可以一一对应,每一个数组项对应一个中断。假设irq_desc数组项中的第36,37,38,39项,分别对应sub_intc的0,1,2,3号中断。
2023-03-06 08:00:00
1657
原创 5.2中断系统中的设备树——Linux对中断处理的框架及代码流程简述
当发生中断时,CPU会跳到一个固定的地址去执行代码,这个固定的地址就被称为中断向量。以ARM920T为例,它的中断向量默认是地址24(0x18)的地方。那么,就可以在这里放一条跳转指令。一系列的跳转指令用来处理各种异常,中断当然也是一种异常。这些指令就被称为vector,异常向量表。对于ARM9来说,vector可以放在0地址,也可以放在0xffff 0000地址(使能MMU,开启虚拟地址之后)。对于其他芯片,vector的存放地址可能不一样。但是不管怎么样,对于大部分的芯片来说,它的软件中都应该保存一个v
2023-01-10 22:42:54
1057
翻译 1 The Yocto Project Overview and Concepts Manual
欢迎使用Yocto项目概述和概念手册!本手册通过概念介绍、软件概述、操作方法说明(BKMs,best-known-methods )以及适用于Yocto项目新用户的其他任何高级介绍信息。另外,本手册。
2022-11-17 08:00:00
206
原创 4.2uboot对设备树的支持——dtb的修改原理
本节说明。在uboot中,有一些命令支持。当我们想要修改dtb文件时,可以直接,然后生成,再将。或者,我们也可以在中使用,直接修改dtb文件。修改完成后,再将新的dtb文件保存在板子上,以后启动时就可以使用这个新的dtb文件了。实际上,就是fdt命令在最新的uboot版本中已经有支持了,但是还不支持,所以需要修改uboot代码,增加支持fdt指令(从新版本中移植)。在移植之前,先了解一下在fdt指令修改dtb的原理。
2022-11-06 14:43:48
6107
13
原创 4.1uboot对设备树的支持——传递dtb给内核
本节讲述怎么把设备树(dtb)传给内核。uboot只要,然后在时,把这块内存的传给内核(通过寄存器)。
2022-10-28 08:30:00
3847
原创 3.6内核对设备树的处理——platform_device跟platform_driver的匹配
platform_device跟platform_driver的匹配
2022-10-25 00:29:52
1449
原创 3.5内核对设备树的处理——device_node转换为platform_device
本节学习内核如何将转换为。先回顾一下。所谓总线设备驱动模型,就是将设备分为()和()两部分。使用总线设备驱动模型,如果要去修改,就需要,还要。而设备树就是将通过来描述,这样,修改平台设备后就不需要重新编译内核,。使用设备树的流程大致如下:首先,编写dts文件,然后使用dtc工具编译dts文件得到dtb文件,内核解析dtb文件生成device_node,之后再将device_node转换成platform_device。以之前的jz2440.dts为例。依次分析各个节点。
2022-10-23 21:46:40
2198
转载 Linux中的软件安装进度条怎么搞?
事实上,上面的代码中由于printf在sleep之前,所以printf永远先于sleep执行,但是先执行printf不代表先打印。但结果如下,并没有打印结果,想到行缓冲的规则,原来是因为打印的内容一直都没有换行,所以内容一直存在缓冲区内,不会打印出来。如果每次打印完都回车,就相当于在第一个位置打印一个数字后,又回到该位置,继续打印下一个数字。再结合上面两段代码及现象,可以得出上面打印时采用的是行缓冲(遇到\n就把要打印的内容打印在屏幕上)。先打印,再sleep持续3秒,很自然的结果。
2022-09-23 14:16:58
405
原创 4.2 设计模式_桥接模式
最后,总结一下修改。我们将电脑类定义为了一个抽象类,它含有抽象部分——InstallOS函数。将操作系统类定义为了一个实现类,它包含实现部分——InstallOS_impl函数。它们之间通过一个指针impl建立了连接,抽象类会调用实现类中的实现函数InstallOS_impl,来实现操作系统的安装。而电脑类中仅提供了一个抽象的接口InstallOS,它不负责实现具体的功能。这样,以后不论实现类有做什么更改,抽象类都可以不需要变动。impl = implement(实现)...
2022-09-01 00:45:08
423
原创 3.10 C++高级编程_Android强弱指针的实现与使用
上节通过一个死锁的问题,引入了强弱指针的概念。本节来讨论Android强弱指针的实现与使用。
2022-08-30 09:00:00
816
原创 3.9 C++高级编程_Android弱指针的引入
修改代码,在Person类中增加两个sp类成员,father和son,并且增加两个成员函数setSon和setFather。修改测试函数,创建两个sp 对象father 和 son,它们就相当于开头描述的A和B。那么我们将无法释放A和B,因为A引用了B,B的引用计数会加1,同理A的引用计数也会加1。这样,当我们尝试释放A或B的时候,引用计数永远也不会为0,即A和B永远也不会释放。比如说有两个智能指针 A 和 B,它们互相引用,即A引用到B,B也引用到A。...
2022-08-27 17:11:41
742
原创 3.8 C++高级编程_Android轻量级指针
在上一节的代码中,我们定义了一个基类RefBase,在RefBase中定义了一个引用计数count,还有一些列count加1和减1操作。,一旦在操作的过程中被打断,且在打断过程中有别的进程对 count 值进行操作,那么就可能出现错误。上一节我们使用了一个智能指针的方法,来防止C++中由于申请的内存未释放引起的内存泄漏的问题。内存中的count值在经过A,B两个进程的引用后,应该为3,但是此时结果却为2。需要注意一点是,在之前的代码中,我们在sp类的析构函数中,执行delete操作。
2022-08-25 09:00:00
182
原创 3.7 C++高级编程_自己实现智能指针
先定义一个Person类,在Person类中定义一个构造函数,一个析构函数,一个普通的成员函数。然后编写一个测试函数test_func,从内存中申请了一块Person类大小的空间。最后,在main函数中调用test_func函数。这个代码有什么问题呢?我们编译执行一下,可以看到Person类的构造函数被调用了,但是,。也就是说,在程序运行退出后,没有将之前申请的内存释放掉,这时候,就发生了。......
2022-08-23 09:00:00
665
原创 3.6 C++高级编程_异常
假设有A,B,C三个函数,其中A调用了B,B调用了C(A > B > C)。如果C执行过程中出现异常,那么首先要将异常情况返回给B,然后由B再返回给A。在C++中,可以使用来处理这种情况。。修改代码,在函数C中抛出一个异常,异常值为1;对应的,在函数A中会捕捉这个异常,并且将异常值输出。编译测试,可以看到函数A成功捕捉到了函数C抛出的异常。.........
2022-08-15 08:00:00
184
原创 3.4 C++高级编程_函数模板_重载
此时,在main函数中调用my_max函数,传参均为int型,发现调用的是第二个模板函数,也就是传参为非const类型的模板函数。修改代码,分别定义两个函数模板,它们名字相同,但是传入的参数类型不同,一个是const,一个是非const。此时,两个模板函数,一个普通函数,他们都可以匹配这个my_max,my_max会调用哪个函数呢?那么,为什么此时调用的是my_max函数?增加一个函数my_max,传参的类型为int类型的引用。我们可以重载函数,同样的,我们也可以。同时,他们的输出信息中的序号也不同。...
2022-08-14 13:19:37
774
原创 3.3 C++高级编程_函数模板_引入
在C++中,模板分为两种:本节主要讲解函数模板。所谓模板,就是为了节省代码,对于那些相似的代码,我们可以重复使用。假设我们要写一个比较两个 int 类型变量谁大的函数,那么可以这样写:比较两个 double 型:两个 float 型:可以看到,后面两个double和float的比较函数,其实都是对第一个函数的重载。这些函数这么相似,是否有什么办法可以简化代码,不用定义这么多函数呢?答:可以的,使用函数模板。函数模板的格式如下:代码如下,将输入参数的类型和返回值的类型都用T代替,同时使
2022-08-13 17:26:18
679
1
转载 【图片+代码】:GCC 链接过程中的【重定位】过程分析
目录示例代码sub.o 文件内容分析段信息符号表信息main.o 文件分析段信息符号表信息绝对寻址相对寻址重定位表信息可执行程序 main段信息符号表信息绝对地址重定位相对地址重定位总结。
2022-08-09 14:00:39
1565
1
原创 3.1 C++高级编程_抽象类_概念
virtual 函数声明时,后面加上 “=0”,例如virtual void eating(void) = 0;纯虚函数不需要定义,只需声明;抽象类:含有纯虚函数的类。抽象类不能实例化对象;若子类没有覆写完所有的纯虚函数,则子类还是抽象类;抽象类的作用:向下定义好框架,向上提供统一的接口。.........
2022-08-07 11:25:13
296
原创 2.5 C++面向对象编程_类型转换
格式将expression转换为type-id类型,但是运行时没有类型检查来保证转换的安全。1、用于类层次结构中,基类和子类之间指针或引用的转换;2、用于上行转换(子类转为基类)是安全的;3、用于下行转换(基类转为子类),由于没有动态类型转换,所以是不安全的;4、用于基本数据类型之间的转换,如把int转换成char,把int转换成enum;这种转换的安全性也要开发人员来保证;5、把void指针转换成目标类型的指针(不安全!!!)6、把任何类型的表达式转换成void类型。...
2022-08-02 09:00:00
274
原创 2.4 C++面向对象编程_多态
此时,Human类的内存占用变成了4,而Englishman和Chinese类都为8,因为Englishman和Chinese类除了自身的变量外还继承了Human类的变量。比如,如果没有申明virtual,那么在编译时就确定了test_eating函数中的h.eating调用的是Human类中的eating函数。调用关系如下,当使用虚函数时,是通过对应的虚函数表来映射到对应的虚函数代码上的。前面说了,在拥有虚函数的类中,会有一个指针指向对应的虚函数表,下面就来测试一下。......
2022-07-24 09:00:00
301
1
原创 2.3 C++面向对象编程_再论构造函数
一个派生类可以能有一个或多个基类,这些基类里面还可能是虚拟基类,并且类本身也有对象成员。然后,根据之前说的顺序原则,来推测一下构造函数调用的顺序。
2022-07-23 13:30:06
289
原创 2.2 C++面向对象编程_多重继承
一个派生类可以有多个基类;多个基类可能引入一个问题——二义性;解决二义性的方法——使用虚拟继承。虚基类使得多个类派生出的对象只继承一个基类对象,即Sofabed的基类Sofa,Bed共享一个Furniture对象。httpshttpshttpshttpshttpshttpshttpshttpshttpshttpshttpshttpshttpshttpshttpshttps。...
2022-07-22 09:00:00
365
原创 1.7 C++基础知识_运算符重载_类外函数
假设有下列代码,创建了三个变量a,b,c,其中c=a+b。事实上,c = a + b中的“+”也是一个函数,不过这个函数是由编译器实现的。在之前的point.cpp代码中,如果使用+将两个坐标相加,看看会有什么结果。直接使用+将两个坐标相加。 此时编译会报错,这是因为默认的+号是不支持两个坐标相加的。可以通过重载运算符将+号重载,让它支持坐标相加。首先,增加operator+函数。然后让它成为Point类的友员函数,这样就可以直接使用p1.x,p1.y,而不是通过getX这些函数获取坐标值。 最
2022-07-01 12:00:00
629
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人