自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 FreeRTOS 内存管理策略

然后,对于 pvPortMalloc 调用时,从这个数组中分配空间。FreeRTOS 在创建任务时,需要 2 个内核对象: task control block(TCB)、 stack。

2023-09-11 15:05:56 303

原创 嵌入式基础知识大杂烩

u-boot(或称为Das U-Boot)是一种广泛应用于嵌入式系统的开源引导加载程序。它通常存放在嵌入式系统的非易失性存储器中,具体位置可以根据具体的嵌入式系统架构和设计来确定。总结起来,u-boot一般存放在嵌入式系统的Flash存储器中,包括NOR Flash和NAND Flash,在一些系统中也可以存放在可移动存储介质上,例如SD卡或TF卡。的情况,u-boot可以被烧写到系统的Flash存储器中。,并将u-boot存放在Flash芯片的特定地址范围内。在某些嵌入式系统中,u-boot可以存放在。

2023-09-11 13:24:22 232

原创 Linux 下 C语言版本的线程池

线程池是一种多线程处理形式,处理过程中将任务添加到队列,然后在创建线程后自动启动这些任务。线程池线程都是后台线程。每个线程都使用默认的堆栈大小,以默认的优先级运行,并处于多线程单元中。如果某个线程在托管代码中空闲(如正在等待某个事件), 则线程池将插入另一个辅助线程来使所有处理器保持繁忙。如果所有线程池线程都始终保持繁忙,但队列中包含挂起的工作,则线程池将在一段时间后创建另一个辅助线程但线程的数目永远不会超过最大值。超过最大值的线程可以排队,但他们要等到其他线程完成后才启动。// 线程池结构体。

2023-09-07 13:40:50 472

原创 C++ 访问与继承权限

用关键字private修饰的成员称为私有成员,私有数据成员和成员函数。用关键字public修饰的成员称为公有成员,公有数据成员不仅可以在。用关键字protected修饰的成员称为保护成员,保护数据成员。,保护成员函数只允许在本类以及其子类中调用。private为类默认的访问权限限定符。,公有成员函数可以在类的内部和外部调用。

2023-09-02 13:14:21 107

原创 C++ 浅拷贝和深拷贝

使拷贝后的对象指针成员有自己的内存空间,即进行。

2023-09-02 11:38:34 628

原创 C++ 虚函数与纯虚函数

在这个示例中,我们在Shape基类中定义了两个纯虚函数area和draw。在main函数中,我们创建了一个Shape类型的指针数组,并将其指向两个不同类型的对象。在这个示例中,我们定义了一个Shape基类,它包含一个虚函数area。如果在派生类中不想实现某个纯虚函数,可以将其声明为虚函数,并提供一个默认实现。这个默认实现可以是一个空函数体,也可以是一个具体的实现,具体的实现可能会在某些情况下有用。虚函数是一种在基类中声明的函数,可以在派生类中进行重写。,根据对象的类型确定调用的函数版本,这就是所谓的。

2023-09-02 10:18:24 207

原创 LED 驱动 —— 最简单的 LED 驱动程序

字符设备驱动程序的框架:编写驱动程序的套路:驱动怎么操作硬件?驱动怎么和 APP 传输数据先编写驱动程序:

2023-08-24 18:20:29 692

原创 LED 驱动 —— 普适操作 GPIO 方法

可以设置对应寄存器使能某个 GPIO 模块(Module)有些芯片的 GPIO 是没有使能开关的,即它总是使能的参考资料:芯片手册《Chapter 28: General Purpose Input/Output(GPIO)》有 5 组 GPIO( GPIO1~GPIO5),每组引脚最多有 32 个,但是可能实际上并没有那么多。GPIO1 有 32 个引脚: GPIO1_IO0~GPIO1_IO31;GPIO2 有 22 个引脚: GPIO2_IO0~GPIO2_IO21;

2023-08-24 17:50:02 247

原创 SPI 通信详解

缺点:存在一些资源浪费的现象,比如只需要单方向传输数据却又双方交换数据。,数据在SCK时钟的下降沿切换。,数据在SCK时钟的上升沿切换。,数据在SCK时钟的上升沿切换。,数据在SCK时钟的下降沿切换。,数据在SCK时钟的。,数据在SCK时钟的。,数据在SCK时钟的。,数据在SCK时钟的。

2023-08-23 22:37:04 189

原创 I2C 通信详解

