自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 嵌入式学习 D33:系统编程--网路编程

1)概述:OSI(Open Systems Interconnection)模型是一种用于描述网络通信过程的标准化框架,由国际标准化组织(ISO)于1984年提出。它将网络通信划分为7个层次,每一层负责特定的功能,并通过接口与相邻层交互。2)OSI模型的七层结构物理层(Physical Layer)负责传输原始比特流,定义物理介质(如电缆、光纤)的电气、机械特性。典型协议包括以太网、USB。数据链路层(Data Link Layer)将比特流组织为帧(Frame),提供物理地址(MAC地址)和错误检测。

2025-06-05 19:37:54 812

原创 嵌入式学习 D32:系统编程--进程间通信IPC

3)读端的文件描述符关闭,读端关闭,只要调用写的相关函数,就会管道破裂(类似于段崩塌)导致写端结束,即进程结束。4)双方在通信过程中,写端先关闭,若果管道当中没有数据,那么将会读到0,read返回值为0,说明文件读到结尾。1)因为空间是独立和隔绝的,数据发不过去,需要进程间的通信来交互,所以需要通信。实际中系统读阻塞触发的次数居多,因为资源总数稀缺的。1) 无名管道 ===》pipe ==》只能给有亲缘关系进程通信。创建有名管道-->打开有名管道-->读写管道-->关闭管道-->卸载有名管道(读端)

2025-06-03 20:44:25 648

原创 嵌入式学习 D31:系统编程--Framebuf帧缓冲

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

2025-06-03 20:09:33 581

原创 嵌入式学习 D30:系统编程--线程控制

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

2025-05-28 20:27:54 1014

原创 嵌入式学习 D29:系统编程--线程

Linux中,线程又叫做轻量级进程(light-weight process LWP),也有PCB,创建线程使用的底层函数和进程底层一样,都是clone,但没有独立的地址空间;通过该函数可以将指定的线程资源回收(线程结束栈区默认没被释放),该函数具有 阻塞等待功能,如果指定的线程没有结束,则回收线程会阻塞。Linux下:线程是最小的执行单位,调度的基本单位。(1)进程中的第一个线程为主线程,主线程有且仅有一个,(主线程号和进程号一。Tcb块(线程控制块),进程中有10个线程,pcb块中就有10个tcb块。

2025-05-27 20:28:02 661

原创 嵌入式学习 D28:系统编程--进程(2)

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

2025-05-26 19:26:43 963

原创 嵌入式学习 D27:系统编程--进程

c库函数,会执行io库的清理工作,关闭所有的流,以及所有打开的文件。5)进程上下文切换:就是值指调度器要切换CPU给另一个进程的时候,要保存当前进程的状态,然后加载打开一个新的进程这样的一个过程。(单调函数,进程结束,但清理的相对较少)2)稳定性:如果一个进程发生错误,通常不会影响到其他进程,这提高了系统的稳定性。2)内核主要功能之一就是完成进程调度, 硬件,bios,io,文件系统,驱动;(4)子进程复制父进程的0到3g空间和父进程内核中的PCB,但id号不同(子的id比父大)。

2025-05-25 17:39:06 1029

原创 嵌入式学习 D26:文件操作(2)及目录操作

opendir 用于打开一个目录,readdir 用于读取目录中的条目,closedir 用于关闭目录。lseek 是一个用于在文件中移动文件指针的系统调用,通常用于在文件描述符所指向的文件中定位读取或写入的位置。它用于释放与opendir函数打开的目录流相关的资源。它通常用于将标准库中的文件流(FILE*)转换为底层的文件描述符(int),以便在需要直接使用系统调用时使用。mode:指定文件流的打开模式,与 fopen 的模式字符串相同,如 "r"(只读)、"w"(只写)、"a"(追加)等。

2025-05-22 19:56:51 942

原创 嵌入式学习笔记 D25 :标准i/o操作(2)、文件i/o

操作系统为了方便用户使用系统功能而对外提供的一组系统函数。称之为 系统调用 其中有个文件IO;一般都是对设备文件操作,当然也可以对普通文件进行操作。注:一个基于Linux内核的没有缓存的IO机制。

