自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 QT`实现鼠标超时未点击,窗口自动关闭

Qt 窗口定时关闭

2023-01-30 11:00:01 999

原创 Qt5移植眸芯MC6810E

Qt5移植到ARM平台上,没有tslib,平台插件用linuxfb

2022-12-15 10:54:34 686

原创 C++ 虚表测试程序

测试C++虚表#include <iostream>using namespace std;class base { public: virtual void f() { cout << "base::f" << endl; } virtual void g() { cout << "base::g" << endl; } virtual void h() { cout <&l

2022-03-31 10:59:59 960

原创 实现一个基于生产者和消费者模式的H265视频缓冲区

代码分析贴上代码void BufferItem::PutData(unsigned char *data, unsigned int size){ std::unique_lock<std::mutex> lock(mutex); if(size > bufferSize) { printf("fata error: the frame is bigger than buffer\n"); return ; }

2022-03-26 16:07:12 771

原创 解决C文件包含的头文件修改了,但C文件不重新编译的问题

对于Makefile,有位大神写得由浅到深,非常好,如下是链接https://blog.csdn.net/weixin_42462202/article/details/88584668当我们仅仅只修改了project中的头文件时,如果引用头文件的.c文件对应的目标文件都已经生成了,如果直接编译,make并不能发现头文件的修改,所以我们有如下的解决办法1、把修改的头文件的对应的已经存在的目标...

2019-12-12 00:03:46 3442

原创 字符编码

输入文字,并让输入的文字在显示屏上显示出来是一个复杂的过程,我们不考虑这个过程中的其他因素,分析一下字符编码和点阵输入文字将会以数字的格式存放在内存中,然后CPU从内存中读取数字,以存储方式相同的编码格式来将数字解析出文字所以哪一个数字对应着哪一个文字或者符号,比如会有一个确定的标准ASCII用一个字节的方式来表示拉丁文字母和一些符号,一个字节有8位,因而可以表示256个。实际上拉丁字母数...

2019-12-02 16:01:15 103

原创 存储简介

存储器可以分为ram和rom两种RAMrandom access memory 随机存储,也叫主存,是与CPU直接交换数据的内部存储器。它可以随时读写(刷新时除外),而且速度很快,通常作为操作系统或其他正在运行中的程序的临时数据存储介质。RAM工作时可以随时从任何一个指定的地址写入(存入)或读出(取出)信息。它与ROM的最大区别是数据的易失性,即一旦断电所存储的数据将随之丢失。分为SRAM和...

2019-12-01 22:25:46 215

原创 usb驱动开发——写一个usb驱动

本篇博客的内核基于linux2.6.22先深入分析内核中自带usb鼠标驱动入口函数注册一个usb_driverstatic struct usb_device_id usb_mouse_id_table [] = { { USB_INTERFACE_INFO(USB_INTERFACE_CLASS_HID, USB_INTERFACE_SUBCLASS_BOOT, USB_INTERF...

2019-11-27 19:20:45 1412

原创 总线匹配过程的内核代码分析

我们知道当向内核的某个总线注册driver时,内核将driver加入到该总线下的driver链表中,然后遍历总线下的device链表,挨个根据名字或者id_table来将两者进行匹配,如果匹配成功,则优先调用bus下面的probe函数,如果bus下面probe函数为空,则尝试调用注册进来的driver下的probe函数或者当向内核的某个总线注册device时,内核将device加入到该总线下的d...

2019-11-24 20:19:57 201

原创 USB驱动开发——认识USB驱动

USB协议本身不是我本篇博客的介绍,网上有前辈们已经写了很好的总结。本篇博客将聚焦于USB驱动框架上,下一篇博客将介绍USB驱动开发在网上找到了一个图开发的重点是USB设备驱动程序,不过我们可以从USB总线驱动(也就是图中的USB核心)开始分析当把USB设备插入到开发板,串口打印如下信息...

2019-11-23 17:50:13 995

原创 触摸屏驱动

本篇博客,内核基于linux2.6.22; soc基于s3c2410首先分析一下前辈们写的驱动入口函数注册平台总线,我发现在内核中的示例驱动里有很多都是基于平台总线来接入到内核中static int __init s3c2410ts_init(void){// init_MUTEX(&gADClock); return platform_driver_register(&amp...

2019-11-20 18:43:50 258

原创 LCD驱动开发——编写代码

在上一篇博客我们可以看到,作为开发者,我们需要调用register_framebuffer向核心层注册一个fb_info,还在博客中指出了,核心层的module_init模块入口函数中创建了主设备号,同时也创建了一个class,但是没有在这个class基础上创建device(设备节点),而是在register_framebuffer中创建device,所以我们可以从这里对主设备号、file_ope...

2019-11-15 20:02:26 617

原创 LCD驱动开发——相关内核源码的分析

我们先来看下内核中相关代码,其实我们会发现LCD驱动和前面输入子系统在理念上非常相似(有趣的是,LCD驱动可以基于输入子系统来开发),我个人认为,内核在驱动中最重要的一个思想就是机制和策略分离,将代表着硬件设备(机制)的代码和代表着驱动(策略)尽量剥离开来,然后把大体相同而在细节上不同的驱动之间找出它们的相同代码,将相同的代码构建成一个类似于平台一样的东西,这个平台尽量具有包容性,这样就可以让两端...

2019-11-12 15:43:11 236

原创 输入子系统代码内核代码分析

这是以前在学习输入子系统内核代码时写的笔记,我重新整理了一下核心层的代码主要是在input.c中subsys_initcall(input_init);module_exit(input_exit);核心层的初始化函数input_init其调用了如下几个函数:创建类,传进去的参数是input_class,作用类似于class_create()因为class_register和clas...

2019-11-08 19:43:10 204

原创 用定时器中断实现按键防抖

当按键按下时,由于金属弹片的振动可能会导致多个按键中断产生,消除按键抖动所产生多个中断的思想很简单,我们只取其中一个按键中断。最为常规的办法就是用定时器来实现按键按下可能会因弹片振动产生多个中断,但是这些中断间隔时间非常的短,所以当产生按键中断时,触发的中断处理例程并不是直接处理按键信号,而是在中断例程中设置一个10ms的定时器,如果10ms内依然会因为弹片振动导致按键中断产生,那么触发的中断...

2019-11-06 13:27:25 2295

原创 linux的poll机制内核代码简单分析

从应用层面,当上层应用调用poll函数时,会进入内核调用系统调用sys_pollasmlinkage long sys_poll(struct pollfd __user *ufds, unsigned int nfds, long timeout_msecs){ s64 timeout_jiffies; if (timeout_msecs > 0) { timeout...

2019-11-05 12:13:46 164

原创 Linux内核异常和中断的代码分析

本篇博客的是基于linux 2.6版本之前在分析内核启动过程时知道了内核在启动过程中执行的第一个C函数是start_kernel,这个函数做一系列的软件上的初始化,其中和中断有关的是如下两个函数trap_init();init_IRQ();void __init trap_init(void){ unsigned long vectors = CONFIG_VECTORS_BASE;...

2019-11-04 17:44:37 195

原创 启动NFS两种方法

首先简单说一下如何实现PC机、虚拟机和开发板三者相连的情况ping通三者只需要遵守一条规则,三者要共用一个网卡以及三者的ip地址处于同一网段但是有个问题比如说我目前的情况是,PC机用无线网卡连接着路由器,而开发板用有线网卡连接着PC机,在这种情况下是根本就无法实现三者使用同一网卡,只能退而求其次,让虚拟机和开发板共用有线网卡实现相连而不与主机相连,就可以为开发板上挂载虚拟机上的文件构建了基础...

2019-10-30 14:25:24 1438

原创 内核启动分析

本篇博客基于linux2.6.22.6版本,同时打了一个补丁文件首先要创建一个source insight工程,创建时,务必把其他架构代码(主要是arch和include目录下)排除在project之外,方便代码查看根据前面对uboot启动的分析我们可以猜测得到内核启动最开始应该是处理uboot传给内核的信息;而根据内核最终目的,我们知道是需要运行应用程序,应用程序是要基于根文件系统,所以内核...

2019-10-29 11:39:08 97

原创 bootloader的实现

在上一篇博客里比较深入地分析了uboot(uboot博大精深,原谅我用“深入”这个词),所以这一篇博客里来看下如何实现一个bootloader。显然我们自己的写的bootloader不可能有uboot那样强大,我们的目的就是实现bootloader的最核心功能——加载并启动内核...

2019-10-27 19:19:39 520

原创 nand flash的读写操作

本篇博客芯片基于三星s3c2440,nand flash基于三星的K9F2GXXU0M首先来看下电路图上相关的内容看到这个电路图会有一个疑问,其他的存储设备一般会有地址总线和数据总线相连,而在nand flash中只有数据总线相连,所以传递数据和地址以及命令都只能依靠这8根数据线,当ALE为高电平的时候传输的是地址,当CLE为高电平时传输的是命令,当ALE和CLE都为低电平时传输的是数据,后...

2019-10-25 19:56:36 2694

原创 uboot移植——深入认识u-boot的配置、编译和启动过程

uboot的最终功能是启动内核,所以需要读出内核,从哪里读,读到哪里去?从flash上读到sdram,所以需要初始化sdram。sdram等硬件的工作是离不开时钟,所以需要初始化时钟,还有需要关闭看门狗。为了让我们的开放更加方便,我们需要加入其他的功能,比如我们需要把内核烧写到flash上去,而内核二进制文件从哪里来的呢?所以我们需要初始化网卡或者USB。比如为输出打印信息,我们需要初始化串口先...

2019-10-21 23:54:29 438

原创 spi协议——基于SPI控制器的编程

前面是通过GPIO来模拟SPI协议。实际上s3c2440有SPI控制器,可以通过SPI控制器来实现信息传输芯片手册上介绍了详细的编程流程71.首先需要做的设置波特率,即向SPPREn中填入合适的分配系数。具体设置为多少,需要根据外接设备而定我们这里综合OLED的性能和SPIFlash的性能,将波特率设置为10Mhz2.配置SPCONn寄存器简单介绍一下Clock Polarity Se...

2019-10-18 19:15:11 998

原创 spi协议裸机编程——spi flash

关于SPI协议本身,从前面两篇博客中已经有了初步认识,直接来看下外接的设备——spiflash芯片依然是s3c2440,flash则是winbond的在这里插入图片描述W25Q16DV首先对spiflash做最基本的测试,Read Manufacturer/device id可以看出需要先把90h写入到低八位,然后在高24位写入0。另外这个时序图还有一点小巧妙...

2019-10-17 23:28:37 979 1

原创 使用GPIO实现SPI协议操作OLED

简单分析一下使用GPIO实现SPI协议操作OLED的硬件原理由于OLED只是单纯的信息显示设备,因而只需要往其中写入数据,而不需要从其中读取数据所以我们只需要用GPIO来模拟三条线,分别为片选线(CS) 、时钟线(SPISCLK)和DO(设备输出)程序的框架是什么呢?对于主设备来说,需要配置相应的GPIO管脚,操控管脚的电位,让这些管脚根据SPI协议来发送信息给外接从设备对于从设备,这里...

2019-10-17 00:14:47 986

原创 SPI协议简介

芯片手册上的介绍:使用SPI接口,S3C2440A可以与外部设备同时发送/接收8位数据。 串行时钟线与两条数据线同步,用于信息的移位和采样。 当SPI为主机时,可以通过将SPPREn寄存器中的相应位置1来控制传输频率。 您可以修改其频率以调整波特率数据寄存器的值。 当SPI为从机时,其他主机提供时钟。 当编程器将字节数据写入SPTDATn寄存器时,SPI发送/接收操作将同时开始。 在某些情况下,应...

2019-10-16 00:08:33 819

原创 I2C——裸机编程

我所写的这篇博客里的内容尽量会聚焦在i2c裸机编程上,协议的内容也会简单介绍一下。如下是2440中i2c的block diagram可以看出,i2c所用的时钟是低速总线外接设备通常用的PCLK,但是PCLK的频率对于I2C的部分从设备来说依然有点高,所以我们需要用这里的4-bit Prescaler来分频,降低PCLK的频率来适配外部的从设备IICCON 主要作用是使能中断(Tx/Rx I...

2019-10-14 23:52:45 493

原创 ADC&touchscream

我所用的是电阻屏,因为电阻屏本身的缺点,如不能支持多点触控,所以如今电阻屏使用得非常少,主要是用电容屏;但是从开发的角度来讲,两种区别不是很大。简单介绍一下电阻屏的硬件原理(图来自网络)在上一篇博客中,提到了在A/D转换中的滑动电阻,在这里就是很好的应用我们的触摸屏实际上是两层,上层的前后两端连接着x的正负极,下层的前后两端连接着y的正负极。当触摸屏上的某一点被按下时,可以参照上图的图...

2019-10-13 00:28:17 129

原创 ADC硬件简介和编程

ADC Analog to Digital Converter模拟信号转换数字信号ADC本身的电路原理非常的复杂,我们不需要关注,只需要了解基本的地方可以帮助我们理解ADC控制器的使用一个可变电阻一端接地,另外一端接固定大小的电源(如3.3V),我们可以通过控制可变电阻来获得0 - 3.3V中间的任意大小电压,当滑动电阻变化的时候,电压的变化必然也是连续且可导的,而我们的数字信号是不可导的。(...

2019-10-09 23:32:50 1297

原创 裸机程序编译时出现未定义函数处理方法

编译时出现了如下的编译错误lcd/s3c2440_lcd_controller.o(.text+0xb4): In function `s3c2440_lcd_controller_init':: undefined reference to `__floatsidf'lcd/s3c2440_lcd_controller.o(.text+0xd0): In function `s3c2440...

2019-10-09 12:26:40 979

原创 裸机开发-LCD 编程

编程首先必须要搭建一个框架,框架可以在一开始时不必尽善尽美,我们可以在一边写的时候来一边完善矿建,但是框架一定是编程的开始我们需要达到的目的是实现屏幕画点、画线以及写字,所以为了实现这个目的,我们需要对lcd控制器进行设置,而lcd控制器的设置需要依赖于我们lcd硬件信息,所以硬件信息我们需要放在一个文件里,方便lcd控制器配置文件对lcd硬件信息的提取。最后我们还要在最上层写一个应用测试文件...

2019-10-06 00:19:53 326

原创 代码重定位

为了引入代码重定位的概念,这里简单介绍一下CPU的启动nor 启动和nand启动,后面会在介绍uboot时再更为深入的探讨cpu的启动方式cpu有nor启动是很好理解的,因为cpu是可以通过地址总线数据总线等直接访问nor,而不需要经过什么控制器,所以当我们的bin文件烧写到nor 上时,cpu可以上电后,会将nor上的bin文件的起始地址当作自己访问的起始地址,所以就可以执行bin文件了。但是...

2019-10-04 00:38:38 239

原创 内存控制器和sdram

概念原理分析一般的外接设备是无法和直接和cpu(中的核心)进行通信,而是同时通过cpu内置的控制器作为中介进行通信,主要是包括依靠gpio、协议类外接的设备。但是内存类设备是可以直接和cpu核心进行通信,比如nor flash、网卡和sdram,当这三种设备都挂载在同一地址总线和数据总线上时,cpu是如何确保这三种设备分别和cpu进行通信却不会相互干扰呢?如是引入片选信号这一概念片选信号(...

2019-10-02 17:41:39 367

原创 裸板lcd开发——硬件原理

需要说明的是我所讲的这个lcd屏有点古老,但是依然可以给我们对现在的lcd开发有帮助lcd硬件原理lcd显示出图像是因为屏幕上有整齐排列的像素点,它之所以会产生不同的颜色是因为电子qiang会对产生高能电子流为了引入对程序的开发,我们提出下面三个问题电子qiang如何移动?颜色如何确定?电子qiang如何得知信号而移动到下一行或者重头开始(我个人把这个称之为行重置和面重置)?回答这三...

2019-09-29 23:38:30 680

原创 nor flash

先看下nor flash和nand flash之间的区别NOR FLASH 可以直接进行读操作,但写操作是按块而不是按字节来进行,不能直接写,需要通过命令来做控制;NAND FLASH 即不能直接进行读操作,也不可以直接进行写,读写都是按块来进行,都需要通过命令来做控制。另外nand flash价格便宜,但是存储时可能发生位反转,可能会导致坏块的产生,所以通常用于存储数据量比较大同时可以容忍出一...

2019-09-28 19:05:07 738

原创 ARM异常和中断

中断和异常的概念中断源可以分为外部中断和内部中断在这里我们先后实现一个按键中断和定时器中断按键中断首先是初始化中断源,在这里我们是先将对按键进行初始化初始化中断源,我们需要找到对应的寄存器可以看到按键对应的中断分别是EINT0,EINT2,EINT11, EINT19然后我们进一步找到链接的寄存器找到对应的寄存器分别是GPF0 GPF2; GPG3 GPG11然后我们去芯片...

2019-09-27 19:11:23 340

原创 arm时钟体系学习笔记

时钟体系至少需要记住如下关键词高速设备连接在 AHB BUS上(高速总线)低速设备连接在 APB BUS上(低速总线)总线的时钟频率是有一个范围标准,我们可以在这个范围标准内进行自定义调整未完待完善...

2019-09-26 18:57:06 148

原创 uart串口学习笔记

UART是Universal Asynchronous Receiver and Transmitter简称,中文为通用异步接收和发送器,是常用的串行通讯接口。uart的作用是打印串口输出信息和连接各种外用设备优点是硬件简单,而且传输信息稳定;但是缺点也很明显,传输信息非常慢,因为uart是以单个字节单位来传递信息uart的最重要参数是波特率,这是决定了传输信息期间每个数据位占用多长时间u...

2019-09-26 15:21:57 702

原创 指针学习笔记

以如下程序作为测试程序 #include <stdio.h>int main(void) { int ia; int *pi; //如果只定义指针,而不立即对指针初始化,很容易引起段错误 char *pc; /*所有的变量都是存储在内存中,我们来看下变量在内存中存放的位置*/ print...

2019-09-25 17:26:07 92

原创 pthread_mutex_t 和 pthread_cond_t

有个大神写得非常好,我复述一下(哎,我只适合当一个复读机,希望我等下能提出一些自己的见解)假设有两个线程同时访问一个全局变量n,这个变量的初始值为0,即int n = 0;规则:当消费者线程a进入临界区访问n,a必须要等到n > 0才会继续向下执行至离开临界区,如果n == 0,那么a将会在当前阻塞当生成者线程b进入临界区访问n时,b将会修改n的值,使得n > 0,然后线程b将...

2019-09-23 12:10:07 129

空空如也

空空如也

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

TA关注的人

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