- 博客(48)
- 资源 (1)
- 收藏
- 关注
原创 STM32开发之移植FreeRtos
(1)打开keil新建工程文件夹(2)选择芯片型号接下来会弹出来一个新建工程的小助手,我们关闭就好,接下来我们的工程就创建好了,但是工程还是空的。
2024-08-09 19:57:02
195
原创 Linux驱动开发-06蜂鸣器和多组GPIO控制
我们可以看到SNVS_TAMPER1是这个端口在控制着蜂鸣器,同时这是一个PNP型的三极管,在端口输出为低电平时,蜂鸣器响,在高电平时,蜂鸣器不响。
2024-07-19 19:27:40
1032
原创 Linux驱动开发-05APP和驱动的交互方式
这些文件提供了关于该 GPIO 控制器的其他信息,如它在设备树中的位置、电源管理信息、子系统信息等。这些目录提供了关于该 GPIO 控制器的信息,包括它管理的 GPIO 引脚的范围和数量。,这意味着从 GPIO 96 开始,这个控制器管理接下来的 32 个 GPIO 引脚(即 GPIO 96 到 GPIO 127)。下获得一个新的目录(以 GPIO 引脚编号命名),您可以在该目录中读取或写入文件来配置和查询 GPIO 引脚的状态。:这个文件显示了该 GPIO 控制器管理的 GPIO 引脚的数量。
2024-07-19 19:27:02
311
原创 Linux驱动开发-04LED灯驱动实验(直接操作寄存器)
Linux 下的任何外设驱动,最终都是要配置相应的硬件寄存器。驱动访问底层的硬件除了使用内存映射将物理地址空间转化为虚拟地址空间,去进行读写修改,还可以通过各种子系统函数去进行操作。
2024-07-12 17:14:29
199
原创 Linux驱动开发-03字符设备驱动框架搭建
** @description : 打开设备* @param - inode : 传递给驱动的inode* @param - filp : 设备文件,file结构体有个叫做private_data的成员变量* 一般在open的时候将private_data指向设备结构体。* @return : 0 成功;其他 失败*//** @description : 从设备读取数据* @param - filp : 要打开的设备文件(文件描述符)
2024-07-09 23:26:37
297
原创 Linux应用开发-第四章Linux的多进程开发(1)
在三态模型中,进程状态分为三个基本状态,即就绪态,运行态,阻塞态。在五态模型中,进程分为新建态、就绪态,运行态,阻塞态,终止态。子进程和父进程是运行在不同的内存空间中,它们内存空间的内容是一样的(文件读写和映射不会影响另外一个内存空间)注意:fork之后父子进程共享文件,fork产生的子进程与父进程相同的文件文件描述符指向相同的文件表,引用计数增加,共享文件偏移指针。PCB(Processing Control Block)进程控制块,维护进程相关的信息
2024-07-06 15:54:57
1247
原创 Linux应用开发-第三章Linux的目录IO
实验:实验mkdir去创建一个aaa目录,权限是0777(因为是8进制,前面需要加0)实验目的:我们把上一节创建的aaa目录改成bbb目录。实验目的:获取当前的工作目录后再修改当前的工作目录。
2024-07-04 17:37:04
392
原创 Linux应用开发-第二章Linux的文件IO
*作用:获取一个文件相关的一些信息参数:- pathname:操作的文件的路径- statbuf:结构体变量,传出参数,用于保存获取到的文件的信息返回值:成功:返回0失败:返回-1 设置errno//这个函数是查看软连接文件的信息参数:- pathname:操作的文件的路径- statbuf:结构体变量,传出参数,用于保存获取到的文件的信息返回值:成功:返回0失败:返回-1 设置errno*/
2024-07-04 15:23:38
1061
原创 Linux驱动开发-02字符设备驱动开发初步
modprobe命令默认会去/lib/modules/<kernel-version>目录中查找模块,比如本书使用的 Linux kernel的版本号为 4.1.15因此 modprobe命令默认会到 /lib/modules/4.1.15这个目录中查找相应的驱动模块,一般自己制作的根文件系统中是不会有这个目录的,所以需要自己手 动创建。insmod命令不能解决模块的依赖关系,modprobe会分析模块的依赖关系,然后会将所有的依赖模块都加载到内核中,我们使用。查看当前驱动模块是否有我们刚刚加载的模块。
2024-06-26 16:44:40
218
原创 FreeRtos-14调试与优化
不建议去加上一下打印信息,我们的内核源码中已经写的比较清楚,如果有错的话,程序会中止;在FreeRTOS中,我们也可以查看任务使用CPU的情况、使用栈的情况,然后针对性地进行优化。我们需要比Tick更快的时钟,比如Tick周期时1ms,我们可以使用另一个定时器,让它发生中断的周期时0.1ms甚至更短。很不精确,因为有更高优先级的任务就绪时,当前任务还没运行一个完整的Tick就被抢占了。configASSERT(x)中,如果x为假,表示发生了很严重的错误,必须停止系统的运行。难以处理的是内存越界、栈溢出等。
2024-06-23 20:45:03
122
原创 Linux驱动开发-01配置开发环境
使用桥接网卡时 Ubuntu 就是使用一个真实的网卡 :开发板的网线也连接到这个真实的网卡上,这样 Windows 、 Ubuntu 、开发板就都可以用过这个网卡互通了。这里作者的开发板和电脑都是直接接在路由器上,三者可以ping通。
2024-06-17 17:39:31
177
原创 FreeRtos-13资源管理
要独占式地访问临界资源,有3种方法:1.公平竞争:比如使用互斥量,谁先获得互斥量谁就访问临界资源,这部分内容前面讲过。谁要跟我抢,我就灭掉谁:2.中断要跟我抢?我屏蔽中断3.其他任务要跟我抢?我禁止调度器,不运行任务切换。
2024-06-15 22:36:47
188
原创 FreeRtos-12中断管理
FreeRTOS通过中断优先级和任务优先级两个独立的机制来管理中断和任务。中断优先级决定了中断之间的处理顺序,而任务优先级决定了任务之间的调度顺序。中断优先级总是高于任务优先级,即中断可以打断任务的执行。硬件中断和软件中断在触发方式和用途上有所不同,但都是通过中断机制来处理的。
2024-06-15 22:11:42
294
原创 FreeRtos-11定时器
也就是说:我们每次触发定时器后,就需要尽快去执行守护任务,就需要提高它的优先级让它先执行(我们的tick中断中只负责任务调度);通过这里我们可以看到:一旦我们将守护任务的优先级设置低于用户任务,那怕我们在用户任务中Timestart也还是无法运行定时器回调函数。这个函数(我们需要知道这个函数的优先级,如果它的优先级太低会被高优先级打断,在触发后它应该马上去执行定时器的任务函数)所以,我们的回调函数的是在某个任务中执行(类似于空闲任务的钩子函数一样),这个任务叫做。在下面我们就创建了一个守护任务的函数。
2024-06-13 18:52:16
230
原创 FreeRtos-10任务通知
任务通知的发送者和接收者是多对一的问题(使用任务通知时,只能通知指定任务)发送方:要么发送成功或者失败(不能等待),接收方:可以等待(因为TCB结构体里面没有list让发送者阻塞在上面,所以发送者不会阻塞)
2024-06-11 22:59:52
183
原创 FreeRtos-08互斥量
二进制信号量并不能保证谁上锁谁解锁的问题,虽然二进制信号量可以实现互斥,但是这种互斥是有问题的;所以,我们引入了互斥量主要是为了解决优先级反转和递归上锁/解锁的问题。互斥量的出现,主要是为了更好的保证资源独占(同一时刻只有一个任务在占领资源)和竞争造成的数据出错,比如06中的数据竞争导致sum的值出问题FreeRtos的互斥量并没有实现谁上锁,就由谁解锁的问题,只能靠程序员来实现。
2024-06-06 23:07:28
83
原创 FreeRtos-07信号量
计数型信号量(也称为二进制信号量或互斥信号量)主要用于控制对共享资源的访问,实现任务的同步,但它本身并不直接提供数据的完整性或一致性的保护。当多个线程或进程访问共享数据时,可能会发生数据竞争(data race)或其他并发问题,这些问题可能导致数据不一致或损坏。
2024-06-06 16:44:33
75
原创 FreeRtos-06队列的管理
1.创建队列函数/*第一个参数是队列长度;第二个参数是队列里面元素的数据类型大小(字节)队列创建成功后,会返回一个句柄,创建失败返回0*/2.队列的TCB结构体和任务创建一样,在创建完队列后,它也会返回一个类似的TCB句柄union} u;} xQUEUE;* `pcHead`:通常指向队列存储区域的起始地址。它是不移动的,环形Buf的头指针* `pcWriteTo`:指向队列中下一个要写入数据的位置。
2024-06-03 23:22:10
84
原创 FreeRtos-05同步和互斥
我们根据这两个对比可以看到,在任务一执行的过程中,我们的任务二会一直去访问计算结束标志位,造成CPU资源的浪费;所以两个任务同步实现所占用的时间比一个任务完成的时间会多30ms左右。同步的缺点:在等待期间不停访问,造成CPU资源浪费互斥不稳定的原因是detT太长了。
2024-06-01 23:02:02
74
原创 FreeRtos-02动态静态创建任务
二、静态创建任务2.1静态创建任务代码函数原型三、动态创建任务与静态创建任务的区别 使用静态创建任务时,开发者需要指定空闲任务的栈大小和TCB大小;而使用动态创建任务时,FreeRTOS会自动管理这些内存分配。 在FreeRTOSConfig.h中增加定义 接着出现其他报错Undefined symbol vApplicationGetIdleTaskMemory (referred from tasks.o).
2024-05-23 15:48:18
208
原创 使用Source Insight对RTOS工程进行管理
在我们选中文件夹时:按住Ctrl就可以依次选中(在Ctrl all时,按住Ctrl点击就可以依次取消选中)
2024-05-23 09:11:42
91
原创 C语言面试知识点
(1)static是局部变量,在函数调用时他只被初始化一次,不会被立即释放,下次调用时,使用上次的值,只能在本文件内使用。3.结构体的大小等于所有成员之和,考虑字节对齐就是最大成员的整数倍;32位下,指针变量长度2^32是4字节;64位下,指针变量长度2^64是8字节;联合体和结构体的区别:1.结构体的成员存放在不同的地址,联合体的成员共享一段空间。2.结构体可以对每个成员单独赋值,联合体同时只能对一个对成员赋值,不然会造成重写。(1)16位、32位、64位编译器下,各变量所占内存。
2024-04-20 15:49:05
192
原创 数据结构-树
术语:root(根)、children(孩子)、Parent(父母)、 sibling(兄弟[同一双亲])、leaf(叶子[没有孩子的节点])、cousin(叔叔)树:经常被表示层次数据的一种数据结构(根在顶部,分支向下生长)树的属性:当一颗树有N个节点时,有N-1个链接。高度:从X节点到一个叶节点的最长路径(向下)当我们遍历一棵树时,只能从一个方向进行遍历。深度:从X节点到根节点的路径长度(向上)
2024-03-15 19:27:07
79
2
原创 嵌入式C/C++面试题目
(1)static是局部变量,在函数调用时他只被初始化一次,不会被立即释放,下次调用时,使用上次的值,只能在本文件内使用。3.结构体的大小等于所有成员之和,考虑字节对齐就是最大成员的整数倍;32位下,指针变量长度2^32是4字节;64位下,指针变量长度2^64是8字节;联合体和结构体的区别:1.结构体的成员存放在不同的地址,联合体的成员共享一段空间。2.结构体可以对每个成员单独赋值,联合体同时只能对一个对成员赋值,不然会造成重写。(1)16位、32位、64位编译器下,各变量所占内存。
2024-03-15 13:41:25
420
1
原创 STM32开发之GPIO
这个是STM32F103ZET6的数据手册关于GPIO的引脚说明;我的是144引脚的这个数据手册的名字叫:STM32F103xCDE_DS_CH_V5。
2023-10-21 00:00:03
101
1
原创 STM32开发之模拟I2C与MPU6050通信
相信大家在I2C与MPU6050通信时总会碰到一些问题,作者的问题是可以读ID号,但是无法对MPU6050寄存器进行写入,读取寄存器的数据总是0
2023-10-20 20:18:32
525
1
原创 通过递归的方式打印链表
这里我们还是使用头插法:插入的数据如下,链表的结构为{4,3,2,1}在执行到p->next=NULL时就会一步一步出栈,
2023-10-03 16:22:57
261
1
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人