自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(24)
  • 资源 (1)
  • 收藏
  • 关注

原创 【Linux】驱动_2_字符驱动

Linux 内核将字符设备抽象成一个数据结构 (struct cdev), 字符设备对象cdev 记录了字符设备的相关信息(设备号、内核对象),字符设备的打开、读写、关闭等操作接口(file_operations),在我们想要添加一个字符设备时,就是将这个对象注册到内核中,通过创建一个文件(设备节点)绑定对象的 cdev,当我们对这个文件进行读写操作时,就可以通过虚拟文件系统,在内核中找到这个对象及其操作接口,从而控制设备。如 autofs 是一个字符设备 c, 它的主设备号是 10,次设备号是 235;

2024-04-23 10:07:23 964

原创 【Linux】驱动_1_hello驱动

_init。

2024-04-23 10:06:36 426

原创 【Linux】学习记录_17_网络编程

UDP运载的数据是以报文的形式,各个报文在网络中互不相干传输,UDP每收到一个报文就递交给上层应用,因此如果对于大量数据来说,应用层的重装是非常麻烦的,因为UDP报文在网络中到达目标主机的顺序是不一样的;

2024-04-22 09:49:25 766

原创 【Linux】学习记录_16_POSIX互斥锁

而如果互斥锁处于闭锁状态,则根据互斥锁的类型做对应的处理,默认情况下是快速互斥锁, 获取该互斥锁的线程将无法获得互斥锁,线程将被阻塞,直到互斥锁被释放,当然,如果是同一个线程重复获取互斥锁,也会导致死锁结果。互斥锁处于开锁状态时,线程才能获取互斥锁,线程持有某个互斥锁的时, 其他线程就无法获取这个互斥锁,需等到持有互斥锁的线程进行释放后,其他线程才能获取成功, 线程通过互斥锁获取函数来获取互斥锁的所有权。Linux系统中的锁机制是一个比较广泛的概念,而且锁的种类很多,包括互斥锁,文件锁,读写锁等等。

2024-04-22 09:48:54 507

原创 【Linux】学习记录_15_POSIX信号量

抽象的来讲,信号量中存在一个非负整数,所有获取它的进程/线程都会将该整数减一(获取它当然是为了使用资源), 当该整数值为零时,所有试图获取它的进程/线程都将处于阻塞状态。同样的一个父进程初始化一个信号量, 然后fork其副本得到的是该信号量的副本,这两个信号量之间并不存在关系。路径下, 不同的进程间只要约定好一个相同的信号量文件名字,就可以访问到对应的有名信号量, 并且借助信号量来进行同步或者互斥操作,需要注意的是,有名信号量是一个文件,在进程退出之后它们并不会自动消失, 而需要手工删除并释放资源。

2024-04-21 20:07:14 903 1

原创 【Linux】学习记录_14_线程

线程栈是非常重要的资源,它可以存放函数形参、局部变量、线程切换现场寄存器等数据,线程使用是进程的内存空间,那么一个进程有n个线程,默认的线程栈大小是1M, 那么就有可能导致进程的内存空间是不够的,因此在有多线程的情况下,我们可以适当减小某些线程栈的大小, 防止进程的内存空间不足,而某些线程可能需要完成很大量的工作,或者线程调用的函数会分配很大的局部变量, 亦或是函数调用层次很深时,需要的栈空间可能会很大,那么也可以增大线程栈的大小。也就是说,它只使用当前进程的资源,而不是产生当前进程的副本。

2024-04-21 20:06:42 1372 1

原创 【Linux】学习记录_13_共享内存

共享的内存需要进程自己去维护好,如同步、互斥等工作,共享内存是属于临界资源,在某一时刻最多只能有一个进程对其操作(读/写数据), 共享内存一般不能单独使用,而要配合信号量、互斥锁等协调机制,让各个进程在高效交换数据的同时, 不会发生数据践踏、破坏等意外。虽然shmdt()函数很简单,但是还是有注意要点的:该函数并不删除所指定的共享内存区, 而只是将先前用shmat()函数映射好的共享内存脱离当前进程,共享内存还是存在于物理内存中。shmat()函数调用成功后返回共享内存的起始地址。

2024-04-19 10:24:03 619

原创 【Linux】学习记录_12_system-V IPC 信号量