2025-05-22 12:45:34 828

原创 嵌入式学习笔记 D24 :系统编程之i/o操作

so动态库:stdio.c=>libc.so:gcc的前三步,so文件已经是二进制,也叫c库文件,调用系统级别的头文件,传入的是so动态库,路径在:usr/lib。2)进程:程序在计算机中的一次执行过程,是资源分配的基本单位,有就绪、运行、阻塞等状态,由操作系统调度。1)文件:存储在存储设备上的相关信息集合,是操作系统管理数据存储的基本单元,有文本、二进制等类型,可通过文件系统操作。man xxx == man 1 xxx ===>查看当前xxx命令。流对象 ===》头 《===数据====》尾。

2025-05-20 18:35:20 647

原创 嵌入式学习笔记 D23 :树、哈希表及内核链表

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

2025-05-19 19:50:35 727

原创 嵌入式学习笔记 D22:栈与队列

/ 新节点next指向原栈顶节点(头插法)ls->top = ls->top->next;栈对线性表的插入和删除的位置进行了限制,并没有对元素进出的时间进行限制,:满队判断条件:尾巴+1==头 (tail + 1 ) % tlen == head。// 释放已分配的结构体空间(避免内存泄漏)if(IsEmptyLinkStack(ls)) // 检查栈是否为空。if(IsEmptyLinkStack(ls)) // 检查栈是否为空。

2025-05-19 19:24:08 944

原创 嵌入式学习笔记 D21:双向链表的基本操作

在终端敲make,进行编译,若要指定makefile ,加-f再加指定makefile。双向链表是在单链表的每个结点中,再设置一个指向其前一个结点的指针域。三个.c以上可以使用。5.判断链表是否为空。七、MakeFile工具使用。一、双向链表的定义与创建。

2025-05-15 18:39:41 493

原创 嵌入式学习笔记 D20 :单向链表的基本操作

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

2025-05-14 18:51:30 399

原创 嵌入式学习笔记 Day19:顺序表与单向链表

因为存在先后顺序。在进行基本操作时须明晰参数为指针还是变量,如:1)tmp->data.name,是指针,tmp->data是变量,但是取得是其中的name,name是字符串名字,所以是地址。2)tmp->data,data定义的是DATATYPE类型,并没有*类型说明符,只是变量非指针,因此整体为变量。3.单向链表删除操作时指针要停在待删的前一个,且过程中需要2个辅助指针,结束须释放return 1;free(tmp);ll->clen--;return 0。

2025-05-13 20:30:29 1091

原创 嵌入式学习笔记Day18:数据结构

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

2025-05-12 19:24:27 440 1

原创 嵌入式学习笔记Day 17:结构体与共用体

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

2025-05-12 19:23:48 750

原创 嵌入式学习笔记Day 16:指针函数与函数指针

图中程序意图 将s传入函数,给堆区申请100字节空间并返回,实际运行时造成245行崩,因为得到的指针变量s为野指针(并未初始化),s并不是指向100个字节的指针,并未修改到s本身,该种函数传参本质为值传递,p只是s的复制品。void *malloc(size_t size):申请大小为size字节的内存空间,如果申请成功,返回空间首地址,失败就返回空指针。char * 为指针的基类型,*为类型说明符,说明p为指针。**p为s指针的指针,此时*p为s本身,修改的是s本身,指向100字节的空间。

2025-05-08 18:49:22 584

原创 嵌入式学习笔记Day 15:

(2)表达式a[0]:a[0] <=> &a[0][0] //表达式数据类型:int *;对应的数据类型:int(*)[4],指针+1(跨16个字节)(3)表达式&a:数据类型:int (*)[3][4],指向二维数组的指针,指针+1(跨48个)//其中int *为数据类型,p[10]为数组(数组不可被整体引用);(1)表达式a: a <=> &a[0] //a二维数组名,指向数组的指针,int (*p)[10];//*p为‘H’本尊(指针的间接访问)在栈区,而p指向字符串常量区。

2025-05-08 16:11:23 888

原创 嵌入式学习笔记Day 14:数组与指针

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:56:55 273

