- 博客(28)
- 收藏
- 关注
原创 《锁机制》
对于mutex来说,在使用的时候,需要定义一个mutex对象,然后对mutext加锁、解锁。这样需要去管理加锁和解锁的时机,使用起来不是很好,所以可以采取RAII的方式,创建时加锁,析构时解锁。所以对mutex进行类封装,就有了lock_guard。:当一个线程释放一个互斥锁时,会发生以下步骤互斥锁被释放,此时锁处于可用状态。操作系统的线程调度器会检查是否有其他线程正在等待获取这个锁。被唤醒的线程会重新尝试获取这个互斥锁。如果成功获取,它就可以继续执行。如果仍然无法获取,它会再次进入阻塞状态。
2024-06-30 16:01:42
290
原创 《智能指针》
在程序设计中,我们经常会使用到堆空间。向堆动态申请了内存,需要我们手动调用堆空间。这对程序设计造成不便,加入在设计过程中,某处动态申请了内存,但未手动回收,就会造成内存泄漏,导致程序运行一段时间后崩掉。智能指针就是为了处理这个问题诞生的。原理是,对于C++的对象来说,在创建时会调用其构造函数,而销毁时会调用其析构函数。
2024-06-16 17:29:34
478
原创 《计算机网络》 IP地址与MAC地址
在学习《计算机网络》时,我总有一个疑问,为什么明明有了IP地址,还要MAC地址呢?IP地址和MAC地址到底有什么区别呢?
2024-06-16 13:39:43
1379
原创 《STL源码分析》Vector的实现
vector容器是一个动态数组,而arrary是一个静态数组。这里的静态和动态的区分,是从内存分配上面来看的。因为vector是动态分配,所以vector的大小其实是在运行时确定的所以可以时一个变量,而arrar则是一个静态数组,其大小是在编译时确定的,所以不能用变量去指定其大小。另外注意const修饰的变量,因为const修饰的变量初始化是在编译期间完成的,所以下面的例子可以通过。
2024-06-10 17:55:11
377
原创 《LED驱动》4--驱动分析2
(1)老接口:register_chrdev(2)新接口:register_chrdev_region/alloc_chrdev_region + cdev(3)为什么需要新接口。因为以前是没有次设备号的需求的,随着之后的发展,又有了此设备号,因为主设备号只能有255个,这样能注册的设备数量就很少,但是设备的驱动有很多,比如一块开发板上可就就有好几个LED驱动,但是他们之前的区别可能就是寄存器不同而已。所以内核又引入了此设备号,将注册设备号分为了两部。第一步,申请设备号。第二部注册设备号。
2023-09-04 20:56:17
48
原创 《Linux驱动》2--字符设备驱动
字符设备是 Linux 驱动中最基本的一类设备驱动,字符设备就是一个一个字节,按照字节流进行读写操作的设备,读写数据是分先后顺序的。比如我们最常见的点灯、按键、 IIC、 SPI,LCD 等等都是字符设备,这些设备的驱动就叫做字符设备驱动。Linux应用程序对驱动程序的调用:Linux 中一切皆为文件,驱动加载成功以后会在“/dev”目录下生成一个相应的文件,应用程序通过对这个名为“/dev/xxx” (xxx 是具体的驱动文件名字)的文件进行相应的操作即可实现对硬件的操作。
2023-09-02 10:59:17
62
1
原创 《C语言进阶》8--零碎知识点
(1)NULL不是C语言关键字,本质上是一个宏定义(2)NULL的标准定义:#ifdef _cplusplus // 条件编译#else#define NULL (void *)0 // 这里对应C语言的情况#endif解释:C++的编译环境中,编译器预先定义了一个宏_cplusplus,程序中可以用条件编译来判断当前的编译环境是C++的还是C的。
2023-08-29 14:37:50
68
原创 《C语言进阶》7--存储类&作用域&生命周期&链接属性
(1)普通(自动)局部变量分配在栈上,作用域为代码块作用域,生命周期是临时,连接属性为无连接。定义时如果未显式初始化则其值随机,变量地址由运行时在栈上分配得到,多次执行时地址不一定相同,函数不能返回该类变量的地址(指针)作为返回值。(2)静态局部变量分配在数据段/bss段(显式初始化为非0则在数据段,显式初始化为0或未显示初始化则在bss段),作用域为代码块作用域(人为规定的),生命周期为永久(天然的),链接属性为无连接(天然的)。
2023-08-28 19:13:41
93
1
原创 《C语言进阶》6--宏定义与预处理、函数和函数库
宏定义的规则和使用解析(1)宏定义的解析规则就是:在预处理阶段由预处理器进行替换,这个替换是原封不动的替换。(2)宏定义替换会递归进行,直到替换出来的值本身不再是一个宏为止。(3)一个正确的宏定义式子本身分为3部分:第一部分是#dedine ,第二部分是宏名 ,剩下的所有为第三部分。(4)宏可以带参数,称为带参宏。带参宏的使用和带参函数非常像,但是使用上有一些差异。在定义带参宏时,每一个参数在宏体中引用时都必须加括号,最后整体再加括号,括号缺一不可。宏定义示例1:MAX宏,求2个数中较大的一个。
2023-08-26 16:27:57
64
原创 《Linux驱动》1--驱动介绍
(1)驱动一词的字面意思(2)物理上的驱动(3)硬件中的驱动(4)linux内核驱动。软件层面的驱动广义上就是指:这一段代码操作了硬件去动,所以这一段代码就叫硬件的驱动程序。(本质上是电力提供了动力,而驱动程序提供了操作逻辑方法)狭义上驱动程序就是专指操作系统中用来操控硬件的逻辑方法部分代码。
2023-08-24 18:13:02
43
1
原创 《C语言进阶》5--数组字符串结构
(1)相同点:三种获取内存的方法,都可以给程序提供可用内存,都可以用来定义变量给程序用。(2)不同点:栈内存对应C中的普通局部变量(别的变量还用不了栈,而且栈是自动的,由编译器和运行时环境共同来提供服务的,程序员无法手工控制);堆内存完全是独立于我们的程序存在和管理的,程序需要内存时可以去手工申请malloc,使用完成后必须尽快free释放。(堆内存对程序就好象公共图书馆对于人);数据段对于程序来说对应C程序中的全局变量和静态局部变量。
2023-08-23 17:37:45
27
原创 《ARM裸机》7--串口通信
通行中最重要的两个方面:信息表示、解析方法+信息的传输方法。通信双方需要约定好信息的表示方法和 解析方法做到一致,否则信息不能有效传递。所以通信传输方式可以分为三个步骤:编码——>传输——>解码。 (1)、同步和异步的区别:首先很多地方都有同步和异步的概念,简单来说就是发送方和接收方按照同一个时钟节拍工作就叫同步,发送方和接收方没有统一的时钟节拍、而各自按照自己的节拍工作就叫异步。 (2)、同步通信中,通信双方按照统一节拍工作,所以配合很好;一般需要发送方给接收方发送信息同时发
2023-08-19 18:37:16
49
原创 《C语言进阶》4--复杂表达式和指针高级应用
在分析C语言问题时不要胡乱去猜测规律,不要总觉得c语言无从捉摸,从已知的规律出发按照既定的规则去做即可。
2023-08-19 13:27:40
38
原创 《ARM裸机》7--时钟系统(基于i.MX6ULL)
查看100ask_imx6ull_pro_2022.08\04_开发板原理图,可以找到两个时钟源:(1)24Mhz CPU 主时钟(Y1)(2)32.768Khz CPU RTC 时钟(Y2)i.MX6ULL的始终系统,通过24Mhz的CPU的主始终,然后用PLL倍频,让后用分频器分频,这样就获得了外设所需要的时钟频率。
2023-08-16 16:50:18
228
2
原创 《C语言进阶》3--指针基础
(1)野指针,就是指针指向的位置是不可知的(随机的、不正确的、没有明确限制的)(2)野指针很可能触发运行时段错误(Sgmentation fault)(3)因为指针变量在定义时如果未初始化,值也是随机的。局部变量是存储在栈上的,而栈的出栈和入栈是通过指针的移动,所以出栈后,内存依然保存这上一次的值,所以这个值是随机的。指针变量的值其实就是别的变量(指针所指向的那个变量)的地址,所以意味着这个指针指向了一个地址是不确定的变量,这时候去解引用就是去访问这个地址不确定的变量,所以结果是不可知的。
2023-08-15 12:21:03
43
1
原创 《ARM裸机》6--BSP
之前编写的文件都是放到一个工作目录下,这样对简单的工程来讲是可以的,但是对于复杂的工程,就会显得很乱,不方便管理。使用BSP管理可以让我的工程变得更整洁,便于管理。SRCDIRS指定了.s和.c文件的路径,SFLIES和CFILES会找到该路径下的所有.s,.c文件。project:用来放应用程序和Start文件。INCDIRS里指定了.h文件的路径。imx6ul:用来放6ul的SDK。obj:用来放编译生成的.o文件。bsp:用来放驱动程序。
2023-08-14 20:59:34
30
原创 《C语言进阶》6--宏定义与预处理、函数和函数库
c源C文件--(预处理)-->.i预处理后文件--(编译)-->.s汇编文件--(汇编)-->.o二进制目标文件--(链接)-->.elf可执行文件。很明显int* a,b是错误的,所以我们可以利用预处理来进行调试。得到test.i文件。
2023-08-13 20:37:43
39
1
原创 《ARM裸机》5--重定位
在编译程序时,其实知道被运行时的地址,而且必须给编译器连接器指定这个地址(链接地址),这就是与运行地址有关。1.链接地址:链接时指定的地址,也是我们要指定程序最后的运行位置。(2)搬运代码,因为第一次的重定位后,bootROM会自动帮我们将程序拷贝到要运行的地址上去,但是之后我们在进行重定,CPU只是知道了要在新的地址上去找变量或者指令,所以我们要进行手动搬运。上面的搬运是用汇编里实现的,也可以在汇编里直接调用C语言函数,传入的参数,比如是3个参数,传入的参数就是r0,r1,r2。
2023-08-13 19:18:13
153
1
原创 《ARM裸机》4--LED与KEY(基于I.MX6ULL)
1.1物理特性LED本身两个接线点,一个是LED的正极,一个是LED的负极。LED这个硬件的功能是亮或者不亮。加上正向电压就可以点亮LED。1.2查阅原理图了解板载LED硬件接法这里列出图中的三颗LED原理图,如下:LED1:正极接3.3V高电平,负极接地,可知,LED1是常量的,也就是电源指示灯,只要上电,LED1就会常亮。LED2:正极接3.3V高电平,负极由GPIO5_3控制,GPIO5_3为1输出高电平,LED2不亮,GPIO5_3为0输出低电平,LED2亮。
2023-08-11 16:10:58
134
1
原创 《ARM裸机》3--烧写
之前讲i,mx6ULL启动的时候讲到过,要烧写到Flash中的文件,不仅仅是bin文件,还需要有头部。可以看出手动添加是一个很麻烦,这里我没可以采用imxdownload自动添加。所以在制作映像文件的时候,需要去计算添加这些头部。
2023-08-07 15:46:05
77
1
原创 《C语言进阶》2--位操作
位与&:(1)位与符号是一个&,两个&&是逻辑与。(2)位与就是两个操作数按照二进制数,每一位进行逻辑与。位或|:(1)位或是一个|,逻辑或是||。(2)位与就是两个操作数按照二进制数,每一位进行逻辑或。位取反:(1)C语言的位取反~,逻辑取反是!。(2)按位取反是将操作数的二进制位逐个按位取反(1变成0,0变成1)﹔而逻辑取反是真(在c语言中只要不是0的任何数都是真)变成假(在c语言中只有O表示假)、假变成真。
2023-07-24 15:23:19
291
原创 《ARM裸机》1--前言
ARM内核版本号:ARM设计出来卖的版本号。如:ARMv7。ARM Soc版本号:Soc的版本号。如:Cortex-A8。芯片型号:加工出来芯片的型号。如:S5PV210。M-microcontroller(微型处理器): 应用于单片机,例如STM32(ST公司的M3处理器)。A-application (应用级处理器): 应用于手机平板。R-realtime( 实时处理器): 处理器相应速度比较快,应用于工业、航天等领域。实时操作系统:RTOS。Linux,windows不是实时操作系统。
2023-07-22 22:00:11
87
原创 《C语言进阶》1--内存
从硬件的角度:内存实际上是电脑的一个配件(一般叫内存条)。根据不同的硬件实现原理还可以分从SRAM和DRAM(DRAM有好多代,如:SDRAM,DDR1、DDR2...、LDDR)。SRAM操作时不需要初始化,DRAM则需初始化。从逻辑角度:内存是RAM,它可以随机访问(只要给一个地址,就可以访问这个内存)、并且可以读写(也可以只读、只写);内存在编程中天然是来存放变量的(就是因为有了内存,C语言才能定义变量,C语言中的一个变量实际就是对应内存中的一个单元)。
2023-07-22 18:07:47
210
原创 《数据结构》--算法
1.插入排序2.希尔排序3.冒泡排序4.快速排序5.简单选择排序5.1堆排序5.2堆的插入删除6.归并排序7.基数排序8.外部排序。
2023-07-21 17:00:29
25
1
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人