自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 嵌入式学习(Day52:启动代码,点灯)

存储结构:NOR flash允许随机访问任意地址,而NAND flash更适合顺序访问。速度:NOR flash读取速度快,适合代码存储;NAND flash写入和擦除速度快,适合大容量数据存储。耐久性:NOR flash通常具有更高的写入/擦除循环次数。成本和密度:NAND flash通常更便宜,存储密度更高,适合大容量应用。这两种闪存各有优缺点,选择使用哪一种取决于具体应用的需求。2.RAM和ROM的区别RAM:高速、易失性存储器,适用于需要快速存取的应用。ROM。

2024-06-26 23:21:14 353

原创 嵌入式学习(Day 51:ARM指令/汇编与c语言函数相互调用)

1.Supervisor模式与SVC模式 所以,Supervisor模式和SVC模式在ARM处理器中是不同的概念,但它们之间有密切的关联。SVC模式使用Supervisor模式的功能来提供系统服务。2.指令+s的作用,影响N,Z,C,V位 ARM指令中的“S”后缀用于指示该指令执行后是否更新程序状态寄存器(CPSR)的条件标志位。这些标志位可以用于后续的条件判断或分支操作,从而影响指令的执行顺序。以下是具体功能和详细解释:条件标志位更新:当ARM指令后带有“S”后缀时,该指令执行

2024-06-25 23:14:56 1207

原创 嵌入式学习(Day50:ARM汇编)

循环右移(Circular Right Shift)是二进制数操作中的一种位运算方式,它的核心思想是将一个二进制数的所有位向右移动指定的位数,同时将被移出的最高位(最左边的位)重新放到最低位(最右边的位)上,从而形成一个“循环”的效果。综上所述,FIQ的服务程序地址位于0x1C主要是基于ARM架构的FIQ模式特性、中断向量表的位置、直接执行与跳转的性能考虑等多方面因素综合考虑的结果。循环右移是一种二进制数的位运算,它将数值的每一位向右移动指定的位数,并将移出的最高位放回最低位,实现一个循环的移位效果。

2024-06-24 22:55:53 687

原创 嵌入式学习(Day 40:数据结构)

链式存储:采用一组非连续的内存空间保存元素 (如:链表,1.访问没有顺序存储方便,时间复杂度:O(n);:有头链表(第一个节点存储的不是数据)和无头链表(第一个节点存储的是数据) (熟练掌握单向链表的增/删/改/查)散列存储(哈希存储):将数据元素的存储位置与关键码之间建立确定对应关系从而实现查找的存储方式。树型结构:元素之间一对多的关系(二叉树) (特点:一个元素向后找,可以找到多个元素)缺点:插入删除需要移动大量的元素。数据的逻辑结构(逻辑关系):数据元素与元素之间的关系(4种)

2024-06-17 21:51:35 399

原创 嵌入式学习(Day:31 网络编程2:TCP)

recv(,0) /send(,0) ///TCP 常用套机字读写,0表示recv会阻塞等待;(send会阻塞,返回值,代表发送成功的个数,可为0,或者<=要发送的字符数)SOCK_STREAM 流式套接字 ===》TCP //listfd:监听套接字。功能:如果该函数在服务器端调用,则表示将参数1相关的文件描述符文件与参数2 指定的接口地址关联,用于从该接口接受数据。参数:domain 地址族,PF_INET == AF_INET ==>互联网程序。

2024-06-03 22:39:56 723

原创 嵌入式学习(Day: 30 网络编程)

无线局域网:(4G/5G,网络);(网络)接口层: ARP(地址转换:IP地址转换成mac) RARP(逆向地址转换,mac地址转IP地址) ... ip--->mac(ip地址,mac地址(全球唯一):如交换机通过IP地址将数据分发给不同的mac地址的电脑)交换机:(如24口),这24个口,平级关系,里面有个ARM芯片,交换机是一个嵌入式设备。传输层tcp udp 协议 文件 视频,音频(tcp:保证可靠性,可延迟一点,不能丢包,丢包就会出现延迟(如:VNC软件);

2024-06-02 21:53:51 703

原创 嵌入式学习(Day:28 进程间通信2 -> 信号通信)

11) SIGSEGV(重点:段错误信号) 12) SIGUSR2(用户自定义)13) SIGPIPE(重点:管道破裂)14) SIGALRM(重点:定时器,闹钟)15) SIGTERM(非强制关闭,kill的默认信号,可等紧急事件处理完后再关闭)6) SIGABRT(系统触发错误) 7) SIGBUS(总线错误) 8) SIGFPE(算数错误) 9) SIGKILL(重点:强制关闭)10) SIGUSR1(用户自定义)参数2:要调用的函数名)功能:进程暂停,不再继续执行,除非收到其他信号。

