自定义博客皮肤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)
  • 收藏
  • 关注

原创 从零开始的嵌入式学习day33

网络编程及相关概念UDP网络通信程序UDP网络通信操作一、网络编程及相关概念1. 网络编程概念:指通过计算机网络实现程序间通信的技术,涉及协议、套接字、数据传输等核心概念。常见的应用场景包括客户端-服务器模型、分布式系统、实时通信等。2.OSI模型概述及结构1)概述:OSI(Open Systems Interconnection)模型是一种用于描述网络通信过程的标准化框架,由国际标准化组织(ISO)于1984年提出。

2025-06-05 20:07:26 744

原创 从零开始的嵌入式学习day32

触发管道破裂用gdb观察,gdb只能跟一个进程走,默认跟父走,若要跟子走,应该在fork之前输入下述命令:set follow-fork-mode child。3)读端的文件描述符关闭,读端关闭,只要调用写的相关函数,就会管道破裂(类似于段崩塌)导致写端结束,即进程结束。4)双方在通信过程中,写端先关闭,若果管道当中没有数据,那么将会读到0,read返回值为0,说明文件读到结尾。2、所有的管道都是特殊的文件不支持定位操作。1)因为空间是独立和隔绝的,数据发不过去,需要进程间的通信来交互,所以需要通信。

2025-06-05 19:59:39 950

原创 从零开始的嵌入式学习day31

文字可以通过字模工具获取要操作的像素点坐标数组,也可以通过字库进行操作,最原始的图像是位图,文件信息中前54字节是头信息,包含图像的大小等参数,剩下的就是连续了BGRBGR像素点数据,我们可以循环取三字节,再倒序就得到RGB参数了,然后输出。* 简单的操作像素点,比如画直线等,可以通过简单的循环控制xy坐标就能实现,但汉字图像等需要的像素点坐标就比较复杂了。一般可访问显存小一些,即虚拟分辨率,真实分辨率就是打开设置查看得到的分辨率。设备路径 : 设备/dev/fb0。

2025-06-05 19:46:23 635

原创 从零开始的嵌入式学习day30

死锁是指多个进程或线程在竞争资源时,由于互相等待对方释放资源而陷入无限阻塞的状态。(归根结底是逻辑错误导致的)

2025-06-05 19:44:10 566

原创 从零开始的嵌入式学习day29

一、Linux线程基本概念linux中,线程又叫做轻量级进程(light-weight process LWP),也有PCB,创建线程使用的底层函数和进程底层一样,都是clone,但没有独立的地址空间;而进程有独立地址空间,拥有PCB。Linux下:线程是最小的执行单位,调度的基本单位。进程是最小分配资源单位,可看成是只有一个线程的进程。线程是一个进程内部的控制序列。控制序列可以理解为一个执行流。进程内部是指虚拟地址空间。1、线程特点:(1)线程是资源竞争的基本单位。

2025-05-27 19:46:43 536

原创 从零开始的嵌入式学习day28

子进程先消亡,父进程还在,0-3G空间已释放但是pcb块未释放(越来越多会占满内核)。若子进程没退就wait,那么可能会阻塞(某种条件未满足,导致当前进入阻塞态),等着子进程消亡;execv,execvp,execve,需要构造一个参数指针数组,然后将数组的地址传入。如果所有的子进程都在运行,在阻塞(进程运行过程中,某条件未满足导致当前进。如果一个子进程终止,正在等待的父进程则获得终止状态,获得子进程的状态后,退出状态,终止的进程会通知父进程,自己使如何终止的。止),则由exit传入的参数。

2025-05-27 19:41:50 593

原创 从零开始的嵌入式学习day27

子进程是父进程的副本,拥有相同的代码、数据和堆栈,但它们在内存中是独立的。写时复制(Copy-on-Write,简称COW)是一种优化技术,主要用于在多个进程或线程共享相同资源时,延迟实际的数据复制操作,直到某个进程或线程尝试修改数据时才进行复制。潜在的性能开销:虽然写时复制可以减少内存复制操作,但在某些情况下,频繁的复制操作可能会导致性能下降,特别是在高并发环境下。2)exit(), c库函数,会执行io库的清理工作,关闭所有 的流,以及所有打开的文件。每个进程都有独立的内存空间、系统资源和执行状态。

2025-05-24 20:45:44 569

