- 博客(202)
- 收藏
- 关注
![](https://csdnimg.cn/release/blogv2/dist/pc/img/listFixedTop.png)
原创 第76课 - 多线程间的互斥(下)
#include <QtCore/QCoreApplication>#include <QThread>#include <QMutex>#include <QDebug>QMutex g_mutex_1;QMutex g_mutex_2;class ThreadA : public QThread{protected: void run() { whil...
2020-09-23 09:12:43
94
![](https://csdnimg.cn/release/blogv2/dist/pc/img/listFixedTop.png)
原创 第75课 - 多线程间的互斥(上)
#include <QtCore/QCoreApplication>#include <QThread>#include <QMutex>#include <QDebug>static QMutex g_mutex;static QString g_store;class Producer : public QThread{protected: void run() {...
2020-09-23 08:49:15
91
![](https://csdnimg.cn/release/blogv2/dist/pc/img/listFixedTop.png)
原创 第73课 - Qt 中的多线程编程
线程是有生命周期的,创建线程,然后start,然后运行,线程是有生命周期的,不会一直执行,会被操作系统打断,从而进入不可运行状态,让出CPU资源,进而系统调用其他线程执行。所有的线程看起来是并行的执行,但是从CPU的角度来看,是CPU调度执行,共享CPU资源,但调度非常快,给我们的主观感受是并行执行。在单CPU资源中,是线程的并行执行,是CPU调度产生的。线程都会死亡的,死亡分为自然死亡,非自然死亡,调用terminate是非自然死亡,会产生不可预测的错误,是禁止使用,暴力结束线程。...
2020-09-22 16:17:49
159
原创 imx6用文件io操作gpio
要让linux支持文件io方式操作gpio,首先驱动必须得支持,也就是说设备树上必须先配置好gpio模式,然后参照以上链接去实现gpio操作这里举例来说:hud项目中(imx6dl平台),有一个蓝牙电源的使能受GPIO1_IO30的控制,所以我们必须得在设备树上配置这个pad为GPIO模式1.配置gpio模式现在需要在设备树上配置GPIO1_IO32用于gpio, 在配置之前需要确定该pad为哪个pad, 经原理图可知为ENET_TXD0/GPIO1_IO30, 然后在imx6dl规格书上第四章Ext
2022-04-28 15:33:29
408
原创 Linux IIC驱动
概述IIC总线只需要两根线就可以完成读写操作,一条总线上可以挂载多个设备,因此被广泛使用。但是IIC总线有一个缺点,就是传输速率比较低。Linux的i2c体系结构分为三个部分:1、i2c核心;2、i2c总线驱动;3、i2c设备驱动。怎么写I2C设备驱动程序?分配一个i2c_driver结构体设置attach_adapter // 它直接调用 i2c_probe(adap, 设备地址, 发现这个设备后要调用的函数);detach_client // 卸载这个驱动后,如果之前发.
2022-04-14 17:19:47
755
原创 SPI 驱动
1、SPI 协议介绍概述同步串行端口(Synchronous Serial Port) 的模块(Module)来实现的, 它允许 MCU 以全双工的同步串行方式, 与各种外围设备进行高速数据通信.优点:支持全双工通信、通信简单、数据传输速率快缺点:没有指定的流控制,没有应答机制确认是否接收到数据,所以跟 IIC 总线协议比较在数据可靠性上有一定的缺陷。特点采用主-从模式(Master-Slave) 的控制方式SPI 规定了两个 SPI 设备之间通信必须由主设备 (Master) 来控制次设
2022-04-14 15:08:37
451
原创 温习一下嵌入式老鸟 (火哥) 的面试指南
火哥自从校招找工作到现在 (2019-04-26),面试过不下50家公司,拿到过不少于30个offer。虽然不能是百战百胜,但是也还算有着较高的面试成功率。这50场以上的面试中,火哥用过不同的简历,尝试过不同的项目介绍技巧,也算颇有心得,今天我们聊聊电子通信,嵌入式工程师面试的那些事。一、公司面试求职者的目的是什么?《孙子兵法》有云知己知彼,百战不殆,当然百战不殆并不等于百战百胜,而是说在知己知彼的前提之下,至少结果不会很难看,哪怕没有打胜战,也不至于损兵折将一败涂地。所以要去面试一家公司,首先搞清楚
2022-04-07 15:39:17
837
原创 使用gdb+core文件调试程序异常奔溃bug
前言话接上文将gdb移植到开发板,那么又该如何使用gdb来调试解决程序的各种疑难杂症呢?使用gdb的方法对于嵌入式开发而言,使用gdb的手段常见有两种:一种是通过gdb+gdbserver远程调试arm开发板上的程序。这种方法的优点是对arm开发板的资源消耗较少,只需一根网线就可以正常的调试程序。缺点是对于比较大的程序如果单步调试等手段比较费时费力,特别对于偶尔时不时才出现的bug更是如此。那么此时就得使用第二种手段:使用gdb+core文件来调试程序了。core文件简介关于core文件的介绍使用
2022-03-30 17:29:27
915
原创 gdb交叉编译到arm开发板
前言最近手头上的项目出现bug,出现偶尔崩溃现象,而且是随机出现感觉bug如幽灵般无迹可寻。无奈之下只能搬出gdb调试大法,那么问题来了,在嵌入式arm板上一切都是空白的,几乎所有的工具软件都得自己编译移植到arm板子上。在经过一番折腾之后终于将gdb成功的放到板子上运行。过程是辛苦的,结果是欣喜的,遂在此记下移植过程,仅供学习参考。工具、开发环境简介1、pc系统:ubuntu12.042、arm系统:smart210+linux2.6.43、交叉编译工具:arm-none-linux-gnuea
2022-03-30 17:22:53
904
原创 进程间通信
进程间通信的方式1. Pipe fifo 实现最简单2. mmap 非血缘关系进程间3. 信号 开销小4. domain 套接字,稳定性最好使用本地套接字,实现一个本地服务器和多个客户端之间通信类似server 作为服务器,接收客户端的数据,保存每个客户端的fd,实现和客户端的双向通信。#include <stdio.h>#include <unistd.h>#include <sys/socket.h>#include <stri
2022-03-30 14:16:11
334
原创 C语言-字符串与字符数组区别
区别:C语言中没有字符串这种数据类型,可以通过char的数组来代替字符串一定是一个char的数组,但char的数组未必是字符串数字0(和字符’\0’等价)结尾的char数组就是一个字符串,但如果char数组没有以数字0结尾,那么就不是一个字符串,只是普通字符数组,所以字符串是一种特殊的char数组。注:%s是打印一个字符串,%c是打印一个字符%s会接收字符串结束标志’\0’之前的所有字符,在ASCII中就是01.不指定数组长度:没有0结束符,有多个元素就有多长普通字符数组,输出结果乱码,
2022-03-29 10:58:19
2401
1
原创 Linux udev识别移动设备
udev是什么udev 是Linux kernel 2.6系列的设备管理器。它主要的功能是管理/dev目录底下的设备节点。它同时也是用来接替devfs及hotplug的功能,这意味着它要在添加/删除硬件时处理/dev目录以及所有用户空间的行为,包括加载firmware时。udev系统由三个部分组成:libudev函数库,可以用来获取设备的信息,/usr/include/libudev.h。udevd守护进程,处于用户空间,用于管理虚拟/dev管理命令udevadm,用来诊断出错情况,/usr/bi
2022-03-23 14:06:32
848
原创 理解ffmpeg中的pts,dts,time_base
首先介绍下概念:PTS:Presentation Time Stamp。PTS主要用于度量解码后的视频帧什么时候被显示出来DTS:Decode Time Stamp。DTS主要是标识读入内存中的bit流在什么时候开始送入解码器中进行解码也就是pts反映帧什么时候开始显示,dts反映数据流什么时候开始解码怎么理解这里的“什么时候”呢?如果有某一帧,假设它是第10秒开始显示。那么它的pts是多少呢。是10?还是10s?还是两者都不是。为了回答这个问题,先引入FFmpeg中时间基的概念,也就是time_
2022-03-15 13:41:35
5006
1
原创 makefile
1 学习目标网上对于makefile总结学习文章有许多,但是大部分排版或者内容杂乱无章,所以还是自己进行一个总结学习,大家可以根据自己的阅读习惯选择适合自己的文章。在实例部分的代码是层层递进改变,每一次都是在之前的基础上修改。了解Make工具给我们带来的好处和便利makefile的书写格式、关键字、函数。像C 语言有自己的格式、关键字和函数一样(重点)2 makefile概述make工具是一个根据makefile文件内容,针对目标(可执行文件)进行依赖性检测(要生成该可执行文件之前要有哪些中间文
2022-03-06 18:09:46
284
原创 linux消费者生产者 条件变量
条件变量:本身不是锁! 但是通常结合锁来使用。 mutexpthread_cond_t cond;初始化条件变量: 1. pthread_cond_init(&cond, NULL); 动态初始化。 2. pthread_cond_t cond = PTHREAD_COND_INITIALIZER; 静态初始化。阻塞等待条件: pthread_cond_wait(&cond, &mutex); 作用: 1) 阻塞等待条件变量满足 2)
2022-02-22 16:33:41
635
原创 linux生产者消费者(使用信号量)
信号量:应用于线程、进程间同步。相当于 初始化值为 N 的互斥量。 N值,表示可用资源数, 可以同时访问共享数据区的线程数。函数: sem_t sem; 定义类型。 int sem_init(sem_t *sem, int pshared, unsigned int value); 参数: sem: 信号量 pshared: 0: 用于线程间同步 1: 用于进程间同步 value:N值。(表示可用资源数) sem_destroy(); sem_wait(); 一次
2022-02-22 15:59:51
630
原创 linux系统编程--孤儿进程 僵尸进程
孤儿进程:父进程先于子进终止,子进程沦为“孤儿进程”,会被 init 进程领养。僵尸进程:子进程终止,父进程尚未对子进程进行回收,在此期间,子进程为“僵尸进程”。 kill 对其无效。子进程终止时,子进程残留资源 PCB 存放于内核中,PCB 记录了进程结束原因,进程回收就是回收 PCB。回收僵尸进程,得 kill 它的父进程,让孤儿院去回收它。#include <stdio.h>#include <unistd.h>#include <sys/wait.
2022-02-20 14:08:04
866
1
原创 ffmpeg-4.3 H264编码流程
基于ffmpeg-4.3版本的编码流程,参考了 doc/examples/encode_video.c 的流程avcodec_find_encoder_by_name :通过名称获取编码器avcodec_alloc_context3 : 申请一个编码器av_packet_alloc:申请一个AVPacketavcodec_open2:打开编码器av_frame_alloc:申请一个AVFrameencode(AVCodecContext *enc_ctx, AVFrame *frame, AV
2022-01-25 16:47:07
1821
原创 mjpeg协议
https://blog.csdn.net/fuzhikun_python/article/details/64437753想确认一下mjpeg和JPEG的关系?想问一下mjpeg流里面的每一帧都是一个普通的JPEG图像吗,我可以用一个JPEG图片重复发送形成mjpeg流吗?Mjpeg是Motion JPEG 的简称。它的原理是把视频镜头拍成的视频分解成一张张分离的jpg数据发送到客户端。当客户端不断显示图片,即可形成相应的图像。大部分低端的网络摄像头都支持的MJPG协议,较为高级的摄像头支持是
2022-01-24 11:03:05
6089
原创 libusb编译和Qt环境配置libusb
1、下载libusb,下载网址:https://sourceforge.net/projects/libusb/2、Windows下编译libusb,Visual Studio 2017打开libusb_2017.sln。解压下载下来的libusb压缩包,包含ibusb_2017.sln的路径是:libusb-1.0.23/libusb-1.0.23/msvc/libusb_2017.sln。3、编译环境我选择的是Debug Win32。4、编译完成后,在libusb-1.0.23/libusb-1
2021-12-27 22:58:13
2569
原创 发送自定义事件
QT总可以在程序中自主发送事件阻塞型事件发送事件发送后需要等待事件处理完成非阻塞型事件发送事件发送后立即返回事件被发送到事件中等待处理事件被发送到事件队列中等待处理Qt程序程序能够自主发送系统事件QApplication类提供了支持事件发送的成员函数sendEvent()发送事件后需要等待事件处理完成postEevent()发送事件后立即返回void Widget::testSendEvent(){ QMouseEvent dbcEvt(QEvent::MouseBut
2021-12-21 16:44:32
103
原创 先大框架,然后逐模块,逐Function
多年前的一个 IBM 的老鸟曾经教过我一个 5 分钟上手的思维习惯,当我听到以后,醍醐灌顶,惊人天人,一改日常的编码风格。到现在,它还持续保持在我的日常的编码习惯当中。我不知道应该怎么称呼这种思维习惯的名字,top-down,自顶而下,或者分治?先大框架,然后逐模块,逐Function。不管怎么样,它的核心是非常清晰的:编码的时候只思考同一个思维层次的逻辑,在这层完成之后再思考下一层。它基于这么一个事实:我们每个人智力是有限的,同一个时间只能思考有限内容的东西,我们都不是天才。由于这个事实的存在,所以程
2021-11-03 10:25:54
109
原创 UVC 驱动调用过程与驱动框架的简单分析 v4l2
UVC 驱动整体调用流程:/* 打开设备描述符 */1. open: uvc_v4l2_open/* 查询设备属性 */2. VIDIOC_QUERYCAP if (video->streaming->type == V4L2_BUF_TYPE_VIDEO_CAPTURE) cap->capabilities = V4L2_CAP_VIDEO_CAPTURE | V4L2_CAP_STREAMING; else cap->ca
2021-11-02 16:24:55
664
原创 QPixmap的用法
QPixmap类是一种 off-screen 图像表示形式,可以用作绘画设备。使用QLabel或QAbstractButton的子类之一(例如QPushButton和QToolButton),可以轻松地在屏幕上显示QPixmap。QLabel具有pixmap属性,而QAbstractButton具有icon属性。 1、直接加载图片显示 ```cpp QLabel *boatIcon = new QLabel(this); boatIcon->setPixma
2021-11-02 16:17:53
2014
原创 QImage的用法
QImage提供了几种加载图像文件的方法:(1)构造QImage对象Image myImage1 = QImage(filename); 根据文件名打开图像支持的图片格式是:(2)QImage(uchar *data, int width, int height, Format format …)用数据构建一个图像,例如:QImage nImage((uchar *)mAVFrameRGB->data[0],mTargetWidth,mTargetHeight,QImage::Form
2021-11-02 15:50:00
11630
原创 QImage与QPixmap区别
一、不同平台,依赖、存储不同QPixmap依赖于硬件,QImage不依赖于硬件。在X11, Mac 以及 Symbian平台上。QImage: 因为它是存储在客户端,往QImage上绘图比较快,但显示它则比较慢。QPixmap: 具体实现是依赖于系统的,它是存储在服务器端,往QPixmap上绘图比较慢,但显示它则比较快。但在Windows平台上则是是一样的,因为它们都存储在客户端,并不使用任何的GDI资源,可能看起来并没有多大区别。目前的Qt会把QPixmap都存储在graphics memory中
2021-11-02 11:43:55
1254
原创 QT布局管理器--2
11.QT-布局管理器(Box,Grid,Form,Stacked)布局管理器简介QT中提供了对界面组件进行布局管理的类,用于对界面组件进行管理,能够自动排列窗口中的界面组件窗口大小变化后,便会自动更新界面组件的大小。布局管理器可以自定义,从而达到更加个性化界面布局的效果布局管理器可以相互嵌套,完成所有常用的界面布局QLayout是Qt中布局管理器的抽象基类,只能使用它的子类,如下图所示:QBoxLayout水平/垂直布局QBoxLayout有两个子类:QHBoxLayout(水平)和Q
2021-09-28 15:55:58
576
原创 QT布局管理器--对画框自适应和addStretch()用法(1)
1、让对话框大小总是以最合适的大小显示。。。。 label = new QLabel(QObject::tr("初始文本")); label->setMaximumWidth(100); /*自适应大小,可有可无*/ label->adjustSize(); /*自动换行*/ label->setWordWrap(true); button = new QPushButton(tr("改变文本")); QHBoxLayou
2021-09-28 11:30:32
483
原创 git的add、commit、push的详细介绍
1、git status 查看工作区代码相对于暂存区的差别2、git add . 将当前目录下修改的所有代码从工作区添加到暂存区 . 代表当前目录3、git commit -m ‘注释’ 将缓存区内容添加到本地仓库4、git pull origin master先将远程仓库master中的信息同步到本地仓库master中6、git push origin master 将本地版本库推送到远程服务器,7、origin是远程主机,master表示是远程服务器上的master分支和本地分支重名的简写,分
2021-09-27 19:46:48
8311
原创 QGroupBox
是什么: QGroupBox为构建分组框提供了支持。分组框通常带有一个边框和一个标题栏,作为容器部件来使用,在其中可以布置各种窗口部件。布局时可用作一组控件的容器,但是需要注意的是,内部必须使用布局控件(如QBoxLayout)进行布局。 QGroupBox继承关系:怎么用 topLeftGroupBox = new QGroupBox(tr("Group 1")); radioButton1 = new QRadioButton(tr("Radio button 1"
2021-09-26 18:27:51
201
原创 strlen函数与sizeof的区别,C语言strlen与sizeof的区别详解
【摘要】 1.sizeof()是一个运算符 获取类型原型所用的字节长度 bool: 1个字节 char :1个字节(固定) short int : 2个字节(固定) int: 4个字节(固定) unsigned int : 4个字节(固定) float: 4个字节(固定) double: 8个字节(固定) long: 4个字节 unsigned long: 4个字节 long l…1.sizeof()是一个运算符 获取类型原型所用的字节长度bool: 1个字节char :1个字节(固定)short
2021-09-12 17:09:57
270
原创 C语言怎样给字符数组赋值
1、数组在定义时,可以同时进行初始化,但定义完成后,就不能按初始化的形式对其赋值了,如:char a[10]=“abcdefgh”; //这样可以a=“abcdefgh”; //这样是错误的!a是数组名,是一个静态数据:数组首地址值,可以看作是个常数,不能再被改变。2、单字符赋值可通过数组下标方式或指针方式,引用数组元素,进行赋值。例子:char a[10];char ch=‘a’;for( i=0;i<10;i++ )a[i]=ch+i ; //可通过数组下标引用数组元素,完成赋
2021-09-11 15:49:10
15432
原创 open与fopen的区别
函数原型FILE *fopen(const char *filename, const char *mode);参数filename-- 这是 C 字符串,包含了要打开的文件名称。mode-- 这是 C 字符串,包含了文件访问模式。功能使用给定的模式mode打开filename所指向的文件。1.层次不同open是系统调用,返回的是文件句柄,文件的句柄是文件在文件描述副表里的索引,fopen是ANSIC标准中的C语言库函数,返回的是一个指向文件结构的指针)。在不同的系统中应该调用不同的内核
2021-09-09 15:56:02
4237
原创 DM9000C的驱动移植
首先思考一下,两个不同设备上如果用同一种网卡,用法如何不同呢?简单的来说有三点:基地址、位宽和中断引脚。因此,想要移植一个网卡驱动,一般来说,我们只需要在厂家提供的驱动里修改这三个参数就行。1.首先来看DM9000C原理图如下图所示: (#:表示低电平有效)SD0~15: 16位数据线,有CMD引脚决定访问类型CMD: 命令线,当CMD为高,表示SD 传输的是数据,CMD为低表示传输的是地址INT: 中断引脚,接在2440的GPF7脚上IOR#: 读引脚
2021-09-08 17:33:02
682
原创 内存控制器与SDRAM_内存接口概念
辅线1_硬件知识_内存接口概念如图是S3C2440是个片上系统,有GPIO控制器(接有GPIO管脚),有串口控制器 (接有TXD RXD引脚)。配置GPIO控制器相应的寄存器,即可让引脚输出高低电平;配置UART控制器相应的寄存器,即可让引脚输出波形。前者相对简单,类似门电路,后者相对复杂,属于协议类接口。类似的协议类接口还有iic、iis、spi等。 对于CPU是不管什么接口的,它只写相应的寄存器,由控制器根据寄存器的配置去控制具体的引脚。那么CPU是如何访问各个不同的寄存器的呢?CPU只管发出
2021-09-08 15:50:39
700
原创 Linux线程-互斥锁
在线程实际运行过程中,防止共享资源被并发访问。这时可以用互斥锁来完成任务;互斥锁的使用过程中,主要有pthread_mutex_init,pthread_mutex_destory,pthread_mutex_lock,pthread_mutex_unlock这几个函数以完成锁的初始化,锁的销毁,上锁和释放锁操作一、什么是互斥锁互斥锁是另一种用于多线程中的同步访问方法,它允许程序锁住某个对象,使得每次只能有一个线程访问它。为了控制对关键代码的访问,必须在进入这段代码之前锁住一个互斥量,然后在完成操作之后
2021-09-03 16:37:27
441
原创 linux下信号量和互斥锁的区别
之前一直没有怎么关注过这个问题,前些日子在面试一家公司的时候,面试官提到了pthread_cond_wait/pthread_cond_signal的实现,当时答的不是很好,回来就查了nptl的代码。前天,水木上又有人问到了信号量和互斥锁的问题,我想还是对它们的区别与实现总结一下。首先了解一些信号量和线程互斥锁的语义上的区别:援引CU上一篇帖子的内容:“信号量用在多线程多任务同步的,一个线程完成了某一个动作就通过信号量告诉别
2021-09-03 16:15:00
1749
原创 Linux多线程编程之条件变量
前言条件变量是利用线程间共享的全局变量进行同步的一种机制,主要包括两个动作:一个线程等待”条件变量的条件成立”而挂起;另一个线程使”条件成立”(给出条件成立信号)。为了防止竞争,条件变量的使用总是和一个互斥锁结合在一起。1、函数说明a、pthread_cond_init函数可以用来初始化一个条件变量。他使用变量attr所指定的属性来初始化一个条件变量,如果参数attr为空,那么它将使用缺省的属性来设置所指定的条件变量。 b、pthread_cond_destroy函数可以用来摧毁所指定的条件
2021-09-03 15:23:09
239
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人