自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 六个使用C语言函数指针的应用场景

/5、函数指针实现动态函数调用。//4、函数指针作为函数返回值。//3、函数指针作为函数参数。//6、函数指针实现函数重载。//2、函数指针数组。

2024-05-22 14:05:36 280 1

原创 QT结合Mupdf实现预览pdf

1. 下载并安装MuPDF库:首先,你需要从MuPDF的官方网站或代码托管网站上下载MuPDF库的源代码,并按照文档中的说明进行安装。4. 编写代码:在你的Qt项目中,编写代码来加载和显示PDF文件。你可以使用MuPDF库提供的API来加载PDF文件,并使用Qt的控件来显示PDF页面。3. 配置项目:在项目文件中添加MuPDF库的头文件和库文件路径,以便在项目中正确使用MuPDF库。2. 创建Qt项目:在Qt Creator中创建一个新的项目,选择适当的项目模板和设置。// 加载PDF文件。

2023-09-18 18:47:03 911 1

原创 嵌入式开发--SPI介绍和驱动开发

SPI,全称为Serial Peripheral Interface,是一种同步的串行通信协议。SPI协议最初由Motorola公司开发,用于串行通信带宽较低的应用领域,如单片机和外部器件之间的通信。SPI协议特点:1.基于同步通讯方式,由主机发起数据传输请求,外部设备从机响应。2.采用点对点、全双工、同步、串行的通信方式。3.使用4根信号线:SCLK(时钟线)、MOSI(主机发出从机接收线)、MISO(从机发出主机接收线)和SS(从机选通线)。4.通信速率高,最高可以达到几百Mbps。

2023-06-24 17:03:12 754

原创 Linux驱动开发--input子系统开发

设计了输入子系统事件处理层:接收来自核心层上报的事件,并选择对应的handler(事件处理器 struct input_handler)去处理。内核维护着多个事件处理器对象,每个input_handler对象专门处理一类事件,所有产生同类事件的设备驱动共用同一个handler。设备驱动层:主要实现获取硬件设备的数据信息(包括触摸屏被按下、按下位置、鼠标移动、键盘按下等等),并转换为核心层定义的规范事件后提交给核心层,该层每个设备对应一个struct input_dev对象,

2023-06-23 14:08:40 638

原创 Linux驱动开发--IIC总线开发

Inter-Integrated Circuit: 字面意思是用于“集成电路之间”的通信总线,简写:IIC(或者I2C)i2c传输的要点就是: 传输一个字节 后面必然紧跟一个"响应"信号----应答信号.这个响应信号可能来自主机,或者是从机,具体是谁,就要看传输方向。传输方向分两种情况(每种情况又有两种可能: A无应答和 B有应答):1.主机->从机,主机对从机发一个字节之后,主机要读取从机的响应信号(主机读SDA线)

2023-06-23 13:54:34 887

原创 Linux驱动开发--平台总线id和设备树匹配

id匹配(可想象成八字匹配):一个驱动可以对应多个设备 ------优先级次低用到结构体数组,一般不指定大小,初始化时最后加{}表示数组结束设备中增加资源,驱动中访问资源。

2023-06-23 13:14:14 775

原创 Linux驱动开发--平台总线

​ driver模块中,struct platform_driver成员driver的name成员必须指定,但与device模块中name可以不相同。2.2 id匹配(可想象成八字匹配):一个驱动可以对应多个设备 ------优先级次低。2.3 设备树匹配:内核启动时根据设备树自动产生的设备 ------ 优先级最高。2.1 名称匹配:一个驱动只对应一个设备 ----- 优先级最低。​ 带来的问题-------怎样将二者进行关联(匹配)?总线:匹配设备和驱动——婚介所:提供沟通机制,完成拉郎配。

2023-06-23 12:52:07 644

原创 Linux开发驱动--设备模型

仅devfs,导致开发不方便以及一些功能难以支持:热插拔。

2023-06-23 12:36:21 180

原创 Linux驱动开发--中断处理原理

一种硬件上的通知机制,用来通知CPU发生了某种需要立即处理的事件分为:任何一种中断产生,CPU都会暂停当前执行的程序,跳转到内存固定位置执行一段程序,该程序被称为总的中断服务程序,在该程序中区分中断源,然后进一步调用该中断源对应的处理函数。中断源对应的处理函数被称为分中断处理程序,一般每一个分中断处理程序对应一个外设产生的中断写驱动时,如果外设有中断,则需要编写一个函数(分中断处理程序)来处理这种中断。3.2 中断释放3.3 中断处理函数原型四、按键驱动按键原理图: exyno