原创 从零开始的嵌入式学习day26

参数:fd:文件描述符;offset:偏移量;转换: FILE* fp -> int fd fgets(,);返回值:成功返回文件流指针;返回值:成功返回文件描述符;转换:int fd -> FILE *fp。5.fopen与open 对应权限问题。功能:获得一个文件流指针中的文件描述符。返回值:成功返回偏移量;功能:将文件描述符转化为文件流指针。参数:fd:已经打开的文件描述符。参数:stream:文件流指针。8.perror 系统错误警告。功能:定位光标的位置。

2025-05-22 19:28:22 298

原创 从零开始的嵌入式学习day25

一、文件的读和写1.fwrite(读)功能:从指定的stream流对象中获取nmemeb个大小为size字节的数据块到ptr所在的本地内存中。参数:ptr 要存储数据的本地内存一般是数组或者结构体指针size 单个数据块的元数据大小。最小单元的大小nmemb 要获取的数据块的个数,拷贝的数据块个数。stream 要获取数据的源文件流对象,如果是stdin表示从键盘获取数据,如果是fp文件则表示从普通文件获取。返回值:成功 小于等于nemeb的整数,表示获取的数据长度;

2025-05-21 20:10:16 972

原创 从零开始的嵌入式学习day24

第一个参数是字符串buffer指针,传入的是char*,这里当然是可变的;第二个参数是至多读取的字符数,传入的是int;第一个参数path是文件地址,传入的是不可变的字符串;第二个参数是mode是指打开方式,传入的也是不可变的字符串;Linux中系统调用的错误都存储于 errno中,errno由操作系统维护,存储就近发生的错误,即下一次的错误码会覆盖掉上一次的错误。传入的参数是FILE指针,即fopen创建的那个指针;第一个参数是不可变的字符串,第二个参数就是要写到的stream来源这里是FILE指针。

2025-05-20 18:38:01 660

原创 从零开始的嵌入式学习day23

/ 用于构建树的字符数组,按特定格式表示树的节点,'#'表示空节点。// 树节点存储的数据,类型为前面定义的DATATYPE(即char)= *data) // 当当前位置的数据与要查找的数据不相等时。// 打印找到的数据。

2025-05-19 19:37:17 450

原创 从零开始的嵌入式学习day22

一、栈(一)栈的基本概念1、栈的定义:注:线性表中的栈在堆区(因为是malloc来的);系统中的栈区存储局部变量、函数形参、函数返回值地址。2、栈顶和栈底:允许插入和删除的一端称为栈顶(top),另一端称为栈底(bottom),不含任何数据元素的栈称为空栈。3、 LIFO 结构:栈又称为后进先出(LastInFirst0ut)的线性表。4、栈示意图:top为栈顶指针5、栈对线性表的插入和删除的位置进行了限制,并没有对元素进出的时间进行限制,

2025-05-19 19:34:08 295

原创 从零开始的嵌入式学习day21

在终端敲make,进行编译,若要指定makefile ,加-f再加指定makefile。双向链表是在单链表的每个结点中,再设置一个指向其钱去节点的指针域。5. vi Makefile(工程管理工具) :三个.c以上可使用。10.双向链表的逆序。

2025-05-15 18:28:13 192

原创 从零开始的嵌入式学习day20

单向链表的优点:插入和删除的时间复杂度为O(1),优于顺序表。且在空间性能上不需要预先分配,大小可变,能够动态分配满足要求。单向链表的缺点:查找的时间复杂度为O(n)。

2025-05-14 18:56:29 197

原创 从零开始的嵌入式学习day19

一、顺序表(一)顺序表的基本操作1、创建顺序表// 分配顺序表结构体空间// 分配失败报错// 分配数据存储数组空间// 数组分配失败报错// 存储总长度(最大容量)// 初始元素个数为0return sl;// 返回顺序表指针2、销毁顺序表return 1;// 空指针返回错误码1//先检查顺序表指针是否为空// 释放数据存储区(动态分配的数组)free(list);// 释放顺序表结构体本身return 0;

2025-05-13 19:54:35 705

原创 从零开始的嵌入式学习day18

