自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 linux 驱动编程笔记

查看这个命令 mknod /dev/first_device c 200 0 first_device为我的设备名,200为主设备号 0为子设备号 表示应用程序以后就是以文件/dev/作为入口调用驱动程序的。cp arch/arm/boot/uImage ~/tftpboot/ 将编译好的uImage复制到家目录下的tftpboot目录下。cp drivers/char/first_driver.ko ~/nfs/rootfs 将写好编译好的驱动通过多文件系统复制到开发板,

2024-04-24 11:14:07 387

原创 嵌入式学习day39 数据结构

在记录的存储位置和它的关键字之间建立一种去特定的对应关系,使得每个关键字key对应一个存储位置;采用这种散列技术将记录存储在一块连续的存储空间,这块连续存储开空间称为哈希表或散列表。程序的设计:将现实中大量而复杂的问题以特定的数据类型和特定的存储结构存储在内存中,二叉树:任意一个节点的子节点个数不能超过2个(树的度为2),且子节点的位置不可更改。查找时,根据同样的散列函数计算记录的散列地址,并按此散列地址访问记录。容易造成存储空间碎片。满二叉树:在不增加树的层数的前提下,无法再增加一个节点的二叉树。

2024-03-23 10:00:33 648 1

原创 嵌入式学习day38 HTML

二姐 <rt>(er) (jie)<rt>下载

2024-03-15 14:30:39 531

原创 嵌入式学习day37 数据库

errmsg:出错信息存放空间首地址(使用完毕后使用sqlite3_free释放空间)callback: 只有在select时才会使用,其余调用时传递NULL。3.执行代码让代码产生段错误(会生成一个包含错误信息的core文件)实现将dict.txt文件中的所有单词和含义插入到数据库中。ppDb:操作数据库指针存放空间的首地址。sql: 要执行的SQL语句字符串首地址。filename:数据库文件路径。sqlite3*: 数据库句柄。5.可以直接看到产生段错误的代码的位置。成功返回SQLITE_OK。

2024-03-14 00:57:56 543

原创 嵌入式学习day36 数据库

sqlite> insert into student (id, name, score) values (1002, "李四", 100);sqlite> insert into student values (1002, "王二", "女", 18, NULL);sqlite> insert into student values (1001, "张三", "男", 19, 80);1.创建一张订单表,由 ID, 订单号, 货物信息, 生产厂商, 联系人, 联系电话, 订单时间。

2024-03-12 17:15:12 538

原创 嵌入式学习day35

没有数据到来时,可以让任务挂起,节省CPU资源开销,提高系统效率。select监听文件描述符集合中是否有文件描述编程ready状态。成功返回文件描述符集合中的文件描述符个数。exceptfds:其余文件描述符集合。程序未接收到数据时一直执行,效率很低。只能绑定一个文件描述符用来读取数据。nfds:最大文件描述符的值+1。writefds:写文件描述符集合。判断文件描述符fd是否仍在集合中。readfds:读文件描述符集合。将文件描述符fd从集合中清除。将文件描述符fd加入到集合中。将文件描述符集合清0。

2024-03-11 23:56:01 212

原创 学习笔记。。。

sprintf() 往字符串的前面或中间、后面拼接一个字符串。//dest为目标数组,src为源数组,n为要复制的字符个数。strncpy()用来复制字符串的前n个字符。

2024-03-09 16:29:53 463

原创 嵌入式学习day34 网络

4.UDP是无连接的、TCP有连接的、UDP是以数据包形式传输、TCP是以流的方式传输。2.确认号:已经确认接收到的数据的编号(只有当ACK为1时,确认号才有用)本次发送确认号:上次接收到的序列号 + 实际接收的数据长度。3.在通信结束时使用四次挥手结束连接保障数据传输的完整性。2.在通信过程中通过序列号和确认号保障数据传输的完整性。3.TCP实现机制复杂、资源开销大、安全可靠。1.UDP和TCP都是传输层的协议。本次发送序列号:上次收到的确认号。1.序号:发送端发送数据包的编号。

2024-03-08 11:32:24 505

原创 嵌入式学习day33

