自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 U-Boot阶段系统全量更新固件包制作杂记

有一个在 U-Boot 阶段做系统全量自更新的需求,要制作系统的全量固件包(U-Boot.img、kerlen.img、rootfs.img)。大体分为三个主要部分:U-Boot-shell 脚本编写、打包各镜像为一个固件包、固件包的加密和解密。

2024-10-14 16:47:55 1241

原创 uboot中 fastboot udp 协议分析

fastboot是android系统常用的一种刷机方法。android系统设计了2种刷机方式:fastboot和recovery。不论是二者中的哪一个,都是用来给设备刷写固件的。而刷机其实就是镜像传输+烧录,fastboot刷机时使用usb来传输镜像文件,然后写入对应分区(可以拿过来用,需要芯片厂商在底层提供原始实现)fastboot是一种通信协议。基本工作原理就是上位机(pc)通过 USB 或以太网(UDP)与引导加载程序(uboot)通信。

2024-08-22 18:34:27 1481

原创 在 uboot 中实现 UDP 协议

uboot中有许多通信协议,像TFTP、NFS等,这些协议底层都是基于UDP协议来实现的,由于有一个板子在 uboot 段进行固件下载更新的需求,本来想基于TCP协议来实现自定义通信协议(TCP有自带的拥塞控制和重传机制)。首先在common/cmd_net.c中添加如下代码,这一步的目的是在uboot的命令中添加一个名为udp的命令,当我们在控制台输入udp后便会执行do_udp函数,然后逐层往下调用其他函数。这个函数调用了net/net.c中的net_loop()函数,到这里本路径下的修改工作已完成。

2024-08-22 15:33:07 1003 3

原创 为TI的 AM355移植uboot和linux内核

1.uboot源码顶层目录下各源码文件夹的作用2.编译后生成的uboot.xxx 各文件后缀含义关于以上两点社区已经有很多前辈总结的很详细,这里不做赘述。对于uboot源码分析韦东山老师b站上有免费的课程,时间富余的话推荐看一下,会对uboot源码有更深刻的认识。1. 下载交叉编译工具链。

2024-08-18 15:54:55 1029

原创 嵌入式学习 Day 36

数据库软件:MysqlOracleSqlServerSqliteRedisNoSQL。

2024-03-12 19:04:49 1107

原创 嵌入式学习 Day 32

4.能够实现客户端聊天内容的转发,当某个客户端发送聊天信息时,能够将该信息转给除了该用户之外聊天室内所有其余客户端用户。实现服务端对用户的管理(1.查看当前直播间的在线人数 2.能够实现禁言、踢出直播间功能)2.当有新的客户端加入时,能够向所有客户端提示:"欢迎 XXX 用户进入直播间"3.当有客户端退出时,能够向所有客户端提示:"XXX 离开直播间"1.对所有加入直播间的用户的IP地址和端口实现管理(加入、退出)2.接收用户输入的信息,能够将信息发送给服务端。3.接收服务端回复的数据信息,并完成显示。

2024-03-12 11:10:11 475

原创 嵌入式学习 Day 33

