- 博客(42)
- 收藏
- 关注
原创 Makefile的编写
为什么要使用makefile:自动化编译:避免手动输入复杂的编译命令尤其是对于大型项目有超多.c文件。增量编译:只重新编译修改过的文件,提高效率。跨平台兼容:在不同系统上保持一致的编译规则。make 工具工程管理器,顾名思义,就是管理较多文件根据文件依赖关系自动编译程序,避免重复编译未修改的文件。检查目标文件是否存在。检查依赖文件是否比目标文件新。若依赖更新或目标不存在,则执行命令重新生成目标。安装makeMakefile 文件Makefile是一个。
2025-05-15 10:30:38
1089
原创 Linux网络编程实现FTP服务器
程序运行,服务端不断接收客户端指令,服务端可同时处理多个客户端接入并对指令作出解析,并把执行结果返回给客户端,客户端根据服务端对指令的解析并把由服务端传递过来的处理信息通过客户端呈现给客户,实现文件的各种操作。Linux网络编程实现的FTP服务器,服务器由服务端和客户端组成,具有浏览远程服务端的文件和浏览客户端本地文件,同时支持对远程服务端文件的删除,存储,归档操作处理,以及客户端对远程服务端文件的上传和下载。1.socket 创建客户端的套接字,构建客户端和服务端发送和接收信息的桥梁。
2025-05-11 19:33:55
539
原创 Linux网络编程
字节序是指数据在计算机内存中存储或传输时字节的顺序。主要有大端字节序(Big - Endian)和小端字节序(Little - Endian)两种。在不同字节序的系统间进行数据传输或共享时,需进行字节序转换,否则会导致数据错误。例如,大端序系统发送的数据,小端序系统接收后需转换字节序才能正确解析。也叫大端序或大字节序。数据的高位字节存于低地址,低位字节存于高地址。
2025-05-09 19:57:03
1060
原创 Linux线程
线程(Thread)也被叫做轻量级进程(Lightweight Process,LWP),它是程序执行流的最小单元。如果把进程看做成一个工厂的话,那么线程就是工厂里的工人,所以一个进程里能够包含多个线程,这些线程会共享进程的大部分资源,像内存空间、文件描述符等,不过每个线程都有自己独立的程序计数器、栈空间和寄存器组。线程能够并发执行,从而提升程序的性能与响应速度。在 Linux 系统中,线程的实现依赖于内核调度器,内核会把线程当作独立的调度单元,按照调度算法来分配 CPU 时间片。
2025-05-07 15:33:59
936
原创 Linux进程间的通信
IPC 即 Inter-Process Communication,也就是进程间通信,它指的是在不同进程之间进行数据交换和协调同步的机制。在操作系统里,每个进程都有自己独立的内存空间,一般情况下不能直接访问其他进程的内存,所以需要借助 IPC 机制来实现进程间的信息交互与协作。进程间通信常用的几种方式1.管道通信:有名管道,无名管道2.消息队列3.共享内存4.信号量5.套接字。
2025-05-05 19:11:25
1886
原创 Linux进程
进程是指在系统中正在运行的一个应用程序的实例,是操作系统进行资源分配和调度的基本单位。它包含了程序执行的上下文环境,包括程序计数器、寄存器、堆栈以及程序代码和数据等。
2025-05-04 15:26:00
1095
原创 Linux文件编程和库的制作
此时main函数的参数argc的值为3,数组argv[0]存放的是./a.out,argv[1]存放的是demo.c,argv[2]存放的是demo1.c。时不能指定缓存的长度,这样就可能造成缓存越界(如若该行长于缓存长度),写到缓存之后的存储空间中,从而产生不可预料的后果;O_CREAT:如果文件不存在,就创建该文件。:文件的路径名,如果只写文件名,就默认当前目录,如果在文件名加上路径,就按照绝对路径来打开文件。例如文件a.c:用户的权限是:可读可写,组用户的权限是:可读可写,其他用户的权限是:可读。
2025-05-03 12:01:23
1065
原创 FreertosHAL库_学习笔记
队列集(Queue Set)是一种用于管理多个队列的机制,本质也是一个队列,只不过里面存放的是各队列的句柄,它允许任务同时等待多个队列中的数据,多队列管理:可以将多个队列组合在一起,通过一个队列集句柄进行统一管理。则在等待的时间里该任务处于阻塞状态,会被放到管理阻塞任务的链表里这时任务调度器在管理就绪态的链表里选择任务时就不会选到该任务,当等待的时间到了时该任务又会被放进就绪态任务链表,当每个函数都阻塞态时空闲任务就会出来处理那些“自杀”的任务,释放他们的栈。:是一种特殊的计数信号量,计数值只能是0或1。
2025-04-13 20:45:36
973
原创 STM32HAL库_学习笔记
进入CubeMX,先选好芯片,配置时钟源、系统定时、时钟树和其他所需功能,设置工程文件名和保存位置(最好预先新建一个文件夹用来保存工程,最后生成工程。GPIO初始化(通常在CubeMX里配置)main.c 在主函数的while循环里。
2025-04-13 17:47:21
572
原创 列表与列表项
例如,FreeRTOS 的任务就绪列表(pxReadyTasksLists)是一个列表,每个任务的控制块(TCB)中的状态列表项(xStateListItem)会插入到对应的就绪列表中。- 列表项按 "xItemValue"(列表项的值)"升序排列",便于快速插入和查找(如任务优先级调度)。可以看出列表项3插在了列表项1和2之间,说明列表项的 "xItemValue"决定了它在列表中的位置(按升序排列)- pxIndex: 指向列表中的一个列表项,用于遍历列表(如任务切换时遍历就绪列表)。
2025-04-04 17:56:35
1122
原创 任务挂起和恢复
pdFALSE: 恢复运行的任务的任务优先级低于当前正在运行的任务(被中断打断的。该函数的参数依旧是任务句柄,但是该函数有两个返回值。pdTRUE: 恢复运行的任务的任务优先级等于或者高于正在运行的任务(被中断打。断的任务),这意味着在退出中断服务函数以后必须进行一次上下文切换。任务),这意味着在退出中断服务函数的以后不需要进行上下文切换。修改main.c:当震动传感器工作将任务1挂起。在中断服务函数中恢复任务1。任务挂起和恢复API函数。
2025-04-04 14:58:00
312
原创 动、静态创建任务
任务创建和删除API函数xTaskCreat() 、vTaskDelete()函数1.start_task: 用来创建其他两个任务 ,当此任务运行以后会调用删除任务vTaskDelete() 2.task1_task: 普通应用任务3.task2_task: 普通应用任务下面是动态创建任务用串口验证函数的执行:如果要使用静态方法需要将宏 ConfigSUPPORT_STATIC_ALLOCATION 设置为11.start_task: 用来创建两个任务。
2025-04-03 22:52:43
739
原创 FreeRtos简介
为了做到这一点,每个任务都必须有个堆栈,当任务切换的时候将上下文环境保存在堆栈中,这样当任务再次执行的时候就可以从堆栈中取出上下文环境,任务恢复运行。在抢占式调度机制下,当一个高优先级任务进入就绪态时,它会立即抢占当前正在运行的低优先级任务的CPU资源,使低优先级任务进入就绪态或阻塞态,高优先级任务开始运行。前后台系统虽然简单和消耗资源少,但是实时性差,前后台系统各个任务都是排队等待轮流执行,不管多紧急的程序,没有轮到执行就只能排队等候,相当于每个任务的优先级都是一样的,所以在这个时候就需要多系统出马了。
2025-04-03 18:19:13
855
原创 SPI-NRF24L01
NRF24L01是NORDIC公司生产的一款无线通信芯片,采用FSK调制,内部集成NORDIC自己的Enhanced Short Burst 协议,可以实现点对点或者1对6 的无线通信,通信速率最高可以达到2Mbps. NRF24L01采用SPI通信。①MOSI 主器件数据输出,从器件数据输入②MISO 主器件数据输入,从器件数据输出③SCK 时钟信号,主器件产生④CSN 从器件使能信号⑤CE 使能器件的发送模式或接收模式⑥IRQ 中断信号,发生中断变低电平。
2025-03-30 18:58:54
349
原创 STM32-DMA
1.M - > M: Flash to SRAM, 内部FLASH (CODE)的数据传输到内部的SRAM(变量)2.M -> P : SRAM to 串口 + LED,延时DMA传输数据不需要占用CPU注:当源端数据宽度和目标数据宽度不一样时可参考中文参考手册DMA模块数据对齐表。
2025-03-30 16:47:27
605
原创 SPI接口
SPI,是一种高速的,全双工,同步的通信总线,并且在芯片的管脚上只占用四根线,节约了芯片的管脚,同时为PCB的布局上节省了空间,提供方便,主要应用在EEPROM,FLASH,实时时钟,AD转换器还有数字信号处理直接。SPI接口一般使用四根线:MISO,主设备数据输入,从设备数据输出MOSI,主设备数据输出,从设备数据输入SCLK,时钟信号,由主设备产生CS,从设备片选信号,由主设备控制。
2025-03-30 15:53:25
715
原创 51单片机LCD1602显示温湿度
LCD1602 (LiquidCrystal Display)液晶显示屏是一种字符型液晶显示模块,可以显示ASCII码的标准字符和其他的一些内置特殊符号,还可以有8个自定义字符。显示容量:16X2个字符,每个字符为5*7点阵。R/W :读写,写-高,读-低,E: 使能高电平有效。RS:设置指令/数据,数据-高,指令-低。CGRAM+CGROM(字模库)DDARM数据显示区。DB0-DB7:数据。
2025-03-30 12:34:31
387
1
原创 STM32软件IIC实现OLED显示字符串、汉字、数字和温湿度
DHT11数字温湿度传感器是一款含有已校准数字信号输出的温湿度复合传感器,应用于专用数字模块采集技术和温湿度传感技术,确保产品具有极高的可靠性和卓越的长期稳定性。传感器包括一个电阻式感湿元件和一个NTC测温元件,并与一个高性能八位单片机相连接。采用单线制串口行接口,信号传输距离可达20M以上。应用于通暖空调,汽车,自动控制设备,气象站家电 湿度调节器,医疗,除湿器等等。
2025-03-28 10:02:00
559
原创 STM32硬件IIC与OLED使用
OLED即有机发光管(Organic Light-Emitting Diode,OLED)。OLED显示技术具有自发光、广视角、几乎无穷高的对比度、较低功耗、极高反应速度、可用于绕曲性面板、使用温度范围广、构造及制程简单等有点,被认为是下一代的平面显示屏新兴应用技术 OLED显示和传统的LCD显示不同,其可以自发光,所以不需要背光灯,这使得OLED显示屏相对于LCD显示屏尺寸更薄,同时显示效果更优。常用的OLED屏幕有蓝色、黄色、白色等几种。
2025-03-27 22:11:55
1134
原创 IIC协议以及STM32IIC的特性和架构
IIC引脚少,硬件实现简单,可拓展性强,不需要UASRT,CAN通讯协议的外部收发设备,被广泛使用在系统内多个集成电路IC(芯片)间的通讯,采用半双工的通讯方式。IIC一个支持多设备的总线。”总线”指多个设备共用的信号线,在一个IIC通讯总线中,可连接多个IIC通讯设备,支持多个通讯主机及多个通讯从机。一个IIC总线只使用两条总线线路,一条双向串行数据线(SDA),一条串行时钟线(SCL)。数据线即用来表示数据,时钟线用于数据收发同步。
2025-03-27 21:18:19
1357
原创 51单片机_学习笔记
定时器在单片机内部就像一个小闹钟一样,根据时钟的输出信号每隔“一秒”,计数单元的数值就加以,当计数单元数值增加到“设定的闹钟提醒时候”时,计数单元就会向中断系统发出中断申请,产生“响铃提醒”,使得程序跳转到中断服务程序。注意:定时器的资源和单片机的型号是关联在一起的,不同的型号可能会有不同的定时器个数和操作方式,但一般来说,T0和T1的操作方式是所有51单片机所共有的。注意: 中断的资源和单片机的型号是关联在一起的,不同的型号可能会有不同的中断资源,例如中断源个数不同,中断优先级个数不同等等。
2025-03-21 19:41:09
1095
原创 4.定时器TIM、系统定时器systick和垃圾桶项目
如果ARPE为1,ARR寄存器的那日同将在每次的更新时间UEV发生时,传送到影子寄存器;STM32的定时器除了TIM6和TIM7(基本定时器)之外,其他的定时器都可以产生PWM波输出,高级定时器TIM1,TIM8可以同时产生7路PWM输出,而通用定时器可以同时产生4路PWM输出,这样STM32可以最多同时输出30路PWM输出。时基单元就是定时器框图的第二部分,它包括三个寄存器,分别是:计数器寄存器(TIMx_CNT)、预分频器寄存器(TIMx_PSC)和自动装载寄存器(TIMx_ARR)。
2025-03-19 15:03:35
1348
原创 3.串口USART和蓝牙控制led灯
3.在绝大多数场合下,发送端和接收端,采用的都是同一个时钟,所以在传送数据的同时还要发送时钟信号,以便接收端可以使用时钟信号来确定每一个信息位。·校验位:数据位加上这一位之后,使得“1”的位数应为偶数(偶校验)或者奇数(奇校验),以此来校验数据传送的正确性,校验位是可选的,可以不传输。5.字符帧也叫做数据帧,由起始位,数据位,奇偶校验位,停止位等部分组成,是异步通信的一个重要指标。6.同步通信的另一个重要指标是波特率。在嵌入式中,有众多的通信协议,往往从性能,成本,稳定性,易用性等角度考虑选择合适的协议。
2025-03-15 22:32:48
1144
原创 2.外部中断EXTI和外部中断按键控制led灯
但是,STM32并没有使用CM3内核的全部东西,而是只用了它的一部分。STM32有84个中断,包括16个内核中断(异常)和68个可屏蔽中断,具有16级可编程的中断优先级。同时,对每个中断设置一个抢占优先级和响应优先级。概念:在主程序运行过程中,出现了特定的中断触发条件,使得CPU暂停当前正在运行的程序,转而去处理中断程序,处理完后又返回原来被暂停的位置继续运行。概念:重映射属于复用功能的另外一个功能,可以把具有特殊功能的引脚,分配到其他引脚上去,如果某个功能被重映射了,那么这个功能将不再遵循其默认的分配。
2025-03-15 17:53:05
775
原创 1.基本GPIO控制和振动传感器控制继电器、led灯
时钟信号的稳定性和配置直接影响芯片的性能、功耗和外设功能。HAL库是近几年官方极力推荐的库,覆盖了全系列的芯片,可以说HAL库就是用来取代标准库的,相对标准库,HAL库有着更高的抽象、整合水平,它的API更多的集中关注在外设的公共函数功能,HAL库的移植性好,它在STM32中的通用性很强。两个上下拉电阻开关均断开,没有上拉也没有下拉,I/O引脚直接连接TTL肖特基触发器,此时,I/O引脚浮空,读取的电平是不确定的,外部信号是什么电平,MCU引脚就输入什么电平,MCU复位上电后,默认为浮空输入模式。
2025-03-14 18:48:36
815
原创 13.链表
将p0->num与p1->num相比较,如果p0->num > p1->num,此时将p1往后移,并使p2指向刚才p1所指的结点。为了解决上述问题,C语言提供了一些内存管理函数,这些内存管理函数可以按需要动态地分配内存空间,也可把不再使用的空间回收待用,为有效地利用内存资源提供了手段。2.如果相等就将该结点删除,如不相等,就将p后移一个结点,再如此下去,再如此进行下去,直到遇到表尾为止。1.从p指向的第一个结点开始,检查该结点中的Num值是否等于输入的要求,删除的那个学号。如果分配不成功,返回NULL;
2025-03-09 22:22:58
904
原创 12.结构体
struct 结构名成员表列成员列表由若干个成员组成,每个成员都是该结构的一个组成部分。对每个成员也必须作类型说明,其形式为:类型说明符 成员名;int num;1.2.1在声明类型的同时定义变量,这种形式的定义一般形式为:struct 结构名成员表列}变量名表列;int num;在定义了结构体变量之后,系统会为之分配内存单元1.2.2也可以直接定义结构体类型变量(即不出现结构体名)struct成员表列}变量名表列;
2025-03-09 12:00:11
1101
原创 11.宏定义
无参宏的宏名后不带参数其定义一般形式为: #define 标识符 字符串其中的"#”表示这是一条预处理命令凡是以# 开头的均为预处理命令,Define 为宏定义 命令,“标识符”为所定义的宏名,“字符串”可以是常数、表达式、格式串等。1.宏定义是用宏名来表示一个字符串,在宏展开时又以该字符串取代宏名,这只是一种简单的替换,字符串中可以含任何字符,可以是常数,也可以是表达式,预处理程序对它不做任何检查。如有错误,只能在编译已被宏展开后的源程序时发现。
2025-03-08 18:00:16
1003
原创 10.函 数
函数调用可以作为一个运算量出现在表达式中,也可以单独形成一个语句,对于无返回值的函数来讲,只能形成一个函数调用语句。·被调用函数中对形参的操作,将直接改变实参的值(被调用函数对指针的目标操作相当于对实参本身的操作)· 全局变呈就是在函数体外说明的变量,它在程序中的每个函数里都是可见的。·实参就是在使用函数时,调用函数传递给被调用函数的数据,需要确切的数据。·形参是新开辟的存储空间,因此在函数中改变形参的值,不会影响到实参。·函数指针用来存放函数的地址,这个地址是一个函数的入口地址。
2025-03-04 16:53:36
917
原创 9.指 针
px-py运算的结果是两个指针指向的地址位置之间相隔的数据个数,因此,两个指针相减不是两个指针持有的地址值相减的结果。int a[3][3],含有三个元素,a[0],a[1],a[2],元素a[0],a[1],a[2]都是一维数组名。在C语言中,内存单元的地址称为指针,专门用来存放地址的变量,有时对地址,指针和指针变量不区分,统称指针。1.指针变量+1,是向地址大的方向移动一个目标数据。·在C语言中,数组的指针是指数组在内存中的起始地址,数组元素的地址是指数组元素在内存中的起始地址。
2025-03-02 17:06:35
494
原创 8.字符数组和字符串
2.连接前,两串均以‘\0’结束,连接后,串1的‘\0’取消,新串最后加‘\0’·比较规则:将两串字符串从左向右逐个字符比较(ASCII),直到遇到不同字符或‘\0’为止。C语言中没有字符串常量,用字符数组处理字符串,字符数组结束标识:‘\0’·strncpy(p,p1,n),复制指定长度字符串。·strncat(p,p1,n),附加指定长度字符串。·strncmp(p,p1,n),比较指定长度字符串。·格式:strcpy(字符串1,字符串2);·格式:strcmp(字符串1,字符串2)
2025-02-28 19:44:14
405
原创 7.数 组
1.所谓一维数组是指只有一个下标的数组,它在计算机的内存中是连续存储的2.c语言中,一维数组的说明一般形式如下:<存储类型><数据类型><数组名>[<表达式>]例如: int [6]数组名表示内存首地址,是地址常量。sizeof(数组名)是数组占用的总内存空间编译时分配连续的内存,内存字节数=数组维数*sizeof(元素数据类型)注意事项:1.C语言对数组不做越界检查,使用时要注意int a[5];a[5] = 10;2.关于用变量定义数组维数int i = 5;int a[i];
2025-02-27 23:11:06
283
原创 6.控制语句
break语句用于强行跳出switch体,一般每个case后面应有一个break语句,defalut分支后的break可以省略。如:if(a==b && x==y)printf("%d",x);如:if(‘a’)printf("%d",x);·当表达式的值与case后面的常量表达式的值相等时,就执行case后面的语句。3.注意区分if(x=1)和if(x==1)的不同。1.语句块,当有若干条语句的时候,比喻用(......)括起来。if() 语句3。else if(表达式2)语句块2。
2025-02-27 17:42:31
582
原创 5.输入与输出
说明2:与scanf函数不同,字符串并不以空格作为字符串输入结束的标志。·功能:按指定格式从键盘读入数据,存入地址表指定单元中,并按回车键结束。则x = 2 ch = c(2和c之间的空格被"%*c""吃掉"了)格式说明:%[修饰符]格式字符,用于指定输出格式。·格式:int puts(const char*s)用"%c"格式符时,空格和转义字符作为有效字符输入。格式:printf("格式控制符",输出表)方法2:用格式串中空格或"%*c"来"吃掉"·格式:char*gets(char*s)
2025-02-25 20:52:15
659
原创 4.C语言中的运算符
c语言提供的算数运算符:+、-、*、/、%、++(float、double不能取余)逻辑与"&&"运算符的运算规律如下:短路特性-逢0截止。"的作用所以运行结果是"ture"逻辑异或"^"运算符运算规律如下:相同为假,不同为真。逻辑或"||"运算符的运算规律如下:短路-逢1截止。·<运算符>为左移(<<)或右移(>>)运算符;运算符的一般形式:sizeof(类型或变量名)<表达式2>:<表达式3>逗号运算符的运算结果由最后一个表达式决定。·<运算量>必须为整形结果数值;·<表达式>也必须为整形结果数值。
2025-02-25 17:02:20
735
原创 3.c语言中的变量
说明的变量只能在某个程序范围内使用,通常在函数体内或函数中的复合语句中(默认是随机数)。2. 只要程序没有结束,就不会随着说明他的程序段的约束而消失,他下次再调用该函数,该存储类型的变量不会重新说明,而且还保留上次调用存储。称为寄存器型,register变量想将变量放入CPU的寄存器中,这样可以加快程序的运行速度。extern为外部参照引用型,使用extern说明的变量是想引用在其他文件中的函数体外外部说明的变量。当变量在一个文件的函数体外说明,所有其他文件中的函数或程序段都可引用这个变量。
2025-02-24 19:07:53
259
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人