2024-05-29 00:22:15 637

原创 嵌入式学习 (Day:27 IPC --- 进程间通信)

有名管道===》fifo ==》有文件名称的管道。写的快,读的慢,写满了,写阻塞)有名管道 ===》fifo ==》可以给任意单机进程通信 (父子,爷孙,旁系关系(非父子/爷孙,如:堂兄妹)也行)3.管道破裂,,读端关闭,写管道。(读端关闭,即没有接受方了,写的话,写端也会关闭,即写端管道破裂;无名管道 ===》pipe ==》只能给有亲缘关系进程通信 (pipe,管子,父子进程,爷孙进程可用)2,写端是存在的,读管道,如果管道为空的话,读会阻塞。(写端和读端都存在,写的慢,读的块,读阻塞)

2024-05-27 22:51:45 638

原创 嵌入式学习(Day:27 线程2)

3、加锁: (lock可能会阻塞,unlock 不会阻塞)(互斥锁是一种折中的方案,会丧失一点并发的性能)(1释放1,2释放2也能跑,但这是未定义的行为,结果也不定,未定义)linux下的线程同步 ===》信号量机制 ===》semaphore.h posix。如果sem没有资源(==0),则线程阻塞等待,一旦有资源 (重点:sem会阻塞)信号量的定义 ===》信号量的初始化 ==》信号量的PV操作===》信号量的销毁。都是二值信号量,0 1 (初值,表示阻塞与否)

2024-05-26 21:20:54 894

原创 嵌入式学习(Day:26 线程1)

(注意生命周期,main上的可传至次线程,次线程结束的早,所以不能传至main)(每个线程都有自己的一个栈区(8M),其他4个内存区域共享,共享变量(传参,每个线程都可改变变量的值)。(线程要启动的函数名,名字即可)进程是系统中最小的资源分配单位.(进程中默认有一个线程(主线程),其他新开辟的线程(副线程));创建多线程 ==》线程空间操作 ===》线程资源回收(回收每个线程对应的8M空间)5.1 线程的回收机制 ====》不同与进程没有孤儿线程和僵尸线程。====》子线程的结束不会影响主线程的运行。

2024-05-23 23:00:22 888

原创 嵌入式学习(Day 25:进程2)

1.1功能:该函数可以阻塞等待任意子进程退出(如果没有退出的子进程,父进程会阻塞等待),等有子进程结束时,并回收该进程的状态。新进程,所以调用exec前后该进程的id并未改变。execv,execvp,execve,需要构造一个参数指针数组,然后将数组的地址传入。2)如果一个子进程终止,正在等待的父进程则获得终止状态,获得子进程的状态后,立刻返回。用fork创建子进程后执行的是和父进程相同的程序(但有可能执行不同的代码分支),这些函数如果调用成功则加载新的程序从启动代码开始执行,不再返回,如果调用出错。

2024-05-23 22:51:43 815

原创 嵌入式学习(Day 24 :进程1)

退出状态,终止的进程会通知父进程,自己是如何终止的。2)exit(), exit()是c库函数,①会执行io库的清理工作(相当于刷新缓冲区),②关闭所有 的流,以及③关闭所有打开的文件(相当于调用了free)。3)_exit,_Exit 是系统调用, 会关闭所有的已经打开的文件,不执行清理函数。僵尸进程:进程执行结束但部分空间(默认进程结束,PCB块不释放),未被回收变成僵尸进程,等待父进程调用相关函数回收;内核主要功能之一就是完成进程调度, 硬件,bios,io,文件系统,驱动(top,PR、IN)

2024-05-21 22:47:55 673

原创 嵌入式学习(Day 23:文件操作 命令行 混合)