1.数据的类型(ADT,abstruct datatype )是指一组性质相同的值的集合及定义在此集合上的一些操作的总称。算法是指解决特定问题求解步骤的描述,计算机中表现为指令的有限序列,每条指令表示一个或多个操作。2)有穷性,执行的步骤会自动结束,不能是死循环,并且每一步是在可以接受的时间内完成。3)健壮性,输入非法数据,能进行相应的处理,而不是产生异常。1)正确性,语法正确,合法的输入能得到合理的结果。1)输入,输出特性,输入时可选的,输出时必须的。3)确定性,同一个输入,会得到唯一的输出。

2025-05-12 19:25:12 209

原创 从零开始的嵌入式学习day17

形式1:先定义类型,然后定义变量形式2:定义类型的同时定义变量}s;示例:声明结构体的同时定义了两个全局变量(s1,s2)(三)考点:结构体在内存中所占字节数内存对齐原则:1、默认按照计算机位数对齐,64/8=8最终大小必须是8的整数倍;(32位系统下默认4字节对齐)2、从结构体中的成员中查找最大字节的成员,最终按此成员大小对齐;3、把每个成员按照声明顺序依次存放入内存,偏移量/sizeof(成员)必须能够整除。(注:32位的平台 :如果有超过4字节 ,按照4字节对齐;

2025-05-12 19:08:20 692

原创 从零开始的嵌入式学习day16

本篇内容主要包括:指针函数函数指针指针的数组一、指针函数指针函数:返回值是指针的函数。(注意:返回值不能指向局部变量,因为被调函数运行完,局部变量就被销毁,返回值就是野指针)动态内存访问:即用户自己开辟存储空间(堆)利用stdlib.h库函数开辟空间:void *malloc(size_t size):申请大小为size字节的内存空间,如果申请成功,返回空间首地址,失败就返回空指针。void free(void *):释放申请的空间。

2025-05-08 18:53:32 475

原创 从零开始的嵌入式学习day15

对应的数据类型:int(*)[4],指针+1(跨16个字节)2、表达式a[0]:a[0] <=> &a[0][0] //表达式数据类型:int *;//输出结果为80(占80个字节)3、表达式&a:数据类型:int (*)[3][4],指向二维数组的指针,指针+1(跨48个)printf("%d\n", *((int *)(p + 3) - 3));//*p为‘H’本尊(指针的间接访问)在栈区,而p指向字符串常量区。1、表达式a: a <=> &a[0] //a二维数组名,指向数组的指针,

2025-05-08 14:45:24 535

原创 从零开始的嵌入式学习day14

1.若指针变量p已指向数组中的一个元素,则p+1指向同一数组的下一个元素,即向后偏移sizeof(基类型)个字节。指针变量赋值时,地址运算的变量须与指针类型一致,可通过强制类型转换使得类型一致,注意隐式转换问题。2.若p 的初值为数组a的首元素地址,则p+i与a+i均为a[i]的地址,指向数组a的第i个元素。其作用是将数组a首元素的地址赋给指针变量p而不是*p。3.*(p+i)或*(a+i)是p+i或a+i所指向的数组元素,即a[i]。

2025-05-06 18:58:41 317

原创 从零开始的嵌入式学习day12

上述通过static ,即静态局部变量,将s变量从动态生存期改为静态生存期,使其不在栈区,而在静态区。全局作用域:即在任何花括号之外的属于全局作用域,定义为全局作用域的变量为全局变量。局部作用域:即在一对括号内的变量的作用域是局部作用域,具有局部作用域的变量为局部变量;在函数或全局变量前加static,将该变量或函数的使用范围就被限制在当前.c文件中,其他文件不能使用。3.register:定义变量前加此关键字,会建议变量i的空间开到CPU 内部的寄存器而不是RAM,提高读写效率,但不一定执行。

2025-04-29 20:15:35 925

原创 从零开始的嵌入式学习day11

本篇内容主要包括:函数的递归调用。

2025-04-28 18:04:45 319

原创 从零开始的嵌入式学习day10

一个较大的程序一般应分为若干个程序模块,,每一个模块用来实现一个特定的功能。所有高级语言中都有子程序的概念,用子程序实现模块。在c语言中,子程序的作用是由函数完成的,一个c程序可由一个主函数和若干个其他函数构成。由主函数调用其他函数,其他函数可以互相调用。善于利用函数以降低程序耦合性,提高代码复用性。add ( 实参);//对函数进行声明return 0;int add ( 形参) //对函数进行定义.....类型标识符 函数名 (形式参数表列) //函数的首部{ //函数体声明部分。

2025-04-27 19:19:21 223

原创 从零开始嵌入式学习day9

二维数组定义的一般形式为:类型说明符数组名[ 常量表达式][ 常量表达式];表示定义了一个 3×4,即 3 行 4 列总共有 12 个元素的数组 a。这 12 个元素的名字依次是:a[0][0]、a[0][1]、a[0][2]、a[0][3];与一维数组一样,行序号和列序号的下标都是从 0 开始的。元素 a[i][j] 表示第 i+1 行、第 j+1 列的元素。数组 int a[m][n] 最大范围处的元素是 a[m–1][n–1]。所以在引用数组元素时应该注意,下标值应在定义的数组大小的范围内。

2025-04-27 17:49:43 316

原创 从零开始的嵌入式学习day8

字符数组的定义形式如下:char 数组标识符 [常量表达式]例如,下述代码定义了一个字符数组 cArray,该数组中包含 5 个字符型的变量元素:char s[5]如果初值个数与预定的数组长度相同,在定义时可以省略数组长度,系统会自动根据初值个数来确定数组长度。例如,上面初始化字符数组的代码可以写成:代码中定义的 s[] 没有给出数组大小,但系统会自动根据初值的个数确定数组长度为 5。

2025-04-24 19:31:11 817

原创 从零开始的嵌入式学习day7

注意:通过a[ ]进行赋值时,不可以给超过数组空间的其他量赋值,如a [10] = 100;前者只是为了说明A是个数组, 后者为对数组的访问 a[i]是数组中具体的值,i只是下标。a中的10个元素只给前4个元素赋予了对应的初值,后面剩余的元素均被清为0。数组中的数组名有值,其值是数组的首元素地址,即a是数组a当中的首元素a[0]的地址。表示定义了一个含有10个元素的整型数组a。2)定义数组时,常量表达式用来表示元素的个数,即数组长度。3)对全部数组元素赋初值时,数组元素个数可以省略。

