- 博客(43)
- 收藏
- 关注
原创 发电机项目 2/19
如果客户端发布到 MQTT 服务器,则客户端将是发送者,MQTT 服务器将是接收者。MQTT(Message Queuing Telemetry Transport,消息队列遥测传输协议),是一种基于发布/订阅(publish/subscribe)模式的“轻量级”通讯协议,该协议构建于TCP/IP协议上,由IBM在1999年发布。为此,带有唯一消息 ID 的消息会存储两次,首先来自发送者,然后是接收者。使用的发布/订阅消息模式,它提供了一对多的消息分发机制,从而实现与应用程序的解耦。(即点对点),而是由。
2024-02-20 21:29:37 390
原创 Linux编程1/5 栈和队列
增栈:栈的增长方向(自低向高),栈底在低地址,栈顶在高地址。减栈:栈的增长方向(自高向低),栈底在高地址,栈顶在低地址。栈底:不允许入栈、出栈的一端称为栈底。栈顶:允许入栈、出栈的一端称为栈顶。出栈(弹栈):将数据从栈中取出。空栈:栈针指向插入元素的位置。满栈:栈针指向栈顶元素的位置。入栈(压栈):将数据放入栈中。栈和队列:只允许在表的两端进行操作。栈和队列是两种特殊的表状结构。栈针:指向栈顶的位置。表:任意位置插入和删除。
2024-01-29 19:59:12 172
原创 Linux编程 1/2 数据结构
数据量的增长与程序运行时间增长所呈现的比例函数,则称为时间渐进复杂度函数简称时间复杂度。链式存储的表状结构,链表可以分为:单向链表、双向链表、循环链表、内核链表。1.只要空间足够,理论上可以存放无限个数据。1.数据访问不太方便(空间不连续)非线性结构(一对多、多对多)2.会使结构所占存储空间变大。2.链表插入和删除效率高。程序 = 数据结构 + 算法。
2024-01-29 17:31:52 266
原创 ARM 1.17
波特率(bandrate),指的是串口通信的速率,也就是串口通信时每秒钟可以传输多少个二进制位。比如每秒钟可以传输9600个二进制(传输一个二进制位需要的时间是1/9600秒,也就是104us),波特率就是9600。串口的通信波特率不能随意设定,而应该再一些值中去选择。一般常见的波特率是9600或者115200(低端的单片机如51常用9600,高端的单片机和嵌入式Coc一般用115200)。串口是一个泛称,UART、COM、TTL、,因此都被通称为串口。
2024-01-17 21:30:20 541
原创 ARM 1.16
面向连接面向连接,是指发送数据之前必须在两端建立连接。建立连接的方法是“三次握手”,这样能建立可靠的连接。建立连接,是为数据的可靠传输打下了基础。仅支持单播传输每条TCP传输连接只能有两个端点,只能进行点对点的数据传输,不支持多播和广播传输方式。面向字节流TCP不像UDP一样那样一个个报文独立地传输,而是在不保留报文边界的情况下以字节流方式进行传输。可靠传输对于可靠传输,判断丢包,误码靠的是TCP的段编号以及确认号。
2024-01-17 21:03:29 833
原创 ARM 1.15
带通滤波器是指能通过某一频率范围内的频率分量、但将其他范围的频率分量衰减到极低水平的滤波器,与带阻滤波器的概念相对。最简单的高通滤波器是“一阶高通滤波器”,它的的特性一般用一阶线性微分方程表示,它的左边与一阶低通滤波器完全相同,仅右边是激励源的导数而不是激励源本身。当较低的频率通过该系统时,没有或几乎没有什么输出,而当较高的频率通过该系统时,将会受到较小的衰减。信号能够通过电感的滤波器、或者通过电容连接到地的滤波器对于低频信号的衰减要比高频信号小,称为低通滤波器。低通滤波器原理很简单,它就是利用电容。
2024-01-17 19:41:31 452
原创 ARM 1.12
我们可以对T0设定一定的定时时间,当产生定时中断的时候对一个变量进行赋值,而这个变量在主程序运行的开始已经有了一个初值,在这里我们要设定的定时值要小于主程序的运行时间,这样在主程序的尾部对变量的值进行判断,如果值发生了预期的变化,就说明T0中断正常,如果没有发生变化则使程序复位。对于T1我们用来监控主程序的运行,我们给T1设定一定的定时时间,在主程序中对其进行复位,如果不能在一定的时间里对其进行复位,T1 的定时中断就会使单片机复位。在已制成的器件中,如果通过可靠的方法不能进行这项处理,将导致高故障率。
2024-01-15 09:28:20 858
原创 ARM 1.11
例如,在 ARM 架构中,SWI 指令后面可以跟一个 8 位或 24 位的软件中断号。8 位的软件中断号范围是 0 到 255,而 24 位的软件中断号范围是 0 到 16777215。这些中断号是全局唯一的,操作系统会根据这些中断号来识别和响应相应的软件中断。在C和C++等编程语言中,指针是一项重要的概念,掌握指针的使用对于理解和编写高效的代码非常重要。在汇编语言中,SWI(Software Interrupt)是一个特殊的指令,用于触发软件中断。通过指针,我们可以直接访问和操作内存中的数据。
2024-01-12 09:14:28 859
原创 Linux编程day15
backlog:尚未处理的连接请求最大等待个数。addr:存放请求方地址信息空间首地址。addrlen:请求方地址信息长度。buf:存放接收到的数据空间首地址。sockfd:套接字文件描述符。sockfd:套接字文件描述符。sockfd:套接字文件描述符。sockfd:套接字文件描述符。sockfd:套接字文件描述符。addrlen:IP地址的大小。flags:属性 默认为0。addr:对方的IP地址信息。buf:发送数据空间首地址。flags:属性默认为0。UDP MTU 最大为:1500。
2023-12-18 09:03:01 30
原创 Linux编程day15
backlog:尚未处理的连接请求最大等待个数。addr:存放请求方地址信息空间首地址。addrlen:请求方地址信息长度。buf:存放接收到的数据空间首地址。sockfd:套接字文件描述符。sockfd:套接字文件描述符。sockfd:套接字文件描述符。sockfd:套接字文件描述符。sockfd:套接字文件描述符。addrlen:IP地址的大小。flags:属性 默认为0。addr:对方的IP地址信息。buf:发送数据空间首地址。flags:属性默认为0。UDP MTU 最大为:1500。
2023-12-18 08:57:51 33
原创 linux编程day14
桥接模式:Ubuntu直接使用真实的网卡作为操作系统的网卡,通过实际网卡进行数据收发(网络传输不经过windows了)NAT模式:Ubuntu虚拟出来一个网卡,IP地址也是虚拟的,只要windows有网,Ubuntu就有网。发送方:sendto本身具有绑定的功能(IP地址绑定为当前主机的IP,端口号绑定随机端口)网段号:网络位不变,主机位全为0,则表示网段号 192.168.0.0。发送方 接收方。子网掩码对应的二进制形式中是1的部分对应IP地址的网络位。
2023-12-14 18:04:06 34
原创 linux编程day12
* operation flags */ 信号量的标志(SEM_UNDO)/* semaphore operation */ 对信号量的操作(+1, -1)SHM_RND 将离传入地址最近的能够映射的地址进行映射。IPC_CREAT 如果IPC对应的共享内存不存在就创建。shmaddr:将该地址(必须为4k的整数倍)映射到共享空间中。clientB.c将共享内存空间中的数据打印在终端。shmid:共享内存的ID号。
2023-12-11 21:22:34 33
原创 linux编程day11
SIGKILL(9) SIGSTOP(19) 不能被忽略和捕捉。SIGINT:打断进程任务 可以从终端输入(ctrl + c)SIGQUIT:让进程任务退出 可以从终端输入(ctrl + \)SIGTSTP:然进程任务挂起 可以从终端输入(ctrl + z)ipcrm -M/Q/S id(共享内存/消息队列/信号灯ID)ipcrm -m/q/s key(IPC对象名称)按下 ctrl + \ 打印 "SIGQUIT信号来了"按下 ctrl + c 打印 "SIGINT信号来了"
2023-12-11 21:13:56 35
原创 linux编程day5
哪些因素会影响到IO读写的时间?3.利用不同的标准IO接口创建一个2G的文件 分析效率(标准IO不同函数对完成时间的影响)7.利用不同的标准IO接口读取一个2G的文件 分析效率标准IO不同函数对完成时间的影响)4.切换写入文件中数组的大小创建一个2G的文件 分析效率(数据的缓存大小对完成时间的影响)8.切换操作文件中数组的大小读取一个2G的文件 分析效率(数据的缓存大小对完成时间的影响)二、利用写好的日志系统,实现利用不同的IO对2G的文件完成读写操作,测试不同IO函数接口的读写效率。
2023-12-07 21:11:02 31
原创 linux编程day3
2.行缓存: 与终端建立的缓存一般为行缓存 stdin stdout。缓存区满,刷新缓存区 与文件建立的缓存一般都为全缓存。1.利用IO相关函数接口实现,将一个文件中指定的字符串替换成另一个字符串。标准IO中的函数接口将数据放入缓存区中,满足刷新条件交给内核。打开文件获得操作文件的文件描述符(很小、非负整数)利用文件IO中的read和write实现文件内容的拷贝。1.主要用来操作设备文件以及除普通文件外其余类型的文件。
2023-12-07 21:09:24 33
原创 linux编程day2
2023 -> ASCII码文件 '2''0''2''3' -> 0011 0010 0011 0000 0011 0010 0011 0011。fgetc/fputc fprintf/fscanf fgets/fputs -> ASCII码文件。向文件中写入nmemb个对象,每个对象size个字节大小,存放在ptr指向的空间中。从流中读取nmemb个对象,每个对象size个字节,存放到ptr指向的空间中。1.利用fgetc和fputc实现将一个文件中的所有内存拷贝到另外一个文件中。
2023-12-07 21:06:31 30
原创 linux编程day1
tar -zcvf 文件名.tar.gz 文件夹/*tar -jcvf 文件名.tar.bz2 文件夹/*tar -zxvf 文件名.tar.gz。tar -jxvf 文件名.tar.bz2。find 路径 -name 文件名。1.用户多文件编程中指定代码的编译规则。du -m 文件夹。按照字符编码显示文件内容。获得指定目录下文件的大小。在指定路径下查找文件名。要生成文件:依赖的所有文件。按照字符显示文件内容。1.进入到工程目录中。
2023-12-07 21:03:31 26
原创 linux编程day10
申请:让资源数-1,如果当前资源数为0,申请资源时会阻塞等待,直到资源不为0,才能继续向下执行。考虑:实现全双工聊天,a.c可以给b.c发送多条信息, b.c可以给a.c发送多条信息。2.如果管道中写满(64k),阻塞等待,直到有数据读出才能继续写入。2.如果没有数据,阻塞等待直到读取到数据,再继续向下执行。1.write.c从终端接收内容,发送给read.c。1.如果管道中没有写满(64k),则直接写入。创建3个线程任务,任务一循环打印 "A",任务二循环打印"B",1.如果有数据,直接读取数据。
2023-12-07 20:59:24 28
原创 linux编程day9
'a': 采集线程如果正在打印内容,则不打印。1.分离属性优点: 线程结束时可以自动回收线程空间,避免多线程回收时阻塞引发僵尸线程的问题。'b': 存储线程如果正在打印内容,则不打印。'c': 告警线程如果正在打印内容,则不打印。'd': 日志线程如果正在打印内容,则不打印。日志线程如果没有打印内存,就打印内容。采集线程如果没有打印内存,就打印内容。存储线程如果没有打印内存,就打印内容。告警线程如果没有打印内存,就打印内容。2.加入属性优点: 可以实现线程的同步,获得线程结束的状态。
2023-12-06 21:55:55 16
原创 linux编程day8
多线程位于同一个进程空间内部,共享文本段、数据段、堆区,全局变量、静态变量、字符串常量、malloc空间都是共享的。多进程空间是独立的,任务调度时CPU需要在不同的进程空间切换,增大系统的资源开销。多线程共享同一进程空间,一个线程异常结束,会导致进程结束,其余线程均无法执行。多进程空间独立,没有共享空间,多进程间通信需要依赖第三方的文件才能实现通信。线程是独享 8M 栈区空间,其余进程中文本段、数据段、堆区与其余线程共享。多进程空间独立,一个进程异常结束,不会影响其余进程的执行。
2023-12-05 18:01:10 254
原创 linux编程day7
1.一个进程的父进程先结束,子进程会成为孤儿进程,被init进程收养,子进程再结束,被init进程回收空间。1.让父进程先结束,子进程成为孤儿进程,此时子进程再结束,会被系统进程回收进程空间。子进程结束,父进程没有回收子进程空间,子进程会成为僵尸进程。2.进程:程序运行的过程,包括进程的创建,进程的调度,进程的消亡。1.编写程序实现,创建一个父进程的两个子进程,在子进程。2.子进程结束,父进程回收子进程空间,避免产生僵尸进程。3.一个进程有多个子进程,wait回收先结束的子进程。
2023-12-04 17:45:21 29
原创 linux编程day4
静态内存分配是指内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在。该函数使用了while循环,每次比较两个字符串的当前字符是否相等,如果不相等则返回它们的差值,如果其中一个字符串已经到达了结尾,则返回0。printf("时间:%s IO地址:%s 端口号:%s\n", d, b, c);printf("IP地址:%s\n", AddPo1.address);printf("端口号:%s\n", AddPo1.port);printf("请输入端口号:");
2023-11-29 21:07:38 38 1
原创 单片机day3
是指存储在程序存储器中的代码段。在单片机中,程序存储器通常是只读存储器(ROM),用于存储程序的指令和常量数据。类型的无符号字符数组,它存储在程序存储器中。这意味着在程序执行期间,可以通过访问程序存储器来快速访问和执行。关键字通常用于将代码段存储在程序存储器中,以便在程序执行期间可以快速访问和执行。单片机中code unsigned int 的code意思?根据提供的引用内容,单片机中的。举个例子,以下是一个使用。
2023-11-22 09:02:46 45 1
原创 Cday16
1:算数右移 补零1。2.malloc()必须对返回值判空,否则可能出现程序奔溃;第n :a & (~(1 << (n - 1)))第n : a | (1 << (n - 1))short a =;(将a的第6个比特位置、清0)(将a的第6个比特位置1)返回值:申请成功返回申请到的连续空间的起始地址;交换:1.int swap = a;参数:size:申请的连续空间的字节数;操作对象为有符号数,高位是0 补零0。与0得0, 与1保持原值。或1置1, 或0保持原值。<<:左移运算符(双目运算符)
2023-11-14 21:06:07 46 1
原创 Cday15
如果一个规模较大的问题,可以不断的分解成为若干个规模较小的相似问题,一般可以使用函数递归思想解决。6.递归函数:在调用一个函数的过程中又出现直接或间接地调用该函数本身,称为函数的递归调用。1.带参宏不是函数, 不需要入栈出栈 传参 传递返回值,效率高于函数调用。注意:被调函数内部返回的指针一般不能是被调函数的局部变量;(1)封装简化有规律或重复性的代码,提高代码的复用性;指针函数是一个函数,返回值为指针类型的函数;1.递归需要函数反复的调用,(入栈 出栈 传参)函数的函数名是指向函数入口的地址;
2023-11-14 21:03:12 44 1
原创 Cday14
4和5 :定义了一个指针变量p,变量p自身空间不可以被修改,p指向的空间不能被修改,p = 不能作为左值, *p = 不能作为左值;1和2:定义了一个指针变量p, 变量p自身空间可以被修改,p指向的空间不能被修改, *p = 不能作为左值;3 :定义了一个指针变量p, 变量p自身空间不可以被修改,p指向的空间可以被修改, p = 不能作为左值。用途:1.被调想要修改主调空间的值,就需要对主调空间类型&,得到指向该类型的指针;2.指针的数组,在函数传参时,数组名对应类型为指向元素这个一级指针的指针;
2023-11-12 15:24:56 21
原创 Cday13
gets在读取超过数组空间的数时会接着给后写入,导致出现问题。数据通信过程中数据的字节顺序;处理器在存取处理内存中的数据时的字节顺序;union 共用体类型名 变量名;大端存储:地址低位保存数据高位;小端存储:地址低位保存数据低位;结构体成员在内存中空间独立;共用体成员在内存中空间共享;性别:字符 ‘J’ 'L'2.共用体类型变量的定义。数据类型1 变量名1;数据类型2 变量名2;数据类型3 变量名3;数据类型n 变量名n;
2023-11-12 14:57:03 19
原创 Cday12
内存对齐原则:1. 结构体的成员变量分配在内存中的起始地址一定是自身基本数据类型整数倍的地址编号;通过指向结构体变量的指针访问结构体内部成员变量时“->”(指向结构体成员运算符);通过结构体变量名访问结构体内部成员变量时“.”(结构体成员运算符);2. 结构体的大小必须是自身最大数据成员的整数倍。typedef 类型名 类型别名 (变量名的位置变成类型别名)练习:定义两个的结构体类型,日期:年月日 时间 时分秒。typedef 类型名 类型别名;2.结构体数据类型的变量定义。1.结构体数据类型的定义。
2023-11-08 21:35:49 25 1
原创 Cday11
自加:p++ ++p: p = p + 1 指针向高地址偏移自身指向空间的数据类型字节数;自减:p-- --p: p = p - 1 指针向低地址偏移自身指向空间的数据类型字节数;p - p(必须同种类型的指针):两个指针地址编号之间包含的指针所指向空间类型的数量;加法:p + N: 指针向高地址偏移自身指向空间的数据类型字节数的N倍个字节。减法:p - N: 指针向低地址偏移自身指向空间的数据类型字节数的N倍个字节。指针:指针的值是一个地址编号,指针具有指向性,具有类型,
2023-11-07 21:58:53 25 1
原创 Cday10
注意事项:1.当函数返回值类型不为void时, 必须写return 值否则是一个不确定的值;注意事项:1.当函数调用时传递的实际参数类型与形参不一致时,以形参类型为准,发生数据类型隐式转换;3.当函数返回值类型与实际返回的值的类型不一致时,以返回值类型为准,会发生数据类型隐式装换。(1) 修饰局部变量,称为静态变量,保存数据区,具有和全局变量一样的生存周期, 作用域不变。实参将值拷贝给形参;形参的空间与主调内实参的空间互相独立,仅存在拷贝关系;1.被调函数在主调执行到被调函数的函数调用语句时被执行;
2023-11-06 20:26:43 24
原创 Cday9
字符型数组,保存的是六个字符,是字符串。n:访问二维数组的第m+1(一维数组)元素的第n+1个元素。1.含义:由n个数据类型相同的一维数组所组成的数组;类型名:二维数组的元素一维数组的元素类型。N: 二维数组的元素一维数组的元素数量。
2023-11-05 19:22:34 27
原创 Cday8
2.需要的是一个整型常量或者整型常量表达式;练习:1.定义一个整型数组并且进行初始化;找到数组中的最大、最小值;注意:默认初始化 数组的元素个数由初始化列表内值的数量决定;相邻两个元素间进行比较,大的数据向后放,小的往前放(升序)注意:1.数组的大小是固定的;遍历每个位置,为每个位置选择一个合适的值;由数据类型相同的n个元素所组成的一个有限集合;2.每个元素的类型都是相同;注意:没有初始化的元素,初始化为0;拓展:柔性数组(变长数组);数组:是一种构造数据类型;元素在内存中是有序存放的;
2023-11-05 19:18:35 15
原创 Cday7
2.循环从终端接收一个字符串, 统计 大写字母的个数,小写字母的个数, 数字的个数,空格的个数,并输出到终端,输入“quite”, 退出循环。练习:循环从键盘输入一个字母并接收, 当输入的字母为大写时,输出对应小写,当输入的字母为小写时,输出对应大写,当不明确循环执行的次数或循环的上下限时,但是明确循环结束时的状态,一般使用while循环;2.当明确循环执行的次数或循环的上下限时,一般使用for循环;表达式3: 循环变量改变:推动循环趋向结束的代码;(1).在循环体内,短路当次循环体的后续执行;
2023-11-05 19:16:16 18
原创 Cday6
当表达式的值与某个case后面的常量值相等时,程序会跳转到该case下的语句执行。因此,一旦与switch后面圆括号中表达式的值匹配,就从此标号处开始执行,而且执行完一个case后面的语句后,若没遇到break语句,就自动进入下一个case继续执行,而不在判断是否与之匹配,直到遇到break语句才停止执行,退出break语句。当表达式的值与某个case后面的常量值相等时,就会执行该case下的语句。2,为什么表达式的值与某个case后面的常量值相等时,就会执行给case下的语句?2.if ()后不能加';
2023-10-31 21:33:30 28 1
原创 Cday5
2.%c 与 %c 有区别, %c可以过滤不接收’ ‘字符;因为从左至右进行时,若遇到运算符左边的操作数是 1(逻辑真),则停止运算。双目: 算数运算符(双目) > 关系运算符(双目)> 逻辑运算符 (双目)表达式1的值 非0即为真, 如果为真 取表达式2的值作为特殊表达式的值;逗号表达式的值:取最后一个子表达式的值作为逗号表达式的值;%f 按照单精度浮点型输出 %f 与 %lf 互相兼容。关系表达式的值:逻辑真 非零值(1)逻辑假 零值(0)逻辑表达式的值:逻辑真 非零值(1)逻辑假 零值(0)
2023-10-30 21:15:46 42 1
原创 Cday4
int a(1111 1110 1010 1101 1010 1101 1010 1101) = unsigned int b(1111 1110 1010 1101 1010 1101 1010 1101)反 1111 1111 1111 1111 1111 1111 1111 1111 1111 1110 1010 1101 1010 1101 1010 1100。(1) sizeof运算符(单目) 编译阶段去计算 sizeof();(4)链接阶段:将汇编阶段产生的机器语言链接成可执行的程序。
2023-10-28 18:21:47 27 1
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人