注意:getpwuid 和 getpwnam,两个函数的返回值都是指向passwd结构体的指针,该结构体包含了与指定UID或用户名相关的用户信息,失败返回NULL。这两个函数返回的都是指针,这意味着连续调用时会覆盖之前返回的数据,所以使用时可定义一个指针空间(buf[256])保存这些数据。打印errnum出错码对应的出错信息(系统预定义了133个errnum对应不同的错误信息)根据组名到/etc/group文件中获取相关组的信息。返回:如果成功返回group的指针,失败返回NULL。

2024-05-17 21:01:54 435

原创 嵌入式学习(Day 22:文件IO 目录文件的操作)

目录 当文件看,只不过操作函数和操作文件函数不一样。从目录流中读取文件信息并将保存信息的结构体。参数:opendir的返回结果中目录流对象。成功返回包含路径空间的字符串首地址。获得一个文件流指针中的文件描述符。buf:保存工作路径空间的首地址。pathname:目录文件的名字。buf: 属性存放空间的首地址。文件IO 用于底层设备相关的开发,但是。打开一个目录获得一个目录流指针。将文件描述符转化为文件流指针。功能:关闭之前已经打开的目录流对象。size:保存路径空间的长度。fd:已经打开的文件描述符。

2024-05-16 23:27:09 317

原创 嵌入式学习(Day 21:Linux 文件操作 文件IO)

O_EXCL,需要和O_CREAT同时使用,表示新建的文件不能存在,成功,否则open就会失败。标准IO即stdio)有缓存机制,文件IO无缓存机制,直接a.out->硬件设备。rewind() 等效于:fseek(stream,0L,SEEK_SET);对普通文件进行标准IO操作,建立的缓存一般为全缓存。3.程序结束刷新(fclose 刷新)一个基于Linux内核的没有缓存的IO机制.whence 偏移的起始位置,由系统定义的三个宏开始。功能:将stream流文件中的文件指针从whence位置开始。

2024-05-16 01:21:57 864

原创 嵌入式学习(Day 20:Linux 文件操作 stdio)

,普通文件, l,link,软连接 p,pip,管道 s,socket, b,块设备,每次读取数据以块为单位,如硬盘, c,字符设备,读取数据时有连续性,传输时以字节为单位,如键盘/鼠标。------------man 函数名。fgetc/fputc,,,,,,一个字符,功能:从s所在的本地内存中获取一行数据,并写入stream对应的文件。7种,d ,-,l,p管道,s ,c,b。nmemb 要获取的数据块的个数,拷贝的数据块个数。参数: s 要写的信息,一般是固定的字符串或者有数据的数组。

2024-05-14 22:46:02 493

原创 嵌入式学习(Day 19:Linux系统编程___SHELL)

find 路径 -name filename 如:find /home-name -1.txt。4. ./XX.sh ​​​​​​​ //运行。输出———echo 如:echo '$a'` `:将中间的字符串按照命令打印——— a='mk'gzip -c 文件名.tar > 文件名.tar.gz。tar -jcvf 文件名.tar.bz2 目录/*tar -zcvf 文件名.tar.gz 目录/*

2024-05-13 22:48:37 672 1

原创 嵌入式学习(Day 15:段错误调试)

在可能出现错误的位置加入打印,前一句能够打印出来,后一句打印不出来,问题就可以定位到两次打印中间的代码。4.运行代码使其产生段错误,段错误产生后会生成一个包含错误信息的core文件。l 查看代码。r 运行代码。5.gdb a.out core 找到错误产生的位置。q 退出。b 函数名/行号 设置断点。2.使用gdb调试生成的代码。1.编译代码时加入-g选项。3.编译代码加入-g选项。

2024-05-07 22:32:09 283

原创 嵌入式学习(Day 14:共用体的定义/内存大小端/枚举类型/位运算/内存管理/数组和链表的区别)

2.枚举常量默认为int类型,第一个枚举常量的值默认为0,后续枚举常量的值为前一个枚举常量的值+1。内存碎片:由于频繁malloc和free小空间,导致大的连续空间由于中间存在小空间被。1.空间不需要连续(访问数据麻烦、空间不需要连续,可以使用小的分散空间)内存小端:内存低地址存放低数据位,内存高地址存放高数据位。内存大端:内存低地址存放高数据位,内存高地址存放低数据位。1.枚举变量的值在枚举常量中选择其一作为它的值。内存溢出:也称为内存越界,操作超过变量范围的空间数据。size:申请堆区空间的大小。