原创 嵌入式学习笔记Day 13:预处理命令和指针

1.不带参宏# define 标识符 字符串 //认为所表达的内容如:return 0;上述PI 具有全局作用域,编译时先进行预处理,将所有使用PI的内容均用3.1415代替,只换不算。!宏定义时末尾不加分号,否则报错。因为替换时会将“3.1415”替换成“3.1415;”造成语法错误。!PI是常量,不能作为左值使用。2.带参宏。

2025-05-05 23:19:04 640

原创 嵌入式学习笔记Day 12:函数(3)

一、二维数组作为函数参数1. 二维数组二维数组作为函数参数传递时,列数必须固定具体值,不能省略;二维数组传递时需要两个参数:即数组名和行数。

2025-04-29 20:08:41 612

原创 嵌入式学习笔记Day 11:函数(2)

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

2025-04-28 17:58:40 327

原创 嵌入式学习笔记Day 10:c语言---函数

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

2025-04-27 18:17:00 428

原创 嵌入式学习笔记Day 9:二维数组!

二维数组的定义一般形式为:类型说明符 数组名[常量表达式][常量表达式];如:表示定义a为3行4列的数组。定义的二维数组a可以理解为定义了3个一维数组a[ 0 ]、a[ 1 ]、a[ 2 ],每个元素都是一个包含4个元素的一维数组。

2025-04-25 19:14:51 243

原创 嵌入式学习笔记Day 8:字符型数组!

1.字符数组定义形式如下:char 数组标识符 [常量表达式]注意:括号内[ ]为类型说明符,说明s是100个元素的数组。一个字符型只占1个字节,但是字符数组的末尾须加 \0 为字符串结束标志,因此也占1个字节。2. 字符数组初始化1) 逐个字符赋给数组中的元素。2) 定义字符数组的同时进行初始化,可以省略数组长度。3) 利用字符串给字符数组赋初值。字符在内存中按照单一性、有序性、连续性存储。字符串与字符数组之间的关系:字符型数组s是一个容器,总容积为100,整体只用了6字节。

2025-04-24 19:33:09 428

原创 嵌入式学习笔记Day 7:数组!

注意:通过a[ ]进行赋值时,不可以给超过数组空间的其他量赋值,如a [10] = 100;a中的10个元素只给前4个元素赋予了对应的初值,后面剩余的元素均被清为0。3)常量表达式中可以包括常量但不能包含变量,即无法对数组大小作动态定义。数组中的数组名有值,其值是数组的首元素地址,即a是数组a当中的首元素a[0]的地址。表示定义了一个含有10个元素的整型数组a。2)定义数组时,常量表达式用来表示元素的个数,即数组长度。1)连续性:数组在内存中存储相邻元素之间无断点。对数组元素的初始化可以用以下方法实现。

2025-04-23 13:25:30 368

原创 嵌入式学习笔记Day 6:C语言循环结构程序设计!

本篇内容主要包括:goto语句及其构成循环。

2025-04-22 17:40:26 441

原创 嵌入式学习笔记Day 5:C语言选择结构程序设计!

本篇内容主要包括:关系运算符及关系表达式。

2025-04-21 18:24:32 860

原创 嵌入式学习笔记Day4 :零基础入门!

本篇内容主要包括:逗号运算符及逗号表达式。

2025-04-19 00:44:08 684

原创 嵌入式学习笔记Day 3:零基础入门!

本篇内容主要包括:vi便捷用法操作转义字符c语言算术。

2025-04-17 20:38:47 788

原创 嵌入式学习笔记Day 2:零基础入门!

今天是我正式学习嵌入式的第一天!作为一个没有基础的小白,我决定用博客记录下整个学习过程,方便复盘,也希望能帮到同样起步的你。

2025-04-16 19:11:41 843

原创 嵌入式学习笔记Day 1:零基础入门!

今天是我正式学习嵌入式的第一天!作为一个没有基础的小白,我决定用博客记录下整个学习过程,方便复盘,也希望能帮到同样起步的你。

2025-04-15 18:31:09 430

空空如也

空空如也

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

TA关注的人

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