自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 为什么多线程需要互斥,多进程不需要?

在单核处理器上,多线程共享相同的处理器资源,因此它们在。但是,当多个线程同时访问共享资源时,

2024-04-28 20:26:14 179

原创 线程间为什么要枷锁?

除了锁之外,还有其他同步机制,如信号量、条件变量等,不同的应用场景可能需要选择不同的同步机制来实现线程间的协调与同步。:堆内存是所有线程共享的,用于存储动态分配的对象和数据结构。多个线程可以访问和修改堆内存中的数据。:线程局部变量是存储在线程栈中的变量,每个线程有自己的一份,不会被其他线程访问。:全局变量也是共享的,它们存储在全局数据段中,可以被所有线程访问。:每个线程都有自己的线程栈,用于存储局部变量、函数调用信息等。:静态变量在内存中只有一份副本,因此也是共享的。两类,一类是私有的,还有一类是共享的。

2024-04-28 20:18:58 288

原创 类与对象、抽象、封装、继承、多态以及举例

在我们熟悉的现实世界中,。对象,比如房屋、汽车、飞机、动物、植物;也,比如一项计划。对象可以是一个简单的个体,比如一个人;也可以由诸多其他对象组合而成,比如一个公司有多个部门,每个部门又由许多人组成。对类似的对象进行抽象,找出其共同属性,便构成一种类型。这些都是我们在现实世界中所熟悉的概念和方法。编写程序的目的是描述和解决现实世界中的问题,第一步就是要将现实世界中的对象和类如实地反映在程序中。

2024-04-26 16:00:00 1106

原创 内联函数、带默认形参值的函数、引用传参以及函数重载的具体介绍和例子

使用函数有利于代码重用,可以提高开发效率,增强程序的可靠性,也便于分工合作,便于修改维护。但是,函数调用也会降低程序的执行效率,增加时间和空间方面的开销。因此对*一些功能简单、规模较小又使用频繁的函数,可以设计为内联函数。内联函数不是在调用时发生控制转移,而是在**编译时将函数体嵌入在每一个调用处。这样就节省了参数传递、控制转移等开销。内联函数的定义与普通函数的定义方式几乎一样,只是需要使用关键字inline,其语法形式如下:

2024-04-26 08:00:00 1297

原创 C++概念、头文件与c区别、变量、const关键字以及enum枚举

C++语言的主要特点表现在两个方面,**一是尽量兼容C**,**二是支持面向对象的方法**。首先,C++的确是一个更好的C。它保持了C的简洁、高效和接近汇编语言等特点,对C的类型系统进行了改革和扩充,因此C++比C更安全,C++的编译系统能检查出更多的类型错误。

2024-04-25 19:58:07 1154

原创 ds18b20温度传感器驱动程序

有了之前的方法,那么。下面我们套用杂项驱动框架来编写ds18b20驱动程序。实现需要明确的是:**ds18b20驱动的本质是通过2440的gpio,通过给定的时序对ds18b20的读写数据访问,最后将数据传回应用程序。**由于我们实验的linux内核是三星公司根据2440公板修改后的内核,所以有关gpio的操作,三星公司提供了几个api函数,从而大幅度降低了程序的编写难度。

2024-04-25 17:51:53 557

原创 内核定时器

定时器是我们最常用到的功能,一般用来完成延时功能。下面我们来学习linux提供的几种内核延时方法。

2024-04-24 20:44:37 38

原创 ADC驱动怎么应用以及中断顶半部和底半部

今天这篇文章主要使用混杂设备驱动框架和查询方式实现ADC采集,实现的方法于之前的led实验类似首先定义三个指针变量用于操作adc的两个寄存器ADC驱动以及时钟驱动映射寄存器并初始化。

2024-04-24 20:36:13 137

原创 等待队列如何应用

模块加载点:init_waitqueue_head(&wq);初始化这个等待队列头:第32行:在进入阻塞前将条件设置为假第61行:进入阻塞状态,等待条件变为真第81行:在中断服务函数中唤醒,即解除阻塞状态。注意在唤醒前将。