2023-06-22 14:00:51 1043

原创 Linux驱动开发--设备树基础和LED驱动

减少垃圾代码减轻驱动开发工作量驱动代码和设备信息分离参考Open Fireware设计用来记录硬件平台中各种硬件设备的属性信息。

2023-06-22 13:38:59 1225

原创 Linux驱动开发--内核定时器和内存管理

硬件有一个时钟装置,该装置每隔一定时间发出一个时钟中断(称为一次时钟嘀嗒-tick),对应的中断处理程序就将全局变量jiffies_64加1jiffies_64 是一个全局64位整型, jiffies全局变量为其低32位的全局变量,程序中一般用jiffiesHZ:可配置的宏,表示1秒钟产生的时钟中断次数,一般设为100或200。

2023-06-22 13:31:10 402

原创 Linux驱动开发--IO模型并发控制

执行流:有开始有结束总体顺序执行的一段代码 又称上下文竞态:多任务并行执行时,如果在一个时刻同时操作同一个资源,会引起资源的错乱,这种错乱情形被称为竞态共享资源:可能会被多个任务同时使用的资源临界区:操作共享资源的代码段为了解决竞态,需要提供一种控制机制,来避免在同一时刻使用共享资源,这种机制被称为并发控制机制。

2023-06-22 12:13:34 180

原创 Linux驱动开发--五种IO模型

1.阻塞: 不能操作就睡觉2.非阻塞:不能操作就返回错误3.多路复用:委托中介监控4.信号驱动:让内核如果能操作时发信号,在信号处理函数中操作5.异步IO:向内核注册操作请求,内核完成操作后发通知信号。

2023-06-22 11:53:34 469 1

原创 Linux驱动开发--字符设备读写和ioctl、printk实现

x:char、int类型的简单变量名成功为返回0,失败非0。

2023-06-22 10:53:23 937 1

原创 Linux驱动开发--字符设备基础

分配成功后在/proc/devices 可以查看到申请到主设备号和对应的设备名,mknod时参数可以参考查到的此设备信息。应用层通过系统调用函数间接调用这些设备操作函数 ------- 用桩。应用程序打开一个设备文件时,通过设备号来查找定位内核中管理的设备。insmod调用的init函数主要作用 --------- 钉桩。rmmod调用的exitt函数主要作用 --------- 拔桩。释放后/proc/devices文件对应的记录消失。驱动实现设备操作函数 ----------- 做桩。

2023-06-22 10:33:58 256

原创 Linux驱动开发--内核与用户空间

为了彻底解决一个应用程序出错不影响系统和其它app的运行,操作系统给每个app一个独立的假想的地址空间,这个假想的地址空间被称为虚拟地址空间(也叫逻辑地址),操作系统也占用其中固定的一部分,32位Linux的虚拟地址空间大小为4G,并将其划分两部分:0~3G 用户空间 :每个应用程序只能使用自己的这份虚拟地址空间3G~4G 内核空间:内核使用的虚拟地址空间,应用程序不能直接使用这份地址空间,但可以通过一些系统调用函数与其中的某些空间进行数据通信。

2023-06-21 15:07:56 206

原创 Linux驱动开发--内核模块传参和依赖

字符串常量的内容用来描述对应参数的作用modinfo可查看这些参数的描述信息。

2023-06-21 10:55:50 417

原创 Linux驱动开发--内核模块基础代码

Linux内核的插件机制——内核模块类似于浏览器、eclipse这些软件的插件开发,Linux提供了一种可以向正在运行的内核中插入新的代码段、在代码段不需要继续运行时也可以从内核中移除的机制,这个可以被插入、移除的代码段被称为内核模块。内核模块的本质:一段隶属于内核的“动态”代码,与其它内核代码是同一个运行实体,共用同一套运行资源,只是存在形式上是独立的。模块三要素:入口函数 出口函数 MODULE__LICENSE。

2023-06-21 10:31:26 519

原创 Linux驱动开发--内核模块编译

make modules会在新功能源码的同级目录下生成相应的同名.ko文件(生成的ko文件只适用于开发板linux)即新功能源码与内核其它源码不一起编译,而是独立编译成内核的插件(被称为内核模块)文件.ko。make menuconfig 界面里将新功能对应的那项选择成<M>即新功能源码与内核其它代码一起编译进uImage文件内。b、新功能源码与Linux内核源码不在同一目录结构下时。a、新功能源码与Linux内核源码在同一目录结构下时。注意此命令执行前,开发板的内核源码已被编译。