4.UDP是无连接的、TCP有连接的、UDP是以数据包形式传输、TCP是以数据流的方式传输。backlog:允许等待的尚未被处理的三次握手请求的最大个数。本次发送确认号:上次接收到的序列号 + 实际接收的数据长度。2.在通信过程中通过序列号和确认号保障数据传输的完整性。address:存放IP地址的空间首地址。2.确认号:已经确认接收到的数据的编号(处理等待连接队列中的第一个连接请求。1.序列号:发送端发送数据包的编号。本次发送序列号:上次收到的确认号。addrlen:IP地址的大小。

2024-03-12 11:10:03 958

原创 嵌入式学习 Day 34

4.epoll可以工作在水平触发模式(默认: 低速模式),还可以工作在边沿触发模式(高速模式)events:要监听的事件 POLLIN:是否可读 POLLOUT:是否可写。3.epoll会将产生事件的文件描述符对应的事件直接返回。select监听文件描述符集合中是否有文件描述编程ready状态。限制(放在内核中是一个链表,只要有空间就可以一直加入新的监听文件描述符)1.select监听的集合中的文件描述符无。1.select监听的集合中的文件描述符。成功返回文件描述符集合中的文件描述符个数。

2024-03-12 11:06:55 878

原创 嵌入式学习 Day 31

数据传输,数据共享。

2024-03-07 18:17:51 1037

原创 嵌入式学习 Day 27

定时seconds秒后给调用进程发送SIGALRM信号。让进程睡眠,直到接收到信号(捕捉)才能继续向下执行。给PID对应的进程发送sig信号。成功返回之前设定剩余的秒数。seconds:定时的秒数。

2024-03-05 23:46:16 424

原创 嵌入式学习 Day 28

1.地址:区分不同内存空间的编号2.指针:指针就是地址,地址就是指针3.指针变量:存放指针的变量称为指针变量,简称为指针野指针: 指向随机空间的指针空指针: 指向内存地址为0x0的空间的指针注意:定义指针一定要初始化,防止成为野指针。

2024-03-05 23:45:36 1035

原创 嵌入式学习 Day 30

练习:编写2个进程任务(recv.c send.c),send.c从终端接收一个字符串利用消息队列发送给recv.c,recv.c从消息队列中接收消息并打印在终端。根据pathname和proj_id生成一个key_t类型的key值,将来可以用来创建消息队列、共享内存、信号灯。创建共享内存 -> 映射到共享内存中 -> 共享内存操作 -> 解除映射 -> 删除共享内存。ipcrm -q/-m/-s 消息队列ID/共享内存ID/信号灯ID。成功返回key_t类型的IPC对象的key值。

2024-03-05 23:42:35 904

原创 嵌入式学习 Day 29

1.函数的定义2.函数的调用3.函数的声明。

2024-03-04 22:51:49 852

原创 嵌入式学习 Day 26

(题外话)数组指针:数组指针是一种指针,它指向一个数组的首地址。在C语言中,数组名本身就是一个指向数组首地址的指针,因此数组名可以被赋值给指针变量,也可以作为函数参数传递。// 定义一个指向长度为5的整型数组的指针指针数组:指针数组是一个数组,其中的每个元素都是一个指针。每个指针指向内存中的某个位置,可以是另一个变量、数组或者函数等。在C语言中,指针数组通常用于存储不同类型的数据或者对象。// 声明一个包含3个整型指针的数组。

2024-02-28 20:19:31 923

原创 嵌入式学习 Day 25

1.pthread_mutex_trylock 替代 pthread_mutex_lock。注意:留意pthread_create( , , , )的四个参数如何传。概念:多线程操作互斥锁,导致多个线程均无法向下执行的状态称为死锁状态简称为死锁。创建三个线程分别循环打印 A B C,要求打印出来的顺序总是 A -> B -> C。1.想得到线程的结束状态(pthread_join可以返回线程的结束值)互斥锁只能解决资源竞争的问题,无法同步代码(没有先后执行的顺序关系)

2024-02-27 19:07:11 882

原创 嵌入式学习 Day 24

一个线程异常结束会导致进程异常结束,进程异常结束,该进程内所有线程任务均无法向下执行。进程没有共享空间,不存在资源竞争的问题。start_routine:线程要执行的函数的入口。进程空间是独立的,没有共享空间,通信实现比较复杂。多进程需要在不同的空间中切换。retval:存放线程结束状态空间的首地址。thread:存放线程ID空间首地址。attr:线程属性空间首地址。编译时加 -lpthread选项。在该进程中创建一个新的线程。让调用该函数的线程任务结束。retval:线程结束的值。

2024-02-26 19:16:46 1123

原创 嵌入式学习 Day 23

进程的父进程先结束,此时该进程称为孤儿进程,被系统进程收养,进程再结束时,会被系统进程回收进程空间。父进程中打印自己的PID和两个子进程的PID。3. 通过MMU内存映射单元,当一个进程执行时,将物理地址中的数据加载到虚拟地址中运行。创建一个子进程,新创建的进程称为原来进程的子进程,原来的进程称为新进程的父进程。进程:是一个程序动态执行的过程,包括进程的创建、进程的调度、进程的消亡。创建一个父进程的2个子进程,子进程中打印自己的PID和父进程的PID。S 睡眠态/可唤醒等待态。

2024-02-26 01:37:12 837

原创 嵌入式学习 Day 22

恢复 file.txt 文件名,意味着可再次通过inode节点找到file.txt对应的数据块(此时file.txt对应的数据块不一定在1000这个位置,因为无法被访问到的文件空间将被系统回收,此时新建立的file.txt[大概率不在在1000这个位置,若在数据恰巧恢复],之前的数据丢失[打开file.txt显示空白])删除file.txt后,仍可以通过b.txt来操作该文件,数据不会丢失。ln -s file.txt a.txt //创建软链接 a.txt 到 file.txt。

2024-02-20 23:56:20 1052

原创 嵌入式学习 Day21

此位为1,代表不给此位权限 (这是因为dir为2_19的子目录,父目录此位没有写权限,则子目录也不能有写权限,哪怕给权限0777,仍要服从父目录权限)文件IO中 open 获得文件标识符。递归遍历:对当前目录下的信息和其包含的子目录下的信息统统进行查找。X_OK 检测是否拥有执行权限。W_OK 检测是否拥有写权限。检测调用函数的程序对文件是否拥有指定权限。F_OK 检测文件是否存在。创建的文件并不在2_19目录下,而在2_19的父目录下。打开目录获得目录流指针(目录流定位到文件开头)

2024-02-20 00:43:57 1097

原创 嵌入式学习 Day20

O_CREAT 标志着:文件不存在将被创建。创建文件就要明确其权限,权限我们来给(不手动给权限,文件权限将是随机的)(想要文件是什么权限,就给什么,不一定非得是0664)0664 代表文件权限为 rw-rw-r-- ,0664是三组 rwx 通过按位与1得来的。从文件描述符fd对应的文件中读取count个字节存放到buf开始的空间中。O_TRUNC 文件存在截断(清0)向fd对应的文件中写入buf指向的count个字节。O_CREAT 文件不存在创建。打开文件并且获得文件描述符。

2024-02-19 00:05:42 1086 1

原创 嵌入式学习 Day19

从流中读取nmemb个对象,每个对象size个字节,存放到ptr指向的空间中。向流中写入nmemb个对象,每个对象size字节大小,在ptr指向的空间中。练习:实现将一个文件中的内容拷贝到另一个文件中。练习:编写一个程序实现统计一个文件的大小。练习:从终端输入一个单词,获得单词的含义。成功返回存放字符串空间的首地址。size:最多读取字符的个数。ptr:存放数据空间的首地址。size:每个数据对象的大小。练习:编写程序统计文件的行数。nmemb:数据对象的个数。nmemb:读取对象的个数。

2024-02-18 13:14:33 1355

原创 嵌入式学习 Day18

4.DownLoad Form 选择 "Others" -> "China" -> "mirrors.aliyun.com"练习:一条shell命令,将/usr/include/stdio.h文件后200行中与extern相关的内容记录到file.txt文件中。w 只写 文件不存在创建,文件存在将文件内容清空,只写打开。w+ 写读 文件不存在创建,文件存在将文件内容清空,写读打开。2.在Ubuntu左侧找到"Ubuntu Software"

2024-02-04 00:19:22 1061 1

原创 嵌入式学习 Day17

形式:宏名 --标识符注意a.标识符一般写成大写。b.宏对应的值 是一个常量c. 宏定义只是做简单的文本的替换,不做计算d. 宏的嵌套e.最后不能写分号,因为分号也会作为宏值一部分,参与到文本的替换中f.#undef 终止宏的定义,后面的代码不能再用这个宏(2).带参的宏#define 宏名(参数) 宏值避免宏展开的副作用能加括号的都加上。带参宏:文本替换 --- 有可能导致,源代码的体积变大。快 --预处理阶段干。

2024-02-03 02:41:31 1430 1

原创 嵌入式学习 Day16

所谓“枚举”是指将变量的值一一列举出来,变量的值只限于列举出来的值的范围内。数据的组织形式 (逻辑上理解的形式) ---会决定使用数据的算法。sun, //名字 --- 代表一个值 --- 符号常量。共用体用的数据最终存储的 --- 应该是最后一次给到的值。,并且头节点的指针域 为NULL //相当于是尾节点。初始化 --- 只能给一个值,默认是给到第一个成员变量的。5.共用体的大小 --是成员变量中最大的那个成员的大小。3.尾节点 ---- 链表的最后一个有效节点NULL。

2024-02-02 01:29:28 1118

原创 嵌入式学习 Day15

练习:2. 结构体大小8,12。

2024-02-01 02:09:25 555 1

原创 嵌入式学习 Day14

1.指针操作一维字符型数组(字符串)2.函数getsputsstrlen。

2024-01-31 02:04:30 1290 1

原创 嵌入式学习 Day13

1.指针概念a.指针 --- 地址 ---内存单元编号b.指针 --- 数据类型 ---指针类型不同语境:定义一个指针 //指针类型的变量打印某个变量的指针 //指针 --地址2.指针变量的定义基类型 * 变量名a.基类型数据类型基本数据类型数组类型指针类型b. * //定义时候的 * 表示定义的是一个 指针类型的变量c. 变量名eg://p和q都是指针类型的变量;a,b是 int型变量。

2024-01-30 01:27:50 1684 1

原创 嵌入式学习 Day12

2.一般使用在多文件编程中,如果想在当前文件使用别的文件中的 全局变量 ,此时,可以使用 extern int a;//NULL 表示 0号地址,而0号地址是系统用的,会段错误。* //表示此时定义的变量 是一个指针类型的变量。基类型 //基类型 表示 指针变量 指向的目标的 数据类型。* 指针运算 //单目运算符 ,运算数必须是指针类型的值(地址)则,内层的作用域的同名标识符,会屏蔽外层的作用域的同名标识符。//只能带出一个结果。

2024-01-29 03:24:11 981

原创 嵌入式学习 Day11

(2)(形参int a[ ];实参int a[ ])若为数组变量,二者是一个东西,不是独立的,a代表相同的内存空间首地址,传参传递的是实参数组的首元素的地址供形参用。//实参 (1)数组名, (2)数组长度。1.数组元素作为函数实参 --- 此时函数的形参 是一个与实参类型相同变量即可。2.数组作为函数的形参 --- 数组作为函数参数,传递的是数组的首元素的地址。形参int a[n] 实参int b[n] 指的是同一内存空间。是形参数组名, int b 是实参数组名,分别在其所在函数中定义,

2024-01-27 04:21:43 1335 1

原创 嵌入式学习 Day10

返回值的类型标识符 函数名(形式参数) //函数头 --规定了函数的形式函数体 //--实现函数具体功能代码返回结果 //return 返回结果(1).类型标识符 (返回值的类型标识符)返回值 如果没有,返回值类型 一般写成void返回的结果的类型 与 定义返回值类型 不一致 ,以定义的返回值类型为准(发生了隐式类型转换)返回值的类型如果不写,默认为int型(2).函数名 --- 一般和函数功能对应 (见名知意)

2024-01-26 14:43:03 1196 1

原创 嵌入式学习 Day9

/二维数组语法角度 ---行数可以省略 列数不能省略。//部分初始化 ,剩余位置补零。// 3行 4列 二维数组。b.二维整型数组操作 ---访问具体的元素 a[i][j]int[4] a[3];

2024-01-25 02:13:08 959

原创 嵌入式学习 Day8

该函数只知道数组(内存空间)的开始处,并不知道数组的大小,如果输入的字符串过长容易溢出,可能擦写掉程序中的其他数据导致程序异常终止。while(i > 0 && a[i-1] > t) //要么拿的数走到头了停,要么前面的值比拿的数小停。"hello" //字符串长度指的是 '\0' 前面有效字符的 个数。

2024-01-24 01:07:30 995

原创 嵌入式学习 Day7

后面是否有更小的数,若有把更小的数放上去(要 找数的位置),把原来的放下来(放到所遇到的更小的数的位置)代表的数据类型 ---数组类型 int a[10];//a所代表的类型为int[10] //数组类型。if (a[i] > a[i+1]) //相邻比较,小往前走,大往后走。if (a[j] < a[i]) //拿着 a[j] 去对比看。代表的值 ---数组首元素的地址 // &a[0]

2024-01-23 01:06:48 1234 1

原创 嵌入式学习 Day6

结构化程序设计方法主张限制使用 goto 语句,因为滥用 goto 语句将使程序流程无规律、可读性差。1. 标签的命名规则与变量名相同,即由字母、数字和下划线组成,其第一个字符必须为字母或下划线。3.default 写错,不会报语法问题,但是写错后,就起不到default的作用。直到,"表达式"为假,while结束,程序继续往下。"表达式"为假,while结束,程序继续往下。4.default 书写的位置,没有明确规定,while() //后面不要写 分号。for 循环结束,程序继续往下。

2024-01-21 22:53:38 944 1

原创 嵌入式学习 Day5

公历年份是整百数的,必须是400的倍数才是世纪闰年(如1900年不是世纪闰年,2000年是世纪闰年)。公历年份是4的倍数的,且不是100的倍数,为普通闰年(如2004年、2020年就是闰年)。真 执行 "语句n" 语句n 执行完,表示if语句结束,程序继续往下。真 执行 "语句3" 语句3 执行完,表示if语句结束,程序继续往下。真 执行 "语句2" 语句2 执行完,表示if语句结束,程序继续往下。真 执行 "语句1" 语句1 执行完,表示if语句结束,程序继续往下。

2024-01-20 00:24:59 884 1

原创 嵌入式学习 Day4

匹配机制导致,%d%d%f%f%c%c都是顺序的在输入缓冲区内匹配拿走数据,而我们在多个数据输入时,以空白符作为分割符,因此空白符也在输入缓冲区内,由于%c 字符占位符。2.利用一个空白符可以匹配任意多个空白符 //scanf(" %c %c",&c1,&c2);3.利用%*c 跳过一个 (输入缓冲区的)数据项 //scanf("%*c%c%*c%c",&c1,&c2);左对齐 加一个 负号(-)

2024-01-19 01:26:11 1541 1

原创 嵌入式学习 Day3

char c = 'a' // 这是规范的char c= 'abc' // 这样只会打印出 'c' ,这是因为char只有一个字节的空间,而根据计算机小 端存储的方式,'c' 被存储在低地址处,仅'c' 已占满char开辟的空间,'ab' 将不会被存储。

2024-01-18 02:06:00 999 1

原创 嵌入式学习 Day2

ctl + v + 方向键 //块选中,这往往不是块选中的目的,通常是为了再使用其他指令,如复 制,剪切等。shift + v +方向键 //行选中,这往往不是行选中的目的,通常是为了再使用其他指令,如复 制,剪切等。数据在内存中的存储形式,都是以其对应的二进制原码的补码形式存储在内存中。

2024-01-17 01:22:14 954

原创 嵌入式学习 Day1

cp dir1 dir2 -r 目录时操作需要加上 -r 选项表示递归操作。ls -a 目录名 查看目录下所有文件(包括隐藏的点文件)mv 123.txt dir1 将123.txt 移动到 dir1。ls -l 目录名(或文件名) 查看目录下文件属性信息(或某个文件的属性信息)二者区别:参考起点不同 ,前者以根目录为参考节点,后者以当前目录为参考节点。绝对路径: /home/linux 只要是以 /(根目录)开头的。

2024-01-16 00:51:55 436 2

空空如也

空空如也

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

TA关注的人

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