2024-04-23 21:57:36 37

原创 按键驱动和中断方式的按键驱动

之前我们学习了字符设备驱动程序框架,按照这个办法编写一个按键程序也是的。但如果按照之前的知识编写按键驱动程序,大概率会编写出一个查询方式的按键驱动。这样的做法对整个系统来说效率比较低,使用中断方式是个不错的办法。接下来我们将学习。和字符驱动类似的,要使用linux内核中断必须要注册中断。总共5个参数,本质上很简单irq_handler_t是一个,这个函数指针必须指向返回值是,函数参数必须是int和void *的那种函数。那我们就写这么个函数给他不就行了?

2024-04-23 21:46:09 137

原创 混杂设备驱动

之前我们编写的是,看起来还是有点复杂的样子。linux,可以。的意思是的,因此 misc 驱动也叫做,misc 驱动其实就是。所有的 misc 设备驱动的。随着 Linux字符设备驱动的不断增加,,misc 设备驱动就用于解决此问题。misc 设备会,不需要像我们以前那样手动创建,因此。该函数需要一个。

2024-04-22 21:33:21 46

原创 设备号的获取以及如何自动添加设备节点

之前的代码中在注册字符设备驱动的时候我们使用了一个静态的主设备号200,很明显,200这个主设备号如何已经被使用了,那么我们就无法完成注册。最好的办法就是由系统给我们提供一个合法的设备号。

2024-04-22 20:09:27 115

原创 Led驱动程序

前几篇写的程序并没有真正控制什么,接下来我们编写第一个真正用于控制硬件的驱动程序,。本质上来说无论裸机程序还是linux驱动程序目前都是在。在编写驱动之前,我们需要先简单了解一下。。void指针。接下来就可以通过映射好的地址对2440的寄存器进行访问了。

2024-04-20 10:00:00 50

原创 在mini2440上编写linux应用程序、字符设备驱动程序的编写与编译

字符设备是 Linux 驱动中最基本的一类设备驱动,字符设备就是一个一个字节,按照字节流进行读写操作的设备,读写数据是分先后顺序的。比如我们最常见的点灯、按键、IIC、SPI、LCD 等等都是字符设备,这些设备的驱动就叫做字符设备驱动。在详细的学习字符设备驱动架构之前,我们先来简单的了解一下 Linux 下的应用程序是如何调用驱动程序的:linux系统中万物皆文件,驱动程序加载后会在/dev目录下生成一个对应的文件,如/dev/led。

2024-04-19 20:05:27 59

原创 Ctags的安装和使用

是一个代码跟踪软件由于在源码中,具有海量的代码,如果我们在源码中找特定的代码,需要大量时间,但是ctags则可以快速寻找。

2024-04-19 10:00:00 437

原创 arm编译、u-boot编译过程、linux内核编译

譬如linux版本,编译时间等等。问题在于之前编译好的内核我们下载到了0x30008000处,并且这个地址也是第一条指令的地址,称为入口地址。上面的修改将入口地址向后偏移了0x40-=64个字节,而这恰好就是正在的指令了,问题也就解决了。s3c2440的公板名为smdk2440,由三星公司设计,mini2440是在smdk2440的基础上,由友善之臂抄袭而来。linux源码公板配置文件在arch/arm/configs下,理论上我们直接使用该目录下的s3c2410_defconfig文件就可以。

2024-04-18 21:07:24 153

原创 linux启动minicom、u-boot的常用命令、网络命令tftp、nfs/根文件系统、u-boot的bootargs环境变量

既然u-boot可以使用tftp来下载任意文件,那么就可以使用tftp下载编译好的linux内核文件到mini2440中,并让mini2440引导linux系统。这里的根文件系统其实指的是一个文件夹,这个文件夹其实就是linux的系统根目录。NFS(Network File System)是一种用于分布式文件系统的协议,它允许计算机用户或者操作系统通过网络以NFS客户端形式访问远程服务器上的文件。因为我们需要通过该协议从电脑上下载linux内核程序,但是要使用tftp,就需要我们配置好网络相关的环境变量。