2023-06-21 10:26:53 451

原创 嵌入式系统移植--Linux内核加载与加载

1.将“Linux内核镜像”目录下的“uImage”和设备树“exynos4412-fs4412.dtb”拷贝到ubuntu中tftp工作目录下。后观察 uboot 是否能通过 tftp 加载和启动内核,启动时是否能挂载根文件系统(ext2),4.给开发板重新上电,上电之后观察内核是否能通过 tftp 加载和启动内核,启动完成后是。3.给开发板重新上电,上电之后观察内核是否能通过 EMMC 加载和启动内核,启动完成。4.检查网络设置是否正确,使用网线连接开发板与电脑,然后给开发板重新上电,上电之。

2023-06-20 14:31:54 363

原创 嵌入式系统移植--uboot使用和sd卡制作

Bootloader(引导加载程序)是计算机系统中非常重要的一个组成部分,它的主要功能是在计算机系统启动时加载操作系统内核并进行初始化,以确保操作系统能够正确运行。具体来说,Bootloader的主要功能包括:加载内核:在计算机启动时,Bootloader会从指定的位置读取操作系统内核,并将其加载到内存中。设置硬件环境:在加载内核之前,Bootloader会初始化硬件设备,例如CPU、内存、IO设备等,以确保内核能够正确运行。

2023-06-20 13:49:06 2145

原创 嵌入式系统移植--系统导学和环境的搭建

操作系统是管理计算机硬件和软件资源的程序集合,它是计算机系统中最基本的软件之一。操作系统的主要功能包括:处理器管理、内存和存储器管理、设备管理、文件管理、安全性控制、用户和应用程序接口等。操作系统可以分为多种类型,例如单用户单任务操作系统、单用户多任务操作系统、多用户操作系统、分布式操作系统等。常见的操作系统包括Windows、macOS、Linux、Unix等。操作系统的出现极大地推动了计算机技术的发展,使得计算机系统的性能得到了大幅度提升,为我们的日常生活和工作提供了便利。内存管理进程管理。

2023-06-20 13:32:54 177

原创 ARM基础--IIC总线原理和编程

IIC(Inter-Integrated Circuit)总线是由飞利浦公司开发的一种串行通信协议,也称为I2C总线。它是一种面向字节级的双向串行总线,支持多主机和多从机,可以由一根双线传输数据和时钟信号。IIC总线具有简单、灵活、可靠、成本低廉等优点,被广泛应用于数字电路中,如存储器、传感器、数据转换器、实时时钟等芯片的通信。IIC总线包括两根线:SDA(Serial Data Line,串行数据线)和SCL(Serial Clock Line,串行时钟线)。SDA线用于数据传输,SCL线用于时钟同步。

2023-06-20 11:54:03 836

原创 ARM基础--ADC,RTC,PWM实验

ARM的RTC(实时时钟)是一种低功耗时钟设备,通常用于计算机、嵌入式系统和其他电子设备中。RTC的主要作用是提供准确的时间和日期信息,甚至在系统关闭或断电时也能继续运行。ARM处理器通常内置有RTC,它可以提供准确的实时时钟和日期信息。RTC通常由一个晶体振荡器和一个计数器组成,晶体振荡器用于提供时钟信号,计数器用于计数。ARM的RTC通常有以下特点:低功耗:RTC使用非常少的电量,通常在微安级别。高稳定性:RTC使用晶体振荡器作为时钟源,保持高精度的时序稳定性。

2023-06-20 11:30:10 722

原创 ARM基础--基于Exynos4412的轮询和中断

1.轮询:CPU执行程序时不断地询问硬件是否需要其服务,若需要则给予其服务,若不需要一段时间后再次询问,周而复始。2.中断: CPU执行程序时若硬件需要其服务,对应的硬件给CPU发送中断信号,CPU接收到中断信号后将当前的程序暂停下来,转而去执行中断服务程序,执行完成后再返回到被打断的点继续执行。3.DMA:硬件产生数据后,硬件控制器可将产生的数据直接写入到存储器中,整个过程无需CPU的参与。

2023-06-18 17:13:04 155

原创 ARM基础--基于Exynos4412的UART和WDT实验

并行通信和串行通信是两种传输数据的方式。并行通信是指同时传输多个数据位,每个数据位占用一个信号线,这些信号线在传输过程中保持同步。并行通信速度快,但需要很多信号线,对于长距离传输,信号失真和噪声等问题较为严重。常见的并行通信技术包括并行接口、总线接口、VME总线、PCI总线等。串行通信是指逐位传输数据,每个数据位通过单个信号线传输,信号线之间不需要同步。串行通信速度相对较慢,但只需要较少的信号线,传输距离远时信号失真和噪声问题也较少。

