- 博客(34)
- 收藏
- 关注
原创 关于VS839的系统环境配置
本文介绍了在Ubuntu 18.04系统上进行Linux内核(5.4.94)开发环境的配置流程。主要内容包括:1) 系统要求:虚拟机内存建议80G,提供扩容步骤;2) 创建共享文件夹实现PC与Linux文件共享;3) 软件安装与更新;4) CMake 3.14.0的移植与安装;5) 交叉编译工具链配置;6) SDK配置与内核编译流程,包括内核源码解压、补丁应用和编译。文档还提供了常见问题解决方案,如共享文件夹失效的处理方法。最终通过make all命令完成系统编译。
2025-12-03 13:49:17
1007
原创 裸机程序(3)
其核心逻辑是:由唯一的 “主设备” 发起通信请求、控制通信时序,多个 “从设备” 被动接收请求、执行指定操作,并向主设备返回 “应答信息”,以此确保通信的有序性、可靠性和可追溯性。UART 是一种硬件电路或模块(可集成在芯片中,如单片机的 UART 外设),负责将并行数据(如 CPU 内部的 8 位数据)转换为串行数据(逐位传输)发送出去,同时将接收到的串行数据转换为并行数据供设备处理。设备 A 的发送线(TX) 连接设备 B 的接收线(RX);设备 A 的接收线(RX) 连接设备 B 的发送线(TX);
2025-09-05 21:11:46
1035
原创 裸机程序(2)
定时器中断是单片机中一种重要的中断机制,主要用于实现精确计时、周期性任务触发等功能,能让单片机在执行主程序的同时,“自动” 响应定时事件,大幅提升系统的实时性和效率。中断嵌套,高优先级的中断打断低优先级的中断,完成后继续执行低优先级中断。中断是指当中央处理机CPU正在处理某件事的时候外界发生了紧急事件的请求,要求CPU暂停当前的工作,转而去处理这个紧急事件,处理完成后返回原事件继续处理。控制方式:需通过单片机输出特定频率的脉冲信号(如方波),频率不同则音调不同(频率越高,音调越高)。
2025-09-04 19:39:07
1450
原创 裸机程序(1)
裸机指未安装操作系统的硬件设备,直接通过底层硬件驱动运行程序。以AT89C52单片机为例,其裸机程序直接操作硬件寄存器实现功能,采用"初始化+主循环+中断服务"模式。AT89C52是8位增强型51架构单片机,具有8KB Flash程序存储器和256字节RAM,支持定时器、中断等外设资源,开发门槛低,适合嵌入式入门。典型裸机应用包括跑马灯和数码管控制,通过位运算直接操作I/O口寄存器实现硬件控制,无需操作系统支持。
2025-09-03 20:57:29
1281
原创 数据存储——数据库
数据存储有许多方式:变量存储、数组存储、数据存储结构,这些存储方式存在内存上,不可避免最大的弊端就是掉电或程序运行结束数据会丢失;update class(表名) set score=100(条件) where 列名 ="内容"create table 表名(列名1 数据类型, 列名2 数据类型,····,列名n 数据类型);insert into 表名 value(值1,值2,····,值n);select 列名1, 列名2, ···, 列名n from 表名;
2025-08-29 21:21:32
1064
原创 linux下的网络编程(2)
AA C0 00 00 00 F0 00 BB 10 A0 00 00 00 10 校验 BB AA C0 00 00 00 F0 00 BB 10 A0 00 00 00 10 校验 BB AA C0 00 00 00 F0 00 BB 10 A0 00 00 00 10 校验 BB。四次挥手:结束阶段,发送端发送FIN结束信号表示结束发送数据,接收端发送ACK应答表示接收到信号,接收端再次发送FIN和ACK信号,表示请求中止接受和应答信号,最后发送端发送ACK应答信号,传输结束。
2025-08-27 23:30:56
1238
原创 linux下的网络编程
广域网:覆盖范围广(如城市、国家、全球),依赖运营商专线、卫星等长途传输技术,连接多个局域网,传输速度相对较慢、延迟较高,典型代表是互联网,用于跨区域的数据交互;局域网:覆盖范围小(如家庭、办公室、校园),采用交换机、路由器等设备连接,传输速度快、延迟低、安全性较高,常用于局部区域内设备(电脑、打印机等)的互联。(6)数据链路层:封装成帧,点对点通信(居于网内通信),差错检测 交换机 ARP;服务端 : bind()----->recvform----> sendto----->close()
2025-08-22 22:12:52
1394
2
原创 进程间通信
每个进程的内核是共用的,另外的0-3G是独立的,无名管道在内核中创立一个空间,其他进程能够对该空间进行读写操作(无名);(3)读返回0:当写端关闭,从管道中读数据,若管道中有数据,则读到数据;(1) 写阻塞:读端与写端都存在,向管道中写数据,当管道满时,发生写阻塞;写端:pipefd[1];(2)读阻塞:读端与写端都存在,向管道中读数据,当管道为空,发生读阻塞;(4)管道破裂:读端关闭,向管道中写入数据,发生管道破裂(异常)与无名管道类似,不过内核中管道开辟的空间(缓冲区)与文件(管道文件)相关联。
2025-08-19 09:09:07
1229
原创 函数族与线程
类型:指针(指向的对象是函数:void *()(void *));效率角度:由操作系统创建,创建时耗时比线程大,跨进程调度比跨线程调度慢;通信方面:通信简单,可以使用线程共享的区域进行通信(比如全局变量);安全性角度:线程没有进程安全性高,一个线程异常可能会影响所有线程;file :需要执行的可执行文件的名称(系统路径下已有文件);线程和所在进程,以及进程中的其他线程,共用进程的堆区、数据区、文本区。效率角度:由所在进程创建,跨进程调度比跨线程调度慢;安全性角度:进程安全性比线程高,各进程空间独立;
2025-08-16 09:10:35
526
原创 文件IO操作
普通IO则是默认打开了三个文件,stdin:标准输入文件---> 0;stdout:标准输出文件----> 1;mode 文件操作权限(读写执行),最高权限:rwx-rwx-rwx --->0777。功能:打开文件并获得一个文件描述符,范围为0--1023,分配原则:最小的未被使用的;参数:fd:要写入的文件;一般权限 rw- - rw- - r-- ---->0664。行缓冲: 大小1k(1024字节)----->人机交互界面、终端;全缓冲:大小4k(4096字节)------>文件缓存区;
2025-08-14 21:37:09
1217
原创 多任务——进程与线程
就绪态---->运行态(cpu调度) 运行态------>就绪态(cpu调度结束) 运行态------->阻塞态(阻塞IO事件,fgets();------> 阻塞) 阻塞态----->就绪态(IO事件到达,输入)(2)先来先服务,后来后服务算法(任务队列:先进先出,后来后出)(3)短作业优先调度(任务进程短的优先执行);<2>未初始化的静态变量(static)------->bss段初始化按位清零;孤儿进程:父进程先消亡,对应的子进程成为一个孤儿进程,会被系统进程收养;
2025-08-14 21:01:18
820
原创 标准IO操作
参数:ptr:存储读到数据的首地址;参数:ptr:要写入的数据的首地址;参数:s:用来存放读取到的数据的内存空间的首地址;参数:stream:需要定位的文件流指针;“r+”,以读写的方式打开,文件需存在;返回值:成功:读到的字符对应的ASCII码值;“w+”如果文件存在则清空,以读写的方式打开,反之创建打开;“w”如果文件存在则清空,反之以只写的方式创建文件并打开;返回值:成功:存储空间的首地址;“a”以追加写的方式打开,文件不存在则创建,存在则续写;“a+”以读写的方式打开,文件不存在创建,存在则续写。
2025-08-12 21:42:58
1106
原创 数据结构(6)
(3)完全二叉树:对于一颗有n个结点的二叉树按层序编号,如果编号i(1<=i<n)的结点于同样深度的满二叉树中编号为i的结点在二叉树中的位置完全相同。GDB(GNU Debugger)是一款功能强大的命令行调试工具,主要用于调试 C、C++ 等编译型语言的程序,支持断点设置、变量查看、内存检查、程序单步执行等功能。(2)满二叉树:除了叶子结点外,所有分支都有左右子树,并且所有子树都在同一层。(1)斜树:所有结点都只有左节点,叫做左斜树,反之,叫做右斜树;(2)左子树和右子树是有顺序的,次序不能颠倒;
2025-08-12 19:44:53
379
原创 数据结构(5)
顺序队列存在假溢出问题:即当数据的头不在队列的两端,存储数据会发生空间不足的情况,事实上队列空间被没有被完全利用。解决上述问题的办法为:使用顺序队列,即存储数据到一端时,会折返至另一端继续存储,存储至队列空间-1个时结束。存储数据时,通过对应的哈希函数可以将数据映射到指定位置,查找时,仍可以将根据数据找到存储位置。将键(Key)映射到对应的值(Value)的存储位置,从而实现快速的插入、删除和查找操作,平均时间复杂度接近 O (1)。队列的最大存储特点就是先入先出即:FIFO,可以应用在数据的缓存。
2025-08-07 22:46:38
809
原创 数据结构(4)
内核链表是操作系统内核和系统级编程中常用的一种数据结构,它与普通链表相比,在设计上更加灵活高效,它不再将数据存储再链表中,而将链表存储在数据中,而且本身是双向循环,提高了利用率。二级指针的作用:1.在被调函数中,想要修改主调函数中的指针变量,需要传递该指针变量的地址,形参用二级指针接受;内存可分为五个区:栈区、堆区、内核、数据区、文本区。利用顺序表创建的栈称之为顺序栈,利用链表创建的栈称之为链式栈。空栈:先存入栈数据,再移动栈顶,使栈顶保持为空;满栈:先设置栈顶,再入数据,使栈顶始终有数据;
2025-08-06 22:10:04
964
原创 数据结构(3)
其中OBJ为目标文件,SRC为依赖文件(多个依赖可以写做SRC+=),CC为gcc编译器, INC为声明(.h文件),后面加文件地址。在引用任意文件时都需在定义的变量加上()并在括号外加上$符号,例如$(OBJ)。$^意思为所有依赖,$<意思为第一个依赖,$@意思为生成的目标 . out文件。其中data依旧表示链表数据,ppre表示前一个结点的地址,首结点为NULL,pnext则表示后一个节点地址,尾结点为NULL。时间戳:在编译代码时,只编译修改的文件,其他文件只做链接即可。
2025-08-05 20:13:43
633
原创 数据结构(2)
前面已经介绍过单向链表行为有哪些链表行为,在成功创建链表对象之后,我们开始完成其他链表行为。一、插入数据(1)头插(2)尾插二、删除数据(1)头删(2)尾删三、修改数据四、查找数据除了常规查找方法之外,我们也可以利用快慢指针法进行查找,快指针一次走两步,慢指针一次走一步,快指针走到结尾时,慢指针正好走到中间值,我们利用这个原理,寻找倒数第k个元素时,只需让快指针先走k步,然后二者共同走直至结尾即可。五、销毁数据六、判断有环链表有环列表:该列表中没有空指针
2025-08-04 23:55:41
365
原创 数据结构(1)
散列结构(哈希结构):将数据的存储位置与数据元素之间的关键字建立对应关系(快速定位数据)2.线性关系:数据元素与元素之间存在一对一的关系(数组、顺序表、链表、队列、栈);4.图形结构:数据元素与元素之间存在多对多的关系(网状结构)。索引结果:将要存储的数据的关键字和存储位置之间建立一个索引表;3.树形结构:数据元素与元素之间存在一对多的关系(二叉树);元素(key) ———— 函数(哈希)———— data。(2)物理结构:数据元素在计算机内存中的存储方式;链式结构:在内存中选用一套非连续的内存空间存储;
2025-08-04 23:33:40
556
原创 结构体、共用体,位运算
在C语言中,结构体( struct )和共用体( union )都是用户自定义的数据类型,用于组合不同类型的数据,但两者的核心区别在于内存分配方式,这直接决定了它们的用法和场景。左移 《 , 两二进制数左移n次.后面补0 低位向高位移动, 例如 1《 2,意思为1从低位向高位移两位;右移 》 , 二进制数右移n次.前面补0. 高位移向低位, 例如 1 》2,表示1从高位向低位移两位。枚举也属于用户自定义函数类型,但与上面两者不同,它是定义一组命名的函数常量,最终利用到函数中。
2025-07-31 22:23:18
1204
原创 指针函数与指向指针的指针
用法为malloc(元素个数 * sizeof(类型名)), 定义一个 int *p= malloc(1024 *1024)后,系统会传回一个首元素地址。可以用来间接修改指针的值 ,即当需要在函数中修改外部指针的指向(如动态分配内存后更新指针),必须使用指针的指针。回调函数是一种特殊的函数,它作为参数传递给另一个函数,并在特定事件发生或条件满足时被调用,回调函数的本质是让函数的使用者调用。内存地址层级关系为**p(二级指针) → *p(一级指针) → a(变量) → 10(数据)。
2025-07-30 21:32:54
753
原创 指针与数组
int *p 【10】表示p是一个包含10个int型数组的指针,他的字节长度为80个字节。二维数组a【i】【j】可以用指针写作 *(*(a + i) + j) ,其中i代表行,j代表列。此外二维数组作为函数参数传递,其类型为一维数组的指针,如int (*a)【4】。这类函数可以返回变量、数组、动态分配内存等的地址,常用于需要在函数外部使用函数内部计算得到的数据地址的场景。其中存在万能复制函数Mencpy,形参类型为void *型(万能指针),本身不能做指针运算,用于函数可以强转为任意类型。
2025-07-30 00:41:46
421
原创 指针的运算与数组
其结果依旧是一个是一个指针,新的指针是在原来的地址值基础上加上/减去n *(sizeof(指针指向的数据类型))个字节。指针声明时若未确定指向,通常初始化为空指针,避免成为 “野指针”(指向随机内存的危险指针),空指针避免野指针意外修改重要数据。在编程中,空指针 是一个特殊的指针值,表示该指针不指向任何有效的内存地址。指针也可以进行自增,即*(p ++)或*(++p)或*++p(单目运算符自右向左运算)。(*p)++ 他表示指针的内容自增,而不是指针本身。指针和指针之间可以进行减法运算,但是要保证两种(
2025-07-29 00:21:10
621
原创 预处理命令与指针初步
在64位操作系统下指针的内存空间为8个字节(sizeof (p)= 8),32位操作系统占4个字节(32 位操作系统的地址总线宽度为 32 位)。int *p也可以储存其他类型的指针,通过显性转换来实现,例如存储float型的指针是,可以写作int t;不带参的通常形式为#define 标识符(宏名) 字符串 标识符表示后面的字符串(只换不算),后无分号。#endif(避免重定义);指针格式为 基类型 * 指针变量名 (例如: int *p,定义了一个只装int型的指针);
2025-07-28 00:02:18
605
原创 多维数组与变量存储类别
extern函数:对于已有全局变量,添加extern前缀表示已定义该函数,此处只是声明,用法为: extern int maxOfTwoNumber(int a,int b);register函数:表示将函数寄存到寄存器中(也不一定,不太重要的不会寄存),能提高读写效率,且不会被寻址,用法为 register int k;作用域:局部作用域、全局作用域,可以嵌套,{}以外为全局变量,函数形参为局部,全局变量存放在静态区,其中内容未被初始化,其变量值为0。(3)在同一作用域中不得定义同一标识符;
2025-07-25 20:39:24
549
原创 函数的调用与参数
函数调用时,PC 会指向被调用函数的入口地址,在主调函数中的函数会使pc跳转至被调函数的第一条指令,第一条指令地址为函数的入口。栈遵循先进后出(FILO),后进先出(LIFO)的规则,函数参数入栈顺序默认自右向左传递(例如:strcat(i,j)j先入栈)。局部变量:在函数、代码块(如if/for语句块)内部定义的变量,仅在其所在的局部范围内有效。与值传递对应的就是指针传参,其在被调函数中修改主调,通过访问地址修改实参本身,适用于数组,数组作为函数参数传递首元素地址,实现指针传参,提高效率。
2025-07-24 19:57:34
1068
1
原创 二维数组与函数初步
用来比较数组,通过数组内的元素在ASCII表中的序号进行比较,具体方法为strcmp(数组1,数组2),若数组1大于数组2,输出结果为正数,反之为负数,相同为0。二维数组组成与一维数组相同,均由类型说明符,说明符与常量表达式构成,其中类型说明符为除void外的所有类型,数组名为满足字符串的一般规则,常量表达式为定义的变量如(int a。如下,第一个返回值之前的为被调函数,两个返回值之间的部分为主调函数,被调函数一般在主调函数之前。函数名:满足标识符的一般规则,是函数的标识符,用于调用函数;
2025-07-23 20:30:46
516
原创 字符数组的定义与引用
分别定义begin 和end,begin从0开始,end为数组元素个数-1,定义数组中间值为mid = (begin + end)/2,利用if语句与目标值进行比较,若中值比目标值小,则在右边,反之在左边。在一个足够大的数组里,按照单行有序性连续的方式存储,这种称之为字符串,通常以‘\0’的结尾。功能:按 ASCII 码值逐个比较两个字符串的字符,直到遇到不同字符或 '\0'。功能:将源字符串追加到目标字符串的末尾(覆盖目标字符串原有的 '\0',并在新字符串末尾添加 '\0')。
2025-07-22 20:58:44
592
原创 一维数组的定义与引用
上述定义同样可以写成int a 【】= {1,2,3,4,5} 只需保证省略元素后有初始化列表。第一轮:3和1交换→[1,3,4,2] → 3和4不换 → 4和2交换→[1,3,2,4](4 到位)第二轮:从剩余元素找最小值 2→与 3 交换→[1,2,4,3](2 到位)插入 2:2<4→移动4 → 2<3→移动3 → 插入→[1,2,3,4]下面是一段将数组{1,2,3,4,5,6,7,8,9,0}进行逆序的代码。例如原数组 [1,2,3,4,5] → 逆序后 [5,4,3,2,1]
2025-07-21 22:35:02
870
原创 C语言基础 (5)
上述代码完成了在1990年和2100年之间对闰年的查找,其中,year = 1990为初始化,year<=2100为循环条件,year++使为趋于结束的语句。{}内为循环体结构,,表达式1表示初始化,表达式2表示逻辑或者关系(循环条件),表达式3表达循环趋于结束的语句,循环终止时,循环条件为初次为假的时候。表达式1为逻辑或关系表达式,判断表达式1为真,输出结果为2,若1为假,则输出结果3。循环的三要素:循环变量初始化,这是进入循环的条件,循环要有执行条件,循环趋于结束的语句。表达式为 for(表达式1;
2025-07-20 23:58:59
777
原创 C语言基础(4)
上述代码完成了输入年份与月份来计算天数,其中小月与大月间运用逻辑或表示为其中的任意一个,在闰年平年的计算中运用逻辑与,表示某数被4整除和不能被100整除的条件必须同时执行。&&运算符在左关系表达式为真时,会截断右表达式(不考虑优先级),导致右表达式不执行【表达式截断】,减少代码耦合性,来保证程序效率。注意:不能连续比较,像i=2,j=4,-4<i<j,这样会将-4与i比较,结果与j比较。1<小于,2<=小于等于,3>大于,4>=大于等于,5==等于,6!或||:逻辑或,两者一个为真为真, 否则均为加;
2025-07-18 21:20:22
437
原创 C语言基础(3)
putchar函数(字符输出函数)的作用是向终端输出且只能输出一个字符,一般形式为putchar(),括号内里可以填整型数字,输出结果为ASCII码表对应的数,也可以直接填char型,此时会产生符号位扩展,ASCII码表中最大值为127,二进制为0111 1111,经过符号位扩展,高字节补0。%5d:输出宽度为5,空位补空格,若%05d,表示输出宽度为5,空位补0,若%-5abc,则输出5 abc(中间五个空格),不允许输出%-05abc;数据操作的任务是对已提供的数据进行加工。
2025-07-17 20:58:08
651
原创 C语言基础(2)
输出i + j时,i + j 叫做匿名变量,又称临时变量,是指程序执行中未定义的可改变的量,const int i 值恒定,属于只读变量。右边的值称为右值,一般为常量。纵向的箭头自下向上优先级增高,在运算中低优先级的数据类型会转换为高优先级的数据类型,例如int与long同时运算时,int会转变成long型,这种混合运算中的转换我们称之为。同时,出来在混合运算时进行转换之外,我们也能够进行自发的转换,如在变量前增加 (x)a,x表示我们想要转换的类型,加完后进行隐式转换,这种转换我们称之为。
2025-07-16 21:20:19
790
原创 C语言基础
阶码将整数部分转换为二进制,小数部分×2,只至小数部分为0为止,利用科学计数法技术,进行移位,将移位的阶数➕127,转换为二进制;在整形数据中,第一位为符号位,0为正数,1为负数,若定义变量为负数,先将其转为十六进制,再转为二进制,取反码,再➕1得补码(若正数原码即为补码),再转为十六进制存储进内存单元。char和unsigned char ,大小为1个字节,char范围是-2的-7次方~2的7次方-1;(1)整形(整数)(2)字符型(3)浮点型(包含单/双精度型)(4)枚举型。
2025-07-15 19:12:35
352
原创 普特Day1
了解了unix操作系统和linux操作系统的历史以及c语言的诞生。学习了Linux的简单操作指令,包含cd,pwd,ls等,学习了绝对路径和相对路径,文件夹及文件的创建、复制及删除。编写和执行“Hello World”。今天了解了总体学习计划,明白学习要求。
2025-07-14 17:27:23
269
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