2024-04-18 20:43:26 236

原创 linux驱动编程相关介绍、u-boot的移植与下载

bootloader的本质是一个裸机程序。bootlood专门是为了能够正确地启动linux操作系统,在系统初上电时需要对系统做一些硬件的初始化操作。例如初始化内存,初始化时钟等等。最终bootloader会将linux内核(kernel)加载到ram中,并引导系统去执行linux代码,完成linux的启动。所以不难看出,bootloader在这里起到一个承上启下的作用。

2024-04-17 21:32:55 55

原创 arm中模/数转换器工作原理以及I2C工作原理

ADC量化的过程是相对于一个基准值的,这个基准值称之为基准电压。一般采用逐次逼近法的ADC会先拿采用电压Vadc跟基准电压Vref的1/2进行比较,如果Vadc>Vref,则结果为1,否则结果为0。之后继续拿Vadc和Vref的1/4或Vref的3/4继续比较。这个过程有点像二分法,每次比较都会使量化的结果逼近真实值。很明显,比较的次数决定了测量的精度,这个精度被称之为ADC的分辨率。比如一个比较了8次的ADC外设,它就称为8位ADC,其结果是0~255之间的一个数值。

2024-04-16 21:33:49 1341

原创 ARM看门狗定时器

在S3C2440A中,看门狗定时器的作用是当由于噪声和系统错误引起的故障干扰时恢复控制器的工作。也就是说,系统内部的看门狗定时器需要在指定时间内向一个特殊的寄存器内写入一个数值,俗称喂狗。

2024-04-15 20:21:13 475

原创 ARM汇编指令、指令中s后缀的作用、N、Z、C、V位有什么作用、ARM汇编启动代码

学习arm汇编的主要目的是为了编写,启动代码启动以后,引导程序到c语言环境下允许。换句话说启动代码的目的是为了在处理器复位以后搭建c语言最基本的需求。首先我们先学一些指令。

2024-04-11 20:30:56 1143

原创 arm工作模式、arm9通用寄存器、异常向量表中irq的异常向量、cpsr中的哪几位是用来设置工作模式以及r13,r14,15别名是什么?有什么作用?

当没有超过读取限制的时候,读取的值是指令的地址加上8个字节,由于ARM指令总是以字对齐的,故bit[1:0]总是00。在V3及以下版本中,写入bit[1:0]的值将被忽略,而在V4及以上版本写入r15的bit[1:0]必须为00,否则后果不可预测。(internal ram)注意iram并非是真正意义上的某种ram,通常iram就是sram,它通常存在于Soc内部,所以被称为iram。成本低,存储密度大。,CPU可以直接访问,用来存放当前正在执行的程序中的活跃部分,以便快速地向CPU提供指令和数据。

2024-04-10 21:22:28 2325

原创 DS18B20采集流程及利用上位机获取采集数据

DS1820提供9位温度读数,指示器件的温度。信息经过单线接口送入DS1820或从DS1820送出,因此从中央处理器到DS1820仅需连接(和地)。读、写和完成温度变换所需的电源可以由数据线本身提供,而不需要外部电源。因为每一个DS1820有唯一的系列号(silicon serial number),因此多个DS1820可以存在于同一条单线总线上。这允许在许多不同的地方放置温度灵敏器件。此特性的应用范围包括HVAC环境控制,建筑物、设备或机械内的温度检测,以及过程监视和控制中的温度检测。

2024-04-09 19:35:36 666

原创 什么是并行通信、串行通信?什么是全双工、半双工、单工? 什么是异步通信、同步通信? 什么是RS232、RS485?什么是pwm?