2023-06-18 14:24:01 535

原创 ARM基础--基于Exynos4412的GPIO实验

GPIO,全称为General Purpose Input/Output,即通用输入/输出接口,是一种通用接口,可以连接不同类型的外部设备,如LED灯、按键、传感器、电机等。GPIO接口通常由微控制器或单片机提供,通过编程来控制GPIO的状态以实现对外部设备的控制和读取。GPIO接口包括输入和输出两种模式,可以通过编程方式进行设置,以实现对外部设备的控制和数据读取。从输入端来看,GPIO可以接收外部信号,如开关、传感器等,通过程序来获取这些信号并进行处理;

2023-06-18 13:42:12 262

原创 ARM基础--Exynos4412环境搭建

ARM架构下的交叉编译器安装步骤如下:下载交叉编译器包。你可以从官网或者第三方网站下载ARM交叉编译器包,如arm-linux-gnueabihf等,选择适合你的平台和系统的版本。解压交叉编译器包。2.1配置交叉编译器的环境变量。编译代码。在终端中输入make命令进行编译。运行代码。将编译好的程序拷贝到目标设备上运行。以上就是ARM架构下交叉编译器的安装步骤。需要注意的是,不同的交叉编译器使用的命令和配置可能略有不同,你需要根据自己选择的交叉编译器来进行相应的操作。

2023-06-18 13:26:04 125

原创 ARM基础--指令集汇编常用指令

ARM的软中断指令是一种在执行程序时,通过指令触发软中断,在指定的软中断号(0-255)下执行一段子程序的指令。其中,MRS指令用于将CPSR或CSPR的值传送到一个通用寄存器中,MSR指令则将通用寄存器中的值传送到CPSR或CSPR中。ARM的状态寄存器传送指令是一种将状态寄存器的值从一个寄存器传送到另一个寄存器的指令,它可以用来保存和恢复状态寄存器的值,以便在程序执行过程中控制程序的行为。BGT指令用于比较两个寄存器的值,如果第一个寄存器的值大于第二个寄存器的值,则跳转到指定地址。

2023-06-18 11:15:22 2644

原创 ARM基础--寄存器组织和异常处理

寄存器是处理器内部的存储器,没有地址。一般用于暂时存放参与运算的数据和运算结果。包括通用寄存器、专用寄存器、控制寄存器。注意:全局变量不允许使用寄存器。

2023-06-18 10:29:17 779

原创 ARM基础--处理器概论

ARM处理器是一种基于RISC指令集架构的微处理器,主要用于嵌入式系统和移动设备,如智能手机、平板电脑、数字相机等。ARM处理器的优点是功耗低、体积小、可靠性高,在嵌入式系统和移动设备领域得到广泛应用。ARM处理器架构简洁高效,指令集精简,架构简单易于实现。同时,ARM处理器支持多种操作系统,可以使用Linux、Android等开源操作系统,也可以使用Windows、iOS等商业操作系统。因此,ARM处理器适合于开发各种类型的应用程序,包括企业应用、游戏、嵌入式应用、移动应用等。

2023-06-17 14:52:47 959

原创 嵌入式数据库--sqlite

SQLite 是一个轻型的数据库系统,它不需要一个单独的服务器进程或操作系统,也不需要配置和管理等繁琐的工作。SQLite 主要包括以下几个概念:数据库文件:SQLite 基于文件的方式进行存储,每个数据库对应一个文件,文件以 .db 为后缀名。数据库文件中包含了一个或多个表,表包含了多个数据行。表:表是 SQLite 中的基本数据存储单位。一个表由多个字段组成,每个字段对应表中一列数据。字段:表中的每个列称为一个字段,字段包含了数据的类型、长度等信息。

2023-06-17 14:25:15 1011

原创 Linux编程--IO多路复用

IO多路复用是指通过一种机制,使得单个进程可以监控多个文件描述符的可读、可写和异常等事件。常见的IO多路复用技术包括:select、poll、epoll等。在实际应用中,IO多路复用可以提高程序的运行效率和性能,减少系统开销,降低系统资源的使用率。它广泛应用于网络编程、服务器开发、操作系统等领域,可以帮助开发人员更好地处理大量的网络连接和数据请求。

2023-06-17 13:39:51 2116