当指定了SEM_UNDO,那么将维护进程对信号量的调整值,进程退出的时候会自动还原它对信号量的操作;讲简单一点:对某个进程,在指定SEM_UNDO后,对信号量的当前值的修改都会反应到信号量调整值上, 当该进程终止的时候,内核会根据信号量调整值重新恢复信号量之前的值,SEM_UNDO操作可以防止进程退出时没有释放信号量导致的死锁。sem_op 大于 0,表示进程对资源使用完毕,对该信号量执行V操作,交回的资源数由sem_op决定, 系统会把sem_op的值加到该信号量的信号量当前值semval上。

2024-04-19 10:23:30 855

原创 【Linux】学习记录_11_消息队列

IPC_SET设置消息队列的属性,要设置的属性需先存储在结构体msqid_ds类型的buf中, 可设置的属性包括:msg_perm.uid、msg_perm.gid、msg_perm.mode以及msg_qbytes,储存在结构体msqid_ds中。时表示, 创建或返回已经存在的消息队列的标识符,且该消息队列的存取权限为0666, 即消息的所有者,所属组用户,其他用户均可对该消息进行读写。其中创建或打开消息队列使用的函数是msgget(),这里创建的消息队列的数量会受到系统可支持的消息队列数量的限制;

2024-04-18 10:23:22 292 1

原创 【Linux】学习记录_10_管道

数组pipefd是用于返回两个引用管道末端的文件描述符, pipefd[0] 指管道的读取端,pipefd[1]指向管道的写端 , 向管道的写入端写入数据将会由内核缓冲,即写入内存中,直到从管道的读取端读取数据为止, 而且数据遵循先进先出原则。但是它又不是普通的文件,并不属于其他任何文件系统,并且只存在于内核的内存空间中, 因此不能使用lseek()来定位。由于匿名管道是利用环形队列实现的,数据将从写入端流入管道,从读取端流出,这样子就实现了进程间通信, 但是这个匿名管道此时有两个读取端与两个写入端。

2024-04-18 10:22:48 315 1

原创 【Linux】学习记录_9_信号

也就是说,即使这些信号到来了,进程也不一定会立即去处理它, 因为系统不会为了处理一个信号而把当前正在运行的进程挂起,这样的话系统的资源消耗太大了, 如果不是紧急信号,是不会立即处理的,所以系统一般都会选择在内核态切换回用户态的时候处理信号。信号(signal),又称为软中断信号,用于通知进程发生了异步事件, 它是Linux系统响应某些条件而产生的一个事件,它是在软件层次上对中断机制的一种模拟, 是一种异步通信方式,在原理上,一个进程收到一个信号与处理器收到一个中断请求可以说是一样的。让信号默认动作起作用。

2024-04-16 09:49:27 852

原创 【Linux】学习记录_8_进程

PID是16位的正整数, 默认取值范围是从2到32768(可以修改),由Linux在启动新进程的时候自动依次分配,当进程被启动时, 系统将按顺序选择下一个未被使用的数字作为它的PID,当PID的数值达到最大时, 系统将重新选择下一个未使用的数值,新的PID重新从2开始,这是因为PID数字为1的值一般是为特殊进程init保留, 即系统在运行时就存在的第一个进程,init进程负责管理其他进程。fork()函数用于从一个已存在的进程中启动一个新进程, 新进程为子进程,原进程为父进程。

2024-04-16 09:48:12 866

原创 【Linux】学习记录_7_文件操作(C标准库)

如库函数写入数据的文件操作fwrite最后也是执行了write系统调用,如果是写少量数据的话,直接执行write可能会更高效,但如果是频繁的写入操作,由于fwrite的缓冲区可以减少调用write的次数,这种情况下使用fwrite能更节省时间。如针对某种存储设备的write函数每次可能必须写4kB的数据,那么当要写入的实际数据小于4kB时, write也只能按4kB写入,浪费了部分空间,而带缓冲区的fwrite函数面对这种情况, 会尽量在满足数据长度要求时才执行系统调用,减少空间开销。

2024-04-10 10:21:12 318 1

原创 【Linux】学习记录_6_存储设备文件系统

sys目录下的文件/文件夹向用户提供了一些关于设备、内核模块、文件系统以及其他内核组件的信息, 如子目录block中存放了所有的块设备,而bus中存放了系统中所有的总线类型, 有i2c,usb,sdio,pci等。不同的文件系统标准,需要使用不同的程序逻辑实现访问, 对外提供的访问接口可能也稍有差异。概括来说,sysfs文件系统是内核加载驱动时,根据系统上的设备和总 线构成导出的分级目录,它是系统上设备的直观反应,每个设备在sysfs下都有 唯一的对应目录,用户可以通过具体设备目录下的文件访问设备。

