- 博客(42)
- 收藏
- 关注
原创 嵌入式学习Day43
bic r0, r0, #(0x1F << 0) //低5位清零。orr r0, r0, #0x10 //第5位置一。(2) 于r0中,设置相关数据,设为User模式(10000), {r0-r12, lr}, {r0-r12, lr}保护时,SP先写,再加;恢复时,SP先减,再读;保护时,SP先写,再加;恢复时,SP先减,再读;保护时,SP先加,再写;恢复时,SP先读,再减;保护时,SP先减,再写;恢复时,SP先读,再加;保护时,SP先写,再减;恢复时,SP先加,再读;
2025-06-23 18:01:28
850
原创 嵌入式学习Day42
V:该位是针对有符号数的操作,会在下面两种情形变为1,两个最高有效位均为0的数相加,得到的结果最高有效位为1;CMP比较指令用于比较两个寄存器的值或者比较一个寄存器和立即数的值,其原理是对待比较的两个数求差,看结果是否为0,这个指令会无条件修改N,V,C,Z位。汇编指令的s后缀,几乎所有的汇编指令都可以在指令后面加上s后缀,s后缀的含义是在指令执行过程中会更新cpsr寄存器的N,V,C,Z位。如果结果为非负数,则N=0。把某个数展开成2进制,这个数的最高位1至最低位1之间的二进制数序列的位数不能超过8位;
2025-06-23 17:53:49
1000
原创 嵌入式学习Day41
两个或多个输出信号连接在一起可以实现逻辑“与”的功能。51单片机ds18b20公共总线111100010000拉高的过程为释放总线的过程;接收方一定要释放总线,来实现接收数据;上拉电阻:保证双方释放总线后,总线能够呈现高电平;首先,DS18B20的小数点是定点存放的,低四位为二进制小数,高十二位为整数部分,最低的小数部分为0.0625;ARM Cortex A(应用于消费类电子产品)M(应用于微控制器MAU方向,如STM32)R(应用于实时性方向,如军事,通信)
2025-06-20 18:20:50
883
原创 嵌入式学习Day40
3.同理RS485使用两根信号线(A和B)来传输数据,通过比较A和B之间的电压差来识别信息,电压范围分别为+7V到+12V和-7V到-12V。由于采用的是压差,RS485在传输数据的某一时刻,两根线都要用到,所以它是半双工的。1.TTL(Transistor-Transistor Logic)通常指的就是芯片引脚产生的电压,这个电压值跟选择的芯片有关,在51单片机系统下是5v;在2440下是3.3v等等。异步通信:指通信中两个字符(8位)之间的时间间隔是不固定的,而在一个字符内各位的时间间隔是固定的;
2025-06-20 18:15:27
942
原创 嵌入式学习Day39
当CPU正在处理某件事的时候外界发生了紧急事件请求,要求CPU暂停当前的工作,转而去处理这个紧急事件,处理完以后,再回到原来被中断的地方,继续原来的工作,这样的过程称为中断;在中断中,一旦任何设备将其中断,处理器就会受到干扰;在轮询中,处理器通过重复检查每个设备的命令就绪位来浪费无数的处理器周期。在中断中,中断请求线用作指示设备需要维修的指示;在轮询时,命令就绪位用作指示,表明设备需要维修。在中断中,该设备由中断处理程序提供服务;轮询时,CPU会以固定的间隔稳定地对设备进行投票。中断和轮询之间的区别。
2025-06-17 20:49:33
348
原创 嵌入式学习Day38
一、简介中央处理单元 , 一块超大规模的集成电路,是一台计算机的运算核心(Core)和控制核心Control Unit)微控制单元 更重视对外设的控制,而非数据的处理[一种特殊的CPU]微处理单元 , 是一种集成了中央处理器(CPU)、内存、外设控制器和总线接口等功能的芯片图像处理单元, 是一种用于处理图像和图形运算工作的协处理器片上系统 , 是一个将电脑或其他电子系统集成到单一芯片的集成电路[一种特殊的CPU]二、 51单片机学会查看原理图、查看手册。
2025-06-16 19:39:49
606
原创 嵌入式学习Day36
HTML(HyperText Markup Language)是用于创建网页的标准标记语言。通过标签(如<div><p>)定义内容结构,浏览器解析后呈现页面。最新版本为HTML5,支持多媒体、语义化标签等现代功能。
2025-06-11 17:40:32
562
原创 嵌入式学习Day35
SQLite3是一款轻量级的嵌入式关系型数据库引擎,无需服务器配置,支持跨平台操作,适用于移动应用、桌面软件及小型Web项目。它以单文件形式存储数据,支持标准SQL语法,提供事务、触发器等高级功能。
2025-06-10 17:50:45
965
原创 嵌入式学习Day34
select 是一种多路 I/O 复用机制,允许程序监视多个文件描述符的状态(可读、可写、异常),直到一个或多个文件描述符就绪。它是 Unix/Linux 系统中的系统调用,常用于处理非阻塞 I/O。epoll是Linux系统中用于高效处理大量文件描述符(FD)的I/O多路复用机制,属于selectpoll的增强版。它通过事件驱动的方式监控多个文件描述符的状态变化,适合高并发场景。
2025-06-09 17:39:43
558
原创 嵌入式学习Day33
P2P(Peer-to-Peer)模型是一种分布式网络架构,节点(peers)直接通信与共享资源,无需依赖中央服务器。其核心特点是去中心化、高扩展性和容错性,广泛应用于文件共享、区块链、实时通信等领域。在Linux网络编程中,TCP粘包是指发送方多次发送的数据被接收方一次性接收的现象,导致数据边界模糊。TCP是字节流协议,本身没有"包"的概念,数据被视为连续的字节流,因此需要应用层自行处理消息边界。
2025-06-05 17:19:45
1922
原创 嵌入式学习Day32
OSI(Open Systems Interconnection)模型是一种用于描述网络通信过程的标准化框架,由国际标准化组织(ISO)于1984年提出。它将网络通信划分为7个层次,每一层负责特定的功能,并通过接口与相邻层交互。TCP/IP模型是互联网通信的核心框架,由四层组成:网络接口层、网络层、传输层和应用层。它比OSI七层模型更简洁,实际应用更广泛。
2025-06-04 17:09:16
957
原创 嵌入式学习Day31
信号是 Linux 系统中进程间通信(IPC)的一种机制,用于通知进程发生了某种事件。信号通常是异步的,由内核、其他进程或进程自身发送。Linux 提供了多种标准信号(如SIGKILLSIGTERM),并允许用户自定义信号处理行为。在Linux系统中,信号是一种进程间通信机制,用于通知进程发生了某种事件。信号可以由内核、其他进程或进程自身发送。常见的信号包括SIGINT(中断,如Ctrl+C)、SIGTERM(终止请求)和SIGKILL(强制终止)。signal。
2025-06-03 17:41:34
859
原创 嵌入式学习Day30
信号量(Semaphore)是Linux中用于进程或线程间同步的机制,由E.W. Dijkstra提出。它本质上是一个计数器,用于控制对共享资源的访问。二进制信号量:取值为0或1,类似互斥锁。计数信号量:取值为非负整数,用于限制资源数量。sem_init是Linux系统中用于初始化未命名信号量的函数,属于POSIX信号量 API(它常用于多线程或多进程间的同步控制,通过计数器机制管理资源访问。sem_wait。
2025-05-28 17:36:33
710
原创 嵌入式学习Day29
是 POSIX 线程库中的一个函数,用于显式终止当前线程的执行。调用该函数后,线程会退出并返回一个指定的退出状态,而不会影响其他线程的运行。参数retval是一个指针,指向线程的退出状态。其他线程可以通过获取该值。返回值:无返回值(线程终止)。是 POSIX 线程(pthread)库中的一个函数,用于获取当前调用线程的线程标识符(thread ID)。线程 ID 是一个唯一的标识符,类型为pthread_t,通常用于线程管理或比较操作。是 POSIX 线程库中用于请求取消另一个线程的函数。
2025-05-27 17:39:07
1990
原创 嵌入式学习Day28
在 Linux 系统中,exit是一个用于终止进程的系统调用或库函数。它属于标准 C 库(stdlib.h),也可通过系统调用直接使用。调用exit会结束当前进程,并返回一个状态码给父进程。atexit是 Linux/Unix 系统中的一个标准库函数,用于注册程序正常终止时要调用的函数。这些函数会在程序通过exit或从main函数返回时执行,通常用于资源清理、日志记录等收尾工作。wait函数在Linux中用于父进程等待子进程的状态变化(如终止或停止)。它是进程间同步的重要工具,属于系统调用的一部分,定义在。
2025-05-26 17:22:46
1977
原创 嵌入式学习Day27
写时复制(Copy-on-Write,简称COW)是一种优化技术,主要用于在多个进程或线程共享相同资源时,延迟实际的数据复制操作,直到某个进程或线程尝试修改数据时才进行复制。一个进程可以包含多个线程,线程共享进程的内存空间和资源,但每个线程有自己的栈和程序计数器。子进程是父进程的副本,拥有相同的代码、数据和堆栈,但它们在内存中是独立的。2)exit(), c库函数,会执行io库的清理工作,关闭所有 的流,以及所有打开的文件。由于子进程是父进程的副本,它们共享相同的代码段,但拥有独立的数据段和堆栈。
2025-05-23 17:36:07
895
原创 嵌入式学习Day26
lseek是一个用于在文件中移动文件指针的系统调用,通常用于在文件描述符所指向的文件中定位读取或写入的位置。它允许程序在文件中随机访问数据,而不是只能顺序读取或写入。
2025-05-22 17:56:48
636
原创 嵌入式学习Day25
fread和fwrite是 C 语言中用于文件输入输出的函数,分别用于从文件中读取数据和向文件中写入数据。它们属于标准库<stdio.h>中的函数,通常用于处理二进制文件。fread:表达式:size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);ptrsizenmembstreamFILEfreadnmembfwrite函数用于向文件中写入数据。sizenmembstreamFILEfwrite返回实际写入的数据项数量。
2025-05-21 18:04:29
587
原创 嵌入式学习Day24
eg : ====》stdio.h ===>stdio.c==>libc.so ==>/usr/lib so 动态库。I: 键盘是标准输入设备 ====》默认输入就是指键盘 /dev/input。man xxx == man 1 xxx ===>查看当前xxx命令。man 2 xxx ===>查看xxx对应的系统调用函数。man 3 xxx ===》查看xxx对应的标准库函数。O: 显示器是标准输出设备 ==》默认输出就是指显示器。fgetc/fputc,,,,,,一个字符,
2025-05-20 19:24:37
449
原创 嵌入式学习Day23
树和二叉树:树:n(n>=0)个结点的有限集合。n = 0 ,空树。在任意一个非空树中,1,有且仅有一个特定的根结点2,当n>1 时,其余结点可分为m个互不相交的有限集合T1,T2,T3.。。。。Tm,其中每一个集合又是一个树,并且称谓子树。结点拥有子树的个数称谓结点的度。度为0的结点称谓叶结点。度不为0,称谓分支结点。树的度数是指,这棵树中,最大的结点的度数,称谓树的度数。树的深度或高度,从根开始,根为第一层,根的孩子为第二层。
2025-05-19 17:28:09
679
原创 嵌入式学习Day21
首先,使用vi Makefile进行代码编写注意:无论版本1还是版本2,回车之后的,下一行使用Tab键打出空挡clean 清除文件敲下make :make会在当前目录下去寻找file,默认走第一条规则;使用make clean 走第二条规则, make clean删除预期文件和中间文件指定make file的规则文件:make -f Makefile2。3.后驱指针域(指向下一个节点)。支持从任意节点向前或向后遍历。
2025-05-15 18:29:14
168
原创 嵌入式学习Day19
为了表示每个数据元素,ai与其直接后继数据元素ai+1之间的逻辑关系,对ai来说,除了存储其本身的信息外,还需要存一个指示器直接后续的信息。把存储元素信息的域叫数据域,把存储直接后继位置的域叫指针域。这两部分信息组成数据元素ai的存储映像,叫结点(Node);特点:线性表链式存储结构的特点是一组任意的存储单位存储线性表的数据元素,存储单元可以是连续的,也可以不连续。在链式结构中还需要一个元素存储下一个元素的地址。线性表的链式存储:解决顺序存储的缺点,插入和删除,动态存储问题。查找: 顺序表O(1)
2025-05-13 20:28:58
212
原创 嵌入式学习Day18
元素之间是有顺序了,如果存在多个元素,第一个元素无前驱,最有一个没有后继,其他的元素只有一个前驱和一个后继。数据的类型:ADT abstruct datatype ,是指一组性质相同的值的集合及定义在此集合上的一些操作的总称。1,正确性:语法正确、合法的输入能得到合理的结果、对非法的输入,给出满足要求的规格说明。2,有穷性:执行的步骤会自动结束,不能是死循环,并且每一步是在可以接受的时间内完成。1,输入:输出特性,输入时可选的,输出时必须的。3,确定性:同一个输入,会得到唯一的输出。
2025-05-12 20:53:08
332
原创 嵌入式学习Day17
定义一个struct结构体时,是声明,放在头文件中。当id左边为对象是指针时,用(a+i)->id,否则则用.。2.在初始化列表里次序要与声明结构体的顺序要一致,若只初始化一个,则剩下的全自动补0.因为起始地址都相同,所以只有最后赋值的那个数值是有效的。1.默认按照计算机位数对齐,64 / 8= 8,最终大小必须是8的整数倍。2.从结构体中的成员中查找最大字节的成员,最终按此成员大小对齐。其中花括号里的都是常量,从0开始以第一位开始向后编号。枚举中的值是可以指定的,但应避免枚举值发生重叠。
2025-05-11 17:49:35
197
原创 嵌入式学习Day16
如在一个函数中 int add(int a,int b),用来定义这个函数的指针形式为int(*p)(int a,int b)表示两个参数为int型,返回值为int型的函数指针。函数的函数名即为函数的入口地址。形式为:void*realloc(原空间,新开的空间),在新开的空间中先把原来的空间拷贝过来,再把原来的空间释放掉,此时就剩一个新开的空间。在返回值过程中,这个地址必须依旧存在,因此,不能返回局部变量的地址。释放完后的指针p为野指针,为防止出现野指针,释放完后把指针p用为空指针。
2025-05-08 20:01:54
192
原创 嵌入式学习Day15
(((int *)(p + 3)-3))中,p+3 就为第四行x的首地址,此时为野指针,(in*)p 把数组地址转为数组首元素地址,减3表示x向前偏移3个字节,就为数字10的地址,此时再在前加*号,就为10的值。a等价于&a[0];strncpy(s1,“hello” + 2,2),原本“hello”传的是首元素地址,加2后则元素向后加2,首元素就变为l,从l向后拷贝2个字节,结果就为ll。在二维数组中,如int a [3][4] ={1,2,3,4,5,6,7,8,9,10,11,12}表格如下。
2025-05-07 18:22:48
584
原创 嵌入式学习Day14
在数组中,a[i] = *(a + i)在程序中,*a++会报错,因为a是个常量,不能修改。*p++可以,p是个指针变量,可以修改。对指针地址上加n,结果为原地址向后偏移n乘以sizeof(基类型)个字节。2.从定位处开始向后偏移sizeof(基类型)个字节。printf(“%d”,*p)结果为2;5.当 p ==q时,交换基准数和p(或q)的位置。2.从右往左找比基准数小的第一个数(--q)。3.从左往右找比基准数大第一个数的数(++p)如:int a[1,2,3,4,5,6]
2025-05-06 20:54:01
315
原创 嵌入式学习Day13
其中双引号表示在main.c同一文件夹下的文件(自己写的文件),<>号表示不跟main.c在同一文件夹下的文件。指针:指针用来承载地址信息,跟整型是用来装整数的数据类型一样,指针是用来装地址的数据类型。这段代码表示为如果定义宏ABC,则输出结果为hello,未定义宏ABC,结果就为world,这就为条件编译。其中 *p就是i(间接访问i),*p中的*为指针运算符,int *p中的*为类型说明符。注意:指针变量所指向的地址必须是确定的,如不确定,则称为疯指针或野指针,运行时程序崩溃。相对目录:不包含根目录。
2025-05-06 00:28:33
367
原创 嵌入式学习Day12
注意:主函数中定义的变量只在主函数中有效,而不是因为在主函数中定义而在整个文件或程序有效。在全局区内变量在开辟空间未对进行初始化,默认会对全局区内默认请0.局部变量在栈区,开辟空间时未进行初始化,则会是一个随机数。全局变量:在函数之外定义的变量称为外部变量,也是全局变量,全局变量可以在本文件中其他函数所共用,它的有效范围从定义变量的位置开始到本源文件结束。局部变量和全局变量:时在一个函数内部定义的变量,只在本函数范围内有效,在函数以外是不能使用这些变量的。auto变量:自动开辟空间和销毁,称为自动变量。
2025-04-29 20:47:50
195
原创 嵌入式学习Day11
3.在被调函数中声明形参数组大小是不起任何作用的,,因为c语言对形参数组大小不做检查,只是将实参数组的首元素地址传给形参数组,因此,形参数组获得了实参数组的首元素地址,因此形参数组首元素和实参数组首元素具有同一地址,他们攻占统一存储单元。由于实参可以是表达式,而数组元素可以是表达式的组成部分,因此数组元素可以作为函数的实参,与用变量做实参一样,是单向传递,即”值传递“。如果在调用f1的过程中要调用f2函数,而在调用f2函数过程中又要调用f1函数,这是间接调用本函数。2.实参数组与形参数组类型应一致。
2025-04-28 20:24:02
164
原创 嵌入式学习Day10
概念:一个较大的程序分为若干个程序模块,每一个模块实现一个特定的功能,一个c程序可有一个函数和若干个其他函数构成,用主函数调用其他函数,其他函数也可互相调用,同一个函数可以被一个或多个函数调任意多次。一个函数并不从属于另一个函数,即函数不能嵌套定义,函数间可以互相调用,但不能调用main函数,main函数是系统调用的。被调函数当中无法修改主调函数中所定义的变量,在函数的值传递中,实参不改变,只有形参改变,函数传参的顺序规定是自右向左,在同一函数调用传参时不得使用++i 或i++这种的。
2025-04-27 18:27:43
324
原创 嵌入式学习Day9
所以a[0]就代表是第一个一维数组的数组名,首个元素地址为a[0][0];可以分行进行赋初值,如int[3][4] = {1,2,3,4},{5,6,7,8},{9,10,11,12};注意:在初始化中,如果少一个数据,如int[3][4] = {1,2,3,4},{5,6,7},{9,10,11,12};如int[][4]= {1,2,3,4,5,6,7,8,9,10,11,12};也可以将所有数据写在一个花括号内,如int a[3][4] = {1,2,3,4,5,6,7,8,9,10,11,12};
2025-04-25 18:15:57
227
原创 嵌入式学习Day8
其一般形式为 fgets(数组名,大小,输入设备),以数组s为例,则为fgets(s,sizeof(s),stdin);一般形式为strlen(字符数组名),strlen函数是用来计算字符数组的有效长度,即不包含空字符‘\0’在内,与sizeof不同,sizeof为总容量,包含空字符‘\0’,如char s[] = ”helloworld\n“,则sizeof(s)的大小为12,strlen(s)的大小为11.如char s[100]= {‘h’,‘e’,‘l’,‘l’,‘o’};结果就为hello。
2025-04-24 18:30:19
410
原创 嵌入式学习Day7
数组的初始化:可对数组里元素进行初始化,如int a【5】={1,2,3,4,5},花括号就为初始化列表器。如果int a【10】={1,2,3,4,5}在十个元素的数组中,只初始化了5个值,则剩下元素的值会自动清0,为{1,2,3,4,5,0,0,0,0,0}.如果无初始化,如int a[10],则数组里的值为随机数。数组的越界访问:在一个数组中如int a【10】,数组里元素引用为啊a【0】到a【9】,如果引用a【10】,超出范围,则会引发越界访问。注意:在数组初始化中,不能用变量来表示数组个数。
2025-04-23 22:05:34
514
1
原创 嵌入式学习Day6
在循环当中,必有的三要素为:循环的循环条件、进行循环时必须要有循环变量的初始化。以及有使循环趋于结束的语句。这段代码的结果为444,因为当j为4时,j大于3成立,break立即终止当前运行,所以,此时j为4,在外层循环中,循环了三次,所以结果为444.在if(i<10)中,break判断的式内层循环是正常结束循环还是提前break中止运行。先求解表达式1,然后求解表达式2,若其值为真(非0),则执行for语句中指定的内嵌语句,然后求解表达式3,然后转回上面继续求解表达式2,如此循环,若为假,则结束循环。
2025-04-22 19:52:51
550
原创 嵌入式学习Day5
表达式截断:为c语言中的一种特殊规定,在与操作中,&&从左至右运行中,左边为假 ,说明整体就为假,则后边的运行将被截断,不做运行,如i = 2,j = -3;i<0&& ++ j 中printf(“%d”,j)结果为-3,因为i为2,i小于0为假,则后边直接截断,不做运行,所以j还为-3,或||运算中也同样一致。j<-4成立结果为真,真就为1,就变成了1<i,1小于i为假,所以结果为0,因此,不能写成连续比较的类型。关系成立则为真,否则则为假。:j 表达的是如果i大于j,结果就为i,否则就为j。
2025-04-21 20:14:40
363
原创 嵌入式学习Day4
scanf在字符串常量中一般只有占位符%d,不写任何字符包括换行符\n,如果加上其他字符,则需在输入时也应加上相关字符,如:scanf(“%d,%d”,&i,&t)在输入两个变量的值时也应加上,号,比如12,34这种形式。函数调用表达式putchar(65),65为整型,与形参类型一致,也可以为‘A’,‘A’为字符型变量,如果putchar(‘A’)放入整型int中,由于字符型类型为1个字节,在int中发生符号位扩展,由于‘A’为整数,所以,,int其他三个字节补0,结果仍为A。sqrt:求平方根函数。
2025-04-18 20:39:39
324
原创 嵌入式学习Day3
如:-5%2结果为-1,而5%-2结果为1,另外,求余运算必须为整型或者与整型相兼容的数据类型(如char字符型),且求余运算结果一定小于取余运算中右操作符(如‘l’%100,结果一定小于100)。\b表示退格符,类似于键盘上的⬅,如:printf(“hello\b”),输出结果为hello,printf(“hello\b123”),输出结果为hell123,printf(“hello\b\b123”),输出结果为hel123。++i表示使用i之前,先把i的值加1.i++表示在使用i之后,再把i的值加1。
2025-04-17 21:07:53
904
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