4.能够实现客户端聊天内容的转发,当某个客户端发送聊天信息时,能够将该信息转给除了该用户之外聊天室内所有其余客户端用户。实现服务端对用户的管理(1.查看当前直播间的在线人数 2.能够实现禁言、踢出直播间功能)2.当有新的客户端加入时,能够向所有客户端提示:"欢迎 XXX 用户进入直播间"3.当有客户端退出时,能够向所有客户端提示:"XXX 离开直播间"1.对所有加入直播间的用户的IP地址和端口实现管理(加入、退出)backlog:允许等待的尚未被处理的三次握手请求的最大个数。

2024-03-07 17:26:07 316

原创 嵌入式学习day32 网络

/host to network short 将端口号转换为网络通信中的大端存储 eg:htons(50000);//inet_network to address 将二进制ip地址转换为16进制地址型。将IP地址转换为二进制 eg:inet_addr(192.168.1.170);收端: socket -> bind -> recvfrom -> close。addrlen:存放接收到IP地址大小空间的首地址。src_addr:存放IP地址信息的空间首地址。addr:绑定IP地址空间首地址。

2024-03-06 22:43:45 442

原创 嵌入式学习day31 网络

网络层 数据的路由(如何从一个局域网到达另一个局域网) IP地址。domain:使用的协议族 AF_INET (IPv4协议族)dest_addr:目的地址信息存放的空间首地址。子网掩码是1的部分表示IP地址的网络位。子网掩码是0的部分表示IP地址的主机位。表示层 发送的数据是否加密。广播地址:网络位不变,主机位全为1,表示广播地址。应用层 传输的数据。网段号:网络位不变,主机位全为0,表示网段号。

2024-03-06 10:35:55 533

原创 嵌入式day30 指针复习2 函数传参

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

2024-03-04 17:41:44 562

原创 嵌入式学习day29 指针复习

1.指针:1.提供一种间接访问数据的方法2.空间没有名字,只有一个地址编号2.指针:1.地址:区分不同内存空间的编号2.指针:指针就是地址,地址就是指针3.指针变量:存放指针的变量称为指针变量,简称为指针3.指针的定义:野指针:指向随机空间的指针空指针:指向内存地址为0x0的空间的指针注意:定义指针一定要初始化,防止成为野指针4.指针的运算符:*: *p作为右值:获得指针指向空间中的值*p作为左值:将右值放入指针指向的空间。

2024-03-02 17:57:37 662

原创 嵌入式学习day28 Linux 进程间通信

写入数据时,如果管道中没有存满(64k),则直接写入,管道中如果存满,则阻塞等待直到有数据读出,才能继续写入。读取数据时,如果管道中有数据直接读取,管道中没有数据阻塞等待直到有数据写入读出,继续向后执行。读取数据时,如果管道中有数据直接读取,管道中没有数据不阻塞等待直接向下执行。编写两个进程,A B A给B发送一条消息,B接收到打印后再给A回复一条消息。写入数据时,会产生管道破裂错误,导致程序崩溃。打开管道文件 -> 读写管道文件 -> 关闭管道文件。pipefd[0]:读管道文件描述符。

2024-02-29 12:45:36 395

原创 嵌入式学习day27 Linux

该函数用于以原子操作的方式将信号量的值减1。原子操作就是,如果两个线程企图同时给一个信号量加1或减1,它们之间不会互相干扰。1.pthread_mutex_trylock 替代 pthread_mutex_lock。5.互斥锁只能解决资源竞争的问题,无法同步代码(没有先后执行的顺序关系)多线程操作互斥锁,导致多个线程均无法向下执行的状态称为死锁状态简称为死锁。该函数用于以原子操作的方式将信号量的值加1。CPU最小的一次不能被任务调度打断的操作称为原子操作。attr:互斥锁的属性(默认为NULL)

2024-02-27 17:27:02 936

原创 嵌入式学习day26 Linux

一个线程异常结束会导致进程异常结束,进程异常结束,该进程内所有线程任务均无法向下执行。线程:线程是一个轻量级的进程,位于进程空间内部,一个进程中可以创建多个线程。练习:创建三个线程任务,线程打印 线程(TID:XXXX)开始执行。start_routine:线程要执行的函数的入口。进程空间是独立的,没有共享空间,通信实现比较复杂。retval:存放线程结束状态空间的首地址。线程独占栈空间,文本段、数据段和堆区与进程共享。thread:存放线程ID空间首地址。编译时加 -lpthread选项。

