- 博客(25)
- 收藏
- 关注
原创 进程间的通信(IPC机制)
3.共享内存:共享内存的原理是通过向内核空间申请一片空间来进行进程间的通信,两个相互通信的进程间可以使用同一个键值来申请到同一片内核空间,然后通过将这片内核中的共享空间映射到本地内存,通过对本地内存的读写来实现进程间的通信,在进程结束通信后,应当撤销映射,以保证内核空间的回收,最后删除内核空间中的共享内存区域。修改共享内存属性,也可以删除指定的共享内存对象,shmid是要删除的共享内存对象。
2024-10-16 16:09:14
266
原创 【无标题】
作为模块化动态加载进内核的方式在编译内核的时候,不会编译这些被选为模块化的驱动程序,这些模块化的驱动程序是通过make modules的方式生成 .ko文件,然后挂载到根文件系统下,在需要这些驱动模块的时候,才会执行这些驱动模块,将这些驱动模块加载进内核中的模块驱动区域。cdev_add()设备节点添加;自动创建设备节点:class = class_create(THIS_MODULE,设备类的名称);2.设备的cdev:也就是设备的编号(这是对于设备底层的标识,设备的各种操作(即1中的各种操作),链表。
2024-10-10 21:47:32
324
原创 内核驱动-如何编译内核以及给内核中添加新文件
所以可以选择需要编译的文件,但是因为整个Linux内核文件的数量是在是太多,我们无法一个一个文件去寻找我们所需要的文件,所以在makefile中关于关于目标文件的写法是:obj-$(CONFIG_TEST) + = test.o。出现这个问题是因为我们编译之后的uImage程序是包含64字节头信息的内核程序,而我们执行bootm 0x30008000的时候,pc是指向uImage的头信息开始执行的,所以会出现undefined instruction。在项目中首次编译的时候,会报错。
2024-10-08 21:27:36
709
原创 内核驱动-如何在开发板启动操作系统
1.nandflash:nandflash的大小为256M,比起norflash的2M要大许多,所以可以直接将操作系统烧到nandflash中(nandflash和内存的结构不一样,CPU不能通过总线直接读写nandflash中数据)。bootloader程序在nandflash中的第0块位置,通过专用程序可以将nandflash中的bootloader程序的前4k放进cpu中的IRAM中,然后执行这前4k的程序,在这前4K的程序中初始化好内存,然后将bootloader剩下的程序加载进入内存继续执行。
2024-10-08 19:25:59
336
原创 互斥、同步
使用的函数分别为:pthread_mutex_t;同步:有一定先后顺序的排他性访问。互斥锁可以控制排他性访问,但是没有顺序。因此应当用信号量机制。定义互斥锁--》初始化互斥锁--》加锁--》解锁--》销毁锁。互斥:在多线程中对临界资源的排他性访问。
2024-08-22 19:57:31
272
原创 进程的回收和exec函数族
非阻塞的意思是如果子进程没有结束,父进程不会一致阻塞在这里等待,而是继续执行它的指令。而另外两个不会,若在另外两个函数中只写当前路径下的文件名,函数会执行失败,因为若是文件的话,它默认会在PAHT 中去寻找此文件。若参数为NULL,则代表不关心子进程的状态信息,此时函数只用于阻塞等待回收子进程。返回值:若指令执行成功并且子进程被回收,则为回收的子进程的pid;一般用于父进程回收子进程。3.返回值:若成功,则返回子进程的pid号,若失败,则返回-1。功能:用于回收子进程的资源,并获得子进程的结束信息。
2024-08-20 21:14:40
397
原创 高级编程之进程
进程的概念:进程是一个程序执行的过程。表示进程在一段时间内可以同时执行多个程序,宏观上是多个程序同时进行,而进程在某一个时刻上只能执行一个程序,因此在微观上是串行的。在pcb中最重要的是pid,pid 用来标识一个进程,一个进程只能有一个pid.一个pid也只能表示一个进程。返回值:若返回值为大于0的数,表示子进程创建成功,此时从父进程开始执行。1.就绪态:此时进程已经获得了除cpu之外的所有资源,只要等待cpu的调度便能执行。2.执行态:此时进程相关的资源在内存中,CPU按照程序指令进行执行。
2024-08-19 21:05:39
166
原创 makefile和gdb的使用。
注意:在makefile中使用变量。进入文件后:1. all:main.c add.c mul.c。一般调试:gcc -main.c -g;gdb a.out .makefile:工程管理工具。用于管理多个文件,方便一次性编译。用法:vi Makefile。
2024-08-15 20:25:39
202
原创 文件io以及标准io中缓冲区
只不过fseek()的返回值成功为0,失败为-1.而lseek()函数的返回值成功为从文件开头到定位到位置的字符个数。write(fd,s,size_t):表示向fd中写数据,数据来自s,写入数据的大小为size_t,返回值成功为写入的个数。read(fd,s,size_t):表示从fd读数据到s中,数据的大小为size_t,返回值成功为读到的数据个数,失败为-1.行缓冲区的大小为1k,全缓冲区的大小为4k.行缓冲区主要用于将数据刷新到屏幕,全缓冲区主要将数据刷新到文件。2.缓冲区满缓冲区会刷新。
2024-08-13 21:25:13
429
原创 结构体 共用体 枚举 位运算
注意:结构体类型可以用来作为变量,指针,数组,函数的数据类型。当结构体类型作为指针的数据类型时,表示该指针的基类型为结构体类型,当利用结构体指针来指向结构体数组时。注意:[ ]和->的优先级相同,当利用 (s+i)->score[j]的方式访问数组第 i 个结构体元素中的score数组时,此时 [ ]和-> 的优先级相同,结合是从左到右,所以是先访问到score数组在对数组元素进行访问,所以不用对 (s+i)->score 的整体加括号。形式3:定义类型的同时,定义变量,可以省略类型名。
2024-08-09 21:00:34
277
原创 指针操作二维字符型数组和指针数组和数组指针、函数指针
注意:当操作二维整型数组和二维字符型数组时存在不同,操作整型数组时,需要传入数组的行数,通过指针来操作二维整型数组的方式为:*(*(p+i)+j).当操作二维字符型数组时,也需要传入行数,间接访问的方式为:*(p+i);语法:int (*p)[n]:表示p是一个指针,它的基类型是int[n].通常用于指向二维数组。定义的语法:int * p[n];指针数组是一个数组,数组的每一个元素为指针类型。指针的指针:**p;指针的指针其实就是基类型为指针类型的指针。指针+函数:就是通过指针的方式来调用函数。
2024-08-08 20:01:26
193
原创 指针作为函数参数操作一维字符型数组
char s[] = "hello"和char *s = "hello"的区别:第一个表示在栈上开辟数组空间时,将字符串常量区的字符串常量赋值给栈上那片数组空间。注意:1形参设计为const char *的目的是防止函数中的误操作,好处是可以提前发现问题,可以接受 char *和const char *,提高了参数的适用性。int Puts(const char *s):const char *s//char const *s//char *const s.const 所在的位置不同,限制的对象也不同。
2024-08-07 21:33:23
448
原创 从零开始学习嵌入式day13
2.定义多个指针类型变量:int *P,*q;//定义时候的 * 是修饰变量名的,表示定义的是一个指针类型的变量。6.再从基准值左边开始重复1~5.再从基准值右边开始重复1~5.直到确定每一个位置上的值。形参 ---指针类型变量,用来接收实参。p-q: //表示差了多少个元素个数,也就是差了多少个基类型。地址(指针)传递 :传的是地址 ---可以实现被调修改主调。实参 ----要修改谁,就把谁的地址传过去。可以实现被调修改主调(指针的主要的用途)。形参 ---数组形式 // 本质上是一个指针型变量。
2024-08-06 18:30:52
344
原创 从零开始学习嵌入式第12天
区别:在于在查找头文件的方式不一样,<>到系统默认的路径寻找对应的头文件,”“表示先到当下目录下寻找头文件,如果没有,再到系统默认路径寻找。函数-----调用时,进行使用。函数----编译阶段。2.编译:指令:gcc -S file.i -o file.s.将预处理后的程序翻译成汇编语言程序语言。4.链接:指令:gcc file.o -o file.将使用到的其他代码链接到一起生成最终的可执行文件。3.汇编:指令:gcc -o file.s -o file.o.将汇编程序翻译成二进制文件。
2024-08-05 20:35:47
398
原创 从零开始学习嵌入式day11
2.static:修饰局部变量时,1 局部变量的声明周期会被延长,从程序开始到整个程序执行结束。4.extern:1.表示变量是存在外部的,即不在当前文件中。3.static修饰全局变量时,表示限定该全局变量的作用域为当前文件。在局部作用域中定义的变量为局部变量,在全局作用域中定义的变量为全局变量。3.二维整型数组作为函数参数:形参需要指定为int a[][n](其中行的值可以不写,但是列的值必须写。在函数的形式参数中,因为处理的是字符串,所以不需要传递数组长度,而是以‘\0’作为结束的标志。
2024-08-03 18:38:43
525
原创 从零开始学习嵌入式day10
其实实质是利用一种叫栈的数据结构,它的本质也是一片内存空间。利用栈来保存现场(就是对当前函数的数据及信息的存放),结合栈的特性:先进后出 来保证函数的层层调用以及返回。在C语言中它的本质上是一片连续的内存空间,只是按照栈的特性来进行数据的存储。1.栈:用于存放局部变量,对于其中的变量所占的空间是自动申请和自动释放的。在Linux中,栈空间的默认大小为8M,但是可以修改。2.堆:特点是空间大,只不过堆上的空间是手动申请和手动释放的。思路:比如说要求问题n,依赖于问题n-1的求解。5.代码区:是一片只读区域。
2024-08-02 19:20:28
346
原创 从零开始学习嵌入式day9
4. 考虑函数需不需要带出结果,以此来确定函数的类型说明符。二维数组获得单个字符串的语法:gets(s[i]) /scanf("%s",s[i]);2.考虑函数需要哪些数据:形参的定义:数据类型 形参变量名。1.void bzero(void* s,size_t n):该函数的功能时将s开头的n个字节清除为0.printf("%s",s[i]).用于输出二维数组中的一个字符串。注意:printf("%s",s). 用于输出一个字符串。函数的思想:函数的思想就是一个从上到下逐步求解的一个过程。
2024-08-02 12:50:59
354
原创 从零开始学习嵌入式day8
2.该函数的返回值为int类型,通过停在最后位置上的字符的差值的正负来判断大小关系,返回值为停在最后一个位置上的字符差值的值。2.源字符串可以为字符数组名,也可以为字符串常量。注意:在定义二维数组时,可以省略数组的行,但是不能省略数组的列的值。3. strcat(目标字符串,源字符串):该函数用于拼接字符串,将源字符串拼接到目标字符串后面。二维数组的本质:1. C语言中不存在真正的二维数组,都是一维数组模拟的。2.strcpy(目标字符串,源字符串):该函数用于复制一个字符串。参数:1.可以为字符串常量。
2024-07-31 20:29:29
516
原创 从零开始学习嵌入式day7
在找最大值的实现中:从头开始向后与未排序的值进行比较,在比较中,若前面的数大于后面的数,则交换两者的值,直到比较到最后一个未比较的数,此时便将未排序的数中的最大值找到并按顺序放置到后面位置。对于一个位置,1:我们需要为这个位置找到合适的数, 2 对于整个数组,我们需要为数组的每一个位置放置合适的数。找到最小的数在代码中实现:以当前位置上的数和后面的所有数进行比较,若大于后面的数,则两者交换位置。2 :为数组的每一个位置放置合适的数:依次从剩下的未排序的数中找到最小的数并依次放置给对应的位置。
2024-07-30 21:19:15
1444
原创 从零开始学习嵌入式day6
语义:表达式1是用于初值设定,表达式2是循环判断结束的条件,表达式3是使循环趋于结束的条件。如果为真,则执行循环体中的语句,然后再执行 s3:执行表达式3的语句,然后继续执行s2中的操作,以此反复,直到不满足循环继续执行的条件,然后退出循环。(原因是:如果对数组初始化,就代表此时的数组的大小为固定值,但是因为常量表达式可以为变量,所以应当是在知道变量的大小之后才能确定数组的大小,这样两者是矛盾的)如果表达式的结果为真,则继续执行循环体中的语句,直到表达式的结果为假,然后结束循环进入下面的语句。
2024-07-29 20:28:17
548
原创 从零开始学习嵌入式day-5
因为存在一假为假和一真为真的特性,所以,如果在计算完左边表达式的结果后,如果已经能确定整个表达式的逻辑值,则不会再去计算后面表达式的结果。整个条件表达式的意思为:若表达式1的值为真,则表达式2的结果作为表达式的结果,否则将表达式3的结果作为表达式的结果。switch语句用于处理多种分支的情况,需要注意switch中的表达式结果需要为整型。在if()语句中注意:1.可以有单多的if语句,但是不能有单独的else语句。构成循环结构的基本要素:循环的初始条件、循环的结束条件、循环体、使循环趋于结束的语句。
2024-07-27 21:26:52
1343
原创 嵌入式学习day4
如果数据的实际宽度大于m的值,则会输出实际的数据的宽度。(其中特殊的时%c,在%c匹配到空白符时,%c能够对空白符读取成功。%X:表示将数据以十六进制输出,并且其中的abcdef以大写的形式输出。putchar(x):用于输出一个字符.这个函数的返回值是类型是int,返回值等于所输出字符的ASCII码值,但是如果输出失败,则返回值位-1.,比如 \n%c,待匹配的字符为 \t \n c,则\n可以匹配掉字符c前面的多个空白符,从而保证%c匹正确的匹配到字符c.2.%o:表示将数据以八进制输出。
2024-07-26 20:23:29
251
原创 从零开始学习嵌入式day3
如果我们没有换行,‘\b’会使光标向前移动,此时运行打印后会在光标位置打印命令提示符,如图中的linux@ubuntu:~$,此时会覆盖掉字符d.而在‘\b’后跟一个‘\n’则会使光标移动到下一行,命令提示符会在下一行打印,从而不会覆盖掉字符d的位置。在运行效率行,前缀的运行效率高于后缀,原因为:前缀时先加(减)后用,在存储单元上的加减发生在变量自身的存储空间,不需要单独开辟临时空间来存放表达式的值。逗号运算符:逗号运算符的用法为:表达式,表达式,表达式,........,表达式。
2024-07-25 21:17:21
517
原创 从零开始学习嵌入式-day2
48~57:字符0~9;浮点类型数据在存储单元中的存储方式:符号位+(指数位+x)+尾数位.其中float类型的指数位占8位,x为127,尾数位为23位。不同整型类型的取值范围是不同的,而关于有无符号时的范围也是不同的。剪切:Ndd + p 表示将所要删除的行移动到p光标所在的行,其中按p之前也可以指定粘贴多少份。:如果是计算二进制转换位10进制数一定要注意是否区分符号,若区分正负,一定要对符号位为1的二进制数进行一次补码运算。2.负数的反码是对原码除符号位之外的所有位求反,补码是在反码的基础上加1.
2024-07-24 21:15:44
395
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人