- 博客(40)
- 收藏
- 关注
原创 设备程序驱动框架
利用这个命令我们就能创建相对应的字符设备 ,这里的/dev/demo1就是设备节点名,c代表的就是字符设备文件,255和0是它的主设备号和次设备号。想要验证内核代码能够正确运行,我们就可以在应用层编写测试代码来进行测试,在开发板挂载的目录下进行编写。这个代码因为我们要在开发板上运行,所以我们要使用arm-linux-gcc这个编译器来进行。在开发板上电操作系统加载完之后,我们会发现在/dev下并没有demo1这个设备。编译好后运行程序,如果能打印出printk中的内容即为成功。将这个代码编译并加载进内核。
2024-09-25 14:59:15
336
原创 中断控制器
S3C2440A 中的中断控制器接受来自个中断源的请求。提供这些中断源的是内部外设,如 DMA 控制器、 UART、IIC 等等。在这些中断源中,UARTn、AC97 和 EINTn 中断对于中断控制器而言是“或”关系。当从内部外设和外部中断请求引脚收到多个中断请求时,中断控制器在仲裁步骤后请求 ARM920T 内核的 FIQ 或 IRQ。s3c2440A中断处理框图对于IRQ处理过程详解。
2024-09-09 20:48:48
1111
原创 ADC——模数转换器
其转换模拟输入信号为 10 位二 进制数字编码,最大转换率为 2.5MHz A/D转换器时钟下的 500 KSPS。通过比较器获得的电信号转换数字信号,根据自己需求,如果要求速率就可以使用较多的比较器,不要求速率考虑成本就可以使用较少的比较器,将最后的转换结果,通过编码来表示。转换时间 = 1/(1MHz / 5 周期) = 1/200KHz = 5µs。A/D 转换器频率 = 50MHz / (49+1) = 1MHz。通过8通道的选通门,来减少速率的同时,减少内存的占用。转换速率:500 KSPS。
2024-09-06 20:31:17
1011
原创 ARM下汇编语言编程
段又可以分为代码段和数据段,代码段存放执行代码,数据段存放代码运行时需要用到的数据。段是相对独立的、具有特定名称的、不可分割的指令或者数据序列。1、算术指令:ADD、ADC、SUB、SBC、RSB、RSC。4.程序状态寄存器处理指令(完成 CPSR的管理 )1、分别为数据处理指令(完成CPU内部的计算)2、位运算指令:AND、ORR、EOR、BIC。5.协处理器指令(完成CPU扩展功能的实现)3、比较指令:CMP、CMN、TST、TEQ。3.跳转指令 (完成程序的跳转)4、数据搬移:MOV、MVN。
2024-09-03 20:29:20
1012
原创 ARM架构
在编译器编译的时候,不会给该段的数据分配空间,只是记录数据所需的空间大小。在编译器编译的时候,会给已初始化的数据分配内存空间,数据保存在目标文件中。ROM-> PROM-> EPROM-> EEPROM (可编程-> 可擦除(紫外线)-> 电擦除 )RAM ->SRAM-> DRAM-> SDRAM-> DDR(n) (静态-> 动态-> 同步)CPSR: 运算结果为正、负、进借位、结果为0等标志, 中断的使能, 工作状态,工作模式 S。(7)System:使用和User模式相同寄存器集的特权模式。
2024-09-03 20:00:54
671
原创 树、二叉树
1、满二叉树:满二叉树是一种特殊的二叉树,其中每个层级的节点数都是最大值,即每个层级都是完全填充的。深度: 从根节点出发到达节点的分支节点个数称为该节点的深度。高度:从叶子节点出发到该节点最大的节点个数称为该节点的高度。树的高度:整个树形结构中高度最高的节点的高度称为树的高度。树的深度:整个树形结构中深度最深的节点的深度称为树的深度。3、二叉树特点:叶子节点、只有左孩子、只有右孩子、左右孩子都有。树的层数 == 树的高度 == 树的深度。3.叶子节点:没有后继的节点。节点的度: 叶子节点度数为0。
2024-08-30 21:09:25
839
原创 双向链表的复杂操作、内核链表、栈
其余的一些操作,比如正向遍历,反向遍历,查找,替换,销毁的代码与单向链表没有什么区别。4、出栈(弹栈):将数据元素从栈顶位置取出。2、栈底:不允许入栈和出栈的一端称为栈底。1、栈顶:允许入栈出栈的一端称为栈顶。3、入栈(压栈):将数据元素放入栈顶。栈的基本操作也都可以通过内核链表实现。FILO:先进后出,后进先出。
2024-08-29 20:46:17
464
原创 单向链表的复杂操作
快指针先走k步,慢指针和快指针每次走1步(快指针总是领先慢指针k步),当快指针走到末尾时,慢指针即指向链表倒数第k个节点。快指针pFast每次走2步,慢指针pSlow每次走1步,快指针到达末尾时,慢指针所在的位置即为中间位置。功能:找到链表倒数第k个节点。3、寻找链表的中间节点位置。4、寻找链表倒数第K个节点。功能:找到中间节点位置。
2024-08-28 17:40:16
446
原创 数据结构—链表
数据量增长与程序运行时间的比例关系以函数描述称为时间渐进复杂度函数,简称时间复杂度。数据量增长与程序所占用空间的比例关系称为空间复杂度。顺序表、链式表、顺序栈、链式栈、顺序队列、链式队列 、树 二叉树。使用该函数遍历顺序表内元素,符合条件的可对其进行计数和打印。使用该函数遍历顺序表内元素,符合条件的对其进行修改。3.链表空间不连续,使得理论上长度是无限的。2.链表需要更大的空间存放数据和节点地址。1.空间可以不连续,访问元素不方便。3.程序 = 数据结构 + 算法。4.链表的插入和删除效率很高。
2024-08-27 20:38:53
840
原创 SQLite数据库
数据库文件一般以.db结尾,例如filename.db,可以抽象的理解为Excel表格的存储格式,一个对象和他的N多个特征组成的表。对于一般小批量的数据存放且掉电数据不会丢失,软件的配置及想要持续保存的数据会放入文件中。五、内键:用来区分一张表中不同的数据(内键的值不允许重复),一般为整形。(2)中型数据库:MySQL (开源) 、SQL Server。数据库支持的编程语言,主要对表完成:增、删、改、查相关功能。六、外键:与外部关联的键值,用来建立表与表之间的引用关系。(3)小型数据库:SQLite。
2024-08-22 18:49:08
599
原创 day 30TCP并发服务器模型
1.poll监听的文件描述符集合在应用层,内核层监听事件后需要传递给用户层带来资源开销。2.select监听的文件描述符集合在应用层,内核层监听事件后需要传递给用户层带来资源开销。3.poll只能工作在水平触发模式(低速模式)而无法工作在边沿触发模式(高速模式)4.select只能工作在水平触发模式(低速模式)而无法工作在边沿触发模式(高速模式)2.epoll监听的事件表在内核层,内核监听事件不需要操作用户层空间提高效率。3.epoll会获得产生事件的文件描述符,不需要用户查找。
2024-08-21 17:27:43
406
原创 day 28 HTTP协议
UDP MTU最大传输单元(理论:65535 实际:1500)TCP发送数据是连续的,两次发送的数据可能粘连成一包被接收到。例如:https://www.baidu.com。3.客户端向发送HTTP请求报文,告诉服务器想要的数据。4.服务器回复HTTP响应报文,将客户端要的数据发回。长连接:通信前建立链接,通过新过程中链接一直保持。1、HTTP:超文本传输协议,在协议的应用层。1.协议://主机:端口号/资源路径。UDP是无连接的,面向数据包的传输方式。TCP是面向连接的,面向字节流传输方式。
2024-08-17 22:28:22
471
原创 day 27TCP编程
针对UDP这些特性所以就有了TCP这种更可靠,更安全的传输方式。2.UDP资源开销小,实现机制简单。1.不安全不可靠的传输方式。3.UDP是无连接的。
2024-08-16 17:19:09
540
原创 day 26网络编程—协议
子网掩码展开成二进制,1对应的部分就是IP地址的网络位,0对应的部分就是IP地址的。子网掩码:每个IP地址都会搭配一个子网掩码,用来区分IP地址的网络位及主机位。私有地址:192.168.0.0 ~ 192.168.255.255。私有地址:10.0.0.0 ~ 10.255.255.255。B类:128.0.0.0 ~ 191.255.255.255。C类:192.0.0.0 ~ 223.255.255.255。子网掩码:255.255.255.0。网络位:IP地址所属的网段(局域网的编号)
2024-08-15 19:53:09
1646
原创 day 24进程间通信—信号
3.SIGCHLD:表示该进程有一个子进程结束了。2.SIGUSR1:用户可以使用该信号实现通信。1.SIGSEGV:表示内核操作内存错误。4.SIGPIPE:表示管道破裂。3、不能被忽略和挂起的信号:9号和19号信号。1.SIGKILL 进程结束。2.SIGSTOP 进程挂起。一、信号:内核层和用户层通信的一种方式。1、缺省:按照默认的方式处理信号。3、捕捉:按照指定的方式处理信号。5、表示IO事件发生的信号。2、忽略:不处理信号。
2024-08-10 17:34:31
702
原创 day 23 进程间通信—管道
如果管道中写满(64k),则阻塞等待,等有数据读出才能继续写入。如果管道中没有数据,会阻塞等待直到有数据写入后读出。如果管道中没有数据,不会阻塞直接继续向下执行。向管道中写入数据会产生管道破裂信号。如果管道中有数据,直接读出。如果管道中有数据,直接读出。如果管道没有写满,直接写入。
2024-08-09 18:09:51
447
原创 day 22线程间通信
2、互斥锁: 是一种资源,当一个线程任务加锁,其余线程任务无法再次加锁,直到解锁后才能加锁,互斥锁主要是用来防止多个线程任务竞争某个资源,加锁和解锁中间的代码称为临界代码也称为临界区。2.不剥夺条件:不剥夺条件是指一个线程任务已经锁定了一个资源,不能被其他线程任务抢占,直到它使用完该资源。资源是有限的,在程序运行过程中,一段代码、一段空间、一个变量、CPU、内存都可以看做资源。资源数 == 0 申请操作会阻塞,直到资源数不为0,申请得到资源后继续向下执行。2.打破互斥条件、不可剥夺条件(不建议使用)
2024-08-08 19:27:14
702
原创 day 21 线程
在同一软件下的多任务考虑用多线程,不同软件下的多任务考虑用多进程,根据实际需求赉设计程序,进程和线程实际效率差不多。多线程一个线程任务异常结束可能导致进程异常结束,会导致进程中其余线程也随进程一起结束。pthread_join具有阻塞功能,线程不结束,会阻塞等到直到线程结束回收线程空间。多进程没有共享空间,通信需要使用其余的进程间通信方式完(管道、套接字、信号等)成。线程代码执行结束,空间不回收会成为僵尸线程,需要回收线程空间。多进程需要在不同的进程空间内部切换调度任务。1.线程必须位于进程空间内部。
2024-08-07 19:30:41
455
原创 day 20进程
父进程先结束,子进程成为孤儿进程,被init进程(1号)进程收养,子进程结束,init系统进程自动回收进程空间。2.子进程结束,父进程回收子进程空间,子进程不会变成僵尸进程(优先选择)wait具有阻塞功能,如果子进程先结束,wait会不阻塞直接回收。如果子进程没结束,wait会阻塞直到子进程结束回收子进程空间。2、僵尸进程产生原因:子进程任务结束,空间没有被回收,该进程成为僵尸进程。1.让父进程先结束,子进程再结束,子进程不会变成僵尸进程。进程:是一个程序动态执行的过程,包括进程的创建、调度和消亡的过程。
2024-08-06 17:50:12
1068
原创 day 19目录IO和链接IO
需要注意:目录文件的权限mode有1.r 决定是否目录下可以查看其余文件信息2.w 决定目录下的文件是否能够新建3.x 决定目录文件是否能够进入。
2024-08-02 20:21:14
1928
原创 day 18流的定位、文件IO以及Linux系统中时间的获取
7.文件IO可以操作设备文件、进程间通信的文件、普通文件(Linux系统下的一切文件均可以使用文件IO)相对于标准IO来说,文件IO直接在Linux的内核中操作,也更加的简洁精炼。系统调用:是Linux内核中的函数接口,只能在Linux系统中使用。根据日历时间转换为1970年1月1日到现在的秒数。SEEK_SET:从文件开头开始偏移。SEEK_END:从文件末尾开始偏移。SEEK_END:从文件末尾开始偏移。成功返回1970年1月1日到现在的秒数。返回1970年1月1日到现在的秒数。
2024-08-01 19:28:35
821
原创 day 17标准IO的函数接口
fgets不会去掉用户输入的\n字符。gets会去掉用户输入\n字符。puts会多打印一个\n字符。1、puts和fputs的区别。2、gets和gets的区别。
2024-07-31 19:31:42
451
原创 day 16 常见shell命令、IO
4. - 普通文件 保存数据信息的文件(代码、图片、音视频、压缩包等)w 只写 如果文件存在则清0,只写打开。5.link l 链接文件 指向其他文件的文件。如果文件不存在则创建。a 追加只写 如果文件存在则追加只写打开。a+ 追加读写 如果文件存在则追加读写打开。r+ 读写 如果文件存在则读写打开。
2024-07-30 19:54:42
878
原创 day 15内存管理、链表
当使用strcat、strcpy、strcmp函数时可能会产生内存越界。1.函数体内部的局部变量会随函数结束被回收,可以考虑存放到堆区空间中避免随函数结束回收。5、内存碎片:表示申请的小的堆区空间在应用完后未释放,影响后续大的连续内存空间的开辟。注意:操作指针时,注意指针指向的空间是否存在?2、堆区空间的使用:主要是malloc和free的使用。4.单向链表、双向链表、内核链表、循环链表。3、内存泄露:申请的堆区空间没有被释放。2.数组的空间必须连续。1、内存管理在应用时遇到的问题。
2024-07-27 20:07:57
385
原创 day 14 构造数据类型、位运算
1.存放结构体成员变量,必须保证前面的长度为成员变量所占空间大小的整数倍。1.枚举常量第一个值默认为0,后面的枚举常量为前一个枚举常量的值+1。^ 按位异或 相同为0 相异为1。& 按位与 & 0得0。2.结构体整体的大小必须为最大类型长度的整数倍。2.枚举类型对应的变量的值应该为枚举常量中的值之一。括号 > 单目 > 双目 > 三目 > 赋值 > 逗号。1.小端:内存低地址存放低数据位称为内存小端。算数 > 移位 > 关系 > 位运算 > 逻辑。
2024-07-26 19:35:55
365
原创 day 13函数指针和指针函数,C语言进阶之构造数据类型
例如:struct student s = {"Kylin", 'm', 22, 100};1.char *、int *、double * 转换为void *时需要强制类型转换。2.void *转换为char *、int *、double *时不需要强制类型转换。结构体访问成员变量最终的类型由成员变量的类型决定。2.构造数据类型: 结构体、共用体(联合体)、枚举。-> :结构体指针类型访问成员变量。指针函数是函数,函数的返回值是指针。函数指针是指针,指针指向一个函数。1、指针函数:返回值为指针的函数。
2024-07-25 19:08:50
427
原创 day 12指针数组和数组指针
2.指针数组的数组名是指向数组第一个元素的指针,即指向指针的指针也就是二级指针。2.数组指针取*操作:值不变,类型降级成为指向数组第一个元素的指针。1.函数体内想修改函数体外指针变量值的时候,传指针变量的地址即二级指针。3、二维数组传参:在主函数中传入指针及行数,在函数体接收指针和规定列数。数组的数组名是指向数组第一行所有元素的数组指针。1.sizeof运算时。数组的数组名是指向数组第一个元素的指针常量。指针数组是数组,数组的每个元素是指针。数组指针是指针,指针指向一个数组。1、定义:指向指针变量的指针。
2024-07-24 18:59:40
364
原创 day 11指针和数组
作用:const修饰p和*p, 指针变量p的值不能变,也不能利用*p改变指向空间中的值, 一定要对指针初始化。作用:const修饰p, 指针变量p的值不能变, 但可以利用指针修改指向空间中的值, 一定要对指针初始化。作用:const修饰*p, 指针变量p可以修改指向的空间,但不能利用该指针修改指向空间中的值。3.一维字符型数组和指针的关系:数组的数组名是指向数组第一个元素的指针。1、数组和指针的关系:数组用来存放数据而指针用来操作数组中的数据。1.数组的数组名a是指向数组第一个元素的指针常量。
2024-07-23 17:31:29
360
原创 day10 条件编译、指针!
3.指针变量:用来存放指针(地址)的变量,使用变量等价于等使用指针,所以我们也把指针变量简称为指针。实参将地址传递给形参,形参是指向实参的指针,可以利用形参修改实参的值。对*p赋值:不会修改指针变量的指向,只是利用指针修改其指向空间中的值。*p:间接访问,通过变量在内存中的地址来使用该变量的空间。类型:对地址取*操作,会让地址类型降级为对应的数据类型。值:获得指针指向空间中的值(根据指针的类型来读取)2.指针:指针就是地址、地址就是指针,指针具有指向的概念。2.作为右值:获得指针指向空间中的值。
2024-07-22 19:08:00
1867
原创 day9函数传参、递归函数、预处理命令
----include ---- add.h add.c中用到的数据类型的定义、宏定义、全局变量的声明、全局函数的声明。|--- sub.h sub.c中用到的数据类型的定义、宏定义、全局变量的声明、全局函数的声明。|--- mul.h mul.c中用到的数据类型的定义、宏定义、全局变量的声明、全局函数的声明。jisuanqi--------src ----- main.c 主函数的实现。
2024-07-20 20:19:53
772
原创 day 8字符型二维数组、函数
例如:char str[3][32] = {{'h', 'o', 'w', '\0'}, {'a', 'r', 'e', '\0'}, {'y', 'o', 'u', '\0'}};函数类型:函数运行结果的类型(如果返回值类型与函数类型不一致,会将返回值强制类型转换成函数类型返回)3.实参与形参类型不一致时,会将实参强制类型转换为形参类型,传入函数中。函数类型 函数名(数据类型1 形参1, 数据类型2 形参2, ...)2.定义:定义一个之前不存在的变量或函数,需要开辟新的空间。
2024-07-19 21:25:08
884
原创 day 7二维整型数组、字符型数组
例如: char str[6] = {'h', 'e', 'l', 'l', 'o', '\0'};两个的区别为:scanf无法接收带' '的字符串而gets可以接收带' '的字符串。没有给定初值的元素被赋值为0('\0') ,而不是'0'例如: char str[] = {'h', 'e', 'l', 'l', 'o'};如果结果 == 0则 str1 == str2。获得字符串的长度(从字符串开头到’\0‘之前元素的个数)例如: int a[2][3] = {1, 2, 3, 4, 5, 6};
2024-07-18 19:07:12
701
原创 day 6循环结构、数组
3.默认初始化:定义变量时没有给定数组元素个数,通过给定初值的个数决定数组元素个数(尽量不要使用)2.局部初始化:只给定一部分元素的值,没有给定初值的元素会被默认赋值为0。例如: int a[5] = {1, 2, 3, 4, 5};需要注意的是在定义数组时元素个数必须为常量或常量表达式,不允许是变量或变量表达式。例如: int a[] = {1, 2, 3, 4, 5};例如:int a[5];例如:int a[5] = {1, 2, 3};例如:a[0] 、a[n]、a[1] 、a[n+1]等。
2024-07-17 18:49:56
531
原创 day 5 分支结构中if的阶梯分支、嵌套分支,switch分支的基本形式和嵌套形式,以及循环结构
续接上文2、if的阶梯分支(1)if的阶梯分支的结构(2)if的嵌套分支的结构在使用嵌套分支时需要注意:不要嵌套太深,嵌套太深会导致可读性变差,最多嵌套3 - 5层。
2024-07-16 20:35:31
600
原创 day 4 常用输入输出函数以及部分流程控制
5.scanf中只有%c可以接收' '和'\n'字符,其余均认为是数据结束的标志。%c 按照char类型接收(会接收' '和'\n'字符)scanf中出现非输入控制符,需要原封不动的从终端输入该字符。在使用puts的过程中我们需要注意puts会多打印一个\n,不需要再自行输入换行符。2.if可以脱离else单独使用,但是else不能脱离if单独使用。_%c 接收一个非' '和'\n'的字符。4.scanf中' '和'\n'字符表示数据末尾。3.scanf不能接收带' '的字符串。
2024-07-15 19:42:46
464
原创 day3 变量、表达式与运算符,以及C语言中常用的输入输出函数
例如: \n(换行符)、 \t (制表符)、\b (退格符)、\v (纵向制表符)、\r(回车符)、\\ (\字符)、 \" ("字符)等。算术运算符包括:、+、-、 *、/、%、++(自增运算符)、 -- ( 自减运算符)等。1.short 、char 、int进行数据运算和数据处理时会默认转换为long类型。运算规则:从左到右依次运行,最后一个逗号表达式的结果为整体表达式的结果。%# 打印八进制前的0和十六进制前的0x。赋值运算符包括:= 、+= 、-=、*=、 /=、%=等。
2024-07-13 18:38:56
653
原创 day2 gcc编译器与C语言基础
在日常生活中我们常用十进制,我们都了解十进制的工作原理时逢十进一,以此类推二进制、八进制、十进制、十六进制。我们不仅需要单独的进制机制,还要了解他们之间如何互相转换,其中最重要的是,二进制和十进制之间的互相转换。在使用gcc编译的过程中,我们也会遇到程序错误,程序错误分为两种。当然也不会是真的句句打印,能够大致定位到出错误的段落,对这个段落进行逐步打印。相对于语法错误来说,逻辑错误通常会造成比较大的影响,可能会使整个项目崩溃。调试步骤: 查看代码 -> 设置断点 -> 运行代码 -> 单步执行。
2024-07-12 18:53:50
511
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人