- 博客(40)
- 收藏
- 关注
原创 ARM 中断系统
中断(Interrupt)是指处理器接收到来自硬件或软件的信号,提示发生了某个事件,应该被注意,这种情况就称为中断。通常,在接收到来自外围硬件(相对于中央处理器和内存)的异步信号,或来自软件的同步信号之后,处理器将会进行相应的硬件/软件处理。发出这样的信号称为进行中断请求(interrupt request,IRQ)。硬件中断导致处理器通过一个运行信息切换(context switch)来保存执行状态(以程序计数器和程序状态字等寄存器信息为主);
2025-06-24 19:45:41
1175
原创 ARM基础知识、基础指令
CPU的模式可以简单的理解为当前CPU的工作状态,比如:当前操作系统正在执行用户程序,那么当前CPU工作在用户模式,这时网卡上有数据到达,产生中断信号,CPU自动切换到一般中断模式下处理网卡数据(普通应用程序没有权限直接访问硬件),处理完网卡数据,返回到用户模式下继续执行用户程序。操作数1应是一个寄存器,操作数2可以是一个寄存器,被移位的寄存器,或一个立即数。显然,当进行32位的循环右移操作时,通用寄存器中的值不改变。操作数1应是一个寄存器,操作数2可以是一个寄存器,被移位的寄存器,或一个立即数。
2025-06-20 21:13:38
1023
原创 DS18B20温度传感器
如果DQ引脚是高电平,就是写1,如果DQ引脚是低电平,就是写0。主机要生成一个写1时间隙,必须把数据线拉到低电平然后释放,在写时间隙开始后的15us内允许数据线拉到高电平。主机释放总线时,会产生一由低电平跳变为高电平的上升沿,单总线器件检测到该上升沿后,延时15~60μs,接着单总线器件通过拉低总线60~240μsμ来产生应答脉冲。它的内容是64 位序列号,它可以被看作是该DS18B20 的地址序列码,其作用是使每个DS18B20 都各不相同,这样就可以实现一根总线上挂接多个DS18B20 的目的。
2025-06-19 18:55:12
2310
原创 中断、定时器、PWM
中断系统是为使CPU具有对外界紧急事件的实时处理能力而设置的;当中央处理机CPU正在处理某件事的时候外界发生了紧急事件请求,要求CPU暂停当前的工作,转而丢处理这个紧急事件,处理完以后,再回到原来被中断的地方,继续原来的工作,这样的过程称为中断。请示CPU中断的请求源称为中断源(打断当前工作的事件)。微型机的中断系统一般允许多个中断源,当几个中断源同时向CPU请求中断,要求为它服务的时候,这就存在CPU优先响应哪一个中断源请求的问题。
2025-06-19 18:42:50
882
原创 linux数据库基础知识
运算符允许在一个 SQL 语句的 WHERE 子句中的多个条件的存在。使用 AND 运算符时,只有当所有条件都为真(true)时,整个条件为真(true)。使用 OR 运算符时,只要当条件中任何一个为真(true)时,整个条件为真(true)。如果搜索表达式与模式表达式匹配,LIKE 运算符将返回真(true),也就是 1,其中,百分号(%)和下划线(_)这两个通配符与 LIKE 运算符一起使用,百分号(%)代表零个、一个或多个数字或字符。如果满足给定的条件,即为真(true)时,则从表中返回特定的值。
2025-06-10 21:53:12
467
原创 IO多路复用
selectselect是最早的一种 I/O 多路复用方式,可以同时监听多个文件描述符的可读、可写和异常事件。通过在调用select时传递关注的文件描述符集合,及时返回有事件发生的文件描述符,然后应用程序可以对这些文件描述符进行读写操作。pollpoll是select的一种改进版,也能够同时监听多个文件描述符的可读、可写和异常事件。通过调用poll时传递关注的文件描述符数组,返回有事件发生的文件描述符,应用程序执行对应的读写操作。epoll。
2025-06-09 19:25:41
819
原创 Linux网络编程:TCP
客户端收到服务器的连接释放报文后,必须发出确认,ACK=1,ack=w+1,而自己的序列号是seq=u+1,此时,客户端就进入了TIME-WAIT(时间等待)状态,但此时TCP连接还未终止,必须要经过2MSL后(最长报文寿命),当客户端撤销相应的TCB后,客户端才会进入CLOSED关闭状态,服务器端接收到确认报文后,会立即进入CLOSED关闭状态,到这里TCP连接就断开了,四次挥手完成。对于这些套接字,连接时这样的:默认发送和接收数据的主机由给定的地址确定,可以使用 send()和 recv()。
2025-06-05 21:07:18
939
原创 Linux网络编程(1)
OSI(Open Systems Interconnection)模型是一种用于描述网络通信过程的标准化框架,由国际标准化组织(ISO)于1984年提出。它将网络通信划分为7个层次,每一层负责特定的功能,并通过接口与相邻层交互。
2025-06-05 20:48:07
595
原创 Linux进程间通信(IPC)
pipe 函数接受一个参数,是包含两个整数的数组,如果调用成功,会通过 pipefd[] 传出给用户程序两个文件描述符,需要注意 pipefd[0] 指向管道的读端, pipefd[1] 指向管道的写端,那么此时这个管道对于用户程序就是一个文件,可以通过 read(pipefd [0]);如果有指向管道写端的文件描述符没关闭,而持有管道写端的进程也没有向管道中写数据,这时有进程从管道读端读数据,那么管道中剩余的数据都被读取后,再次read会阻塞,直到管道中有数据可读了才读取数据并返回。
2025-06-03 17:45:12
952
原创 Linux的线程同步
2)PTHREAD_PROCESS_SHARED:锁可用于两个不同进程中的线程进行互斥,使用时还需要在进程共享内存中分配互斥锁,然后该互斥锁指定属性就可以了。静态初始化通常比 pthread_mutex_init 更有效,而且可以在定义为全局变量时即完成初始化,这样可以保证在任何线程开始执行之前,初始化既已完成。互斥锁本质是结构体,可以看成整数,初值为1。当处于解锁状态时,线程想获取该互斥锁,就可以获取不被阻塞,互斥锁变为锁定状态;当处于锁定状态时,线程获取互斥锁被阻塞,并加入到这个互斥锁的等待队列中。
2025-05-29 08:41:02
851
原创 Linux的线程
在一个线程中调用pthread_create()创建新的线程后,当前线程从pthread_create()返回继续往下执行,而新的线程所执行的代码由我们传给pthread_create的函数指针start_routine决定。pthread_t 类型的线程 ID :属于NPTL线程库的范畴,线程库的后续操作,就是根据该线程 ID 来操作线程的。如果计算密集型线程的数量比可用的处理器多,那么可能会有较大的性能损失,这里的性能损失指的是增加了额外的同步和调度开销,而可用的资源不变。线程需要执行的函数。
2025-05-27 18:01:04
1521
原创 Linux进程(2)
exec函数族提供了一个在进程中启动另一个程序执行的方法。它可以根据指定的文件名或目录名找到可执行文件,并用它来取代原调用进程的数据段、代码段和堆栈段,在执行完之后,原调用进程的内容除了进程号外,其他全部被新的进程替换了。另外,这里的可执行文件既可以是二进制文件,也可以是Linux下任何可执行的脚本文件。作用我们用fork函数创建新进程后,经常会在新进程中调用exec函数去执行另外一个程序。当进程调用exec函数时,该进程被完全替换为新程序。
2025-05-26 20:14:22
869
原创 Linux系统编程 - 进程
一个具有一定独立功能的程序在一个数据集合上的一次动态执行过程。动态性:可动态创建,结束进程。并发性:进程可以被独立调度并占用处理机运行。并发并行独立性:不同的进程的工作不互相影响。制约性:因访问共享的数据&资源或者进程同步而产生制约。调度。
2025-05-25 12:31:01
597
原创 文件IO操作、目录操作
函数是C语言中的一个标准I/O库函数,它的作用是将一个已有的文件描述符(file descriptor)转换为对应的文件指针(FILE *)。是一个在C语言中常用的函数,它的主要功能是将文件流指针转换为文件描述符。在Linux编程中,文件描述符是一个重要的概念,因为它提供了对文件的低级访问。它的作用是重新定位文件内的读写位置,这个位置是从文件开头到当前位置的字节数。函数是一个用于错误处理的库函数,它的作用是将上一个函数发生错误的原因输出到标准错误输出(stderr)。,后跟一个冒号,然后是一个空格。
2025-05-22 18:23:59
904
原创 标准IO(2)、文件IO
我们通过fwrite写入的内容不是直接进入内核中的buf,而是先进入应用层标准IO库自己维护的buf中,然后标准IO库自己根据操作系统单次write的最佳count来选择好的时机来完成write到内核中的buf中。采用文件I/O的函数接口,每调用一次函数写入字符就会产生一次系统调用。文件I/O是采用系统直接调用的方式,因此当使用这些接口对文件进行操作时,就会立刻触发系统调用过程,即向系统内核发出请求之后,系统内核会收到执行相关代码处理的请求,决定是否将操作硬件资源或返回结果给应用程序。
2025-05-21 19:49:04
1004
原创 系统编程的标准IO
第一个参数是字符串buffer指针,传入的是char*,这里当然是可变的;第二个参数是至多读取的字符数,传入的是int;第一个参数path是文件地址,传入的是不可变的字符串;第二个参数是mode是指打开方式,传入的也是不可变的字符串;Linux中系统调用的错误都存储于 errno中,errno由操作系统维护,存储就近发生的错误,即下一次的错误码会覆盖掉上一次的错误。传入的参数是FILE指针,即fopen创建的那个指针;第一个参数是不可变的字符串,第二个参数就是要写到的stream来源这里是FILE指针。
2025-05-20 17:13:14
751
原创 二叉树的基础定义
树是一种数据结构,它是由n(n>=1)个有限节点组成一个具有层次关系的集合。把它叫做“树”是因为它看起来像一棵倒挂的树,也就是说它是根朝上,而叶朝下的。它具有以下的特点:1.每个节点有零个或多个子节点;2.没有父节点的节点称为根节点;3.每一个非跟节点有且仅有一个父节点;4.除了根节点以外,每个子节点可以分为多个不想交的子树。1.2树的基本术语若一个节点有子树,那么该节点称为子树根节点的“双亲“,子树的跟是该节点的“孩子”。有相同双亲的节点互为“兄弟节点”。
2025-05-19 20:08:08
452
原创 栈与队列的理解
队列(queue)是只允许在一端进行插入操作,而在另一端进行删除操作的线性表。队列是一种先进先出(First In First Out)的线性表,简称FIFO。允许插入的一端称为队尾,允许删除的一端称为队头。队头(Front):允许删除的一端,又称队首。队尾(Rear):允许插入的一端。空队列:不包含任何元素的空表。int head;int tail;int tlen;}SeqQueue;
2025-05-16 18:37:25
293
原创 双链表的定义及其基本操作
双链表的结点中有两个指针prior和next,分别指向前驱结点和后继结点。双链表上的操作初始化双链表与单链表一样,为了操作方便也可以加入头结点,那么初始化双链表其实就是定义一个头结点,然后将指针域置空。return dl;
2025-05-15 20:55:43
428
原创 顺序表与单链表
概念:用一组地址连续的存储单元依次存储线性表的数据元素,这种存储结构的线性表称为顺序表。特点:逻辑上相邻的数据元素,物理次序也是相邻的。只要确定好了存储线性表的起始位置,线性表中任一数据元素都可以随机存取,所以线性表的顺序存储结构是一种随机存取的储存结构,因为高级语言中的数组类型也是有随机存取的特性,所以通常我们都使用数组来描述数据结构中的顺序储存结构,用动态分配的一维数组表示线性表。
2025-05-13 20:51:03
329
原创 数据结构基础概念
在进行算法分析时,语句总的执行次数T(n)是关于问题规模n的函数,进而分析T(n)随n的变化情况并确定T(n)的数量级。算法的时间复杂度,也就是算法的时间度量,记作:表示随问题规模n的增大,算法执行时间的增长率和f(n)的增长率相同,称作算法的渐进时间复杂度,简称为时间复杂度。其中f(n)是问题规模n的某个函数。一般情况下,随着n的增大,T(n)增长最慢的算法为最优算法。常见的时间复杂度执行次数函数举例阶非正式术语12O(1)常数阶2n+3O(n)线性阶。
2025-05-12 20:10:00
718
原创 结构体与共用体、位运算
结构体的关键字为:struct定义student这种结构体(注意分号不能少),有三个成员变量id,age,name。int age;int age;}stu1;//在结构体定义时,同时声明一个这种结构体变量stu1union uuint i;double db;声明共用体变量 、初始化、赋值。(后赋值的成员变量会覆盖前面赋值的成员的数据)
2025-05-09 19:44:39
929
原创 指针与函数、指针数组
第一个指针指向了字符串"Hello",第二个指针指向了字符串"World",而sizeof(s)=16,因为在64位平台,指针类型大小占8个字节。需要注意的是,字符数组 str 中存放的是字符串的首地址,不是字符串本身,字符串本身位于其他的内存区域,和字符数组是分开的。它是一个数组,数组的元素都是指针,数组占多少个字节由数组本身的大小决定,每个元素都是一个指针。这种函数的返回值是一个指针,可以是指向任何数据类型的指针。malloc函数的返回的是无类型指针,在使用时一定要强制转换为所需要的类型。
2025-05-08 21:03:30
428
原创 字符串与指针、数组指针
字符串常量只有读取权限,没有写入权限,这就导致了字符数组 在定义后可读取和修改每个字符而 第二种形式(字符串常量) 一旦定义后便不可修改,不能进行赋值。const在这里的功能可以理解为 函数的这段功能不能被修改,但同时也提高了参数的适应性,可以定义字符型,也可以定义int型等等。memcpy() 的功能是将某块内存中的 n 的字节拷贝到另一块内存里 ,memcpy() 函数的原型如下。&a // int (*)[3][4] 二维指针 *(*(a+i)+j);
2025-05-07 19:47:40
652
原创 数组与指针
同理 arr[i] 应该等价于 * (arr+i),数组元素的访问在编译器处理的时候,也是转换成首元素的地址 + 偏移量求出元素的地址,然后进行访问的。因为数组在内存中是连续存放的,所以可以通过指针加减整数的操作,得到每个元素的地址,进而。此处,c的地址已分配给pc指针。为了获取存储在该地址中的值,使用了*pc。并且,将c的地址分配给pc指针。指针(指针变量)是用于存储地址而非值的特殊变量。由于pc和的地址c相同,因此*pc得到1。在这里声明了一个int类型的指针p。为了获得指针所指向的内容的值。
2025-05-06 19:57:06
385
原创 C语言函数的定义与调用
函数的定义是指编写函数的具体实现,包括它的返回值类型、名称、参数以及执行逻辑。定义函数的语法如下:返回值类型 函数名(参数列表) {函数体;return 返回值;// 如果返回值类型不是 void,则需要返回一个值( ){ }示例:定义一个计算两个整数之和的函数return sum;
2025-04-27 18:40:55
524
原创 C语言的二维数组
二维数组定义的一般形式为:类型说明符 数组名[ 常量表达式][ 常量表达式];表示定义了一个 3×4,即 3 行 4 列总共有 12 个元素的数组 a。这 12 个元素的名字依次是:a[0][0]、a[0][1]、a[0][2]、a[0][3];与一维数组一样,行序号和列序号的下标都是从 0 开始的。元素 a[i][j] 表示第 i+1 行、第 j+1 列的元素。数组 int a[m][n] 最大范围处的元素是 a[m–1][n–1]。
2025-04-25 17:52:57
302
原创 C语言字符数组用法
字符数组的定义形式如下:char 数组标识符 [常量表达式]例如,下述代码定义了一个字符数组 cArray,该数组中包含 5 个字符型的变量元素:char s[5]如果初值个数与预定的数组长度相同,在定义时可以省略数组长度,系统会自动根据初值个数来确定数组长度。例如,上面初始化字符数组的代码可以写成:代码中定义的 s[] 没有给出数组大小,但系统会自动根据初值的个数确定数组长度为 5。
2025-04-24 18:30:38
838
原创 C语言的循环
while语句用来实现“当型”循环结构。while(表达式)语句注意事项:while后面不能加分号当表达式为非0值时,执行while语句中的内嵌语句,其特点是:先判断表达式,后执行语句。
2025-04-22 15:08:57
332
原创 逗号运算符、字符数据输入输出与格式输入输出
逗号运算符( , )是C语言运算符中优先级最低的一种运算符,结合顺序是从左至右,用来顺序求值(最后一个逗号后面表达式的值作为整个表达式的值)。例如:x= (a = 4, b = 8, c = 12),x = 12。
2025-04-18 19:40:37
443
原创 C语言转义字符及运算符
const int i = 100 (int const i = 100 作用相同) ,其中i为只读变量,也是左值。如(double)int i = 10,输出的i为双精度浮点型数据。在混合运算时,字符类型和short类型必直接转换为int型,float型必转换为double型。以++运算符为例,分为后置++,前置++,优先级为2,结合方向为自右至左。该运算符为双目运算符,结合方向为自左向右。改运算符为双目运算符,结合方向为自左向右。定义为:不可获得地址的数据。定义为:可获得地址的数据。
2025-04-17 19:31:18
490
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