对于指定设备(Slave Address),在指定地址(Reg Address)下,写入指定数据(Data)。对于指定设备(Slave Address),在指定地址(Reg Address)下,读取从机数据(Data),依次循环上述过程8次,即可接收一个字节(主机在接收之前,需要释放SDA)类似 123 木头人游戏。SCL 低电平期间,主机将数据位依次放到SDA线上。:SCL高电平期间,SDA从高电平切换到低电平。:SCL高电平期间,SDA从低电平切换到高电平。(主机在接收之前,需要释放SDA)

2023-08-23 17:59:07 2275 4

原创 串口通信详解

将一个设备的数据传送到另一个设备,扩展硬件系统制定通信的规则,通信双方按照协议规则进行数据收发有CLK时钟信号线的通信协议是同步协议I2C(SCL)、SPI(SCLK)同时具备接收信号线和发送信号线的通信协议是全双工USART(RX、TX)、SPI。

2023-08-23 13:06:57 160

原创 Linux 软链接与硬链接

它引用的是文件在文件系统中的物理索引(也称为inode)。当移动或者删除原始文件时,硬链接不会被破坏,因为它所引用的是文件的物理数据而不是文件在件结构中的位置。,是linux特殊文件的一种,作为一个文件,它的数据是它所连接的文件的路径。,如果原始文件被删除,所有指向它的符号链接也就都被破坏了。(仅此而已),说白了,

2023-08-17 16:11:05 47

原创 Linux 驱动认知与开发流程

1)内核驱动基本框架:驱动代码编写:参考pin4driver2.c:(2)内核驱动编译:把驱动代码拷贝至 driver/char修改Makefile ,告诉编译器,要编译该驱动文件,驱动代码文件放在哪个目录下就修改哪个目录下的Makefile文件(3)驱动测试步骤:内核驱动装载:内核驱动卸载:sodu rmmod xxx 不需要写ko查看内核模块:lsmod(4)验证步骤:装载驱动驱动装载后生成设备,比如:/dev/pin4,通过。

2023-08-16 17:32:02 377

原创 Linux 内核编译与移植

初始化时钟,关闭看门狗,关中断,启动 ICACHE,关闭 DCACHE 和 TLB,关闭MMU,初始化 SDRAM,初始化 FLASH、串口,IIC、驱动等,重定位。二阶段:初始化一个串口,检测系统内存映射,将内核映象和根文件系统映象从 Flash上读到SDRAM空间中,为内核设置启动参数,调用内核引导Linux内核启动2. Linux 源码目录树分析。

2023-08-16 16:35:21 422

原创 Linux 内核认知

Linux 内核主要包括5个模块:进程调度模块、内存管理模块、文件系统模块、进程间通信模块和网络接口模块。由上图可以认识到 Linux 分为三个层次:用户级、内核级、硬件级。调用 sys_call、然后调用 VFS 中的sys_open,的时候,系统就会启动一个 shell 程序, 此时它就会。所有的模块都要通过进程调度来运行。,read、write 等类似。调用 open 会通过。

2023-08-16 15:21:39 35

原创 Linux 文件系统目录结构

文件名称区分大小写( 大小写敏感还需要看具体的文件系统格式 ),以.开头的为隐藏文件,路径用/来进行分割(windows中使用\来分割)不以斜杠开始,指该文件相对于该目录的路径或某个目录的路径,不以根开始。可以作为一个简短的形式来指定一个文件名,但不具备普适性。文件名最长为255字节(字节,不是字符)。包括路径在内的文件名称最长为4095字节。文件颜色显示不同,代表了不同的文件格式。以正斜杠开始,表示该文件从根目录开始的完整位置路径,必须以根开始。在Linux系统中,目录被组织成一个:单根倒置树结构,

2023-08-16 14:52:21 133

原创 Linux 文件系统认知

windows: 随意(面向普通用户PC),目录即分区:C(装系统的位置)也可以随意在C盘存放文件. D盘(用户随意发挥)Linux: 按照功能来分区,每个分区严格存放文件(开发者),嵌入式系统可以分为4个区bootloader: 启动代码para: 启动代码向内核传递参数的位置kernel: 内核分区根分区:文件系统结构。

2023-08-16 14:39:41 29

原创 Linux 系统调用和库函数的区别