2024-05-07 00:12:11 374

原创 嵌入式学习(Day 13:结构体类型/变量类型的定义,结构体的元素访问/初始化/存储,结构体作为函数参数/结构体数组)

2.结构体大小必须为最大成员变量类型的整数倍(成员变量类型包含double型时,仍按4字节对齐存储)3.构造的数据类型 struct date d;1.结构体成员变量只能存放在内存地址为自身基本类型长度整数倍的内存单元中。-> 结构体指针类型访问成员变量使用->. 结构体变量类型访问成员变量使用.数据类型1 成员变量1;数据类型2 成员变量2;数据类型3 成员变量3;最终类型是由成员变量的类型决定。数据类型:1.基本数据类型。

2024-04-30 18:51:34 151

原创 【嵌入式学习Day12:二维数组和指针的关系/二维数组传参/指针数组传参/指针函数和函数指针】

二维数组的数组名是指向数组第一行所有元素的一个数组指针。指针函数是函数,函数的返回值是指针。函数指针时指针,指针指向一个函数。不能返回局部变量的地址。二维数组传递数组指针和长度。指针数组传递二级指针和长度。

2024-04-29 17:36:42 136

原创 嵌入式学习(Day 11:字符型数组和字符串的传参/二级指针/void*指针/const指针/数组指针/指针数组)

void * 作为函数参数,可以传入char *、double *、int *的指针,实现一个函数原型下的不同类型指针的传参。const 修饰 p, p不可以改变, *p可以改变,一定要初始化,否则该指针为野指针。void * -> int *、char *、double * 不需要强制类型转换。int *a[5]:定义一个数组,数组名为a,有5个元素,每个元素为int*型。const 修饰p *p, p不可以改变, *p不可以改变,一定要初始化。const 修饰 *p, p可以改变, *p不能改变。

2024-04-28 18:37:28 419

原创 嵌入式学习(Day 10:指针/指针相关的运算符/初始化/算数运算/常见参数/指针变量的定义/指针和数组的关系/指针/数组作为函数参数)

2.指针变量指向的空间,也就是*p,修改*p的值并不能改变指针变量的指向,只是利用指针修改对应空间中的值。指针均占8个字节,int* 指向4字节空间, double* 指向8字节空间, char* 指向1字节空间。指针变量:一个用来存放指针(地址)的变量,使用变量就是使用变量中存放的指针,所以有时也将指针变量简称为指针。实参将地址给形参,形参是实参的指针,可以通过对形参取*改变实参的值。指针:指针就是地址,地址就是指针, 地址是一个编号,指针多了指向的概念。三种形式均传入的是指针,最好使用第三种。

2024-04-26 18:31:59 255

原创 嵌入式学习(Day 9 函数传参/递归函数/带参宏/条件编译)

include "stdio.h" 在当前目录下寻找stdio.h,如果找不到再到系统目录下找stdio.h。4.宏函数执行效率高,函数因为有调用和传参的过程会占用系统资源开销,所以执行效率低一些。2.宏函数是在编译的时候加载到程序中,函数是在运行时加载到程序中。1.函数是有参数类型、返回值、调用相关概念,带参宏是没有的。3.宏函数会使代码体积增大,函数不会使代码体积增大。宏只是代码的替换,写代码时能加括号就加括号。函数体在定义时调用函数体本身。2.避免深层次的递归。2.带参宏(宏函数)

2024-04-25 18:44:05 244

原创 嵌入式学习(Day 8:函数/变量的作用域及生存周期/函数的传递)

函数类型:函数运行结果的类型(函数返回值与函数类型不匹配时,强制将返回值转换为函数类型后返回、函数类型不写默认为int类型)函数类型 函数名(数据类型1 形式参数1, 数据类型2 形式参数2, 数据类型3 形式参数3, ..)函数类型 函数名(数据类型1 形式参数1, 数据类型2 形式参数2, 数据类型3 形式参数3, ..);2.如果实参类型与形参类型不匹配,那么会将实参类型强制转换为形参类型传入到函数中。声明:之前变量是存在的,声明该变量的类型,同时声明变量是存在的。3.超过变量作用域回收变量空间。

2024-04-24 19:04:56 317

原创 嵌入式学习Day 7(二维数组/字符型数组/字符型二维数组)