2024-02-26 17:14:25 434

原创 嵌入式学习day25 Linux

进程的父进程先结束,此时该进程称为孤儿进程,被系统进程收养,进程再结束时,会被系统进程回收进程空间。一个进程在运行时,操作系统会为该进程分配 0 - 4G 虚拟内存空间,分为文本段、数据段、系统数据段。宏观上三个进程同时执行,微观上进程一 -> 进程二 -> 进程三。创建一个子进程,新创建的进程称为原来进程的子进程,原来的进程称为新进程的父进程。父进程调用fork创建子进程,子进程拷贝父进程的文本段、数据段、系统数据段。进程:是一个程序动态执行的过程,包括进程的创建、进程的调度、进程的消亡。

2024-02-26 10:01:56 840

原创 嵌入式学习day24 Linux

2.指定目录下编写Makefile文件或者makefile。$< 第一个依赖的文件。$@ 要生成的文件。$^ 所有。4.调用对应目录下的makefile文件。5.根据文件设定的编译规则来编译代码。要生成的文件:依赖的文件。3.在目录下输入make。

2024-02-22 00:46:50 239

原创 嵌入式学习day20 Linux

从流中读取nmemb个对象,每个对象size个字节,存放到ptr指向的空间中。向流中写入nmemb个对象,每个对象size字节大小,在ptr指向的空间中。SEEK_CUR 文件当前位置。将格式化字符串输出到stream指向的流中。SEEK_SET 文件开头。SEEK_END 文件末尾。ptr:存放数据空间的首地址。size:每个数据对象的大小。nmemb:数据对象的个数。nmemb:读取对象的个数。stream:文件流指针。stream:文件流指针。size:读取对象的大小。

2024-02-21 01:59:10 279

原创 嵌入式学习day23 Linux

将pathname对应的文件信息放入statbuf中。通过文件名链接,所有能够看到的连接文件均为软连接文件。返回1970-1-1到现在的秒数(格林威治时间)通过文件对应的inode节点链接。pathname:文件路径字符串的首地址。statbuf:存放文件信息空间的首地址。pathname:链接文件的路径。timep:存放秒数空间首地址。/etc/group 组信息文件。tloc:存放秒数空间首地址。通过UID获得对应的用户信息。成功返回包含用户信息的结构体。buf:存放数据空间首地址。

2024-02-20 22:42:17 1059

原创 嵌入式学习day22 Linux

SEEK_CUR 文件当前位置。SEEK_SET 文件开头。SEEK_END 文件末尾。X_OK 检测是否拥有执行权限。R_OK 检测是否拥有读权限。W_OK 检测是否拥有写权限。F_OK 检测文件是否存在。检测调用函数的程序对文件是否拥有指定权限。重新设定文件描述符的偏移量。成功返回包含目录项信息的空间首地址。r: 目录中是否能够查看文件。w: 目录中是否能够新建文件。pathname:文件路径。pathname:文件路径。读到文件末尾返回NULL。

2024-02-19 17:34:09 751

原创 嵌入式学习day21

从文件描述符fd对应的文件中读取count个字节存放到buf开始的空间中。O_TRUNC 文件存在截断(清0)向fd对应的文件中写入buf指向的count个字节。O_CREAT 文件不存在创建。新生成的文件描述符总是为尚未被使用的最小的非负整数。O_ASYNC 异步IO。2.文件IO是系统调用,是Linux内核中的函数接口。成功返回文件描述符(很小的非负整数)buf:存放数据空间的首地址。打开文件并且获得文件描述符。将fd对应的文件描述符关闭。count:写入的字节数。

2024-02-19 09:38:56 287 1

原创 嵌入式学习day19 Linux

2.fgetc/fputc与getchar/putchar的区别。练习:实现将一个文件中的内容拷贝到另一个文件中。成功返回读到字符的ASCII码值。成功返回存放字符串空间的首地址。size:最多读取字符的个数。练习:编写程序统计文件的行数。stream:文件流指针。stream:文件流指针。s:存放字符串空间首地址。stream:文件流指针。读到文件末尾返回NULL。读到文件末尾返回EOF。从流中读取下一个字符。向流中写入一个字符串。从流中读取一个字符串。

2024-02-04 16:20:30 177 1

原创 嵌入式学习day18 Linux

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:17:13 592 1