从用户的角度来看,系统调用和库函数似乎没有什么区别,它们都是以 C 函数的形式出现并且两者都为应用程序提供服务。但从实现者角度来看,它们之间是有根本的区别。那么,它们之间到底有哪些不同呢?在说明之前,先简单了解以下系统调用和库函数。双缓冲技术移植性系统调用本身性能缺陷系统调用和库函数的区别_系统调用与库函数和实用程序有什么区别_守望之名的博客-CSDN博客。

2023-08-16 13:42:44 133

原创 TCP 三次握手与四次挥手

作为例子,考虑计算机S和C之间的通信,假定C给S发送一个连接请求分组,S收到了这个分组,并发 送了确认应答分组。可是,C在S的应答分组在传输中被丢失的情况下,将不知道S 是否已准备好,不知道S建立什么样的序列号,C甚至怀疑S是否收到自己的连接请求分组。在这种情况下,C认为连接还未建立成功,将忽略S发来的任何数据分 组,只等待连接确认应答分组。但是关闭连接时,当Server端收到FIN报文时,很可能并不会立即关闭SOCKET,所以只能先回复一个ACK报文,告诉Client端,"你发的FIN报文我收到了"。

2023-08-16 12:28:03 48

原创 Socket、TCP、HTTP 三者区别与联系

套接字(socket)是通信的基石,是支持TCP/IP协议的网络通信的基本操作单元。它是网络通信过程中端点的抽象表示,包含进行网络通信必须的五种信息:连接使用的协议,本地主机的IP地址,本地进程的协议端口,远地主机的IP地址,远地进程的协议端口。应用层通过传输层进行数据通信时,TCP会遇到同时为多个应用程序进程提供并发服务的问题。多个TCP连接或多个应用程序进程可能需要通过同一个 TCP 协议端口传输数据。

2023-08-16 12:04:58 515

原创 FreeRTOS 优先级反转与优先级继承

优先级反转的问题在于,LPTask 低优先级任务获得了锁,但是它优先级太低而无法运行。如果能提升 LPTask 任务的优先级,让它能尽快运行、释放锁,"优先级反转"的问题不就解决了吗?举个栗子:假设任务 A、B 都想使用串口,A 优先级比较低。如果涉及 3 个任务,可以让"优先级反转"的后果更加恶劣。

2023-08-08 14:58:44 338

原创 C 语言内存分配

栈又称堆栈,是用户存放程序临时创建的变量,也就是我们函数{}中定义的变量,但不包括static声明的变量,static意味着在数据段中存放变量。除此之外,在函数被调用时,其参数也会被压入发起调用的进程栈中,并且待到调用结束后,函数的返回值也会被存放回栈中,由于栈的先进后出特点,所以栈特别方便用来保存、恢复调用现场。bss段的特点就是被初始化为0,bss段本质上也是属于数据段,bss段就是被初始化为0的数据段。堆是用来存放进程中被动态分配的内存段,它的大小并不固定,可动态扩张或缩减。

2023-07-25 17:27:27 46

原创 LeetCode 485 最大连续 1 的个数

如代码所示,问题就出现在第二个 while 循环的条件判断上,while(case1 && case2) 和 while(case2 && case1) 是有区别的,区别在于如果第一个条件不满足的情况下,第二个条件是不会运行的。这就导致了如果上一次 right++ 导致 index 越界想着下次不进入循环的情况下,如果访问条件放在第一个位置,下一次再进行判断时就会访问到越界的索引导致出现段错误。因此正确的习惯是优先判断索引不要越界,要是越界了就不会判断其他条件直接退出 while 判断。

2023-04-21 22:58:18 88

原创 刷题 | 杨辉三角

输入为一行,输入一个整数。在屏幕上打印杨辉三角。

2022-10-30 11:01:10 104

原创 树莓派解决 vim 编辑器中文乱码问题

我们用电脑编写程序的时候避免不了都会写很多中文注释,当我们把 file.c 文件拉到树莓派用 vim 编辑器打开时经常会发现里面的中文已经成为乱码,为了解决这个问题本人也寻找了很多的方案,但是最终都不管用,直到尝试了以下的一种方案后把中文乱码问题解决。

2022-09-07 16:28:15 757 1

原创 Linux 网络编程项目 —— FTP 网盘

1. LS —— 展示服务端文件,用法:lls2. PWD —— 展示服务端的当前路径,用法:pwd3. CD —— 用于切换服务端的路径,用法:cd path4. RM —— 用于删除服务端的文件,用法:rm file5. GET —— 下载服务端文件至客户端本地,用法:get file6. PUT —— 把客户端本地文件上传至服务端,用法:put file