2024-04-10 10:19:12 784 1

原创 【Linux】学习记录_5_Makefile

在Makefile中编写的目标,在make看来其实都是目标文件,例如make在执行时由于在目录找不到targeta文件,所以每次make targeta的时候,它都会去执行targeta的命令,期待执行后能得到名为targeta的 同名文件。在前面《GCC编译过程》章节中提到整个编译过程包含如下图中的步骤,make在执行时也是 使用同样的流程,不过在Makefile的实际应用中,通常会把编译和最终的链接过程分开。在Makefile中的变量,有点像C语言的宏定义,在引用变量的地方使用变量值进行替换。

2024-04-09 10:14:05 584

原创 【Linux】学习记录_4_GCC编译过程

如下地址找到它提供的ARM交叉编译器:https://releases.linaro.org/components/toolchain/binaries/ , 如下图所示,在它提供的编译器列表中首先选择版本号,然后可选择ARM架构类型,最后是具体的编译器平台。GCC使用的命令语法如下:gcc [选项] 输入的文件名。

2024-04-09 10:13:06 368

原创 【Linux】学习记录_2_用户组与文件权限&3_Linux命令行

后面的九个字符,每三个为一组,分别表示文件拥有者 的权限、文件所属组拥有的权限及其他用户的权限。ls命令是list的简写,是Linux下最常用的指令, 功能为显示指定目录下的内容(文件及子目录) ,还可查看文件大小,修改日期等等信息。第二字段的含义,主要取决该文件的类型,如果是文件的话,则表示该文件所具有的硬连接数。第五字段:文件所占用的空间(以字节为单位)第五字段表示文件大小,在Linux中,目录是一个特殊的文件。第五字段表示文件最近访问的时间,使用touch命令,可以修改文件的第六字段。

2024-04-08 21:45:48 1010

原创 【Linux】学习记录_1_Linux文件目录

1 Linux文件目录1.1 根目录结构目录放置内容bin存放系统命令的目录,如命令cat,cp,mkdirboot存放开机启动过程所需的内容,如开机管理程序grub2dev所有设备文件的目录(如声卡、硬盘、光驱)etc系统的主要配置文件home用户家目录数据的存放目录lib存放sbin和bin目录下命令所需的库文件lib32/lib64存放二进制函数库,支持32位/64位lost+found在EXT3/4系统中,当系统意外崩

2024-04-08 21:43:50 298

原创 记录一个小问题

使用串口解析报文时,接收方式使用DMA搬运数据,并启动空闲中断,半满中断和全满中断进行乒乓缓存。但并未使用库函数,而是自写函数。发现一个问题就是在空闲中断取完数据后,必须有一次读取DR寄存器的操作,否则串口有可能会丢包,不知道卡在哪个步骤了。

2024-02-07 22:07:49 328 1

原创 qtcreator配置交叉编译工具链,主要为编译交叉qmake

前提,需要在linux下已经安装QT。

2023-06-16 10:51:43 1381 1

原创 【DP】爬楼梯

f(x)表示爬到x阶台阶的方案数。爬最后一步到x阶时可能跨了一级或者两级。通过转移方程和边界条件给出一个时间复杂度和空间复杂度都是 O(n) 的实现,但是由于这里的 f(x) 只和 f(x−1) 与f(x−2) 有关,所以我们可以用。根据边界条件,从0到0只有一种方法 f(0) = 1,0到1:f(1) = 1。你有多少种不同的方法可以爬到楼顶呢?把空间复杂度优化成 O(1)

2023-05-10 15:29:22 189

原创 RTT自动初始化

关于rtthread自动初始化的一些笔记与感悟

2022-09-26 22:07:55 838

原创 使用VSCODE搭建32位MCU开发环境

使用VSCODE+ARM_GCC+ARMGDB开发32位MCU搭建环境

2022-08-09 09:22:21 2415

原创 安装EC20调试环境

EC20 linux驱动搭建

2022-08-08 16:07:27 1264 1

vscode搭建32位MCU开发环境

使用vscode+gcc+gdb搭建32位MCU开发环境

2022-08-09

空空如也

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

TA关注的人

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