字符型数组所占空间大小: 元素个数 * 1 //(1个字符所占空间为1字节)2.字符型数组:一组字符的集合,最末尾不需要一定是'\0'字符。字符串的长度: 从字符串开头到\0中间元素的个数(不包含\0)2.元素大小必须能存放下字符串和末尾的\0字符。1.字符串:一定包含最末尾的'\0'字符。a[0][3] //错。a[2][0] //错。char str[第一维大小][第二维大小];返回<0:第一个字符串 < 第二个字符串。

2024-04-23 19:03:49 243

原创 嵌入式学习(Day 6:一维数组)

元素个数:int len = sizeof(a) / sizeof(a[0])int a[n+3];1.数组第一个元素下标从0开始,到元素个数-1。数组空间大小 = 每个元素所占空间大小 * 元素个数。sizeof(a[0]):每个元素所占空间大小。2.5个元素的数组中没有a[5]元素。sizeof(a):数组所占空间大小。数据类型 数组名[元素个数];

2024-04-22 19:04:58 284

原创 嵌入式学习Day5(switch分支/循环结构/辅助控制语句)

结束本次循环,不影响当前循环之后的剩余循环部分继续执行 ( 在一个循环中屏蔽某几次循环时使用continue)里层switch结束后需要加break,如果没有加break,外层switch会继续向下执行。C:循环体内部代码执行结束后执行的代码(每循环一次,就会被执行一次)3.switch只与case后面的值比1次,然后顺序向下执行。想要跳出循环使用break,(当前循环之后的剩余循环部分直接跳过)case 常量1:语句块1;case 常量2:语句块2;case 常量3:语句块3;A:在循环前执行的代码。

2024-04-19 19:22:56 304

原创 嵌入式学习(Day4 scanf/gets/puts函数/流程控制/)

| 逻辑或 要么..要么.. 一真为真,全假为假 num < 0 || num > 100 num在0-100之外。2.if可以脱离else单独使用,但是else不能脱离if单独使用。%c 按照char类型接收数据(可以接收' '和'\n')_%c 按照char类型接收数据(无法接收' '和'\n')1.if后面必须加条件,else不能加条件。(5)scanf中,用_%c接受一个非' '和'\n'的字符;

2024-04-18 21:24:11 869

原创 嵌入式学习(Day3 不同数据类型间转换/运算符/C常用输入输出函数)

大数据放入小空间直接截取数据低位(有可能正数截成负数,有可能负数截成正数)左值为整数类型,右值为浮点数类型时,会将浮点数类型舍弃精度赋值给整数类型。左值为浮点数类型,右值为整数类型时,会将整数类型转换为浮点数类型赋值。小数据放入大空间高位需要补位(有符号数补符号位、无符号数补0)浮点数精度范围高于整数类型精度范围。getchar()表达式结果为从终端接收到的字符的ASCII码值。从左至右依次执行,将最后一个表达式的结果作为整体的结果。printf表达式的值为实际打印在终端屏幕上的字符的个数。

2024-04-17 21:58:07 299

原创 嵌入式学习(Day2 gcc编译流程/基本数据类型/常量/变量)

2.1整数类型:short 短整型 2个字节,(signed short,unsigned)int a,b,c;操作命令: gcc -E filename.c -o filename.i。操作命令:gcc -S filename.c -o filename.s。操作命令:gcc -c filename.c -o filename.o。2.2字符类型:char 1个字节, 如:‘a' 'B'操作命令: gcc filename.c -o filename。

2024-04-16 21:51:57 286

原创 嵌入式学习(Day1:Linux基础/C语言)

touch:新建一个空的普通文件,如:touch filename(注意:虽Linux不以文件后缀名来区分文件类型,但最好加上文件类型;文件名不能出现空格);2.5 Linux中的用户分为两类:1.超级用户,有且只有一个,名字为root, 2.普通用户:可以有一个或多个或者没有,名字无限制;(蓝色:目录文件(文件夹),白色:普通文件,如:图片,音乐);ls-l:查看当前目录下文件的详细信息,(文件类型-文件权限-作者-修改时间-作者等)生成一个a.out的文件,运行该文件,直接输入:./a.out。

2024-04-15 21:27:04 195

空空如也

空空如也

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

TA关注的人

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