2022-09-01 21:30:05 2264

原创 Linux 网络编程 —— socket 网络编程

【代码】Linux 网络编程 —— socket 网络编程。

2022-08-31 20:20:37 377

原创 Linux 网络编程 —— 网络基础与相关 API

IP地址是Internet中主机的标识,Internet中的主机要与别的机器通信必须具有一个IP地址,IP地址为32为(Ipv4)或者128位(Ipv6),每个数据包都必须携带目的IP地址和源IP地址,路由器依靠此信息为数据包选择路由。是一个编程接口,是一个特殊的文件描述符(对他执行IO的操作函数,比如read,write,close等),并不仅限于TCP/IP协议,面向连接TCP,无连接UDP。表示的形式:常用点分形式,如202.38.64.10,最后都会转化成一个32位的无符号整数。..........

2022-08-31 18:25:41 874

原创 Linux 线程 —— 条件变量与信号量

生产者生产一个节点,消费者就删除一个,没有发生数据混乱。例子:生产者和消费者模型。使用条件变量+互斥量。

2022-08-30 16:20:16 239

原创 Linux 线程 —— 锁相关

【代码】Linux 线程 —— 锁相关。

2022-08-30 11:11:14 953

原创 Linux 线程 —— 概念与函数

解决方法:线程同步,使用锁。就像上厕所一样,一个厕所只能一个人使用,想要使用厕所都需要把锁锁上防止别人进来,因此只有拿到锁才可以对共享资源进行操作,这样就保证了一个线程在操作共享资源的时候不会受到另一个线程的影响,避免了造成数据混乱。linux中,线程又叫做轻量级进程(light-weight process LWP),也有PCB,创建线程使用的底层函数和进程底层一样,都是clone,但没有独立的地址空间;线程是一个进程内部的控制序列。进程内部是指虚拟地址空间。.........

2022-08-29 21:50:42 520

原创 Linux 进程间通信面试总结

Linux 进程间通信面试总结

2022-08-28 16:14:52 321

原创 Linux 进程间通信 —— 信号与信号灯

Linux 进程间通信——信号与信号灯

2022-08-28 13:36:04 522

原创 Linux 进程间通信 —— 消息队列与共享内存

Linux 进程间通信——消息队列与共享内存

2022-08-24 22:57:12 615

原创 Linux 进程间通信之 PIPE 与 FIFO

Inter Process Communication 进程间通信。

2022-08-24 15:47:23 544

原创 嵌入式 Linux 进程相关知识点

我们用 fork 函数创建新进程后,经常会在新进程中调用 exec 函数去执行另外一个程序。当进程调用 exec 函数时,该进程被完全替换为新程序。因为调用 exec 函数并不创建新进程,所以前后进程的ID并没有改变。

2022-08-24 01:54:21 331

原创 嵌入式 Linux 应用之进程

进程基本的状态有五种,分别为初始态,就绪态,运行态,挂起态和终止态。其中初始态为进程准备阶段,常常与就绪态结合来看。证明了 fork 后父子进程之间不可通过全局变量通信,父子进程两者之间的数据互不干涉,各自运作。>0:当前进程为父进程。vfork也可以创建进程,与fork有什么区别呢?fork 之前两个地址空间区数据完全相同,返回值: =0:当前进程为子进程。

2022-08-23 20:35:24 216

原创 Linux 静态库与动态库

函数库目录:/lib /usr/lib。以下以 main.c 和 sub.c 为例子生成静态库和动态库并使用。

2022-08-20 13:46:57 162

转载 open 与 fopen 的区别

就是open无缓冲,fopen有缓冲。前者与read,write等配合使用, 后者与fread,fwrite等配合使用。使用fopenread,write);而使用open函数,在文件读写时则每次都需要进行内核态和用户态的切换;表现为,如果顺序访问文件,fopen系列的函数要比直接调用open系列的函数快;如果随机访问文件则相反。这样一总结梳理,相信大家对于两个函数及系列函数有了一个更全面清晰的认识,也应该知道在什么场合下使用什么样的函数更合适,效率更高。

2022-08-19 23:31:27 125

原创 嵌入式Linux应用之文件

Linux 文件基本函数与实现 cp 指令

2022-08-19 19:33:01 423 1

空空如也

空空如也

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

TA关注的人

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