原创 嵌入式学习day17

2.插入创建一个新的节点节点链接起来//尾插思路:s1.创建一个新的节点//放在了堆区//s2.找到尾节点//此时p在头节点= NULL )//让p指向下一个节点s3.链接到尾节点后面//尾节点s1.创建一个新的节点//放在了堆区//s2.找到尾节点//此时p在头节点= NULL )//让p指向下一个节点s3.链接到尾节点后面//尾节点//统计有效节点的个数。

2024-02-02 20:54:58 491

原创 嵌入式学习day16

1.2.结构体的定义形式struct stu...// 形式1 先定义类型,再定义变量struct stu...//形式2 定义类型的同时定义变量struct....//形式3 省略了类型名--如果只用一次,可以这样写。

2024-02-02 09:43:25 625

原创 嵌入式学习day15

int *p;定义 p变量为int *型此时,p代表地址,p为指针*p 表示对p作了*运算,偏移空间后的基类型的值**p 表示存放指针*p地址的地址eg 图中int指针p本身的类型为int *型,指针p指向目标的类型为int型。int表示指向的空间(a)里存的数据类型为int,表示存放的基类型*表示定义了一个指针变量,这块空间(p)要里存放一个地址数据eg图中int ** q = &p;指针q本身的类型为int **型,指针q指向目标的类型为int*型。

2024-01-31 23:59:05 388

原创 嵌入式学习day14

/&a[0]--对应的数据类型 int(*)[4] //数组类型 (一维整型数组类型)//返回值类型 --- 指针类型 --- 指针的函数 --指针函数。//数组类型的指针 --- 数组指针。//*(p+1) 代表的类型int[4] 此时相当于是 int[4]的数组名。//a --代表的值 -- 首元素的地址 -- a[0]//a --数组名 --代表类型 int [3][4]指针函数 -- 指针的函数 --- 返回值为指针类型 的函数。函数指针 -- 函数的指针 --- 函数类型的 指针。

2024-01-31 00:00:50 303

原创 嵌入式学习day13

/p不能被修改,指向的目标类型不能被修改。}//const char *s --在函数里面 不能通过*s修改到外面的数据。//就近原则 -- 离谁近,就限定谁的。//&s[0] --->char * //地址类型。//(是不能通过*p)//s数组名 --- 代表 数组首元素的地址。//s[0] --->类型 char型。也可以接收 字符串常量 //const char *p --- 指针变量 --本身的类型 int *a --- int型变量 --本身类型 int。p+q //指针不能做加法运算。

2024-01-30 00:41:49 189 1

原创 嵌入式学习day12

/想要取a[0]的地址,所以定义这个地址名为p,数据类型为int*型,取a[0]的地址赋给它。//修饰局部变量时,数据存放在全局区(静态区),程序运行结束,数据a才销毁。extern 可以放在函数声明中 --函数声明 //表示的意思--将函数作用域扩展到当前文件。//基类型 表示指针变量指向的目标的数据类型。//a[i]的首元素的地址也就是a[0]的地址就是a。//&a[0] -- int * 因为是地址型 所以是int。a[i] *(a+i) //指针运算 首元素的地址a再+ i。

2024-01-29 00:33:15 1081

原创 嵌入式学习day11

/编译器最终 是当做指针变量来看的。//实参 一个是(1)数组名,一个是(2)数组长度。//形式上 写成字符数组的形式。//注意: 此时不需要传数组长度 ---因为字符串有结束标志。//此时 形式上看 是数组。1.数组元素作为函数实参 --- 此时函数的形参 是一个与实参类型相同变量即可。//编译器最终当做指针变量处理。

2024-01-27 08:58:42 107

原创 嵌入式学习day10

返回的结果的类型 与 定义返回值类型 不一致 ,以定义的返回值类型为准。返回值的类型标识符 函数名(形式参数) //函数头 --规定了一下函数的形式。准备两个数据 --- 形式参数要能接收两个数据 ---本身其实就是变量。//函数调用在表达式中。(4).函数体 --- 完成函数具体功能的代码。函数体 //--实现函数具体功能代码。自动申请 自动释放。(2).函数名 --- 一般和函数功能对应。(3).形式参数 --- 函数接收数据的入口。(1).类型标识符 (返回值的类型标识符)