原创 Linux编程--网编编程UDP框架

UDP (User Datagram Protocol) 是一种无连接的通信协议,它将数据包发送给目标计算机,而不需要在发送和接收之间建立连接。以下是 UDP 通信的基本实现过程:创建套接字 (Socket) 在客户端和服务器端分别创建 UDP 套接字,以便可以在两者之间发送和接收数据包。绑定套接字 在服务器端,将套接字与一个 IP 地址和端口号绑定,以便可以接收客户端发送的数据包。发送数据包 在客户端,通过套接字向服务器端发送数据包。需要指定服务器的 IP 地址和端口号。

2023-06-17 12:55:57 313

原创 Linux编程--网络编程TCP框架

TCP/IP协议是互联网的核心协议,它的五层模型分别为:应用层:应用层协议处理网络应用程序之间的数据交换,如FTP、SMTP、HTTP等。传输层:传输层协议为应用层提供可靠的端到端通信,如TCP和UDP。网络层:网络层协议负责将分组从源节点传输到目的节点,如IP协议。数据链路层:数据链路层协议负责在物理层上提供数据传输服务,如以太网协议。物理层:物理层协议负责处理数据在物理媒介上传输的细节,如电信号和传输介质。

2023-06-17 12:27:07 487

原创 Linux编程--网络编程基础知识

网络的七层模型是指OSI(Open Systems Interconnection)模型,它定义了网络通信的七个层次,每个层次都有不同的功能和特点。以下是每个层次的简单介绍:物理层(Physical Layer):这是最底层的层次,它处理网络中的物理传输,如电缆、双绞线、光纤和无线电波等。数据链路层(Data Link Layer):数据链路层处理位于同一个物理网络中的设备之间的通信,它通过帧的形式来传输数据。

2023-06-17 10:57:27 77

原创 Linux编程--消息队列和信号灯

功能:创建或打开一个消息队列。参数:key是消息队列的关键字,msgflg表示创建标志。返回值:成功返回消息队列标识符,失败返回-1。功能:向消息队列中发送消息。参数:msqid是消息队列标识符,msgp是指向消息缓冲区的指针,msgsz是消息长度,msgflg表示发送标志。返回值:成功返回0,失败返回-1。功能:从消息队列中接收消息。参数:msqid是消息队列标识符,msgp是指向消息缓冲区的指针,msgsz是消息长度,msgtyp表示接收的消息类型,msgflg表示接收标志。

2023-06-16 11:46:45 665

原创 Linux编程--信号机制

Linux信号机制是Linux操作系统提供的一种进程间通信机制,用于在进程间传递信息或通知。信号是一种异步通信方式,即发送信号的进程不需要等待接收信号的进程的响应,而是在发送信号后即可继续执行自己的任务。Linux系统中共有64种信号,每种信号都有一个对应的数字信号码,可以通过kill命令发送信号或通过signal函数注册信号处理函数。在信号处理函数中,可以采取不同的处理方式,如忽略信号、打印信息、修改某些变量的值等。信号处理函数的执行会打断进程的正常流程,因此需要注意信号处理函数的可重入性。

2023-06-16 11:16:41 45

原创 Linux编程--进程间的通信内存映射和共享内存

函数返回值:成功返回创建的映射区首地址,失败返回MAP_FAILED( ((void *) -1) ),设置errno值addr:指定要映射的内存地址,一般设置为 NULL 让操作系统自动选择合适的内存地址。length:必须>0。映射地址空间的字节数,它从被映射文件开头 offset 个字节开始算起。prot:指定共享内存的访问权限。可取如下几个值的可选:PROT_READ(可读), PROT_WRITE(可写), PROT_EXEC(可执行), PROT_NONE(不可访问)。

2023-06-16 10:43:21 178

原创 Linux编程--进程间的通信有名管道和无名管道

(2) 写端没有全部被关闭,read阻塞等待(不久的将来可能有数据递达,此时会让出cpu)1. 管道读端全部被关闭, 进程异常终止(也可使用捕捉SIGPIPE信号,使进程不终止)(1) 管道写端被全部关闭,read返回0 (相当于读到文件结尾)(2)管道未满,write将数据写入,并返回实际写入的字节数。(1) 管道已满,write阻塞。通过路径名来操作,在文件系统中可见,但内容存放在内存中。1. 管道中有数据,read返回实际读到的字节数。mode 管道文件的权限,如0666。文件IO来操作有名管道。

2023-06-16 10:22:28 253

空空如也

空空如也

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

TA关注的人

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