2025-04-23 13:32:08 396

原创 从零开始的嵌入式学习day6

本篇内容主要包括:goto语句及其构成循环用while语句实现循环用do ....while语句实现循环用for语句实现循环break语句与continue语句。

2025-04-22 18:00:08 275

原创 从零开始的嵌入式学习day5

及关系表达式逻辑运算符及逻辑表达式判断语句(if 语句、switch语句)条件运算符及条件表达式。

2025-04-22 13:25:07 689

原创 从零开始的嵌入式学习day4

本篇内容主要包括:逗号运算符及逗号表达式C语句描述数据输入输出的概念字符数据的输入输出格式输入与输出。

2025-04-19 10:36:51 917

原创 从零开始的嵌入式学习Day3

是对变量i的初始化,初始化只有一次,赋值可以多次。i++会复制一份到临时空间 i++没有加一 i加一。\t:将前后字符之间凑够8个,每个按8个字符对齐(水平制表符)任何表达式都有其数据类型,表达式的数据类型和两边的类型有关。3.3为双精度,8字节,3.3f为单精度浮点,4字节。只保存不退出,在第二个终端编译,不用关闭一次vi。\r:回车,将光标从当前位置移动至本行最左边。在 i 前面加 const ,i 变只读变量。求余运算永远小于右操作数,右操作数不为0。符号是0,高位补0;

2025-04-17 19:31:49 330

原创 从零开始的嵌入式学习Day2

常量:程序运行过程中,其值不发生变化的量。无法定位在内存中的地址变量:程序运行过程中,其值发生变化的量。根本原因在于任何变量都有对应内存空间,每次运行其地址都会变从硬件角度看计算机系统最不可或缺的设备:CPU:核心处理单元RAM(Random Access Memory):随机访问存储器16GBit:比特16GByte:字节,描述计算机存储的最小单元(16GB)1Byte=8Bit整型常量 :即为整常数,有以下3种表示方法,后两种都是为了向二进制转换而存在,C语言未提供2进制表示法。

2025-04-16 18:08:10 335

原创 从零开始的嵌入式学习

博主是一名双非的研二在校生,因为担心自己毕业即失业,于是决定从零开始的嵌入式学习,力争日更!!!

2025-04-15 18:21:49 383 1

空空如也

空空如也

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

TA关注的人

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