2024-01-26 00:38:50 988 1

原创 嵌入式学习day9

/一维数组 //一维数组的元素类型,又一个数组类型。//二维数组 //a数据类型 int[3] [4]int a[3][4] = {1,2,3,4,5,6,7};//a的数据类型 int[4]int a[3][4][5];

2024-01-24 17:39:41 625 1

原创 嵌入式学习day8

/ h e l l o'\0 ' //5就是字符串的长度。//指的是 '\0' 前面有效字符的 个数。插入排序:(在有序的数列中)找一个适合的位置,插入。1.字符串--更关注的是字符串整体,不是单个字符。2.字符串的结束标志 比较重要,表示字符串结束。返回值:表示的是 存储在字符串那块空间的首地址。参数:@s 存放字符串的一块空间。'\0' 对字符串来说,为结束标志。参数:@s 字符串所在空间的首地址。

2024-01-24 01:12:28 517 1

原创 嵌入式学习day7

因为左边空间,右边应该为一个数值 eg:a = 1,所以数组赋值必须一个一个赋值eg:a[0] = 1 或者用循环 a[i] = i+1。[0~数组长度-1]int a[] = {1,2,3};a[i] //下标运算 ---本质 实际是一个地址的运算。(4).常量表达式//表示数组的长度-----变量的个数。(3).[ ] //表示此时定义的是一个数组。数组的越界问题://数组最后一个数为随机数。

2024-01-23 00:48:30 392 1

原创 嵌入式day6

构成循环的要素:初始条件、使循环体趋于结束的语句(操作)、循环体(重复被执行的代码)、结束条件。执行顺序:表达式1 --> 判断表达式2 --> 语句 --> 表达式3。先判断表达式,为真再执行语句,否则结束。先判断表达式再执行。先执行循环体,再判断表达式,若为真则返回继续执行循环体语句,否则结束。应用:while , do while ,switch。while(表达式)语句 //后面不要写分号。break语句 跳出本次循环。while(-1)死循环。while(表达式);

2024-01-20 17:08:56 395

原创 嵌入式学习day5

1>2为假,与运算一假则假,所以不进行后续计算了。含义:求“表达式”,根据结果,匹配下面case后的值,再执行对应case后的语句,直到遇到break或switch的右 } 花括号才停止。> >= < 2 && a++变成一句完整的if语句,不会报错,但并未执行下面的语句。执行语句,语句执行完,if语句结束,程序继续往下。if (表达式) //表达式,做判断的条件。

2024-01-20 01:58:18 459

原创 嵌入式学习day4

/一个空白符可以匹配任意多个空白符,所以敲数字永远匹配不中止,可以敲一个字符中止匹配。发现的问题:程序是按顺序依次运行,要规划好,先画流程图再写代码,否则如图有的数据还没从键盘输入就进行计算,程序无法正常运行。类型也需匹配int -- %d long -- %ld longlong -- %lld。短类型给长类型赋值//无符号:短类型高位补0 有符号:符号位扩展,高位都变为0(正)或1(负)占一个位置,将输入的数据转换为占位符指定的格式,放到输出列表的地址对应的一块内存空间上。

2024-01-18 18:56:08 956 1

原创 嵌入式学习day3

i+++++i //贪心原则 从左至右逐个字符的扫描表达式,看这些字符能否,尽可能多的结合成c的运算符。a += 1 // a = (a + 1) +运算的优先级为1级比赋值运算级别高。srand(seed random重新播种)用法:srand (time(NULL))的值,而右值是所有不是左值的表达式的值。lvalue(left value)//左值,可定位的,看能不能被定位。形式:表达式1,表达式2,......,表达式n 运算的优先级最低。但能否被赋值不是区分左值与右值的依据。

2024-01-17 18:46:29 929 1

原创 嵌入式学习day2

1|000 0000 0000 0000 0000 0000 0000 0000 //某个负数的补码 ---规定 符号位 既充当符号位 又 充当数值位。1 0000 0000 0000 0000 0000 0000 0000 0000 2^32 - 1 //42亿多。0000 0000 0000 0000 0000 0000 0000 0000 //最小值。1|000 0000 0000 0000 0000 0000 0000 0000 //负数。0 ... 1 ---高位。

2024-01-17 01:34:54 386

空空如也

空空如也

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

TA关注的人

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