嵌入式系统中的通信是指两个或两个以上的主机之间的数据互交,这里的主机可以是计算机也可以是嵌入式主机,甚至可以是芯片。主机间通信的方式一般可以分为两类并行通信和串行通信。并行通信是指多个比特同时通过并行线进行传输,这种方式的传输速率较高,但会占用大量的芯片资源;串行通信是指将数据拆分成一个个比特,按照先后次序在一根总线上进行发送,串行通信有着系统占用资源少,结构简单等优点,是主机间通信的常用方式。串口通信(Serial Port)是串行通信的一种,属于串行通信中的异步通信。

2024-04-08 21:33:43 1455

原创 什么是中断?什么是中断源?什么是中断向量表?中断的执行流程是什么?

中断系统是为使CPU具有对外界紧急事件的实时处理能力而设置的。当中央处理机CPU正在处理某件事的时候外界发生了紧急事件请求,要求CPU暂停当前的工作,转而去处理这个紧急事件,处理完以后,再回到原来被中断的地方,继续原来的工作,这样的过程称为中断。实现这种功能的部件称为中断系统,请示CPU中断的请求源称为中断源。微型机的中断系统一般允许多个中断源,当几个中断源同时向CPU请求中断,要求为它服务的时候,这就存在CPU优先响应哪一个中断源请求的问题。中断源是引起中断的事件或原因,或发出中断申请的来源。

2024-04-08 20:52:29 699

原创 什么是framebuffer,怎么应用(二)————如何打印BMP图片、字幕函数、字符串

切换到终端模式后,登录账号名与密码,其余操作均有桌面终端一样。

2024-03-29 18:00:00 964

原创 什么是framebuffer,怎么应用(一)————如何画点、线、矩形、圆

FrameBuffer,可以译作帧缓存,有时候简称为fbdrv。这是一种独立于硬件的抽象图形设备。是Linux为显示设备提供的一个接口,把显存抽象后的一种设备,允许上层应用程序在图形模式下直接对显示缓冲区进行读写操作。

2024-03-28 20:21:47 789

原创 哈希表——数据结构——day8

(哈希表的技术)是在记录的存储位置和它的关键字之间建立一个确定的对应关系 f,使得每个关键字 key 对应一个存储位置f(key)。查找时,根据这个确定的对应关系找到给定值 key 的映射 f(key),若查找集合中存在这个记录,则必定在f(key)的位置上。

2024-03-27 13:40:04 1014

原创 二叉树的遍历、存储、性质、定义——数据结构——day7

二叉树(Binary Tree)是n(n≥0)个结点的有限集合,该集合或者为空集(称为空二叉树),或者由一个根结点和两棵互不相交的、分别称为根结点的左子树和右子树的二叉树组成。性质3:对任何一棵二叉树 T,如果其终端结点数(叶子节点)为n,度为2的结点数为m,则n=m+1。如果将树中结点的各子树看成从左至右是有次序的,不能互换的,则称该树为有序树,否则称为无序树。(4)如果结点度为1,则该结点只有左孩子,即不存在只有右子树的情况。性质1:在二叉树的第i层上至多有2的(i-1)次方个结点(i>1)。

2024-03-26 19:52:10 1347

原创 循环队列——数据结构——day6

继昨天说完队列之后,今天学习了循环队列,循环队列是解决数据溢出,所以就是将队列的头尾相接这里我们将front指向出队的第一个元素,rear指向入队的最后一个元素即可初始化操作,建立一个空队列判断循环队列是否满元素如果(que->rear+1) % que->maxlen == que->front,则循环队列中的元素已满判断循环队列是否为空如果que->front == que->rear,则循环队列中没有元素入队若循环队列存在,插入新数据num到循环队列中。出队删除循环队列中队头元素,并

2024-03-25 08:47:24 323

原创 队列——数据结构——day5

队列(queue)是只允许在一端进行插入操作,而在另一端进行删除操作的线性表。 队列是一种先进先出(First In First Out)的线性表,简称FIFO。允许插入的一端称为队尾,允许删除的一端称为队头。

2024-03-23 06:00:00 376

原创 栈——数据结构——day4

栈是限定仅在一段进行插入和删除操作的线性表。我们把允许插入和删除的一端称为栈顶(top),另一端称为栈底(bottom),不含任何数据元素的栈称为空栈。栈又称为后进先出(Last In First Out)的线性表,简称LIFO结构。

2024-03-22 19:10:16 1150

原创 双向链表增删改查、遍历、倒置、销毁等——数据结构——day3

【代码】双向链表增删改查、遍历、倒置、销毁等——数据结构——day3。

2024-03-20 20:35:45 640

原创 链表取反、查找中间值、删除倒数第几个值、删除链表指定数据的结点、插入排序——数据结构——day02

【代码】链表取反、查找中间值、删除倒数第几个值、删除链表指定数据的结点、插入排序——数据结构——day02。

2024-03-19 20:30:10 402

原创 单向链表——数据结构——day01

在单向链表中,我主要完成了对于链表的头插、尾插、头删、尾删、遍历、查找、销毁以及修改。下面我将举一个例子:其中有main.c link.c link.h三个文件。

2024-03-18 20:05:43 466

原创 sqlite3——数据库——day2

eg:实现将dict.txt文件中的所有单词和含义插入到数据库中,插入之后,输入单词,在数据库中将其意思输出到终端上。

2024-03-13 21:23:21 850

原创 数据库增删改查以及联合查询——数据库——day1

在创建表时,我已经将id设为了主键并且为升序。sqlite3 数据库文件名。已经成功打开数据库文件。

2024-03-12 20:42:59 536

原创 TCP并发模型——计算机网络——day04

int CreateTcpClient(char *pip, int port) //链接tcp//参数1:IPv4协议族;参数2:数据报套接字;参数3:协议,默认为0return -1;//IPv4模式//将端口50000转为网络的大端模式//将字符串IP地址转为内存中的IP地址return -1;while (1)//清零操作cnt++;//发送return -1;//接收return -1;return 0;

2024-03-11 21:12:28 456

原创 TCP包头、与UDP区别——计算机网络——day03

【代码】TCP包头、与UDP区别——计算机网络——day03。

2024-03-09 08:53:00 224

原创 基于UDP实现直播间聊天的功能

【代码】基于UDP实现直播间聊天的功能。

2024-03-07 21:36:24 910

linux驱动编程相关介绍、调试环境

u-boot的下载:s3c2440.jflash、u-boot.bin

2024-04-17

51单片机点LED灯,keil4环境

51单片机点灯,通过代码实现指定灯亮灭以及灯的循环 适用于做实验

2024-04-15

utf.h:C用于C和C ++的单头utf8字符串函数

我们提供了一个名为utf.h的单个头文件,其中包含了C和C++的UTF-8字符串处理函数库。这个库包括ascString、ucsString和utfString类,以及用于各种字符串类型之间转换的utfCount、utf8_ucs2_t和utf8_ucs4_t工具。这些工具和类库使得在处理中文字符串时更加简单,包括字符类型之间的转换、操作和统计等功能,有助于简化中文软件的设计和输出过程。 其中包含字模库文件路径、字模宽度、字模高度、每个字模字节数和字模库文件缓存区 函数包括: enc_get_utf8_size(const unsigned char pInput) * 将一个字符的UTF8编码转换成Unicode(UCS-2和UCS-4)编码. enc_utf8_to_unicode_one(const unsigned char* pInput, unsigned long *Unic) * 将一个字符的UTF8编码转换成Unicode(UCS-2和UCS-4)编码. 等等

2024-03-28

linux中,minishell复现

minishell 实现功能:ls opendir readdir closedir ls -a opendir readdir closedir ls -l touch fopen fclose rm remove mkdir mkdir rmdir rmdir cp IO cd chdir cat IO pwd getcwd mv rename chmod

2024-02-21

空空如也

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

TA关注的人

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