-
三、AD——原理图
原理图Value值 原理图PCB封装统一管理 原理图编译设置及检查 Net高亮,显示另一个连接 Read More
-
二、AD——PCB封装库
1 PCB中各个层 English 中文 作用 Top Layer 顶层信号层 主要用来放置走线和元器件 Bottom Layer 底层信号层 同上,就是一个在上面一个在背面 Keep out Layer 禁止布线层 所选区域外禁止布线,也有人用于设计板框 Mechanical 1 机械层 一般放置有关制板和装配方法的指示性信息,如PCB的外形尺寸、尺寸标记、数据资料、过孔信息、装配说明等信息 ... Read More
-
一、AD——原理图库
1 元器件Component属性 Design Item ID:器件ID/器件名称。用于标识库中元器件的唯一名称,类似于元器件型号或库元件名。比如RES、CAP、STM32F103C8T6等。 Designator:器件编号。用于在原理图中区分每一个器件的唯一编号,如 R1、C2、U3。 Comment:参数注释。通常填写器件的关键参数,常作为 PCB 丝印内容。如 10k 1%、1uF 25V 等 Description:描述。元件详细描述,便于查找与识别。 Part:可以把元器件分成不同部分。方便各自接不同的电路。 元器件新建不同部分 原理图中需... Read More
-
一、STMProject——XRD
1 停止 接收到停止命令后,通过地址表,减速停止,并不是急停。 疑问: 缓慢减速停止,还是急停 两种都需要? 急停是使能IO,还是停止PWM 使能IO是否需要接入,单片机控制 2 校读 疑问: 系统,一直去判断,是否接收到停止命令,响应比较慢。 方案: 通过立即处理命令和阻塞命令两个线程,可以实现不同命令同时响应。 如果第一次就是高角度,是否就不需要第二次判向.(高角度不遮挡,0度开始遮挡) 并不是重置为5度,跟5度差个校准值?,2000个脉冲,2000 * (0.005) = 10°,型号对应关系。 消除机械空程 θ:2θ 不同机器型号 3 叠扫 定时步进:(延时阶段+电... Read More
-
五、电路基础——MOS管
1 前言 D(Drain)漏极:载流子(NMOS为负电荷,PMOS为正电荷)离开端。 S(Source)源极:载流子发射端。 G(Gate)珊极:控制MOS开关的管脚。简单理解NMOS高电平导通,PMOS低电平导通。 沟道:D和S之间形成的导电通道。 衬底:向沟道提供电子或从沟道拿电子,与源极连接。 以P型半导体为衬底,在一个 低掺杂容度 的 P 型半导体上,通过扩散技术做出来2块 高掺杂容度 的 N 型半导体,引出去分别作为 源级(S) 和 漏极(D)。 P型衬底在 MOS管内部是和 源级(S)相连。(P材料就是衬底,内部已经跟源极S短接) 在P型衬底和两个N型半导体 之间加一层 二氧化硅(SiO₂)绝缘膜,然后通过多晶硅引出引脚组成栅极(G)。 组成结构如下图(增... Read More
-
四、电路基础——负载
Read More
-
三、电路基础——光耦
https://www.eefocus.com/article/1846337.html https://image.baidu.com/search/detail?z=0&word=%E9%AB%98%E9%80%9F%E5%85%89%E8%80%A66n137%E5%8E%9F%E7%90%86%E5%9B%BE&hs=0&pn=8&spn=0&di=7498023338351001601&pi=0&rn=1&tn=baiduimagedetail&is=0%2C0&ie=utf-8&oe=utf-8&lm=&cs=2091962342%2C2883589073&os... Read More
-
二、电路基础——三极管
1 三极管基本概念 2 NPN三种工作状态 2.1 NPN截止状态 条件:$V_{BE} < 0.6\,\text{V}$ 特性:三极管不导通,$I_C \approx 0$ 管压降:$V_{CE} \approx V_{CC}$ 2.2 NPN放大状态 条件:$V_{BE} \approx 0.7\,\text{V}$,且 $V_{CE} > V_{CE(sat)}$ 集电极电流:$I_C = \beta I_B$ 发射极电流:$I_E = I_B + I_C = (\beta + 1) I_B$ 管压降(假设发射极... Read More
-
一、电路基础——二极管
1 二极管特性 正向偏置导通后,硅管的管压降约为0.7V,锗管的管压降约为0.3V。 注意反向击穿电压。 电路符号。 2 PN结形成 P(Positive)型和N(Negative)型可根据它们的载流子(载流子说得比较学术,其实就是导体里面能流动的带电粒子,为电子或者是空穴,空穴可以看作是带正电的电子)来区分。 P型掺杂三价元素主要包括硼(B)、铝(AI),容易得到自由电子,变成负离子。 N型掺杂五价元素主要是磷(P),容易失去自由电子,变成是正离子。 当P型半导体和N型半导体相接触时,由于两种半导体的掺杂原子种类和浓度不同,会产生电子和空穴的扩散运动... Read More
-
一、
凌霄IMU 更新凌霄IMU 点击载入固件文件,载入成功,固件信息会显示。(必须对应硬件版本号) Read More
-
二、无人机姿态解算
Read More
-
一、无人机基本知识
1 X模式和十字模式 十字模式如下图左所示,X模式如下图右所示。对于姿态测量和控制来说,两种结构差别不大。如果考虑安装航拍摄 像机,为了视线不被挡住,通常采用X模式。 一般都是采用X模式,M1和M3(对角线电机)同一个旋转方向。不同飞控的旋转方向定义会有区别,但是对角线都是同一个旋转方向。 1.1 匿名飞控旋转方向定义 2 坐标系 姿态角(pitch、roll、yaw)是飞行器的机体坐标系与地面坐标系的夹角,也叫做欧拉角。 俯仰角(pitch):机体绕着Y轴旋转。向上(抬头)时,俯仰角为正,否则为负。 偏航角(yaw):机体绕Z轴旋转。机头右偏航(右转)为正,反之为负。 滚转角(roll):机体绕X轴旋... Read More
-
二、EtherCAT——移植SOEM
1 SOEM github SEOEM下载链接:https://github.com/OpenEtherCATsociety/SOEM SOEM库采用分层设计,并且提供了一个抽象层,将SOEM协议栈与具体操作系统和硬件分开。抽象层由OSAL和OSHW两个模块组成,OSAL是操作系统抽象层,OSHW 是硬件抽象层,移植的主要内容就是对OSAL和OSHW具体API实现,在新的操作系统和硬件平台上的重写。 SOEM的层级架构如下图所示: 1.1 osal.c 1.2 nicdrv.c https://blog.csdn.net/cln512/article/details/110704584 https://blog.csdn.net/weixin_48501028/a... Read More
-
一、EtherCAT——概述
1 EtherCat概述 1.1 特性(可以简单看看) 开发的技术:EtherCAT全称EtherNet Control Automation Technology,是由德国倍福(Beckhoff)公司提出的一种实时以太网技术。EtherCAT是一种开放但不开源的技术,意味着您可以任意使用这项技术,但若要进行相关设备的开发,则需要向倍福公司获取相关授权。 快速性:相比传统现场总线,EtherCAT的数据传输速率有了极大的提升,可选10Mbit/s或100Mbit/s,甚至依托补充的EtherCAT G技术,传输速率可达1000Mbit/s;同时EtherCAT基于标准以太网帧传输,单帧数据用容量可达1486 Bytes。这使得在传输数据量方面Et... Read More
-
02 Lwip之无操作系统移植
## nagle造成的无法立即发送 https://blog.csdn.net/qq_43448742/article/details/107314650 https://blog.csdn.net/weixin_39628271/article/details/111686643?spm=1001.2101.3001.6650.1&utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromBaidu%7EPaidSort-1-111686643-blog-107314650.235%5Ev43%5Epc_blog_bottom_relevance_base2&dep... Read More
-
一、Lwip——简介
1 LwIP介绍 LwIP全名:Light weight IP,意思是轻量化的TCP/IP协议,是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。LwIP的设计初衷是:用少量的资源消耗实现一个较为完整的TCP/IP协议栈,其中“完整”主要指的是TCP协议的完整性,实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。此外LwIP既可以移植到操作系统上运行,也可以在无操作系统的情况下独立运行。 LwIP具有主要特性: 支持ARP协议(以太网地址解析协议) 支持ICMP协议(控制报文协议),用于网络的调试与维护。 支持IGMP协议(互联网组管理协议),可以实现多播数据的... Read More
-
二、Vs Code——跳转到函数定义
1 settings.json 在 .vscode -> settings.json 文件设置 C_Cpp.default.browse.path 浏览路径。 { "C_Cpp.default.browse.path": [ "${workspaceFolder}/.." ], "files.encoding": "gb2312", } Read More
-
一、STM32——答疑总结
https://www.iotword.com/19400.html Read More
-
20251111——工作计划管理Excel使用
1 工作明细表 1.1 分类添加 分类名称添加 分类的背景色 一定要先选择分类这一列 ,再点击新建规则 只为包含以下内容的单元格设置格式,然后选中等于那个单元格 点击 格式 -> 图案 选择相应的颜色 2 日待办 2.1 分类的项目背景色 选择分类这一列,新建格式规则,选择只为包含以下内容的单元格设置格式 ... Read More
-
三、内存
在电子领域中,我们经常提到RAM、SRAM、DRAM、SDRAM、DDR、ROM、PROM、EPROM、EEPROM、NAND FLASH、NOR FLASH等,它们都是常见的存储类型,但是却在结构、功能和应用场景上存在着显著的差异。有些朋友可能不太能区分,今天我们就来依次介绍一下。 1 定义与特点 1.1 RAM 定义:RAM(Random Access Memory)即随机存取存储器,是一种用于存储数据和程序指令的计算机硬件。 特点:RAM中的数据在断电后会立即消失,因此它通常被用作临时存储区域,以加快数据的读取和写入速度。RAM有多种类型,其中最常见的是SRAM(静态随机存取存储器)和DRAM(动态随机存取存储器)。 1.1.1 SRAM 定义:SRAM(Static... Read More
-
20250302——win11右键默认显示更多选项
管理员运行命令恢复win10右键:reg.exe add “HKCU\Software\Classes\CLSID{86ca1aa0-34aa-4e8b-a509-50c905bae2a2}\InprocServer32” /f /ve 管理员运行命令恢复win11右键:reg.exe delete “HKCU\Software\Classes\CLSID{86ca1aa0-34aa-4e8b-a509-50c905bae2a2}\InprocServer32” /va /f 执行完命令后需要重启 Read More
-
一、Arm汇编——Cortex-M3
cortex-m3是一个32位处理器内核:总线(数据、地址)宽度是32位、寄存器位宽是32位;内核结构为哈佛结构,拥有独立的数据总线和指令总线,可以并行进行指令执行和数据访问; 1 寄存器组 cortex-m3拥有R0-R15寄存器,其中R0-R12为通用寄存器 通用寄存器:通用寄存器用于数据操作,绝大多数16位thumb指令只能访问R0-R7,32位Thumb指令可以访问所有的。 Banked R13:MSP和PSP,两个堆栈寄存器,同一时刻只能使用其中一个,堆栈指针的低两位永远是0,堆栈总是4字节对齐的 主堆栈指针(MSP):复位后缺省使用的堆栈寄存器,用于操作系统内核和异常处理例程(包含中断服... Read More
-
四、FreeRTOS——内存
首先要复习STM32单片机中的内存五区。 1 内存五区 在嵌入式系统中,五种内存区域分别是:堆(Heap)、栈(Stack)、全局区/静态区、常量区和代码区。 RO (Read-Only):这部分内存用于存储只读数据,即程序代码(比如应用程序的指令)和常量数据(比如常量数组、字符串等)。这些数据在程序运行时不能被修改。 RW (Read-Write):这部分内存用于存储可读可写的数据。在程序运行过程中,数据可能会被修改。 ZI (Zero Initialized):这部分内存用于存储未初始化的数据,在程序启动时,这些数据会被自动初始化为零。 1.1 栈(Stack) 1.2 堆(Heap) #inc... Read More
-
三、FreeRTOS——队列
Read More
-
二、FreeRTOS——任务管理
1 任务状态 正在运行的任务,被称为”正在使用处理器”,它处于运行状态。在单处理系统中,任何时间里只能有一个任务处于运行状态。 非运行状态的任务,它处于这3中状态之一:阻塞(Blocked)、暂停(Suspended)、就绪(Ready)。 就绪态(Ready)的任务,可以被调度器挑选出来切换为运行状态,调度器永远都是挑选最高优先级的就绪态任务并让它进入运行状态。 阻塞状态的任务,它在等待”事件”,当事件发生时任务就会进入就绪状态。事件分为两类:时间相关的事件、同步事件。所谓时间相关的事件,就是设置超时时间:在指定时间内阻塞,时间到了就进入就绪状态。使用时间相... Read More
-
一、FreeRTOS——系统移植
1 基本概念 1.1 操作系统的定义 一个通用操作系统提供的主要功能有(可见下图蓝色的部分): 任务(应用程序)的调度管理(重要) 堆栈和内存管理(重要) 文件管理 队列管理 中断和定时器管理 资源管理 输入输出管理 1.2 实时性的含义 实时操作系统(RTOS-Real Time Operating System)中实时(Real Time)指的是任务(Task)或者说实现一个功能的线程(Thread)必须在给定的时间(Deadline)内完成。 说明:Linux等操作系统一般把多任务都是称为多个线程,FreeRTOS中将线程... Read More
-
一、计算机网络协议——MQTT
1 MQTT协议 MQTT(Message Queuing Telemetry Transport,消息队列遥测传输协议),是一种基于发布/订阅(publish/subscribe)模式的“轻量级”通讯协议,该协议构建于TCP/IP协议上,由IBM在1999年发布。MQTT最大优点在于,可以以极少的代码和有限的带宽,为远程连接设备提过实时可靠的消息服务,作为一种低开销、低带宽占用的即时通讯协议,使其在物联网、小型设备、移动应用等方面有较广泛的应用 MQTT是一个基于客户端-服务器的消息发布/订阅传输协议。MQTT协议是轻量、简单、开放和易于实现的,这些特点使它适用范围非常广泛。 1.1 MQTT特点 基于Publish/Subscribe(发布/订阅)模式的物... Read More
-
四、FFmpeg——AVFormatContext
在使用FFmpeg进行开发的时候,AVFormatContext是一个贯穿始终的数据结构,很多函数都要用它到作为参数。 封装格式信息: 该结构体包含了多媒体文件或流的封装格式信息, 如FLV、MP4等格式信息 管理音视频流: 该结构体管理多媒体文件中包含的多个流,如:视频流、音频流、字幕流,每个流都由AVStream结构体表示 使用 AVFormatContext 结构体 前需要导入头文件 : #include <libavformat/avformat.h> Read More
-
三、FFmpeg——入门
1 介绍 FFmpeg(Fast Forward MPEG)是一个开放源代码的自由软件,可以运行音频和视频多种格式的录影、转换、流功能。 1.1 FFmpeg目录文件 以下是FFmpeg源代码目录 以下是FFmpeg整体架构 comppat:该目录存放的是兼容文件,以便兼容早期版本 doc:说明文档 libavcodec:编解码库,封装了Codec库,AVCodec中实现了目前多媒体领域绝大多数常用的编解码格式,即支持编码,也支持解码。AVCodec除了支持MPEG4、AAC、MJPEG等自带的媒体编解码格式之外,还支持第三方的编解码器,如H.264(AVC)编码,需要使用x264编码器;H.265(HEVC)编... Read More
-
二、FFmpeg——音频基础
1 声音基本认识 声音是通过空气或其他介质传播的压力波,自然界中的声音通常是模拟的,音频信号以连续变化的方式表示声音,由振动形成声波。声音的特征即响度、音调、音色。 声波的三要素:频率、振幅和波形。频率代表音调的高低,振幅代表声音音量的大小,波形代表音色。 1.1 响度 响度反映声音强弱,物理表示为振幅(Amplitude) 声能 W 即声音在介质中传播时使媒介附加的能量,质点振动动能和质点偏离平衡位置所具有的势能的总和,单位是焦耳(J)。 声强 I 即单位时间内通过垂直于声波传播方向的单位面积的平均声能。声强的单位是瓦/平方米(W/m²)。声强级 SIL(Sound Intensity Level)是以 10-12 W/m² 为参考值,任一声强与其比值的对数乘以 10 记... Read More
-
一、FFmpeg——音视频基础
1 颜色空间 计算机中存储的任意类型图像都需要遵循一定的数据描述方式,这种描述方式被称为颜色空间。颜色空间类型非常多,我以下图为例详细讲解图像的颜色空间。 1.1 RGB颜色空间 对设计稍有了解的都会熟悉这种颜色空间,这种颜色空间是计算机屏幕显示的最直观的颜色空间。这种颜色空间的来源是因为,最初的物理科学家发现,通过红、绿、蓝光的不同强弱的组合几乎能表现出任意类型的光的颜色,所以后来计算机屏幕上每个像素点都会有这三种颜色的小灯,通过控制灯的强弱来制造出所有颜色。其中红色代表Red,绿色代表Green,蓝色代表Blue。 但这种方式有一个问题在于,一个像素点亮度从没有光到最亮,需要定义多少个颜色值呢?经过科学家反复测算,最终发现,定义256个值,可以表达16777216种颜色... Read More
-
一、Vs Code——文件编码
由于开启了编码猜测功能,可能会把UTF-8文件(文件中有中文),猜测成ISO其他格式,造成编码错误。 UTF-8格式下,中文字符编码串口通信,串口助手会乱码,串口助手查看的应该是 GB 2312,如果某个文件有需要,可以单独重新编码成 GB 2312格式。 1 设置 1.1 编码设置 1.1.1 打开设置 1.1.2 关闭编码猜测功能 1.1.3 设置默认编码格式 注意:这里有全局User设置,工作项目设置 Read More
-
二十五、STM32——单片机型号介绍
1 STM32介绍 STM32是意法半导体推出的低成本、高性能、低功耗的单片机,主流产品(STM32F0、STM32F1、STM32F3)、超低功耗产品(STM32L0、STM32L1、STM32L4、STM32L4+)、高性能产品(STM32F2、STM32F4、STM32F7、STM32H7)。 STM32代表此款单片机为32位单片机 F表示产品类型为基础增强型 051代表此款单片机的系列为入门级单片机 R表示单片机引脚数目为64引脚 8表示单片机的闪存容量也就是FLASH容量为64Kbytes T代表封装为QFN封装 6表示温度范围 ... Read More
-
二十四、STM32——驱动步进电机
需要设置PWM2,级性为高。如果是PWM1,在更新中断停止PWM的时候,下一周期PWM已经开始运行,已经把高电平发出去了。所以通过中断函数判断发了多少脉冲,如果使用PWM1,会多发一个脉冲(不是一个完成的脉冲,但也会有高电平上升沿)。 1 基础 常见的加减速算法分析类型 七段式S型曲线 梯形曲线 Sigmoid函数型 2 梯形调速算法 为啥需要设计一个调速算法呢?步进电机不是给多少脉冲就动多少步吗?但是带上负载了就可能失步,所谓失步,简单理解就是实际电机轴转过的度数,没有输入脉冲对应度数多。为什么会这样呢?电机的扭矩有可能无法驱动负载。一般会做一个启动加速控制过程,停止的时候做一个减速控制,中间做一个匀速控制... Read More
-
二十三、STM32——F7/H7内存保护单元MPU
1 什么是MPU?我们为什么要使用MPU MPU的全称是内存保护单元,主要作用是: 代码访问保护 内存保护 外设保护 在stm32的F7系列和H7系列mpu中配置了Cache,这使得在这些高系列中要提高性能,会使用mpu变得十分的有必要。 2 简化的MPU框图及简介 从上面的图我们知道cpu与内存的通讯路线有三种: strongely ordered memory(直接与内存通讯):程序完全按照代码顺序执行,CPU会等待当前加载存储执行完毕后才执行下一条指令,导致性能下降。 device memory(经过buffer再通讯):外设加载和存储要严格按照次序进行,确保寄存器... Read More
-
二十二、STM32——H7系列内存和总线
1 STM32H723内存映射 这部分内容可以在下面文档中找到: 以下是STM32H723/733系列内存映射图,MPU内存保护单元默认的类型和属性就是表中的Type和Atrributes。 除了TCM RAM之外,其他内存都需要开启Cache才能达到最大性能。(TCM是直连CPU内核)。 有些内存默认参数就是开启Cache达到了最大性能。比如:内部FLASH(0x800 0000)也不需自行配置MPU,因为默认参数Cache已经是最大性能。 1.1 SRAM STM32H7的SRAM不是连续的,分成了以下几类: TCM RAM:Tightly Coupled Memory(TCM,紧耦合内存),T... Read More
-
二十、STM32——FSMC
1 FSMC的概念及结构框图 F7/H7具有MPU单元的单片机,操作外设地址总线。 1.1 FSMC概念 FSMC,Flexible Static Memory Controller,灵活的静态存储控制器。 用于驱动SRAM,NOR FLASH,NAND FLASH及PC卡类型的存储器。配置好FSMC,定义一个指向这些地址的指针,通过对指针操作就可以直接修改存储单元的内容,FSMC自动完成读写命令和数据访问操作,不需要程序去实现时序。也就是无需手动去拉高、拉低信号实现选择写、读和选择读写命令、数据等东西。 F1/ F4(407)系列大容量型号,且引脚数目在100脚以上的芯片都有FSMC接口。F4/F7/H7系列就是FMC接口,区别是FMC可以直接驱动SDRAM,FSMC不行。... Read More
-
十九、STM32——IO
Read More
-
十五、STM32——移植lwip
我这里移植的lwip,都是通过STM32CubeMX直接生成,同时含有FreeRTOS系统。以下是对CubeMX生成的文件直接描述。 1 架构描述 关于源代码文件分为两部分: 中间层文件,跟STM32和PHY芯片有关。STM32芯片不同,PHY芯片不同,这部分文件都会变化。 lwip源文件,不进行修改部分,这部分是直接复制lwip。 中间层文件: lwip.c: MX_LWIP_Init 初始化函数,tcp_init, netif_add,网卡连接状态线程创建。 lan8742.c:PHY芯片寄存器读写函数,设置自动协商,获取网口连接状态,开启关闭PHY中断。 ethern... Read More
-
十四、STM32——以太网外设
1 以太网外设(ETH) 1.1 以太网外设(ETH)简介 STM32F4系列MCU内部集成了一个以太网外设(ETH),可以通过介质独立接口(MII)或简化介质独立接口(RMII)和外部PHY(如LAN8720)相连实现MCU的联网功能。 STM32F4系列的以太网外设(ETH)框图如下: 1.2 关于接口 MII或RMII:以太网 PHY(物理层)与 MAC(介质访问控制层)之间的通信接口。选择一种接口即可。 SMI(站管理接口):一共两根线,一根时钟线MDC、一根数据线MDIO。用于读或写PHY芯片寄存器。同时可以连接32个PHY,所以每个PHY都有独立地址 1.2.1 MII(介质独立接口) 介质独立接口 (MII) ... Read More
-
十三、STM32——CANopen
Read More
-
十二、STM32——CANopen对象字典深度理解
1 对象字典工具objdictedit.py使用 安装:直接看参考1:基于Canfestival的对象字典工具objdictedit.py的运行环境配置 使用:直接看参考2:CANOpen系列教程12_对象字典编辑器操作说明 安装最后直接使用简单配置就可以 2 字典对象索引 打开 Objectedit 不难发现,根据常用的字典对象项目,重新划分了一下索引区间。 2.1 通讯对象子协议区 定义了所有和通信有关的对象参数,这里面的有些项可以认为是通用标准,预定义这些项的作用。 比如:0x1018 厂商标识ID,C语言文件对应着相应的变量 最后这些数组地址,都是跟相应的索引对应地址,组合到新的变量里面。 2.2... Read More
-
十一、STM32——CANopen概述、对象字典、NMT控制
1 CANOpen概述 CANopen属于应用层协议:从OSI的7层网络模型的角度来看,CAN现成总线仅仅定义了第1层(物理层)、第二层(数据链路层)。实际开发中,这两层完全是由硬件实现,设计人员无需再为此开发相关软件和固件。 CANopen 是一个基于 CAN 串行总线的网络传输系统的应用层协议,遵循 ISO/OSI 标准模型。 CANopen面对对象设计: 网络管理对象(NMT)、服务数据对象 (SDO)、过程数据对象(PDO)、 同步对象 (SYNC)、紧急报文 (EMCY) CANopen定位为小网络、控制信号的实时通讯: 所以报文采用的CAN标准帧格式,即11bit的ID,以尽量减小传输时间。 ... Read More
-
十、STM32——F1系列内存地址和启动分析
STM32无法下载程序,无法找到内核的时候,可以尝试BOOT0置高,因为置高后应该可以暂停程序的运行 1 STM32寄存器映射 由于STM32是32位地址总线,因为CPU地址总线可以寻址0x00000000到0xFFFFFFFF区间,也就是将程序存储器、数据存储器、寄存器和输入输出端口被组织在同一个2^32=4G的线性地址空间内,数据字节以小端格式存放在存储器中。 我们以STM32F103VET6为例 0x0000 0000 - 0x0007 FFFF:此为闪存或系统内存,具体取决于BOOT的引脚设置。STM32F1空留出的原因是,Cortex-M3内核在启动时始终从代码区0x0000 0000开始。通过设置BOOT引脚,可以把FLASH内存地址、系统内... Read More
-
九、STM32——CAN
1 概述 CAN只需要两根通信线(CAN_H、CAN_L),线路少,无需共地。 差分信号通信(利用两个信号的电压差值传递信息),抗干扰能力强。无需时钟线,通信速率由设备各自约定。 11位/29位报文ID,用于区分消息的功能,同时决定消息发送的优先级(ID号小的优先发送)。11位是标准帧、29位是扩展帧。 一个数据帧可配置 1 ~ 8字节的有效载荷(每次只能传输1~8字节数据)。 CAN总线的两种标准: 高速CAN(ISO11898):125K~1Mbps,<40m 低速CAN(ISO11519):1... Read More
-
八、STM32——TIM
1 STM32基本定时器、通用定时器、高级定时器区别 STM32系列微控制器中的定时器资源分为基本定时器(Basic Timer)、通用定时器(General Purpose Timer)和高级定时器(Advanced Timer)三类,它们在功能和复杂性上有所不同。 基本定时器:TIM6 和 TIM7 是一个16位的只能向上计数的定时器,只能定时,没有外部 IO。 通用定时器:TIM2/3/4/5 是一个16位的可以向上/下计数的定时器,可以定时,可以输出比较,可以输入捕获,每个定时器有四个外部IO。 高级定时器:TIM1/TIM8 是一个16位的可以向上/下计数的定时器,可以定时,可以输出比较,可以输入捕获,还可以有三相电... Read More
-
七、STM32——串口
1 基本概念 复习基本概念:同步、异步、全双工、半双工和单工。 1.1 同步 (Synchronous) 和 异步 (Asynchronous) 同步和异步是通信时钟同步的两种不同方式: 同步通信:数据传输是通过共享时钟信号来协调的,发送方和接收方必须以相同的速率和时序工作。在同步模式下,数据位在固定的时钟周期内传输,发送和接收设备使用同一个时钟信号来同步数据交换。 STM32中的同步通信:如USART、SPI等接口都支持同步模式。例如,在SPI模式下,主设备和从设备之间共享一个时钟信号(SCK),确保数据传输的同步进行。 异步通信:数据传输不依赖于共享的时钟信号。数据的发送和接收是根据预先设定的波特率和时序... Read More
-
六、STM32——DMA
https://blog.csdn.net/zhej2014/article/details/124539061 https://blog.csdn.net/best_xo/article/details/140328396 https://blog.csdn.net/Firefly_cjd/article/details/116673101 https://mp.weixin.qq.com/s?__biz=MzIxNTg1NzQwMQ==&mid=2247485119&idx=1&sn=3358f5a935f12603333c04f7fad561c0&chksm=9790a729a0e72e3fcb8ac0a96b180040fd4d2be18e... Read More
-
五、STM32——时钟
1 什么是时钟 时钟是单片机运行的基础,时钟信号推动单片机内各个部分执行相应的指令。时钟系统就是CPU的脉搏,决定cpu速率,像人的心跳一样 只有有了心跳,人才能做其他的事情,而单片机有了时钟,才能够运行执行指令,才能够做其他的处理 (点灯,串口,ADC),时钟的重要性不言而喻。 为什么STM32要有多个时钟源呢? STM32本身十分复杂,外设非常多 但我们实际使用的时候只会用到有限的几个外设,使用任何外设都需要时钟才能启动,但并不是所有的外设都需要系统时钟那么高的频率,为了兼容不同速度的设备,有些高速,有些低速,如果都用高速时钟,势必造成浪费 并且,同一个电路,时钟越快功耗越快,同时抗电磁干扰能力也就越弱,所以较为复杂的MCU都是采用多时钟源的方法来解决这些问题。所以... Read More
-
四、STM32——VsCode EIDE
EIDE 插件是一款适用于 8051/STM8/Cortex-M/RISC-V 的单片机开发环境。在 Vs Code 上提供 8051、STM8、Cortex-M、RISC-V项目的开发、编译、烧录等功能。 1 插件安装 安装成功之后,可以在左侧看到一个芯片样式的图标,然后可以进行相应的操作,可以进行新建工程,导入工程等操作,具体如下图所示; 2 MDK-ARM项目导入 2.1 创建MDK-ARM项目 比如:我基于 STM32L431RCT6 芯片在 CubeMX 创建了一个初始串口项目,导出 MDK-ARM 项目。 具体如下: 2.2 EIDE导入MDK-ARM项目 2.3 设置EIDE项目 设置相应的 pack 文件; ... Read More
-
三、STM32——CubeMX
1 STM32CubeMX安装 STM32CubeMX下载连接:https://www.st.com.cn/zh/development-tools/stm32cubemx.html 或者: 2 STM32CUbeMX创建项目 2.1 启动页 2.1.1 安装嵌入式软件包 点击 INSTALL/REMOVE 嵌入式软件包,选择相应的型号安装: 2.2 新建项目页面 点击 ACCESS TO MCU SELECTOR,搜索相应的芯片型号,列表视图,直接双击相应的芯片型号就可以创建项目。 2.3 芯片配置页面 2.5 项目管理页面 2.5.1 项目 2.5.2 代码生成配置 后续具体每一个模块的使用,参考具体的章节。 参考 参考1:... Read More
-
二、STM32——项目文件结构分析
1 HAL库和标准库区别 HAL库(Hardware Abstraction Layer,硬件抽象层) 和 标准库(Standard Peripheral Library,标准外设库,又称为SPL) 都是STM32微控制器的固件库。它们的主要区别在于结构和抽象的级别。 HAL 库: HAL 库是 STMicroelectronics(ST)提供的较新的库。它提供了一套统一的 API,用于访问 STM32 系列微控制器的外设。HAL 库的目的是简化固件开发,让开发者更加关注应用层逻辑,而无需深入了解底层硬件。 HAL 库的特点: 跨平台支持:支持 STM32 全系列微控制器。 ... Read More
-
一、STM32——Keil
1 Keil安装 所有安装所需的软件都在百度网盘/ST相关环境中 1.1 安装MDK(Keil) MDK-Arm最新版本下载地址:https://www.keil.com/download/product/ 1.2 注册机破解 右击keil,管理员权限运行 选择 License Management 复制 CID ID号 将复制的代码填入,并且选择ARM 点击Generate,将生成的代码复制。 粘贴到如图所示,点击Add LIC。出现如图所示表示破解完成。到这KEIL5的安装算是完成了。 1.3 安装ARMCC编译器 从MDK5.37开始,AC5(ARMCC)编译器不再默认安装,需要独立安装。路径、字符等安装问题,都可能引起AC... Read More
-
01 界面总结
https://soso.nipic.com/q_%E5%A4%A7%E5%B1%8F%E5%8F%AF%E8%A7%86%E5%8C%96%E6%8A%98%E7%BA%BF%E5%9B%BE%E5%9B%BE%E8%A1%A8%E5%9B%BE%E7%89%87_g_0.html https://www.nipic.com/show/37032399.html https://www.nipic.com/show/37032398.html https://www.nipic.com/show/23143686.html https://www.17sucai.com/pins/48798.html https://dribbble.com/shots/25049078-... Read More
-
二、Qt Design Studio——咖啡机
Read More
-
一、Qt Design Studio——登录界面设计
Qt Design Studio 定义用户界面的外观和风格,从线框图到最终实现,使用预设的UI组件。将2D和3D设计工具中的UI设计文件导入到Qt Design Studio,它可以将这些文件转换为开发人员使用的代码。Qt Design Studio的原型设计功能使您的设计栩栩如生,并模拟和验证交互和动态行为。您可以在桌面或目标设备上实时测试、预览并精确调整您的设计,达到像素级的完美。 1 Log In UI - Components 按照绿色标准的序号,进行依次修改信息创建一个空项目。 创建成功之后,我们打开 Loginnui1 目录,看一下里面有哪些文件,作用分别是什么。 Constants.qml:QML文件,通常定义了常量值,如颜色、字体大小... Read More
-
十九、C++复习——const用法总结
1 const修饰变量 语法: const 数据类型 常量名 = 常量值 /* 例如: const int month = 12; */ const 类型的变量必须在定义时进行初始化,之后不能对const型的变量赋值。 2 const修饰指针 2.1 常量指针 const修饰指针(常量指针):const修饰的是指针,指针指向可以改,指针指向的值不可以更改 const int * p1 = &a; p1 = &b; //正确 //*p1 = 100; 报错 2.2 指针常量 const修饰常量(指针常量):const修饰的是常量,指针指向不可以改,指针指向的值可以更改 int * const p2 = &a; //p2... Read More
-
十八、C++复习——lambda表达式
1 什么是lambda表达式 C++ Lambda表达式是一种匿名函数,它可以像变量一样被定义、传递和赋值,大大简化了C++的编程过程。 Lambda表达式的语法形式如下: [capture-list] (parameters) -> returntype {statement} [capture-list]:捕获列表,该列表总是出现在lambda函数的开始位置,编译器根据 [] 来判断接下来的代码是否为lambda函数,捕捉列表能够捕捉上下文中的变量供lambda函数使用。 (parameters):参数列表。与普通函数的参数列表一致,如果不需要参数传递,则可以连同()一起省略。 ->returntype:... Read More
-
十七、C++复习——overrid关键字
override 关键字在C++中用于显式地指定一个成员函数为重写(覆盖)了基类中的虚函数。它可以提高代码的可读性,并可以帮助编译器检查是否正确地重写了虚函数。 如果使用了 override ,但是该函数不是基类虚函数,就会报错。 Read More
-
20240912——算力
1 基本概念 1.1 精度 半精度浮点数 (Half-precision):16位, 单精度浮点数 (Single-precision):32位,提供约7位有效数字。 双精度浮点数 (Double-precision):64位,提供约15-16位有效数字。 1.2 算力单位 TOPS:指的是每秒钟可以执行的整数运算次数,它代表着计算机在处理图像、音频等任务时的处理能力。TOPS的单位是万亿次每秒(trillion operations per second)。一般是指整数运算能力INT8。亿是10^8,万亿次就是10^12。貌似有些时候T是tera。 TFLOPS:指的是每秒钟可以执行的浮点运算次数,它代表着计算机在处理科学计算、机器学习等任务时的处理能力。TFLOPS的... Read More
-
四、Qt6笔记——QPainter
QPainter可以对继承QPaintDevice类的任何对象进行操作。 QPainter 与 QPaintDevice 和 QPaintEngine 类一起构成了Qt绘制系统的基础。 QPainter 是用于执行绘图操作的类。 QPaintDevice 表示可以使用 QPainter 在其上绘制的设备。 QPaintEngine 提供了一个接口,QPainter 可以使用这个接口来绘制不同类型的设备。 Read More
-
三、Qt6笔记——QTimer
1 基本概念 继承自 QObject ,可使用元对象系统。 QTimer 类提供了一个高级的定时器编程接口。要使用它,可以创建一个 QTimer 对象,将其 timeout() 信号连接到相应的槽函数,并调用 start()。从那时起,它将在固定的时间间隔内发出 timeout() 信号。 /** * 例如,设置一个一秒(1000 毫秒)的定时器(来自模拟时钟示例): * 之后,update() 槽函数每秒都会被调用。 */ QTimer *timer = new QTimer(this); connect(timer, &QTimer::timeout, this, QOverload<>::of(&... Read More
-
二、Qt6笔记——信号与槽
1 信号与槽函数连接connect 这部分内容参考: Qt6 C++开发指南 (3.3.4 信号与槽章节) 查看代码源文件,可以发现有三种信号与槽连接函数声明。 1.1 Qt4版本通过名称连接 第一种就是Qt4版本中使用的,通过信号和槽函数名称连接,这种方式不会对信号和槽函数类型进行检查是否匹配。 /* 不带参数 */ connect(sender, SIGNAL(signal()), receiver, SLOT(slot())); /* 带参数 */ connect(spinNum, SIGNAL(valueChanged(int)), this, SLOT(updateStatus(int))); 1.2 Qt5版本通过函数指针 对于具有默认参数的信号,即信... Read More
-
一、Qt6笔记——QWidget
元对象的属性系统,介绍QWidget属性。 1 QWidget详细介绍 Widget是交互界面(用户界面)的基本组成部分:Widget可以从窗口系统中接受鼠标、键盘或者其他事件,并在屏幕上绘制相应Widget界面。每个Widget都是矩形,每个Widget都是以Z轴顺序排列。Widget会被其父控件Widget和位于其前方的控件Widget剪裁(意识就是被遮挡区域就会无法显示)。 如果一个Widget没有被嵌入在父Widget里面,这个Widget就会被称作是window。 窗口window还有边框frame和标题bar,但是也可以用一些window flags创建没有装饰的窗口window。在 Qt 中,QMainWindow 和各种 QDialog 的子类是最常... Read More
-
十六、C++复习——知识点总结
这是我在学习Qt过程中,对于一些未掌握的C++语法进行总结。 1 父类构造执行 这是类继承的结构图: 类继承后,比如创建 Student1类,就会先执行父类的构造函数。 我们可以通过初始化列表,指定执行那个父类的构造函数(由于构造函数重载,父类可能有好几个构造函数) 可以参考 01_测试父类构造函数执行.cpp 2 命名空间中前向声明类 前向声明:是指在使用某个类、结构体或函数之前,仅仅声明该类、结构体或函数的存在而不定义其实现细节。前向声明可以避免循环依赖和头文件包含问题,提高编译效率和可维护性。 2.1 为什么要使用前向声明 A需要B的成员的时候,B需要A对象的指针或者引用的时候。就可以先把A进行前向声明。 前向声明仅仅是可用该对象的指针或者引用 2.... Read More
-
一、H265编码原理
1 NALU头 这里跟H264不同的是,NALU Header占用2个字节。 F(forbidden_zero_bit): 必须为0,表示有效;为1的话表示无效(传输工程中发送错误)。 Type(nalu_unit_type): 占6bit,NAL Type确定NAL的类型,其中VCL NAL和non-VCL NAL各有32类。 0 - 31是VCL NAL单元; 32 - 63是非VCL NAL单元,VCL是指携带编码数据的数据流,而non-VCL则是控制数据流。 LayerID(nuh_layer_id): 表示NAL所在... Read More
-
三、DeepStream问题分析
**PERF: FPS 0 (Avg) FPS 1 (Avg) FPS 2 (Avg) FPS 3 (Avg) **PERF: 20.66 (19.75) 20.45 (19.25) 19.83 (18.33) 19.75 (19.11) **PERF: 14.90 (15.86) 14.92 (13.95) 14.93 (15.60) 13.34 (13.61) ** WARN: <queue_src_pad_probe:275>: Invalid PTS found in stream. Stream recorded by Smart Record might have issues ERROR from muxer: ... Read More
-
十、MP4封装
示例都是以NVIDIA Deepstream中的sample_720p.mp4为例。 1 概念与术语 Box:MP4文件是由一个个Box组成的,可以将其理解为一个数据块,它由Header+Data组成,Data 可以存储媒体元数据和实际的音视频码流数据。Box可直接存储数据块,也可包含其它Box,我们把包含其它Box的Box称为container box。 Sample:可理解为采样,对于视频可理解为一帧数据,音频一帧数据就是一段固定时间的音频数据,可以由多个Sample数据组成,存储媒体数据的单位是sample。 Chunk:连续几个sample组成的单元被称为chunk,每个chunk在文件中有一个偏移量,整个偏移量从文件... Read More
-
五、H264编码原理——slice
1 Slice基本概念 一个视频图像可编码成一个或更多个条带(slice),每个条带(slice)包含整数个宏块(MB),即每个条带至少一个 MB,最多时每个条带包含整个图像的宏块。总之,一幅图像中每个条带的宏块数不一定固定。 设条带的目的是为了限制误码的扩散和传输,每个编码条带相互间是独立的。某个条带的预测不能以其它条带中的宏块为参考图像,这样某一条带中的预测误差才不会传播到其它条带中去。 一帧有多少个条带,是根据PPS中的num_slice_groups_minus1决定的。一般来说,都是一帧是一个Slice。 2 Slice类型 根据码流中不同的数据类型,H264 中定义了 5 中 slice 类型: I Slice:是指每个块或宏块是通过其所在... Read More
-
四、H264编码原理——AUD
1 AUD基本概念 AUD英文名称为:Access Unit Delimiter 访问单元分隔符。 AUD也是一个NAL,类型值是9. AUD之间是一个完整的帧(具体是哪一种,请看primary_pic_type) 2 AUD格式 (/assets/Video/04_H264编码原理AUD/image/image.png primary_pic_type表示的含义如下: 3 示例分析 以 /assets/Video/01_H264编码原理/video/output.mp4 为例,分析AUD类型的NALU单元。 MP4格式中找到AUD类型的NALU 分析AUD ... Read More
-
三、H264编码原理——PPS
1 PPS基本概念 PPS(Picture Paramater Set)又称作图像参数集。作用于编码视频序列中一个或多个独立的图像。 SPS NALU的 nal_unit_type 为 8. 可以获取到视频流的帧率、长宽。 通过 pic_order_cnt_type 可以知道帧显示POC如何计算。 1.1 PPS每个字段含义 pic_parameter_set_id: 图片参数集ID,用于标识不同的PPS(视频流中可能会有很多组PPS) seq_parameter_set_id: 序列参数集ID,指定与该PPS相关联的SPS的ID entropy_coding... Read More
-
二、H264编码原理——SPS
1 SPS基本概念 SPS(Sequence Paramater Set)又称作序列参数集。对应的是针对一段连续编码视频序列的参数。包含 帧数、POC的约束、参考帧数目、解码图像尺寸和帧场编码模式选择标识等信息。 SPS NALU的 nal_unit_type 为 7. 可以获取到视频流的帧率、长宽。 通过 pic_order_cnt_type 可以知道帧显示POC如何计算。 1.1 SPS每个字段含义 1.1.1 profile_idc 标识当前H.264码流的profile。我们知道,H.264中定义了三种常用的档次profile: 基准档次:baseline profile; 主要档次:main pro... Read More
-
一、H264编码原理——概述
H.264码流中没有音频、没有时间戳、除了图像本身信息啥都没有。(没有时间戳,不能正常播放) mp4 mkv 这些容器加时间戳。 1 基本概念 NALU:Network Abstraction Layer Unit 网络抽象层单元。NALU将编码后的视频数据分割成多个单元,每个单元可以单独处理和传输。 VCL(VideoCoding Layer,视频编码层):负责高效的视频内容表示。(指的不是编码数据的一帧,是描述视频数据的一层) NAL(NetWorkAbstraction Layer,网络提取层):负责以网络所要求的恰当方式对数据进行打包和发送。 SODB(String of Data Bits,数据... Read More
-
二十八、GstSegment
流开始时,会发出segment事件。 GstSegmen存储着流开始、结束、持续时间,目前的流位置,播放速率等。 参考 参考1:官网Segments 参考2:官网Streams 参考3:官网GstSegmen Read More
-
二十七、时钟相关总结
在一个 GstPipeline 中,实现sync同步播放是通过以下三个对象实现的: GstClock 它对整个管道的所有GstElement->clock都是同一个。 GstBuffer 的PTS和DTS. 视频流开始前的 segment 事件。 基本概念 绝对时间absolute time(对应图中clock time): 通过 gst_clock_get_time 获取的当前时间,有时也称now 运行时间running time: 表示在 PLAYING 状态下花费的总时间。 如果管道处于 NULL/READY 状态,running time 是未定义的。 如果是 P... Read More
-
四、GStreamer智能录像
1 GstInterpipe interpipesink 和 interpipesrc 内部其实就是通过传输 GstBuffer,所以会造成事件无法相互传输。 2 https://discourse.gstreamer.org/t/dynamically-adding-new-queue-to-a-tee-element/470 https://blog.csdn.net/qq_41563600/article/details/121343927 https://discourse.gstreamer.org/t/dynamically-record-video/1372 https://community.nxp.com/t5/i-MX-Processors/Dynami... Read More
-
26 Gtkbasesink
Read More
-
三、GStreamer视频时间查询
1 查询duration 示例代码:/assets/GStreamerStudy/04_time_duration/查询时间.c 我们使用的播放文件 /assets/GStreamerStudy/04_time_duration/sample_720p.h264 该文件的大小为 14759548 bytes 对于h264流文件,并没有准确的 duration 时间(我们管道不能获取到准确的时间,得到的只是估计时间)。如果使用了qtdemux这些元素,通过这些元素可以获取准确duration. 对整个管道进行duration查询的时候,会把查询事件发送给最后的sink元素,然后通过pad依次调用。 整个管道可以没有固定duratio... Read More
-
5 人脸检测
1 人脸检测 转化成TensorRT模型: https://github.com/wang-xinyu/tensorrtx/tree/master/retinaface Deepstream配置文件参考:https://github.com/zhouyuchong/retinaface-deepstream-python Deepstream自定义解析中,一定要导入TensorRT插件的头文件。 人脸识别: https://github.com/hiennguyen9874/deepstream-face-recognition Read More
-
三、GStreamer录像
gst-launch-1.0 v4l2src -e device=”/dev/video0” ! videoconvert ! nvvideoconvert ! tee name=t t. ! nvh264enc ! h264parse ! qtmux ! filesink location=video.mp4 t. ! nveglglessink gst-launch-1.0 -e v4l2src ! videoconvert ! nvvideoconvert ! queue ! timeoverlay ! nvh264enc ! h264parse ! splitmuxsink location=video%02d.mkv max-size-time=10000000000... Read More
-
一、插件编写
1 Pad (de)activation 1.1 激活 改变状态时,一个 bin 会按照从sink到source的顺序为其所有子元素设置状态。当元素经历 READY→PAUSED 过渡时,它们的Pad会被激活以准备数据流。一些Pad会启动任务以驱动数据流。 一个元素会从sourcepads到sinkpads依次激活其Pad。这是为了确保当sinkpads被激活并准备接收数据时,sourcepads已经激活以向下游传递数据。 Pads可以在 PUSH 和 PULL 两种模式下激活。PUSH 模式是正常情况,其中链接中的source pad通过 gst_pad_push() 将数据发送到对端的sink pad。而 PULL 模式则是由source pad请求数据通过 gst_p... Read More
-
二十五、GstVideoOverlay
GstVideoOverlay 接口主要用于两个目的: 获取视频接收器元素将渲染视频的窗口。这可以通过以下两种方式实现:要么通知视频接收器元素生成的窗口标识符,要么强制视频接收器元素使用特定的窗口标识符进行渲染。 强制重新绘制视频接收器元素在窗口上显示的最新视频帧。实际上,如果 GstPipeline 处于 GST_STATE_PAUSED 状态,移动窗口会损坏其内容。应用程序开发人员将希望自己处理暴露事件并强制视频接收器元素刷新窗口的内容。 使用视频接收器创建的窗口可能是最简单的场景,但在某些情况下,如果应用程序开发人员需要捕获诸如鼠标移动和按钮点击之类的事件,这可能不够灵活。 在视频接收器元素上设置特定的窗口标识符是最灵活的解决方案... Read More
-
八、Linux直接内存访问DMA
https://download.csdn.net/blog/column/11175480/133602965 https://blog.csdn.net/weixin_44821644/article/details/139710556 https://www.cnblogs.com/pengdonglin137/p/17892633.html Read More
-
二、计算机网络硬件——路由器
1 路由器的MAC地址 路由器分为: WAN 广域网(Wide Area Network),通俗讲就是和外部网连接的网线口;路由器会提供一个WAN MAC地址。 LAN 局域网(Local Area Network)接口,通俗讲就是电脑、笔记本、打印机等局域网设置连接的网线口;路由器会提供一个LAN MAC地址。 WLAN无线局域网(Wireless LAN),数据通过电磁波传输; 我的路由器的 WAN MAC地址 和 LAN MAC地址 如下: WAN MAC 地址: 0C:11:7F:00:B1:95(192.168.1.4) LAN MAC 地址: 0C:11:7F:0... Read More
-
一、计算机网络硬件——交换机
1 基本概念 链路:从一个结点到相邻结点的一段物理线路(有线或无线),而中间没有其他任何的交换结点。(我们这节讲的交换机组成的局域网也叫做同一链路网络) MAC地址:Media Access Control,介质访问控制地址,也叫硬件地址。 交换机工作于数据链路层,根据MAC地址将帧发送到不同的网络端口。 2 交换机的工作原理 交换机在接收到数据时,会先检查数据中包含的MAC地址,再将数据从目的主机所在的端口转发出去。交换机之所以能实现这一功能,是因为交换机内存有一张MAC地址表,该表记录了网络中所有MAC地址与该交换机各端口的对应信息。 当有数据帧需要通过该交换机进行转发时,交换机根据内部存储的MAC... Read More
-
二、GStreamer播放音视频
Read More
-
三、GStreamer插件设计——事件处理
Read More
-
二、GStreamer高级概念——Caps协商
Caps协商是在元素之间寻找它们可以处理的媒体格式(GstCaps)的过程。在大多数情况下,GStreamer 中的这个过程可以找到完整管道的最佳解决方案。在本节中,我们将解释这个过程是如何工作的。 1 Cpas negotiation basics 在GStreamer中,媒体格式的协商始终遵循以下简单规则: 下游元素建议一种格式在其sinkpad上,并将这一建议放置在对下游sinkpad执行的CAPS查询的结果中。也可参见“Implementing a CAPS query function”。 上游元素决定一种格式,这个上游元素并通过CAPS事件将所选的媒体格式发送到其source pad下游元素。下游元素重新配置自身以处理CAPS事件中... Read More
-
十、GTK4核心对象——GtkExpression
1 GtkExpression GtkExpression 是一种基础类型,它不是 GObject 的子类,是直接在类型系统注册的一种类型,可以说类似 GObject。 GtkConstantExpression、GtkPropertyExpression等都是继承于 GtkExpression 定义的类型。 通过 gtk_expression_evaluate 函数可以到创建表达式时候设定的值,如果创建表达式的时候有另外表达式,获取到的就是另外表达式的值,否则就是@this实例里面的值。 Read More
-
五、GTK4核心对象——GtkWindow
1 进程中一般只存在一种的对象 1.1 GdkDisplayManager GdkDisplayManager 对象可以打开一个默认的 GdkDisplay对象和存储多个 GdkDisplay 对象。 通过 gdk_display_manager_get() 函数,可以创建或者获取到唯一的静态 GdkDisplayManager 对象。 通过 gdk_display_manager_open_display() 函数和设置 GDK_BACKEND 环境变量,可以打开一个显示后端,设置默认的 default_display ,并且创建,然后返回 GdkDisplay 对象。 创建静态 GdkDisplayManager 对象和... Read More
-
六、GTK4核心对象——GtkPaintable
Read More
-
六、GTK4核心对象——GtkSnapshot
Read More
-
四、GTK4核心对象——GskRenderNode
渲染节点类型有很多种,他们可以都添加到渲染节点容器中。 GtkSnapshot中可以添加渲染节点,然后转换成渲染节点。 1 注册GskRenderNode类型对象 2 基于GskRenderNode类型创建的渲染节点类型对象 Read More
-
四、GTK4核心对象——GskRenderer
1 GskRenderer 1.1 GskRenderer继承关系 1.2 GskRenderer成员 1.3 创建GskRenderer 1.4 GskRenderer创建GdkGLContext函数 通过surface里面的display获取到GdkGLContext类型,创建新的GdkGLContext 1.5 GskGpuRenderer渲染函数 Read More
-
四、GTK4核心对象——GdkFrameClock
1 GdkFrameClock GdkFrameClock告诉应用程序何时更新和重新绘制表面。比如: show函数的时候,调用 gdk_frame_clock_begin_updating 函数,从而注册空闲绘制或者空闲刷新函数。 接受到鼠标进入窗口事件,事件源就会注册GdkFrameClock空闲刷新函数。 2 创建GdkFrameClock对象 GdkSurface 中含有该对象成员 GdkFrameClock。 创建surface的时候,会调用GdkX11TopLevel或者GdkX11DragSurface对象实现... Read More
-
三、GTK4核心对象——GdkGLContext
1 GdkGLContext 创建 GdkGLContext 时候,一般都需要指定 GdkSurface GdkGLContext 中含有 egl_context(egl上下文是在渲染的时候创建) 2 GdkGLContext创建分析 GdkX11Display 创建了 GdkX11GLContextEGL,整个程序其他的 GdkGLContext 都是基于默认显示的上下文创建。 GtkWindow 创建了 GdkSurface,程序运行过程中并没有创建 GdkSurface->gl_paint_context(GdkGLContext)。 GskRenderer 创建了 GdkGLConte... Read More
-
二、GTK4核心对象——GdkSurface
1 GdkSurface GdkSurface创建窗口。比如GdkX11Surface中的 gdk_x11_surface_create_window 函数,调用 XCreateWindow 来创建窗口。 GdkSurface管理窗口属性,x11_surface_resize () 函数,调用 XResizeWindow() 来修改窗口的大小size GdkSurface显示窗口,gdk_x11_surface_show () 函数,调用 XMapWindow() 来显示窗口。 GdkSurface中含有 egl_surface 成员。 1.1 GdkSurface有那些成员 1.1.1 成员... Read More
-
一、GTK4核心对象——GdkDisplay
GdkDisplayManager 和 GdkDisplay 创建都是在 gtk_init() 函数调用的,而且一个程序一般只有一个 GdkDisplayManager 和 GdkDisplay 1 GdkDisplayManager GdkDisplayManager 对象可以打开一个默认的 GdkDisplay对象和存储多个 GdkDisplay 对象。 通过 gdk_display_manager_get() 函数,可以创建或者获取到唯一的静态 GdkDisplayManager 对象。 通过 gdk_display_manager_open_display() 函数和设置 GDK_BACKEND 环境变量,可以打开一... Read More
-
08 画图
Live Chart https://github.com/lundmar/gtkchart/tree/master https://github.com/lcallarec/live-chart?tab=readme-ov-file#chart-widget https://codeberg.org/grindhold/libgtkflow https://blog.gtk.org/2020/04/24/custom-widgets-in-gtk-4-drawing/ https://github.getafreenode.com/Akascape/CTkPieChart https://github.com/aluntzer/gtknodes https://g... Read More
-
二十四、GstSystemClock
GstClock是抽象对象,GstSystemClock是抽象对象GstClock的实现。 gst_system_clock_obtain 函数用来获取Gst系统内部定义的时钟,也就是 static GstClock *_the_system_clock = NULL。该变量是由Gst系统内部创建,不能释放,是一个静态对象。 gst_clock_get_time 函数表示获取当前系统开机运行了多长时间(因为内部创建的时候,使用的FLAG是GST_CLOCK_TYPE_MONOTONIC)。gst_clock_get_time 会根据校准变量,修改 gst_clock_get_internal_time 获取到的时间。 ... Read More
-
十二、Ubuntu之绘图软件kolourpaint
sudo apt-get install -y breeze-icon-theme kolourpaint Read More
-
20240628——git失败如何解决
git config --global http.version HTTP/1.1 Read More
-
一、GStreamer调试
1 源代码准备 按照以下包,避免编译 GStreamer 的时候再次下载,进而影响系统。 sudo apt install -y libcairo2-dev libpng-dev libffi-dev 1.1 gstreamer和glib 其实不用修改也行,如果debug时候出现没有找到源代码,可以将 debugoptimized 修改为 debug。 我在使用 ximagesink 插件的时候出现无法找到源代码问题,我修改 debugoptimized 为 debug 按照到 /opt/gstreamer-1.22.6 和 /opt/glib-2.80.2 文件夹。 1.2 glibc 切勿直接下载glibc源代码,使用debug编译,按照到/usr目录,会出现... Read More
-
一、GStreamer高级概念——时钟和同步
在播放复杂的媒体时,每个声音和视频样本都必须在特定的时间按特定的顺序播放。为此,GStreamer 提供了同步机制。 GStreamer 支持以下用例: 访问速度快于播放速度的非实时源。这是从文件读取媒体并以同步方式播放的情况。在这种情况下,需要同步多个流,如音频、视频和字幕。 从多个实时源捕获和同步混流/混合媒体。这是一个典型的用例,你可以从麦克风/摄像头录制音频和视频,并将其混流到一个文件中进行存储。 通过缓冲从(慢速)网络流进行流媒体播放。这是典型的网页流媒体情况,通过HTTP从流媒体服务器访问内容。 从实时源捕获并具有可配置延迟的播放。例如,在从摄像头捕获、应用效果并显示结果时使用。这也用于通过UD... Read More
-
十四、GLib——GArray
GArray添加元素的时候,不是指针赋值存储,而是对要存储的元素的实际内存进行拷贝。(所以GArray一般存储的是某个对象,而不是某个对象的指针) GArray并没有在GType类型系统注册。 1 相关函数总结 1.1 g_array_new /** * @zero_terminated: 如果数组在末尾应有一个额外的元素并设置为0,则为%TRUE * @clear_: 如果在分配时应将#GArray元素自动清除为0,则为%TRUE * @element_size: 每个元素的大小(以字节为单位) * * 创建一个新的具有引用计数1的#GArray。 */ GArray* g_array_new (gboolean ... Read More
-
二十四、Meson构建文件函数——find_program()
# `program_name` here is a string that can be an executable or script external_program find_program( str | file program_name, # The name of the program to search, or a file object to be used str | file fallback..., # These parameters are used as fallback names to search for # Keyword arguments: default_options : list[str] | di... Read More
-
十四、GTK4——GtkPicture
1 GtkPicture 内部主要使用的是 GdkPaintable。可以通过实现GdkPaintable,显示各种内容。 可以填充满整个控件区域。 2 函数总结 2.1 设置函数 /** * @brief: 图片是否能够收缩显示,如果设置FALSE则显示最小就是图片原始大小。 */ void gtk_picture_set_can_shrink (GtkPicture *self, gboolean can_shrink); /** * @brief: 设置内容(图片)应该如何变化尺寸去适应控件区域去显示 */ void gtk_picture_set_... Read More
-
十三、GTK4——GtkImage
1 GtkImage 主要用来显示图标icon,可以设定图标的显示像素大小 显示图片的长宽比例不能变 内部使用的是 GtkIconHelper 2 GtkImage函数总结 2.1 设定图片像素大小 /** * @brief: 设定图片像素大小 * @note: 设定的是 MIN {width, height} 设定为 @pixel_size */ void gtk_image_set_pixel_size (GtkImage *image, int pixel_size); Read More
-
十、GTK4——GtkGesture
Read More
-
一、插件编写
1 Pad (de)activation 1.1 激活 改变状态时,一个 bin 会按照从sink到source的顺序为其所有子元素设置状态。当元素经历 READY→PAUSED 过渡时,它们的Pad会被激活以准备数据流。一些Pad会启动任务以驱动数据流。 一个元素会从sourcepads到sinkpads依次激活其Pad。这是为了确保当sinkpads被激活并准备接收数据时,sourcepads已经激活以向下游传递数据。 Pads可以在 PUSH 和 PULL 两种模式下激活。PUSH 模式是正常情况,其中链接中的source pad通过 gst_pad_push() 将数据发送到对端的sink pad。而 PULL 模式则是由source pad请求数据通过 gst_pad... Read More
-
二、GStreamer插件设计——注册GstPad
Read More
-
一、GStreamer插件设计——插件注册与搜索路径
1 插件注册 1.1 元素注册定义宏 /** * @brief: 元素注册到GStreamer中的宏定义 * @param e: 元素的名称(小写), 需要跟注册元素的时候 GST_ELEMENT_REGISTER 的第一个参数相同 * @param e_n: 元素的名称,用于元素创建 gst_element_factory_make 函数中使用 * @param r: 元素的等级 * @param t: Gtype类型系统中已经被注册的类型 */ GST_ELEMENT_REGISTER_DEFINE(e, e_n, r, t) 1.2 元素注册宏 /** * @brief: 元素注册到GStreamer到@plugin中 * @param element:... Read More
-
二十三、Meson构建文件函数——wrap()
Wrap依赖系统可以使得Meson自动加载和编译所需要的依赖库。 必须要在 subprojects 目录中,编写名为 <project_name>.wrap 的文件。该文件目前有四种类型:wrap-file、wrap-git、wrap-hg、wrap-svn。我们主要使用的是前两种,下面也主要介绍前两种。 1 wrap-file 我们以 gstreamer 中的 glib.wrap 为例。 [wrap-file] directory = glib-2.74.1 source_url = https://download.gnome.org/sources/glib/2.74/glib-2.74.1.tar.xz source... Read More
-
二十二、Meson构建文件函数——library()
library 可以构建一个库,该库可以是静态的、共享的或两者兼有的,这取决于 default_library 用户选项值。大多数情况下,你应该使用这个方法,而不是shared_library()、static_library()或both_libraries()。 # Builds a library that is either static, shared or both depending on lib library( str target_name, # The *unique* name of the build target str | file... Read More
-
二十一、Meson构建文件函数——share_library()
# Builds a shared library with the given sources lib shared_library( str target_name, # The *unique* name of the build target str | file | custom_tgt | custom_idx | generated_list source..., # Input source to compile # Keyword arguments: <lang>_args : lis... Read More
-
三、Jetson交叉编译容器
https://catalog.ngc.nvidia.com/orgs/nvidia/containers/jetpack-linux-aarch64-crosscompile-x86 Read More
-
二十、Meson构建文件函数——configuration_data()
通过在构建文件设置配置信息,生成头文件,例如config.h 对同一个 config.h 文件,多次同时 configure_file ,会把之前config.h里面的内容覆盖。 1 如果有输入文件 输入文件名为 `config.h.in,内容如下: #define VERSION_STR "@version@" #mesondefine TOKEN #mesondefine TOKEN可以替换内容如下: #define TOKEN // 如果 conf_data.set('TOKEN', true) #undef TOKEN // 如果 conf_data.set('TOKEN', false) #define TOKE... Read More
-
十一、Ubuntu之NFS共享目录
1 基本概念 网络文件系统(英语:Network File System,缩写作 NFS)是一种分布式文件系统,力求客户端主机可以访问服务器端文件,并且其过程与访问本地存储时一样,它由Sun Microsystems(已被甲骨文公司收购)开发,于1984年发布。NFS 的实现基于 ONC RPC(一个开放、标准的RFC系统,任何人或组织都可以依据标准实现它)。 2 安装相关服务 sudo apt-get -y install nfs-kernel-server nfs-common 3 配置NFS服务 sudo gedit /etc/exports 4 重启NFS服务 systemctl enable nfs-kernel-server systemctl re... Read More
-
03 人脸识别
Read More
-
二、OpenCV——交叉编译
创建交叉编译cmake文件 # 指定目标系统 set(CMAKE_SYSTEM_NAME Linux) # 指定目标平台处理器架构 set(CMAKE_SYSTEM_PROCESSOR aarch64) # 指定交叉编译工具链的根路径 set(CROSS_CHAIN_PATH "/home/lieryang/Documents/jetson_tool/gcc-jetson-9.3-x86_64-aarch64-linux-gnu") # 指定C编译器 set(CMAKE_C_COMPILER "${CROSS_CHAIN_PATH}/bin/aarch64-linux-gcc") # 指定C++编译器 set(CMAKE_CXX_COMPILER "${CROSS_CHAIN_P... Read More
-
十、Ubuntu之SSH远程
1 SSH基本概念 1.1 SSH是什么 SSH(Secure Shell)是一种用于远程登录和其他网络服务的加密协议。它主要用于通过不安全的网络安全地访问远程计算机。SSH提供了一种安全的途径,可以在两台计算机之间传输数据,并支持各种身份验证方法。 1.2 主要功能 安全登录到远程系统:使用SSH可以通过命令行远程登录到另一台计算机。 安全文件传输:通过SCP(Secure Copy Protocol)和SFTP(SSH File Transfer Protocol)可以在本地和远程计算机之间安全地传输文件。 端口转发:可以通过SSH进行端口转发,实现访问受限制的服务。 1.3 常用的SSH客户端和服务器 ... Read More
-
三、编译工具链GCC——制作交叉编译工具链
1 基础知识 1.1 查看目标target主机软件版本 查看glibc版本(glibc在后续编译gcc过程中会用到 ldd --version 查看gcc版本 gcc -v 查看linux内核的版本 uname -r 1.2 机器名称命名规则 gcc编译过程中,一般需要给你三个机器名称,即编译系统(build)、运行系统(host)、目标系统(target),以便编译器生成对应机器的二进制代码。 build:是指目前我们正在用那个平台来构建。如果不指定,系统会根据当前环境进行猜测。 host:我们使用那个平台来运行已经构建好的代码。 ... Read More
-
二、编译工具链GCC——使用交叉编译工具链
一般相关的硬件官方都会提供x86_64交叉编译该硬件的工具链。 1 Ubuntu软件源提供的Gcc交叉编译工具链 从上图可以看到,有不同Gcc版本的交叉编译工具链,但是没有具体9.x版本可选。 所以还是从Arm官网下载不同版本的工具链较为合适。 2 Arm官网提供的Gcc交叉编译工具链 下载链接:https://developer.arm.com/downloads/-/arm-gnu-toolchain-downloads 3 NVIDA Jetson提供的交叉编译工具链 访问链接:https://developer.nvidia.com/embedded/jetpack-archive 然后点击L4T 35.5.0,下载Bootlin Toolcha... Read More
-
八、GTK4——GMenu
1 GMenuModel /* 抽象类型 GMenuModel */ G_DEFINE_ABSTRACT_TYPE (GMenuModel, g_menu_model, G_TYPE_OBJECT) assets/GTK4/08_Menu/image/image-1.png 分析插入submenu和section Read More
-
五、GIO——GMenu
Read More
-
七、GTK4——GtkEditableLabel
1 GtkEditable GtkEditable 是一个用于文本编辑widget的接口。 典型的可编辑部件示例包括 GtkEntry 和 GtkSpinButton。它包含用于通用操作可编辑部件的函数、大量用于键绑定的操作信号以及应用程序可以连接以修改部件行为的几个信号。 作为后者用法的一个示例,通过将以下处理程序连接到 GtkEditable::insert-text 信号,应用程序可以将所有输入转换为大写。 Read More
-
四、GIO——GSimpleAction
1 GAction 接口的名称跟普通对象定义的名称没有区别,GAction 和 G_TYPE_ACTION,只不过实际使用的结构体是 GActionInterface 而不是 GAction。 GAction 表示一个单个命名的动作,该接口的包含了Action: /* gaction.h */ typedef struct _GActionInterface GActionInterface; struct _GActionInterface { GTypeInterface g_iface; /* virtual functions */ const gchar * (* get_name) (GAction *acti... Read More
-
六、GTK4——GtkListView
GtkListView 显示一个大的动态项目列表。每项Item,也就是每行,都可以根据 GtkListItemFactory 生成指定的 GtkWidget,根据 GListModel 用相应数据赋值给 GtkWidget 显示。 GtkListView 使用其工厂为每个可见项目生成一个行小部件,并在垂直或水平的线性显示中显示它们。可以指定属性是否显示行分割符。 GtkListView 允许用户根据模型的选择特性选择项目。可以进行单选、多选。 1 GListModel GListModel 是一种接口(必须是GObject对象,才能去实现该接口)。 通过该接口一般都是实现一个数据列表或者数组,该接口可以获取到数组... Read More
-
五、GTK4——GtkBox
1 GtkBox引用 static void app_activate (GApplication *app, gpointer *user_data) { GtkWidget *win = gtk_application_window_new (GTK_APPLICATION (app)); GtkWidget *box = gtk_box_new (1, 0); g_print ("g_object_is_floating (box) = %d\n", g_object_is_floating (box)); /* 是附点引用 */ gtk_window_set_child (GTK_WINDOW(win), box); g_print ("g_... Read More
-
四、GTK4——GtkApplicationWindow
1 GtkApplication GApplication 实现了 GActionGroup 和 GActionMap 接口。 /* filename: gapplication.c */ G_DEFINE_TYPE_WITH_CODE (GApplication, g_application, G_TYPE_OBJECT, G_ADD_PRIVATE (GApplication) G_IMPLEMENT_INTERFACE (G_TYPE_ACTION_GROUP, g_application_action_group_iface_init) G_IMPLEMENT_INTERFACE (G_TYPE_ACTION_MAP, g_application_action_map... Read More
-
十六、GObject类用法总结
基于前面知识,我们知道GObject是静态类对象,可以创建N个实例,但是只会创建一个类结构体对象。 比如常用 GObjectClass里面的: 类里面函数指针,可以做信号的默认处理函数(指向默认处理函数) 子类可以重写父类里面的函数指针(指向的处理函数),进而实现多态。 子类也可以调用父类的函数指针。 1 对象初始化过程分析 1.1 区分不同父类内存区域 需要主要两部分内存空间:一是父类自身占用的内存空间,另一个是子类复制父类部分的内存空间 比如 GtkWIdget: GTK_WIDGET_GET_CLASS 得到的是自身拷贝父类部分的内存空间。(这部分有些数据已经被 gtk_widget... Read More
-
十五、GObject对象私有结构体
创建一个对象的时候,一个对象包含两部分,类结构体和实例结构体。所以私有结构体也分两种: 类里面添加私有结构体 实例里面添加私有结构体 可以参考:GtkWidget对象,该对象即有类私有结构体,也有实例私有结构体 1 类添加私有结构体 /* 1. 结构体定义 */ typedef struct _MyObjectClassPrivate MyObjectClassPrivate; struct _MyObjectClassPrivate { gint secret_class_count; }; /* 2. 类型定义 */ /** * g_define_type_id是G_DEFINE_TYPE_WITH_CODE宏里面,表示M... Read More
-
三、GIO——GApplication
1 GApplication官网介绍 GApplication 是支持应用程序的核心类。 GApplication 是应用程序的基础。它封装了一些低级别的平台特定服务,旨在作为更高级别应用程序类(如 GtkApplication 或 MxApplication)的基础。通常,不应在更高级别的框架之外使用此类。 GApplication 通过维护主要应用程序实例的“使用计数”来提供方便的生命周期管理。可以使用 g_application_hold() 和 g_application_release() 更改使用计数。如果计数降到零,应用程序将退出。更高级别的类(如 GtkApplication)使用使用计数来确保只要有任何窗口打开... Read More
-
三、GTK4——Cambalache设计软件
前面先总结了Python3运行Gtk4程序,是因为 Cambalache 是用Python3运行Gtk4程序。 1 安装cambalache cambalache下载链接:https://gitlab.gnome.org/jpu/cambalache 1.1 GTK4编译选项 为了使用 cambalache 我们在编译gtk4的时候,必须要编译网页版后端和GIR。 网页运行GTK程序,可以参考https://docs.gtk.org/gtk4/broadway.html 1.2 缺少WebKit2 WebKit2是python运行的组件,本质也是通过 WebKit2-4.1.typelib,然后链接到相关库。 我目前使用的是 Ubuntu22.04 系统,可以从... Read More
-
二、GTK4——Vala运行
使用 Vala,其实调用的是 gtk4.vapi –> libgrk4.so。(VAPI 文件包含了一个库的接口描述信息) Gtk-4.0.typelib影响的是 gtk4.vapi 的生成。(gtk4.vapi提前就会生成好,不会在编译程序的时候再生成) 1 Vala Vala 是一种编程语言,专为 GNOME 项目设计,旨在提供一种高效且便于开发者使用的编程体验。Vala 的语法类似于 C#,但它会编译为 C 代码,因此可以利用现有的 C 语言库。 专门为GNOME项目开发设计的高级语言,本身与 GObject 集成。 vapigen 工具用于从 GIR(GObject Intros... Read More
-
一、Adw——自适应布局Adaptive Layouts
Libadwaita 提供了一些根据可用空间更改布局的组件。可以用它来让应用程序在桌面设备和移动设备之间自适应其用户界面。 2 夹具Clamp AdwClamp 有一个子组件,并在允许其缩小的同时约束其最大尺寸。换句话说,当有足够空间时,它允许子组件有填充;否则去除填充。 这通常用于如盒装列表boxed lists等模式: AdwClamp Read More
-
一、Adw——应用程序窗口AdwApplicationWindow
Read More
-
01 Conda
要取消conda的默认启动,你可以按照以下步骤进行操作: 打开终端。 输入命令: conda config –set auto_activate_base false 。 这将把auto_activate_base参数设置为false,从而取消conda的默认启动。 Read More
-
一、GTK4——Python运行
以前学习的过程中,使用的 Glib 和 Gtk4 都是使用 C语言 版本。这些库也支持其他语言编写,Python、JavaScript、Vala等。 比如Python运行GTK4,通过 PyGObject提供的gi 获取 Gtk-4.0.typelib,最终链接到 libgtk-4.so。 1 GObject Introspection Repository GObject Introspection Repository (GIR) 是 GNOME 开发中的一个重要工具,用于描述和提供 GObject 类型系统的信息。这些信息包括类、对象、方法、属性等的结构和特性,以及它们在底层 C 语言中的实现细节。 GIR 的主要作用是为各种编程语言(如Python、JavaScript... Read More
-
十三、GLib——GKeyFile
Read More
-
一、OpenCV——编译
sudo apt install libjpeg-dev libgtk-3-dev 1 基本概念 opencv_contrib: 是 OpenCV 项目中的一个扩展模块集合。OpenCV(Open Source Computer Vision Library)是一个开源计算机视觉和机器学习软件库,而 opencv_contrib 包含了 OpenCV 主库中没有包括的额外模块和算法。这些模块通常由社区成员贡献,可能包括实验性、前沿或不太常用的功能。 OpenCL: 是一种用于编写跨平台并行编程的开放标准,主要由 Khronos Group 维护。它允许在异构计算环境中编写代码,这些环境包括 CPU、GPU、FPGA 以及其他加速器。OpenC... Read More
-
六、OpenGL ES——线程共享
Read More
-
五、OpenGL ES——离屏渲染
Read More
-
四、OpenGL ES——EGLImageKHR
这一节的内容其实讲的就是纹理,只不过 EGLImageKHR 是通过不同方式直接更新纹理信息。 1 回顾统一变量Uniform Variables 在OpenGL ES着色器编程中,uniform变量是一种特殊的全局变量,该变量可以在每次绘制调用之前更新,它们的作用是在图形渲染管线的不同阶段(如顶点着色器、片段着色器等)共享常量数据。uniform变量的值由CPU端的应用程序设置,并且在整个渲染调用过程中保持不变,这意味着所有在这个渲染批次中的顶点或片段都将使用同一组uniform变量的值。 特性与用途: 在GLSL(OpenGL Shading Language)中,uniform变量通过关键字uniform进行声明,并指定其数据类型,例如矩阵、向量、标量或者... Read More
-
二、GIO——GTask
GTask 是继承于 GObject 的标准对象。使用GObject标准引用计数。使用 g_object_unref 解引用。 GTask 内部是用非独占GThreadPool去执行 GTask 需要执行 ‘g_task_run_in_thread’ 设定的线程函数。(注意:task_pool是全局静态变量,也就说所有创建的GTask对象都是使用这个线程池去运行要执行的函数)。 GTask 任务中线程函数执行完毕后,会执行 g_task_new 设定的 @callback 函数。 GTask 一个对象只能执行一次 g_task_run_in_thread 任务线程函数。(内部没有重置GTask的函数,让任务重新... Read More
-
一、GIO——GCancellable
GCancellable是GIO中广泛使用的一个线程安全的操作取消堆栈,用于允许取消同步和异步操作。 这是继承于 GObject 的标准对象。 可以使用该对象到所有线程中,可以统一退出所有线程。 1 GCancellable对象 /* filename: gcancellable.h */ struct _GCancellable { GObject parent_instance; /*< private >*/ GCancellablePrivate *priv; }; struct _GCancellableClass { GObjectClass parent_class; void (* ... Read More
-
三、OpenGL ES——绘制三角形
1 着色语言 OpenGLSL ES 这部分首先分清 OpenGLSL ES 1.0版本 和 3.0版本 ,其实1.0版本对应的是OpenGL ES 2.0版本。 OpenGL ES 3.0 API 被设计成可以同时运行在 GLSL ES 1.0 和 GLSL ES 3.0 上,意思就是说在 OpenGL ES 2.0 上编写的着色器无需修改就可以迁移到 OpenGL ES 3.0 中运行,但是反过来则是用 GLSL ES 3.0 写的 Shader 不能直接运行在 OpenGL ES 2.0 上。 区别: 在着色器文件中添加 #version 320 es 表明使用3.2版本,如果不添加则使用默认2.0版本。注意使用opengles3.2的API的时候... Read More
-
十二、GLib——GThreadPool
1 GThreadPool基本概念 有时你希望异步地派发工作的执行,然后继续在自己的线程中工作。如果这种情况经常发生,每次启动和销毁线程的开销可能会太高。在这种情况下,重用已经启动的线程似乎是个不错的主意。确实如此,但是实现这一点可能很繁琐且容易出错。因此,GLib提供了线程池以方便你使用。另一个优势是,当不同的子系统使用GLib时,线程可以在它们之间共享。 要创建一个新的线程池,你可以使用g_thread_pool_new()。它可以通过g_thread_pool_free()来销毁。 如果你想在线程池中执行某个特定任务,可以调用g_thread_pool_push()。 要获取当前正在运行的线程数,可以调... Read More
-
十一、GLib——GThread
1 GThread基本概念 线程几乎像进程一样运行,但与进程不同的是,一个进程的所有线程共享相同的内存。这是好的,因为它通过共享内存提供了线程之间的轻松通信,但也有不好的地方,因为如果程序没有谨慎设计,可能会发生奇怪的事情(所谓的“Heisenbugs”)。线程的并发性质意味着不能假设不同线程中运行的代码的执行顺序,除非程序员通过同步原语primitive明确强制执行顺序。 GLib中与线程相关的函数的目标是提供一种可移植的方式来编写多线程软件。有用于保护内存部分访问的互斥锁的原语(#GMutex、#GRecMutex和#GRWLock);有使用单个位进行锁定的设施(g_bit_lock());有用于线程同步的条件变量的原语(#GCond);有线程专用数据的原语 - 每个线程都有一... Read More
-
十、GLib——GError
1 GError结构体 typedef struct _GError GError; struct _GError { GQuark domain; gint code; gchar *message; }; 2 GError相关函数 GError 没有在类型系统注册对象,自定义结构体也没有引用计数。 2.1 GError创建函数 /** * @brief: 创建一个具有给定 @domain 和 @code 的新 #GError,并使用 @format 格式化的消息。 * @domain: error 属于哪一种类 (比如:"g-file-error-quark") * @code: error code ... Read More
-
九、GLib——GMainLoop
1 GMainLoop相关结构体 /* filename: gmain.c */ struct _GMainLoop { GMainContext *context; gboolean is_running; /* (atomic) */ /* 循环函数是否正在运行 */ gint ref_count; /* (atomic) */ }; 引用计数: GMainLoop *loop = g_main_loop_new(NULL, TRUE); /* 引用计数加一,loop->ref_count = 1 */ /* g_main_loop_run循环函数进入时候,引用计数加一, loop->ref_count = 2 * g_main_loo... Read More
-
八、GLib——GMainContext
1 GMainContext结构体 /* filename: gmain.h */ typedef struct _GMainContext GMainContext; /* filename: gmain.c */ struct _GMainContext { /* The following lock is used for both the list of sources * and the list of poll records */ GMutex mutex; GCond cond; GThread *owner; /* 上下文被那个线程拥有 owner = g_thread_self () */ guint owner_count; ... Read More
-
七、GLib——GSource
GMainLoop -> GMainContext -> {GSource1, GSource2,GSource3… } 每个GMainLoop都包含一个GMainContext成员,而这个GMainContext成员可以装各种各样的GSource,GSource则是具体的各种Event处理逻辑了。在这里,可以把GMainContext理解为GSource的容器,但是它的用处不只是装GSouce。 创建GMainLoop使用函数g_main_loop_new,他的第一个参数就是需要关联的GMainContext,如果这个值为空,程序会分配一个默认的Context给GMainLoop,把GSource加到GMainCon... Read More
-
六、GLib——GHashTable
1 基本概念 1.1 哈希表基本概念 哈希表(Hash Table)也叫散列表,哈希表本质上就是一个数组,只不过数组存放的是单一的数据,而哈希表中存放的是键值对,通过Key可以直接找到所映射的Value。 key通过哈希函数(hash function)得到数组的索引,进而存取索引位置的值。 不同的key通过哈希函数可能得到相同的索引值,此时,产生了哈希碰撞。 通过在数组中插入链表或者二叉树,可以解决哈希碰撞的问题。 1.2 哈希表实现原理 通过散列函数(映射函数),将key传入函数,计算出数组的下标值。比如以下time33哈希函数: uint32_t t... Read More
-
五、GLib——GAsyncQueue
1 GAsyncQueue基本概念 通常需要在不同的线程之间进行通信。一般来说,最好不要通过共享内存来实现这一点,而是通过显式的消息传递。然而,这些消息只在多线程应用程序中异步地才有意义,因为同步操作同样可以在同一线程中完成。 异步队列是GLib大多数其他数据结构的例外,因为它们可以同时从多个线程中使用而无需显式加锁,并且它们带有内置的引用计数。这是因为异步队列的特性是它将始终由至少两个并发线程使用。 要使用异步队列,首先必须使用g_async_queue_new()创建一个队列。GAsyncQueue结构是引用计数的,使用g_async_queue_ref()和g_async_queue_unref()来管理你的引用。 ... Read More
-
四、GLib——GQueue
1 队列的基本概念 网上大部分队列是尾部入队,头部出队,使用单链表进行实现。GLib使用双向链表实现,可以两头入队,两头出队。 2 GQueue GQueue 没有在类型系统注册对象,也就是没有 G_QUEUE,没有引用计数。 g_queue_new 创建队列,g_queue_free 释放队列内存空间。 GQueue 不是多线程安全的。 2.1 GQueue结构体 typedef struct _GQueue GQueue; struct _GQueue { GList *head; /* 指向队列的第一个元素 */ GList *tail; /* 指向队列的最后一个元素 */ guint l... Read More
-
三、GLib——GList
1 基本概念 循环链表的概念:单链表的尾结点指针指向空地址,表示这就是最后的结点了。而循环链表的尾结点指针是指向链表的头结点。 循环链表的特点:和单链表相比,循环链表的优点是从链尾到链头比较方便,当要处理的数据具有环型结构特点时,适合采用循环链表。 双向链表的概念:双向链表也叫双链表,是链表的一种,它的链接方向是双向的,它的每个数据结点中都包含有两个指针,分别指向直接后继和直接前驱。所以,从双向链表中的任意一个结点开始,都可以很方便地访问它的前驱结点和后继结点。 双向链表的特点:头节点的pre == NULL,尾节点next == NULL。 2 GLib双向链表实现 GLis... Read More
-
二、GLib——GSList
1 单链接基本概念 1.1 单链表是什么 单链表是一种常见的数据结构,它由一个个节点组成,每个节点包含一个数据元素和一个指向下一个节点的指针 1.2 单链表需要实现那些基本功能 基本的操作为:增、删、查、改 具体为: 插入元素:将新元素插入到链表的指定位置,可以是链表的头部、尾部或中间位置。 删除元素:从链表中删除指定位置的元素。 查找元素:根据给定的值,在链表中查找对应的元素,并返回其位置。 遍历链表:按顺序访问链表中的每个元素。 获取链表长度:获取链表中元素的个数。 判断链表是否为空:判断链表是否为空链表。 清空链表:删除链表中的所有元... Read More
-
二、OpenGL ES——创建窗口
1 使用EGL连接X11窗口 连接到X显示服务器 display = XOpenDisplay(display_name); 创建窗口 win = XCreateSimpleWindow(display, RootWindow(display, screen_num), win_x, win_y, width, height, win_border_width, BlackPixel(display, screen_num), WhitePixel(display, screen... Read More
-
一、OpenGL ES——前言
1 OpenGL ES和EGL基本概念 1.1 OpenGL ES OpenGL ES的全称是 OpenGL for Embedded Systems。这是一个针对嵌入式设备(如智能手机、平板电脑、游戏控制台和车载系统)设计的图形绘制API。OpenGL ES是标准的OpenGL API的一个子集,提供了简化和优化的功能,以适应嵌入式系统的性能和资源限制。 OpenGL ES 是 OpenGL 的子集,区别在于 OpenGL ES 删减了 OpenGL 一切低效能的操作方式,有高性能的决不留低效能的,即只求效能不求兼容性。(即:OpenGL ES 能实现的,OpenGL 也能实现;OpenGL 部分 API,OpenGL ES 不支持) ... Read More
-
十五、C++复习——类型转换
Read More
-
十四、C++复习——模板
Read More
-
十三、C++复习——多态
1 基本概念 概念: 通俗来说,多态就是多种状态,父子对象完成相同任务会产生不同的结果。 比如: 学生和普通人都去买门票学生是半价,而普通人是全价 在继承中构成多态要有两个条件: 必须通过基类的指针 调用的函数必须是虚函数,并且子类的虚函数要被重写 1.1 虚函数的概念 基类中声明为virtual并在一个或多个派生类中重新定义的成员函数叫做虚函数。 关键字virtual加在成员函数前,这个成员函数就是虚函数! 1.2 虚函数的核心作用 实现动态联编,在函数运行阶段动态的选择合适的成员函数。 在定义了虚函数后,可实现在派生类中对虚函数进行重写,从而实现统一的接口和不同的执行过程。 ... Read More
-
十二、C++复习——继承
继承(inheritance)机制是面向对象程序设计,使代码可以复用的重要的手段,它允许程序员在保持原有类特性的基础上进行扩展,增加功能,这样产生新的类,称派生类。 继承呈现了面向对象程序设计的层次结构,体现了由简单到复杂的认知过程。 1 继承定义 定义格式: 下面我们看到 Person 是父类,也称作基类。 Student 是子类,也称作派生类。 2 继承的方式 保护继承:基类的公有成员和私有成员都是以保护成员的身份出现在派生类中,不可用访问基类的私有成员。派生类的其他成员可以直接访问从基类继承的公有和保护成员,但是类外部通过派生类的对象无法访问它们,无论派生类的成员,还是派生类的对象,都无法访问基类的私有成员。 如何恰当的使用public,protected和... Read More
-
十一、C++复习——运算符重载
1 运算符类型 单目运算符:单目运算符是指运算所需变量为一个的运算符,又叫一元运算符,其中有逻辑非运算符:!、按位取反运算符:~、自增自减运算符:++, –等。 逻辑非运算符【!】、按位取反运算符【~】、自增自减运算符【++, –】、负号运算符【-】、类型转换运算符【(类型)】、指针运算符和取地址运算符【*和&】、长度运算符【sizeof】 双目运算符:双目运算符就是对两个变量进行操作。双目运算符较多,+,-,*,/,=,== 等等 如:a + b中的+就是双目,因为操作数是a b两个 三目运算符:三目运算符对三个变量进行操作。,b ? x : y。 2 友元和成员函数重载运算符区别 ... Read More
-
九、C++复习——this指针
Read More
-
八、C++复习——静态成员和方法
Read More
-
七、C++复习——构造函数初始化列表
1 必须使用初始化列表 必须用带有初始化列表的构造函数情况: 如果成员类型是没有默认构造函数的类。 若类没有默认构造函数,则编译器尝试使用默认构造函数将会失败。比如:A是B类的成员,A存在一个默认有参构造函数,就不会存在默认无参构造函数。如果没有初始化函数列表,就会报错。 const成员或者引用类型的成员。因为这类型需要创建的时候就需要被初始化。 除了以上必须使用初始化列表的情况,普通成员也可以使用初始化列表进行初始化。 2 初始化列表赋值执行顺序 Read More
-
十、C++复习——友元
友元(Friend)是C++中一种特殊的访问控制机制,它允许一个类或函数访问另一个类的私有成员。友元在一些特殊情况下非常有用,但也应谨慎使用,因为它会打破封装性和数据隐藏原则。 1 友元函数 1.1 全局函数作友元函数 1.2 类成员函数作友元函数 2 友元对象 Read More
-
九、OpenGL——摄像机
https://learnopengl-cn.github.io/01%20Getting%20started/09%20Camera/ https://www.cnblogs.com/errorman/p/17639819.html Read More
-
八、OpenGL——坐标系统
1 概述 为了将坐标从一个坐标系变换到另一个坐标系,我们需要用到几个变换矩阵,最重要的几个分别是模型(Model)、观察(View)、投影(Projection)三个矩阵。我们的顶点坐标起始于局部空间(Local Space),在这里它称为局部坐标(Local Coordinate),它在之后会变为世界坐标(World Coordinate),观察坐标(View Coordinate),裁剪坐标(Clip Coordinate),并最后以屏幕坐标(Screen Coordinate)的形式结束。下面的这张图展示了整个流程以及各个变换过程做了什么: 局部坐标是对象相对于局部原点的坐标,也是物体起始的坐标。 下一步是将局部坐标变换为世界空间坐标,... Read More
-
一、数学——向量
1 向量点乘 1.1 向量点乘公式推导和几何解释 一般来说,点乘结果描述了两个向量的“相似”程度,点乘结果越大,两向量越相近。 1.1.1 向量点乘(dot product)是其各个分量乘积的和,公式: 用连加号写: 1.1.2 几何解释 点乘的结果是一个标量,等于向量大小与夹角的cos值的乘积。 a•b = |a||b|cosθ 如果a和b都是单位向量,那么点乘的结果就是其夹角的cos值。 a•b = cosθ 1.1.3 推导过程 假设a和b都是二维向量,θ1是a与x轴的夹角,θ2是b与x轴的夹角,向量a与b的夹角θ等于θ1 - θ2 a•b = ax*bx + ay*by = (|a|*sinθ1) * (|b| * sinθ2) + ... Read More
-
七、OpenGL——变化
1 数学知识 1.1 单位矩阵 在OpenGL中,由于某些原因我们通常使用4×4的变换矩阵,而其中最重要的原因就是大部分的向量都是4分量的。我们能想到的最简单的变换矩阵就是单位矩阵(Identity Matrix)。单位矩阵是一个除了对角线以外都是0的N×N矩阵。在下式中可以看到,这种变换矩阵使一个向量完全不变: 注意:向量在矩阵的右侧 1.2 缩放 对(x, y)坐标继续缩放,比如x轴坐标缩小一半,y轴坐标放大一倍,向量v¯缩放后s¯如图所示: 上面这种缩放操作是不均匀缩放,因为每个轴的缩放因子不一样。如果每个轴的缩放因子都一样那么就叫均匀缩放。 如果我们把缩放变量表示为(S1,S2,S3),我们可以为任意向量(x,y,z)定义一个缩放矩阵: 注意,第... Read More
-
六、OpenGL——纹理(补充)
1 纹理环绕方式 纹理坐标的范围是 0-1,超出这一范围的坐标将被OpenGL根据 GL_TEXTURE_WRAP 参数的值进行处理: 环绕方式 描述 GL_REPEAT 对纹理的默认行为。重复纹理图像。 GL_MIRRORED_REPEAT 和GL_REPEAT一样,但每次重复图片是镜像放置的。 GL_CLAMP_TO_EDGE 纹理坐标会被约束在0到1之间,超出的部分会重复纹理坐标的边缘,产生一种边缘被拉伸的效果。 GL_CLAMP_TO_BORDER ... Read More
-
六、OpenGL——纹理(补充)
我们已经了解到,我们可以为每个顶点添加颜色来增加图形的细节,从而创建出有趣的图像。但是,如果想让图形看起来更真实,我们就必须有足够多的顶点,从而指定足够多的颜色。这将会产生很多额外开销,因为每个模型都会需求更多的顶点,每个顶点又需求一个颜色属性。 艺术家和程序员更喜欢使用纹理(Texture)。纹理是一个2D图片(甚至也有1D和3D的纹理),它可以用来添加物体的细节;你可以想象纹理是一张绘有砖块的纸,无缝折叠贴合到你的3D的房子上,这样你的房子看起来就像有砖墙外表了。因为我们可以在一张图片上插入非常多的细节,这样就可以让物体非常精细而不用指定额外的顶点。 <font color=#11FF99>除了图像以外,纹理也可以被用来储存大量的数据,这些数据可以发送到着色器上,但... Read More
-
四、OpenGL——着色器
你好,三角形中提到,着色器(Shader)是运行在GPU上的小程序。这些小程序为图形渲染管线的某个特定部分而运行。从基本意义上来说,着色器只是一种把输入转化为输出的程序。着色器也是一种非常独立的程序,因为它们之间不能相互通信;它们之间唯一的沟通只有通过输入和输出。 前面的教程里我们简要地触及了一点着色器的皮毛,并了解了如何恰当地使用它们。现在我们会用一种更加广泛的形式详细解释着色器,特别是OpenGL着色器语言(GLSL)。 1 GLSL 着色器是使用一种叫GLSL的类C语言写成的。GLSL是为图形计算量身定制的,它包含一些针对向量和矩阵操作的有用特性。 着色器的开头总是要声明版本,接着是输入和输出变量、uniform和main函数。每个着色器的入口点都是main函数,在这个函数中... Read More
-
三、OpenGL——你好,三角形(补充)
01 着色器对象和着色器程序对象 着色器对象和着色器程序对象是两个不同的实体,它们具有不同的作用和生命周期。 着色器对象是用来存储和编译着色器程序的源代码的。你可以创建多个着色器对象,每个对象都代表一个特定类型的着色器(如顶点着色器、片段着色器等)。然后,你可以将这些着色器对象附加到着色器程序对象,并使用‘glLinkProgram’函数将它们链接在一起形成一个完整的着色器程序。 一旦你将着色器对象链接到着色器程序对象之后,并且通过glLinkProgram函数成功链接了着色器程序,那么着色器对象就不再需要了。着色器程序已经包含了编译后的着色器代码,并且可以被OpenGL使用。 删除着色器对象的目的是为了释放资源和减少内存占用... Read More
-
二、OpenGL——你好,三角形
在学习此节之前,建议将这三个单词先记下来: 顶点数组对象:Vertex Array Object, VAO 顶点缓冲对象:Vertex Buffer Object, VBO 元素缓冲对象 Element Buffer Object, EBO 或索引缓冲对象Index Buffer Object, IBO 当指代这三个东西的时候,可能使用的是全称,也可能用的是英文缩写,翻译的时候和原文保持的一致。由于没有英文那样的分词间隔,中文全称的部分可能不太容易注意。但请记住,缩写和中文全称指代的是一个东西。 在OpenGL中,任何事物都在3D空间中,而屏幕和窗口却是2D像素数组,这导致OpenGL的大部分工作都是关于把3D坐标转变为适应你屏幕的2... Read More
-
5 Cmake构建文件之编写
https://www.cnblogs.com/lidabo/p/16661100.html Read More
-
四、CMake构建文件——编写
Read More
-
三、CMake构建文件——编写
目标对象包含的(add_executable和add_library的target) 1 target_include_directories target_include_directories(<target> [SYSTEM] [AFTER|BEFORE] <INTERFACE|PUBLIC|PRIVATE> [items1...] [<INTERFACE|PUBLIC|PRIVATE> [items2...] ...]) 该命令用于为特定目标 target 添加头文件目录。 参数说明: <target> 构建目标,使用 add_executable() 或 add_library 声明,不可为 ... Read More
-
二、CMake构建文件——编写
以下是最基本的格式: # filename: CMakeLists.txt # cmake最低版本要求3.10 cmake_minimum_required(VERSION 3.10) # 该项目名称为OpenGLStudy,该项目编程语言C++ project(CMakeStudy VERSION 1.0 DESCRIPTION "学习CMake构建文件编写" HOMEPAGE_URL "https://lieryangstack.github.io/" LANGUAGES C CXX ) add_executable(m... Read More
-
一、CMake编译项目——快速开始
1 生成构建文件 方式一:当前执行命令目录是构建文件生成目录 # 方式一: 当前执行命令目录是构建文件生成目录 cmake .. # cmake path-to-source(CMakeLists.txt文件所在目录) 方式二:指定源文件目录和构建文件生成目录 cmake [options] -S <path-to-source> -B <path-to-build> 1.1 指定构建系统生成器 -G cmake -G Ninja <path-to-source> # 或者 (不指定生成器,默认使用的是les) cmake -G "Unix Makefiles" <path-to-source> 查询系... Read More
-
九、Ubuntu开机自启动
https://blog.csdn.net/KYJL888/article/details/103687876 https://www.cnblogs.com/Areas/p/13439000.html https://developer.aliyun.com/article/659015 https://blog.csdn.net/k1419197516/article/details/129820333 Read More
-
八、Ubuntu软件源
有些专门的网站服务器提供了Linux系统需要的软件源(仓库),这使得我们可以很方便的安装、更新我们的linux软件。这里以ubuntu系统为例进行学习: https://packages.ubuntu.com/ 这个站点为您提供了关于Ubuntu包存档中所有可用包的信息。 1 软件源配置路径 传统的deb软件源列表: /etc/apt/sources.list 个性化源配置目录: /etc/apt/sources.list.d/,该目录中的源文件一般是各个发行版自己配置的特定软件源,或者用户自己写入的软件源。 ubuntu中,通过下载deb包安装的软件一般会生成一个该deb包的软件源,并存放在个性化源配置目录中,以便新版本发布后供... Read More
-
七、Linux包deb
deb文件是包含数据的存档。用于轻松分发和安装Linux Debian及其衍生发行版适合的程序。当您的应用程序需要处理其他依赖项、将自身与桌面集成、运行安装前和安装后脚本等时,Deb文件非常方便。(与deb格式功能类似的另一种包格式是Fedora系列发行版常用的rpm文件。) 1 deb包命名约定 <软件名称>_<主版本号>-<修订版本号>_<硬件架构>.deb 软件包名称: libglfw3 主版本号: 3.3.6 修订版本号: 1 硬件架构:amd64 2 deb包介绍 deb包本身有三部分组成: control.t... Read More
-
六、Linux包管理命令dpkg、apt-get、apt
这节介绍包管理命令,他们直接的关系可以这样理解: dpkg(底层工具)->apt-get(上层工具)->apt(apt-get的再封装) dpkg是对已经下载好的`.deb`包进行安装、管理、卸载。apt-get上层工具可以从互联网下载包,解决包的依赖关系。 不同的 Linux 发行版使用不同的包管理系统,一般而言,大多数发行版分别属于两大包管理技术阵营: Debian 的.deb,和红帽的.rpm。 dpkg:这个机制最早是由Debian Linux社群所开发出来的﹐通过dpkg 的机制,Debian提供的软件就能够简单的安装起来,同时还能提供安装后的软件信息。只要是衍生于 Debian 的其他Linux distributions ... Read More
-
一、OpenGL——创建窗口
第一步需要创建OpenGL上下文(Context)和一个用于显示的窗口。这些操作可以用一些库GLUT,SDL,SFML和GLFW实现。本教程使用的是GLFW。 1 GLFW GLFW 是配合 OpenGL 使用的轻量级工具程序库,缩写自 Graphics Library Framework(图形库框架)。 GLFW 的主要功能是:创建OpenGL上下文(Context)和一个用于显示的窗口。这些操作可以用一些库GLUT,SDL,SFML和GLFW实现。本教程使用的是GLFW。 由于我直接在Ubuntu下进行学习,所以直接使用apt命令安装相关库 sudo apt-get install -y libglfw3 sudo apt-get install -y libglfw3-... Read More
-
OpenGL——前言
本章内容学习参考:LearnOpenGL CN 状态机 OpenGL自身是一个巨大的状态机(State Machine):一系列的变量描述OpenGL此刻应当如何运行。OpenGL的状态通常被称为OpenGL上下文(Context)。我们通常使用如下途径去更改OpenGL状态:设置选项,操作缓冲。最后,我们使用当前OpenGL上下文来渲染。 假设当我们想告诉OpenGL去画线段而不是三角形的时候,我们通过改变一些上下文变量来改变OpenGL状态,从而告诉OpenGL如何去绘图。一旦我们改变了OpenGL的状态为绘制线段,下一个绘制命令就会画出线段而不是三角形。 当使用OpenGL的时候,我们会遇到一些状态设置函数(State-changing Function),这类函数将会改... Read More
-
六、C++复习——构造与析构函数
1 构造函数 在对象创建时自动调用,完成初始化相关工作。如果定义相关数组,则需要手动调用构造函数。 无返回值,与类名同,默认无参,可以重载,可默认参数。 一经实现,默认构造函数就不复存在。 2 析构函数 对象销毁时,自动调用。完成销毁后的善后工作。 无返回值,与类名相同。无参数。不可以重载与默认参数。 3 拷贝构造和重载赋值运算符 该部分实验代码文件:/assets/CPlusPlus/06_copy_construction/06_copy_construction.cpp 拷贝构造和重载赋值运算符的最大区别就是:赋值运算符的左侧对象不是新生成的对象,而拷贝构造函数... Read More
-
五、C++复习——函数重载
函数重载:用同一个函数名定义不同的函数,当函数名和不同的参数类型搭配时函数的含义不同。 1 重载规则 函数名相同。 参数个数不同,参数的类型不同,参数类型顺序不同,均可构成重载。 3. 反正值类型不同则不可以构成重载。 2 重载底层实现 其实C++编译的时候,编译器会通过更改函数名,区分参数不同的同名函数。 实现原理: 用 v c i f l d 表示 void char int float long double 及其引用。 void func (char a); /* 更改函数名为func_c */ void func (char a, int b, double c); /* 更改函数名为func_cid */ ... Read More
-
四、C++复习——默认参数和占位参数
1 单个默认参数 void myPrint (int x = 3); 2 多个默认参数 在默认参数规则,如果默认参数出现,那么右边的都必须有默认参数 float volume (float length, float weight = 4, float high = 5); 3 占位参数 虽然占位参数并不能使用,但是调用该函数的时候必须要给该该参数赋值。 int func (int a, int b, int) { return a + b; } int main () { func (1, 2); /* 错误 */ func (1, 2, 3); return 0; } 可以通过占位参数与默认参数结合的方式,实现不给占位参数赋值也能... Read More
-
七、全局变量多定义
首先我们看一下下面这两个代码: test.c 中: test1.c中: 此时我们编译并运行: 编译通过,并且打印出了10,这是为什么呢?这就涉及到了链接器解析多重定义的全局符号了。 1 Linux 链接器处理多重定义的符号的规则 述结果是我们在 VS2019下测试的, Linux 链接器处理多重定义的符号的规则为: 不允许有多个同名的强符号 如果有一个强符号和多个弱符号同名,选择强符号 如果有多个弱符号同名,则从这些弱符号中随机选择一个 首先,什么是强符号,什么是弱符号? 强符号:函数和已初始化的全局变量是强符号(int count = 10;) 弱符号:未... Read More
-
六、inline关键字
内联关键字是inline,用于修饰函数。 内联函数的实现需要用inline关键字修饰。 内联函数的声明不需要加inline关键字,只在函数的声明加修饰,不生效。 #include <stdio.h> void BIN_XYB_INLINE (int *b); int main (int argc, char *argv[]) { char b = 0; BIN_XYB_INLINE(&b); return 0; } inline void BIN_XYB_INLINE (int *b) { (*b)++; } Read More
-
三、C++复习——引用
1 引用的含义 变量名,本身是一段内存的引用,即别名,引用可以看作一个已定义变量的别名。 2 引用的语法 data_type &variable_name = value; //data_type表示数据类型,比如int、char等等; //variable_name表示“引用”的名称; //value表示被引用的数据。 /* int a = 10; int &b = a; */ 引用必须在定义的同时初始化,并且以后也要从一而终,不能再引用其它数据。 引用在作函数参数的时候,可以不进行初始化。 引用的本质是常指针(引用在底层实现上实际是有空间的,因为引用是按照指针方式来实现的)。 3 用... Read More
-
二、C++复习——命名空间
命名空间就是为类型、函数、变量提供一个作用域限制。 1 命名空间的定义 注意:定义命令空间时,结束时不要加分号 namespace 命名空间名字 { ... } 2 命名空间的使用 由于使用命名空间后,变量的作用域被限定,所以在使用变量时,就需要通过特定方式来完成。需要用到 :: 域解析操作符 。 暴露整个命名空间中的变量 using namespace name; 暴露命名空间中的某个变量 using name::variable; 使用指定变量 name::variable 直接使用 ::全局变量,使用::前缀来访问一个变量或函数指的是对全局命名空间的访问。全局命名空间是最外层的命名空间,它包含所有不属于任何其他命名空间的变量、函数、类型等。 ... Read More
-
五、static关键字
1 static修饰全局变量 static 修饰全局变量其作用域会被限制在当前文件中(其他源文件不可见) 如果头文件定义了静态全局变量,每个导入该头文件的源文件都会定义一个静态全局变量(每个源文件的静态全局变量都是独立内存空间的,即使变量名相同) 2 static修饰局部变量 局部变量只是在第一次调用时会被初始化一次 数据是存储在全局区。 3 static修饰函数 函数被修饰后,就不可以被其他外部源文件调用该函数。静态函数只对该源文件内部可见。 #include <stdio.h> static void func1 ();/* 只在本源文件可调用 */ void func2(); /* 可被其他源文件调用 */ int main (int argc, c... Read More
-
四、extern关键字
extern关键字用来声明全局变量和函数。 1 声明全局变量 全局变量的作用域十分的广,只要在一个源文件中定义后,应用中所有的所有源文件、对象以及函数都可以调用,生命周期更是贯穿整个程序。 1.1 方式一(常用) 定义全局变量的相关头文件中,使用extern声明全局变量 /* global_test.cpp 源文件定义全局变量 */ int g_num = 100; /* global_test.h 声明该全局变量 */ extern int g_num; /* main.cpp 文件 */ #include "global_test.h" /* g_num全局变量声明头文件 */ int32 get_g_num(); int main() { get_g_num... Read More
-
一、C++复习——前言
C++学习和复习的相关总结: C++复习——命名空间:命名空间其实是对C语言中,函数和变量的声明加了一层作用域。只有通过命名空间名称和 :: 域解析操作符才能访问函数和变量。 Read More
-
二、QtCore——The Meta-Object System
Qt的元对象系统为对象间通信提供了: 信号和槽机制 运行时类型信息 动态属性系统 元对象系统基于三个要素: QObject作为基类,可以为被继承对象提供元对象系统。 类声明的私有部分中的Q_OBJECT宏用于启用元对象功能,如动态属性、信号和槽。 元对象编译器(moc)为每个QObject子类提供实现元对象功能所需的代码。 moc工具读取C++源文件。如果它发现一个或多个包含Q_OBJECT宏的类声明,它将生成另一个C++源文件,其中包含这些类的元对象代码。这个生成的源文件要么被#include到类的源文件中,要么更常见的是,与类的实现一起编译和链接。... Read More
-
一、QtCore
Qt Core模块为C++添加了以下功能: 一种非常强大的机制,用于实现无缝对象通信,称为信号和槽 可查询和可设计的对象属性 层次化且可查询的对象树,以自然的方式组织对象所有权,并使用受保护的指针(QPointer) 一种可跨库边界工作的动态类型转换 以下页面提供了有关Qt核心功能的更多信息: The Meta-Object System The Property System Object Model Object Trees & Ownership Signals & Slots ... Read More
-
六、qmake多平台说明
许多跨平台项目可以通过基本的qmake配置功能来处理。然而,在某些平台上,利用平台特定的功能有时是有用的,甚至是必要的。qmake了解许多这些特性,可以通过特定的变量访问,这些变量只在它们相关的平台上生效。 1 macOS, iOS, tvOS, and watchOS 这些平台的特定功能包括支持创建通用二进制文件、框架和捆绑包。 1.1 Source and Binary Packages 源代码包中提供的qmake与二进制包中提供的版本配置略有不同,它使用不同的特性规范。源代码包通常使用macx-g++规范,而二进制包通常配置为使用macx-xcode规范。 每个包的用户可以通过使用-spec选项调用qmake来覆盖此配置(有关更多信息,请参阅运行qmake)。例如,要使... Read More
-
20240321——SourceInsight使用
1 SourceInsight安装 1.1 软件下载 下载链接:http://www.sd173.com/soft/8293.html 或者 1.2 破解 断开电脑网络 复制 msimg32.dll 到安装路径 生成授权文件 si4.lic 打开 Source Insight 4.0软件,选择导入授权文件激活 2 使用 https://www.zhihu.com/question/351618643/answer/2482190609 Read More
-
四、初步理解前端后端
1 前端 用户界面和体验:前端开发关注于用户可以直接看到和与之互动的界面部分。这包括页面的布局、设计、动画以及交互逻辑。 技术栈:常用的技术包括HTML、CSS和JavaScript,以及框架和库,如React、Vue或Angular。 客户端处理:前端代码运行在用户的浏览器上,负责呈现信息和收集用户输入。 性能优化:前端开发需要关注页面加载速度和响应性,确保良好的用户体验。 跨浏览器/设备兼容性:确保网站或应用在不同的浏览器和设备上能够正确显示和运行。 2 后端 服务器、应用和数据库交互:后端开发涉及服务器的工作,处理应用的逻辑,以及与数据库的交互,存储用户数据等。 技术栈:包括服务器端语言如PHP、Python(Django、Flask)、R... Read More
-
20240316——录屏软件
1 下载链接 2 安装路径 因为此版本是便携破解版本,无需安装,所以直接复制文件目录到 C:\Program Files Read More
-
20240229——VPN相关
1 登录链接 https://auua.sbs?uuid=ac62d908-e2e2-4766-a3f3-eb5c44824f3c&hmac=14b549dadacf4b9f95800aa4bfc5151ebee7bc63a3eb767e0c6a6f51c7819720 bash <(curl -ksSL https://repo.o2cdn.icu/cached-apps/sing-box/singbox.sh || curl -ksSL https://mirror.ghproxy.com/https://raw.githubusercontent.com/caocaocc/installers/main/singbox.sh) “https://sync.xn–... Read More
-
七、Ubuntu文件共享samba
Samba是一个在Unix、Linux和其他类Unix系统上运行的软件,用于实现这些系统与Windows系统之间的文件和打印服务共享。它允许基于SMB/CIFS协议的文件和打印服务共享,这是Windows系统用于网络文件和打印服务共享的标准协议。 Samba可以使得Windows、Linux和手机之间共享查看文件 1 Ubuntu开启文件共享 1.1 安装Samba服务器 sudo apt-get install -y samba samba-common 1.2 给Samba用户设置密码 # -a 表示添加smbpasswd用户 sudo smbpasswd -a lieryang 1.3 修改配置文件 # 为保险起见,先备份一下原来的 Samba 配置文件。 su... Read More
-
五、Linux用户和用户组
Linux系统是一个多用户多任务的分时操作系统,任何一个要使用系统资源的用户,都必须首先向系统管理员申请一个账号,然后以这个账号的身份进入系统。 用户的账号一方面可以帮助系统管理员对使用系统的用户进行跟踪,并控制他们对系统资源的访问;另一方面也可以帮助用户组织文件,并为用户提供安全性保护。 每个用户账号都拥有一个唯一的用户名和各自的口令。 用户在登录时键入正确的用户名和口令后,就能够进入系统和自己的主目录。 1 Linux系统用户账号的管理 用户账号的管理工作主要涉及到用户账号的添加、修改和删除。 添加用户账号就是在系统中创建一个新账号,然后为新账号分配用户号、用户组、主目录和登录Shell等资源。刚添加的账号是被锁定的,无法使用。 1.1 添加新的用户账号使用usera... Read More
-
三、Docker——运维
1 关于镜像和容器的区别 镜像是包含了各种环境或者服务的一个模板,而容器是镜像的一个实例。 镜像是不能运行的,是静态的,而容器是可以运行的,是动态的。 2 https://blog.51cto.com/u_14555/6468616 https://blog.csdn.net/weixin_44542598/article/details/124642113 Read More
-
六、Ubuntu文件传输FTP
1 安装vsftpd 在开始设置 FTP 服务器之前,您需要安装一个称为 vsftpd 的软件包,它是一个流行的 FTP 服务器软件。执行以下命令以安装 vsftpd: sudo apt-get install vsftpd -y 配置vsftpd sudo gedit /etc/vsftpd.conf a. 启用本地用户登录 local_enable=YES,这将允许本地用户通过 FTP 登录到服务器。 b. 启用被用户写入文件 write_enable=YES,这将控制用户是否有权限在服务器上执行写入操作。 配置保存后,重启FTP服务 sudo systemctl enable vsftpd #设置 vsftpd 服务开机自启动 sud... Read More
-
五、Ubuntu截图
1 Flameshot 火焰截图 对于 Ubuntu 系统来说,Flameshot 火焰截图是一款功能强大的截图工具。它将直观的使用体验与复杂的标注工具完美结合,以用户友好的界面和强大的编辑选项而闻名,深受广大 Ubuntu 用户的喜爱。 Flameshot 的特色功能包括: Flameshot 具有可定制的标注功能,可以在截图中添加文本、箭头、形状和自由绘图。通过调整标注的颜色、粗细和样式,您可以完全控制视觉元素。 使用 Flameshot,可以快速将截图发布到像 Imgur 这样的知名图片托管网站。它会生成一个共享链接,方便他人轻松查看您的截图。 Flameshot 提供了多种图片处理功能,如裁剪、调整大小、模糊和像素化。在需要编辑截图或隐藏敏感信息时,这些功能... Read More
-
四、TAO——训练DetectNet_v2数据集
Read More
-
三、TAO——数据集
TAO提供了训练jupyter notebook中的示例,使用的都是Kitti的数据集,最后转换成 TFRecord格式 1 什么是tfrecord TFRecord是Google官方推荐的一种数据格式,是Google专门为TensorFlow设计的一种数据格式。 2 TFRecord原理 TFRecord 并非是TensorFlow唯一支持的数据格式,你也可以使用CSV或文本等格式,但是对于TensorFlow来说,TFRecord 是最友好也是最方便的。 tf.Example是TFRecord的基本结果,其实他就是一个Protobuffer定义的message,表示一组string到bytes value的映射。TFRecord文件里面存储的就是序列化的tf.Example... Read More
-
二、TAO——训练YOLOv3
YOLOv3 是包含在 TAO 工具包中的目标检测模型。YOLOv3 支持以下任务: dataset_convert kmeans train evaluate inference prune export 这些任务可以通过在命令行中使用以下格式从 TAO 工具包启动器中调用: tao model yolo_v3 <sub_task> <args_per_subtask> 其中 args_per_subtask 是针对给定子任务所需的命令行参数。每个子任务将在下面做详细解释。 1 Preparing the Input Data Structure YOLOv3的数据集结构与DetectNet_v2的相同,唯一的区别... Read More
-
一、NGC——快速开始
1 什么是NGC NGC,全称 NVIDIA GPU Cloud,是一款基于GPU加速,提供了为深度学习、机器学习和高性能计算优化的容器、模型、脚本和工具集。 各种预构建的容器:这些容器包含了为NVIDIA GPU优化的深度学习框架(如TensorFlow、PyTorch等),我会在 NGC 章节中介绍如何使用NGC拉去PyTorch容器。 各种预训练模型:DetectNet_v2、YOLO系列等等。 各种工具集:TAO Toolkit是一个用于深度学习模型训练和优化的工具集。 1 Pytorch 官网的概述中提供了两种运行方式: 使用Docker容器运行 使用ngc命令运行 我这里先学习第一种... Read More
-
二、NVIDIA——NGC、TAO、TLT介绍
1 什么是NGC NGC,全称 NVIDIA GPU Cloud,是一款基于GPU加速,提供了为深度学习、机器学习和高性能计算优化的容器、模型、脚本和工具集。 各种预构建的容器:这些容器包含了为NVIDIA GPU优化的深度学习框架(如TensorFlow、PyTorch等),我会在 NGC 章节中介绍如何使用NGC拉去PyTorch容器。 各种预训练模型:DetectNet_v2、YOLO系列等等。 各种工具集:TAO Toolkit是一个用于深度学习模型训练和优化的工具集。 2 TAO和TLT区别 NVIDIA TAO(Train, Adapt, and Optimize)和 NVIDIA TLT(Transf... Read More
-
二、Docker——安装
docker-compose.yml version: '3.1' services: wordpress: image: wordpress restart: always ports: - 8080:80 environment: WORDPRESS_DB_HOST: db WORDPRESS_DB_USER: exampleuser WORDPRESS_DB_PASSWORD: examplepass WORDPRESS_DB_NAME: exampledb volumes: - wordpress:/var/www/html db: image... Read More
-
一、Docker——安装
1 Docker是什么 Docker是一个应用打包、分发、部署的工具 你也可以把它理解为一个轻量的虚拟机,它只虚拟你的软件需要的运行环境,多余的一点都不要, 而普通虚拟机则是一个完整而庞大的系统,包含各种不管你要不要的软件。 1.1 跟普通虚拟机的对比 特性 普通虚拟机 Docker 跨平台 通常只能在桌面级系统运行,例如 Windows/Mac,无法在不带图形界面的服务器上运行 支持的系统非常多,各类 Windows 和 Linux 都支持 性能 性能损耗大,内存占用高,因为是把整个完整系统都虚拟出来了 ... Read More
-
20240113——滑雪
1 基本概念 1.1 重心 滑雪最重要的就是通过重心移动,控制重心变化,从而控制雪板。 推坡的时候重心要保持在双腿中间,后背挺直,目视前方别看脚下,看脚下重心就会前移,就会摔倒。 1.2 关节 滑雪过程中踝关节、膝关节、髋关节、肩关节都有不同的作用。 1.2.1 踝关节 脚踝锁住才能把刃离得更高。 推坡的时候锁住脚踝,感受上半身重心的移动控制推坡的速度。 1.2.2 肩关节 1. 什么是开肩? 上面图中的肩膀就是开肩,开肩可以获得更多的视野,也就是开肩后,头可以扭得角度更多,但是开肩的时候(比如像图中一样,向右后面开肩,肩会带动髋扭动,左腿就会弯曲,右腿就会蹬直,会导致重心靠后,重心靠后就会出现后脚扫雪的情况。 总结: 开肩的好处,可... Read More
-
一、TAO——工具包安装
1 什么是NVIDIA TAO工具套件 NVIDIA TAO工具套件基于TensorFlow和PyTorch构建,是NVIDIA TAO框架的低代码版本的AI框架,便于非专业人士训练模型。 2 开始使用 下载包含启动脚本、Jupyter notebooks和配置文件的TAO软件包。TAO支持在Google Colab上使用;如果你想在Colab上尝试,可以跳过这一步,直接滚动到下面的在colab中运行部分。 wget --content-disposition https://api.ngc.nvidia.com/v2/resources/nvidia/tao/tao-getting-started/versions/5.1.0/zip -O getting_started_v... Read More
-
二、计算机网络——TCP/IP 基础
要说我们开发人员接触计算机网络最多的协议,那势必离不开 TCP/IP 协议了,TCP/IP 协议同时也是互联网中最为著名的协议,下面我们就来聊一下 TCP/IP 协议。 1 TCP/IP 协议的历史背景 最初还没有 TCP/IP 协议的时候,也就是在 20 世纪 60 年代,许多国家和地区认识到通信技术的重要性。美国国防部希望能够研究一种即使通信线路被破坏也能够通过其他路线进行通信的技术。为了实现这种技术,出现了分组网络。 如上图所示,在两个节点通信的过程中,即使几个节点遭到破坏,却依然能够通过改变线路等方式达使两个节点之间进行通信。 这种分组网络促进了 阿帕网-ARPANET(Advanced Research Projects Agency Network) 的诞生。A... Read More
-
一、人工智能——基础知识
1 什么是AI模型 AI模型是指运用数学、统计、计算机科学和机器学习等领域的方法,对具有一定规律性和可预测性的数据进行分析、处理、预测和优化的数学模型。简单来说,可以自动从输入数据中学习和提取特征,并根据学习到的知识进行决策和预测。 比如:线性回归,决策树,学习矢量量化,深度神经网络DNN。目标检测算法模型 YOLO 就是基于这些基础的AI模型构建。 2 什么是AI框架 因为我之前学过 TensorFlow 和 Pytorch,所以我大概了解人工智能训练和推理的流程及原理。TensorFlow 和 Pytorch 就是常用的AI框架,这些框架的作用:提供了基本的神经网络模型(RNN,CNNS,SVM)、算法和优化器,使开发人员能够更轻松地创建自定义模型。 比如:目标检测常用模... Read More
-
5 Wireshark分析ip协议
https://blog.csdn.net/qq_34745941/article/details/128275325 Read More
-
四、WireShark抓包分析——RTSP协议
https://blog.csdn.net/baoecit/article/details/122909906 https://blog.csdn.net/zsz_shsf/article/details/130954191 https://www.cnblogs.com/mq0036/p/11187138.html https://zhuanlan.zhihu.com/p/658787798?utm_id=0 https://www.cnblogs.com/breakpointlab/p/16618170.html https://www.cnblogs.com/breakpointlab/p/15828119.html https://zhuanlan.zhihu.co... Read More
-
三、WireShark抓包分析——HTTP协议
1 TCP报文格式 1.1 TCP选项 常见的TCP选项有7种,如图所示: 1、kind=0,选项表结束(EOP)选项 一个报文段仅用一次。放在末尾用于填充,用途是说明:首部已经没有更多的消息,应用数据在下一个32位字开始处。 2、kind=1,空操作(NOP)选项 没有特殊含义,一般用于将TCP选项的总长度填充为4字节的整数倍。 3、kind=2,最大报文段长度(MSS)选项 TCP连接初始化时,通信双方使用该选项来协商最大报文段长度。TCP模块通常将MSS设置为(MTU减去40)字节(减掉的这40字节包括20字节的TCP头部和20字节的IP头部)。这样携带TCP报文段的IP数据报的长度就不会超过MTU(假设TCP头部和IP头部都不包含选项字段,并且这也是... Read More
-
二、WireShark抓包分析——UDP协议
UDP 叫做用户数据报协议(UDP,User Datagram Protocol),通过名称可以知道 UDP 把重点放在了数据报上,它为应用层提供了一种无需建立连接就可以直接发送数据报的方法。 UDP一共占8字节长度 Read More
-
一、WireShark抓包分析——ARP协议
1 计算机网络模型 首先,回顾一下基础的模型 2 ARP协议基础概念 arp(Address Resolution Protocol)协议,也称地址解析协议,是根据IP地址获取物理地址的一个TCP/IP协议。它可以解决同一个局域网内主机或路由器的IP地址和MAC地址的映射问题。 arp协议属于网路层协议。 APR协议是用在一个链路(局域网)里面查询MAC地址,每个设备(比如:电脑)和路由器都会有ARP缓冲 3 ARP协议的流程 ARP高速缓存表 当主机B要给主机C发送数据包时,会首先在自己的ARP高速缓存表中查找主机C的IP地址所对应的MAC地址,但未找到,因此,主机B需要发送ARP请求报文,来获取主机C... Read More
-
六、计算机网络——应用层
1 应用层概念 1.1 应用层协议的定义 1.2 应用层体系结构 2 进程通信 2.1 进程与计算机网络之间的接口 2.2 进程寻址 2.3 应用程序如何选择运输服务 2.4 因特网能够提供的运输服务 2.4.1 TCP 2.4.2 UDP 3 应用层协议 3.1 WWW 和 HTTP 3.1.1 URI / URL 3.1.2 HTML 3.1.3 HTTP ... Read More
-
四、计算机网络——传输层
1 运输层概述 2 TCP 和 UDP 前置知识 2.1 套接字 2.1.1 套接字类型 2.1.2 套接字处理过程 2.2 聊聊 IP 2.3 端口号 2.3.1 确定端口号 2.4 多路复用和多路分解 2.4.1 无连接的多路复用和多路分解 2.4.2 面向连接的多路复用与多路分解 3 UDP 3.1 UDP 特点 ... Read More
-
五、计算机网络——网络层
前面我们学习了运输层如何为客户端和服务器输送数据的,提供进程端到端的通信。那么下面我们将学习网络层实际上是怎样实现主机到主机的通信服务的。几乎每个端系统都有网络层这一部分。所以,网络层必然是很重要的。下面我将花费大量篇幅来介绍一下计算机网络层的知识。 1 网络层概述 网络层是 OSI 参考模型的第三层,它位于传输层和链路层之间,网络层的主要目的是实现两个端系统之间透明的数据传输。 网络层的作用从表面看上去非常简单,即将分组从一台主机移动到另外一台主机。为了实现这个功能,网络层需要两种功能 转发:因为在互联网中有很多路由器,这些路由器是构成互联网的基石,为什么这么说呢?因为路由器最重要的一个功能就是分组转发,就是靠着这些路由器,才会把一个个数据包通过链路传输给... Read More
-
三、计算机网络——数据链路层
1 基本概念 链路:是从一个结点到相邻结点的一段物理线路(下图红色或者蓝色的线就是链路,链路不能跨过路由或者交换机结点)。 数据链路:是在链路的基础上增加了一些必要的硬件(如网络适配器)和软件(如协议的实现),也就是加上的协议。 虽然链路定义不能跨过节点,但有时候说同一段链路,其实就是同一段局域网,也就是交换机连接成的局域网网络。 局域网属于数据链路层: 局域网虽然是个网络。但我们并不把局域网放在网络层中讨论。这是因为在网络层要讨论的是多个网络互连的问题,是讨论分组怎么从一个网络,通过路由器,转发到另一个网络。 同一个局域网中,分组怎么从一台主机传送到另一台主机,但并不经过路由表IP转发。而是通... Read More
-
二、计算机网络——物理层
1 物理层的基本概念 2物理层下面的传输媒体 传输媒体也称为传输介质或传输媒介,他就是数据传输系统中在发送器和接收器之间的物理通路。传输媒体课分为两大类,即导引型传输媒体和非导引型传输媒体 传输媒体不属于计算机网络体系结构的任何一层。如果非要将它添加到体系结构中,那只能将其放置到物理层之下。 2.1 导引型传输媒体 在导引型传输媒体中,电磁波被导引沿着固体媒体传播。 同轴电缆 双绞线 光纤 多模光纤 可以存在多条不同角度入射的光线在一条光纤中传输。这种光纤就称为多模光纤。 单模光纤 若光纤的直径减小到只有一个光的波长,则光纤就像一根波导那样,它可使光线一直向前传播,而不会产生多次反射。这样的光纤称为... Read More
-
一、计算机网络——基础知识
1 因特网概述 internet(互连网):是一个通用名词,它泛指多个计算机网络互连而成的网络。在这些网络之间的通信协议可以是任意的。 Internet(因特网):它指当前全球最大的、开放的、由众多网络互连而成的特定计算机网络,它采用TCP/IP协议族作为通信的规则,其前身是美国的ARPANET。 1.1 计算机网络 计算机网络: 由若干节点(Node)和链接这些节点的链路(Link)组成的网络。 网络中的节点:可以是计算机、交换器、集线器或者路由器等能够进行网络通信的终端设备。 链路:是一个节点到另外一个节点所走过的物理路线(铜线、光纤等)。 1.2 互连网 互连网: 多个网络通过路由器互连起来,这样就构成了一个... Read More
-
三、Socket编程发送GET请求
Read More
-
计算机网络——前言
Read More
-
二、HTTP协议概念及工作流程
这部分内容参考了哔哩哔哩燕十八: P1-HTTP协议概念及工作流程 P2-HTPP协议之方法与状态码 1 URI结构 HTTP 使用统一资源标识符(URI)来传输数据和建立连接。URL(统一资源定位符)是一种特殊种类的URI,包含了用于查找的资源的足够的信息,我们一般常用的就是 URL,而一个完整的URL 包含下面几部分: http://www.fishbay.cn:80/mix/76.html?name=kelvin&password=123456#first 1.协议部分:该 URL 的协议部分为 http:,表示网页用的是HTTP协议,后面的 // 为分隔符。 2.域名部分:域名是 www.fishbay.cn ,发送请求时,需要向 DNS 服务... Read More
-
一、PHP环境搭建
学习HTTP协议的过程中用到了PHP,所以先搭建PHP和Apache环境。PHP可以编写前后端程序,Apache是Web服务器。 PHP(PHP: Hypertext Preprocessor):即“超文本预处理器”,是在服务器端执行的脚本语言,尤其适用于Web开发并可嵌入HTML中。该语言当初创建的主要目标是让开发人员快速编写出优质的web网站。PHP同时支持面向对象和面向过程的开发,使用上非常灵活。 Apache(音译为阿帕奇):是世界使用排名第一的Web服务器软件。它可以运行在几乎所有广泛使用的计算机平台上,由于其跨平台和安全性被广泛使用,是最流行的Web服务器端软件之一。它快速、可靠并且可通过简单的API扩充,将Perl/Python等解释器编译到服务器中。 1 安装Ap... Read More
-
HTTP——前言
该部分知识学习链接:https://www.bilibili.com/video/BV1js411g7Fw/?spm_id_from=333.880.my_history.page.click&vd_source=e6b01e2e688ed9241677df121e4b897a Read More
-
rtsp视频流播放
rtsp://admin:QFXFDQ@192.168.101.18:554/Streaming/Channels/101 rtsp://admin:yangquan123@192.168.11.112:554/Streaming/Channels/101 gst-launch-1.0 rtspsrc location=rtsp://admin:YEERBA@192.168.10.11:554/Streaming/Channels/101 protocols=GST_RTSP_LOWER_TRANS_TCP latency=1000 ! rtph264depay ! h264parse ! nvv4l2decoder ! nv3dsink gst-launch-1.0 rtspsr... Read More
-
一、音视频基础知识
参考 参考1:音视频开发入门到提高-音视频核心知识精讲(https://www.bilibili.com/video/BV12h41157hE/?spm_id_from=333.999.0.0&vd_source=e6b01e2e688ed9241677df121e4b897a) Read More
-
五、qmake运行
可以通过在命令行上指定各种选项来自定义qmake运行时的行为。这些选项允许对构建过程进行微调,提供有用的诊断信息,并可以用于指定项目的目标平台。 1 命令语法 运行qmake的语法采用以下简单形式: qmake [mode] [options] files 注意:如果通过包管理器安装Qt,二进制文件可能为qmake6。 2 操作模式Operating Modes qmake支持两种不同的操作模式。在默认模式下,qmake使用项目文件中的信息生成Makefile,但也可以使用qmake生成项目文件。如果要明确设置模式,必须在所有其他选项之前指定它。模式可以是以下两个值之一: -makefile:qmake输出将是一个Makefile。 -project:qmak... Read More
-
四、qmake构建常见项目类型
本章描述了如何为基于Qt的三种常见项目类型(应用程序application、库library和插件plugin)设置qmake项目文件。尽管所有项目类型都使用许多相同的变量,但每个项目类型都使用项目特定的变量来自定义输出文件。 此处不描述特定于平台的变量。有关更多信息,请参阅Qt for Windows - Deployment和Qt for macOS。 1 构建应用程序 app模板告诉qmake生成一个用于构建应用程序的Makefile。使用此模板,可以通过将以下选项之一添加到CONFIG变量定义来指定应用程序的类型: 选项 描述 windows 应用程序是Windows图形用... Read More
-
二、Jetson安装搜狗输入法
1 安装fcitx和相关依赖 # 安装fcitx sudo apt-get install -y fcitx # 安装依赖 sudo apt install -y libqt5qml5 libqt5quick5 libqt5quickwidgets5 qml-module-qtquick2 sudo apt install -y libgsettings-qt1 2 语言支持选择fcitx 重启电脑 3 下载安装搜狗输入法 下载链接:https://shurufa.sogou.com/linux 4 问题 4.1 如果不显示选词框 sudo apt remove fcitx-module-kimpanel 在非KDE桌面环境下,如果安装了fcitx-modul... Read More
-
二、DeepStream GTK4环境安装
由于我使用的GTK4开发的GUI软件,而Jetson系统是Ubuntu20.04版本。Ubuntu20.04默认是不支持安装GTK4。 1 默认依赖环境 sudo apt-get -y install libncurses5 sudo apt-get -y install libelf++0 libelf1 libelf-dev sudo apt-get -y install libxml2 libxml2-dev libxml2-utils sudo apt-get -y install libxslt1-dev libxslt1.1 sudo apt-get -y install sysprof libpango1.0-dev sudo apt-get -y install ... Read More
-
三、qmake创建项目文件
项目文件(.pro)包含qmake构建应用程序、库或插件所需的所有信息。通常,您会使用一系列声明来指定项目中的资源,但简单的编程结构支持也使您能够描述不同平台和环境的不同构建过程。 1 项目文件元素 qmake使用的项目文件格式既可支持简单又可支持相当复杂的构建系统。简单的项目文件采用直接的声明式风格,定义标准变量来指示项目中使用的源文件和头文件。复杂的项目可能使用控制流结构来微调构建过程。 以下部分描述了项目文件中使用的不同类型的元素。 1.1 变量 在项目文件中,变量用于存储字符串列表。在最简单的项目中,这些变量告知qmake使用哪些配置选项,或提供构建过程中使用的文件名和路径。 qmake在每个项目文件中查找特定变量,并根据这些变量的内容决定应该写入Makefile的... Read More
-
二、qmake入门
这个教程教您qmake的基础知识。这份手册中的其他主题包含了关于使用qmake的更详细信息。 1 从简单开始 假设您刚完成了应用程序的基本实现,并且创建了以下文件: hello.cpp hello.h main.cpp 您会在Qt发行版的examples/qmake/tutorial目录中找到这些文件。关于应用程序的设置,您只知道它是用Qt编写的。首先,使用您喜欢的纯文本编辑器,在examples/qmake/tutorial中创建一个名为hello.pro的文件。您需要做的第一件事是添加告诉qmake您的开发项目中包含哪些源文件和头文件的行。 我们首先向项目文件添加源文件。为此,您需要使用SOURCES变量。只需以SOURCES += 开始新行并在其后添加h... Read More
-
一、qmake概述
qmake工具为您提供了一个以项目为中心的系统,用于管理应用程序、库和其他组件的构建过程。这种方法使您可以控制使用的源文件,并允许以简洁的方式描述过程中的每个步骤,通常在单个文件内完成。qmake将每个项目文件中的信息扩展为一个Makefile,该Makefile执行编译和链接所需的命令。 1 描述项目 项目通过项目文件(.pro 文件)的内容来描述。qmake使用这些文件中的信息生成Makefile,这些Makefile包含了构建每个项目所需的所有命令。项目文件通常包含源文件和头文件的列表、一般配置信息,以及任何特定于应用程序的细节,例如链接的额外库列表或使用的额外包含路径列表。 项目文件可以包含多种不同元素,包括注释、变量声明、内置函数和一些简单的控制结构。在大多数简单项目中... Read More
-
3 Chapterthreeqt框架功能概述
3 ALL Modules 3.1 Qt Essentials(基础模块) 模块名称 描述 Qt Core 其他模块使用的核心非图形类。 Qt D-Bus 用于通过D-Bus协议进行进程间通信的类。 Qt GUI 图形用户界面(GUI)组件的基类。 Qt Network 使网络编程更简单、更便携的类。 Qt QML 用于QML和JavaScript语言的类。 Qt Quick ... Read More
-
第2章 GUI程序设计基础
2.1 GUI程序结构与运行机制 本小节2.1对应的示例程序是 samp1_1HelloWorld_qmake 2.1.1 GUI项目文件组成 samp2_1.pro: 是qmake构建系统的项目配置文件,其中存储了项目的各种设置内容。 widget.ui: 是UI文件,这是用于窗口界面可视化设计的文件。 main.c: 是主程序文件,包含main()函数。 widget.h: 是窗口类定义头文件,它用到了UI文件widget.ui中的一个可视化设计的窗口界面。 widget.cpp: 是对应于widget.h的源程序文件。 2.1.2 项目配置文件 如果使用qmake构建系统,就会生成后缀 .pro 的项目配置文件(通过点击.pr... Read More
-
qmake前言
如果使用qmake构建系统,就会生成后缀 .pro 的项目配置文件。 qmake工具有助于简化跨不同平台的开发项目的构建过程。它自动化生成Makefile的过程,因此只需要几行信息就能创建每一个Makefile。即使软件项目不是用Qt编写的,你也可以使用qmake。 qmake基于项目文件中的信息生成Makefile。项目文件由开发者创建,通常很简单,但对于复杂的项目,也可以创建更复杂的项目文件。 qmake包含了支持Qt开发的附加功能,能够自动包含元对象编译器(meta-object compiler,MOC)和用户界面编译器(user interface compiler,UIC)生成构建规则。 qmake还能为Microsoft Visual Studio生成项目,而无需... Read More
-
第1章 认识Qt
Qt是一个跨平台应用开发框架(framework),它是用C++语言写的一套类库。使用Qt能为桌面计算机、服务器、移动设备甚至单片机开发各种应用(application),特别是图形用户界面(graphical user interface)程序。 1.1 Qt简介 1.1.1 Qt的跨平台开发能力 Qt具有跨平台开发能力。Qt能用于如下一些设备的平台的应用开发。 桌面应用开发,支持桌面操作系统包括Windows、桌面Linux、macOS。 手机和平板计算机等移动设备的应用开发,支持移动操作系统包括 Android、iOS和Windows。 嵌入式设备的应用开发,支持的嵌入式操作系统包括QNX、嵌入式Linux和VxWorks等。 MCU的应用开发,支持嵌入... Read More
-
一、编译工具链GCC——基础知识
1 基本概念 gcc是linux系统集成的编译器,gcc是可以编译C++程序的,gcc原名GNU C Compiler,最初是C语言的编译器,但是经过发展之后,它变成了一个可以支持C++、Fortran、Pascal、Objective-C、Java、Ada,以及Go与其他语言编译的编译器套件,其名称也因此改为了GNU Compiler Collection。g++便是其中的一部分,用于处理c++语言。虽然大多数情况下,我们直接使用g++命令来编译c++程序,但直接使用gcc命令也可以编译C++程序的,当然前提是安装了g++(gcc-c++)模块。gcc命令会根据源程序的后缀名来决定实际使用的编译器,编译过程与直接使用g++完全一样,但是,链接过程有点不同。g++命令会自动给你加上... Read More
-
Qt6编译部分
2 Qt Creator编译环境 2.1 Qt 交叉编译环境 https://download.qt.io/official_releases 源文件路径:C:\Qt\SourcesCode\qt-everywhere-src-6.6.1 GCC编译器路径:C:\Program Files (x86)\Arm GNU Toolchain aarch64-none-linux-gnu\13.2 Rel1 Read More
-
Qt6 前言
这类型主要记录Qt6的学习笔记,目前主要是学习: Qt6 C++开发之南 王维波书籍学习 Read More
-
编译工具链 前言
一个知识要学好几遍,这次返回来学习构建系统,顺便把编译工具链的知识整理一下。 编译工具链(Toolchain)是一组用于将源代码转换为可执行程序或其他目标文件的软件工具的集合。这些工具通常包括编译器、汇编器、链接器和库文件,它们协同工作以将源代码翻译成可执行文件或库。 1 编译流程 预处理(Preprocessing) 编译(Compilation) 汇编(Assemble),可以是 as 进行汇编。 链接(Linking),可以是 ld 执行链接,注意:分为静态库链接和动态库链接。 2 常见编译工具链 以下介绍常见C/C++编译工具链。 2.1 GNU Compiler Collection (GCC) GCC 是一个开源的编译工具链,支持多种编... Read More
-
一、Jetson安装JetPack
2024年6月:以下操作我都使用的是 Ubuntu 18.04,使用 Ubuntu 20.04 会出现flash错误。(暂时没有研究为什么出现错误,官网说20.04系统也可以刷机) 2024年12月:使用 Ubuntu 20.04 均可以正常给 Xavier Nx 和 Orin Nx 刷机 1 安装 SDK Manager NVIDIA SDK Manager为主机和目标设备的NVIDIA DRIVE, Jetson, Holoscan, Rivermax, DOCA和以太网交换机SDK提供端到端开发环境设置解决方案。 下载链接:https://developer.nvidia.com/sdk-manager 2 Jetson安装系统... Read More
-
一、DeepStream项目计划
1 迭代项目记录 VideoPlatform-1.0第一代使用的是GTK3+DeepStream, VideoPlatform-2.0第二代使用的是GTK4+DeepStream,JetPack系统是5.1 VideoPlatform-3.0第三代是过渡版本 这一代取消的IPC搜索(onvif搜索) 元构建系统使用Meson 编译问题 关于 Read More
-
二、CPU架构
Intel CPU架构 “x86”和”x64”是两种不同的计算机架构类型,它们主要涉及CPU处理能力、内存寻址以及软件兼容性等方面的区别。 x86 定义:x86最初是指Intel开发的一系列兼容微处理器的架构,基于Intel 8086 CPU。随着时间的发展,x86成为了指32位处理器架构的通用术语,不仅限于Intel的产品,也包括了AMD等公司生产的兼容处理器。 特点:x86架构主要是32位的,这意味着它在寻址方面的能力限制为最大4GB的物理内存(理论上),这是由于32位寻址空间的限制。 软件兼容性:x86架构支持大量的32位应用程序和操作系统,兼容性非常广泛。 x64 定义:x64,也称为x86-64或AMD64(由AMD最初提出),是x86架构的64位扩展。这种架构... Read More
-
一、x86安装DeepStream
dGPU Setup for Ubuntu 本节介绍在安装DeepStream SDK之前,如何准备一个NVIDIA dGPU设备的Ubuntu x86_64系统。 注意:本文使用术语“dGPU”独立GPU(discrete GPU)来指代NVIDIA GPU扩展卡产品,例如NVIDIA Tesla® T4、NVIDIA® Hopper、NVIDIA® Ampere、NVIDIA® ADA、NVIDIA GeForce® GTX 1080、NVIDIA GeForce® RTX 2080、NVIDIA GeForce® RTX 3080、NVIDIA GeForce® RTX 4080以及GeForce®/NVIDIA RTX/QUADRO系列。此版本的DeepStream SDK... Read More
-
一、CUDA官方文档介绍
1 CUDA 编程手册系列第一章:CUDA 简介 1.1 我们为什么要使用GPU GPU(Graphics Processing Unit)在相同的价格和功率范围内,比CPU提供更高的指令吞吐量和内存带宽。许多应用程序利用这些更高的能力,在GPU上比在CPU上运行得更快。其他计算设备,如FPGA,也非常节能,但提供的编程灵活性要比GPU少得多。 GPU和CPU在功能上的差异是因为它们的设计目标不同。虽然 CPU 旨在以尽可能快的速度执行一系列称为线程的操作,并且可以并行执行数十个这样的线程。但GPU却能并行执行成千上万个(摊销较慢的单线程性能以实现更大的吞吐量)。 GPU 专门用于高度并行计算,因此设计时更多的晶体管用于数据处理,而不是数据缓存和流量控制。 下图显示了 CPU... Read More
-
三、乐理
la so mi so la so, mi so la so mi re do la so re do, mi — si — Read More
-
二、乐理
11 音符的名称、小节 中间的线就是小节线 上面的简谱是4分音符分一拍,一小节有两拍。举例: 一个四分音符+两个八分音符是一小节。 四个八分音符是一小节。 八个十六分音符是一小节。 12 附点、休止符 13 常用的四拍子 全音符就是四拍,二分音符就是两拍,四分音符就是一拍,八分音符就是0.5拍或者半拍,十六分音符就是0.25拍或者四分之一拍。 14 常用的八拍子 就是四分音符 + 八分音符 15 强弱关系、单拍子、复拍子 律动就是强弱关系。2/4就是动次、动次、动次、、、、 3/4就是动次次、动次次、动次次、、、、 4/4就是动次打次、动次打次、动次打次、、、、 6/8就... Read More
-
一、乐理
课程学习来自:【四川音乐学院作曲硕士】零基础自学音乐学乐理合集-第一季(精简版)/已完结 1 认识简谱的构造 2 认识音名 1234567也叫音符 3 初步理解1=C (调号) 钢琴一共有88个键,除了最左边三个键(两个白的一个黑的)和最右边的一个白键。可以分为7组按键(每组7个白键+5个黑键)。 1=?,1就是从?键上出发,1的位置一旦确定,234567的位置也跟着确定。 4 黑键怎么表示 5 半音&全音 半音:相邻的两个音,它们之间的距离就是一个半音。(C键和C#键,也就是相邻白键和黑键的距离就是一个半音) 全音:两个半音。 注意:E到F是一个半音(因为中间没... Read More
-
二十三、GstElement
1 GstElement基本概念 GstElement是构建可用于GStreamer管道的元素所需的抽象基类(不可实例化)。有关创建GstElement子类的更多信息,请参阅插件编写指南。 使用gst_element_get_name可以获取GstElement的名称,并使用gst_element_set_name进行设置。为了提高速度,在核心中使用GST_ELEMENT_NAME时,需要使用适当的锁。不要在插件或应用程序中使用此功能,以保留ABI兼容性。 元素可以拥有GstPad类型的pad。这些pad链接到其他元素上的pad。GstBuffer在这些链接的pad之间流动。GstElement具有GstPad结构的GList,... Read More
-
GStreamer设计-前言
这部分内容来自: GStreamer design documents:里面讲述了各种GStreamer设计文档。这些文档是在开发或重构GStreamer设计部分时产生的技术文档,用来解决问题的设计解决方案。 Core Library:里面讲述了GStreamer核心对象相关服务和功能,包括初始化、插件管理和类型,以及定义元素和bin的对象层次结构,以及一些更专门的元素。 GStreamer Writer’s Guide:本章节旨在帮助您了解GStreamer框架,以便您可以开发新的插件来扩展现有功能。本指南通过跟踪一个用c编写的示例插件(一个音频过滤器插件)的开发来解决大多数问题。然而,本指南的后面部分还介绍了编写其他类型插件所涉及的一些问题,本指南的末尾描述了一些用于... Read More
-
二十二、GstPad
1 GstPad基本概念 GstElement通过“pads”与其他元素连接,这些 pads 是极其轻量级的通用连接点。 Pads具有GstPadDirection,source pads 产生数据,sink pads 消耗数据。Pads通常是从GstPadTemplate创建的,可以使用 gst_pad_new_from_template 创建,然后添加到GstElement中。这通常发生在元素创建时,但也可以根据元素处理的数据或应用程序请求的 pads 动态发生。没有 pad 模板的 pads 可以使用 gst_pad_new 创建,它接受方向和名称作为参数。如果名称为NULL,则会分配一个确保唯一的名称。 创建 pad 的... Read More
-
二十一、GstPadTemplate
1 GstPadTemplate基本概念 Padtemplates描述了一个pad或element factory可以处理的可能媒体类型media types。这使得在加载元素插件Element plugin之前可以检查处理的类型,以及识别尚未创建(请求Request或有时的Sometimes)元素上的pads成为可能。 Pad和PadTemplates附加了GstCaps来描述它们能够处理的媒体类型。使用gst_pad_template_get_caps或GST_PAD_TEMPLATE_CAPS可以获取padtemplate的caps。创建后不可能修改padtemplate的caps。 PadTemplates有一个GstP... Read More
-
二十、GstEvent
1 GstEvent基本概念 事件GstEvent是在元素pad间传递,也可以通过应用程序传递给元素的pad. 事件在元素之间传递,与数据流并行进行。有些事件与缓冲区序列化,而其他事件则没有。有些事件只能向下游传递,而其他事件只能向上游传递。有些事件可以同时向上游和下游传递。 事件用于在数据流中发出特殊条件的信号,例如 EOS(流结束)或开始新的流段。事件还用于清除管道中的任何挂起数据。 大多数事件 API 在插件内部使用。应用程序通常只构造和使用寻址事件。为此,可以使用 gst_event_new_seek 来创建一个寻址事件,以指定寻址时间和模式。 GstEvent *even... Read More
-
十九、GstMessage
1 GstMessage基本概念 消息是继承于 GstMiniObject 的子类,其内容是一个通用的 GstStructure。这样做可以编写自定义消息而无需进行 API 更改,同时允许各种不同类型的消息。 消息由管道中的对象发布,并通过 GstBus 传递给应用程序。 在 GstBus 上发布消息的基本使用模式如下: gst_bus_post (bus, gst_message_new_eos()); 通常,GstElement 使用 gst_element_post_message 在其父容器提供的总线上发布消息。 2 GstMessage类型结构 2.1 GstMessage类型注册宏定... Read More
-
十八、GstStreamCollection
1 GstStreamCollection基本概念 可获得GstStream的集合。 GstStreamCollection将由可以提供这些流的元素提供。应用程序可以使用集合来向用户展示可用的流,使用 gst_stream_collection_get_stream()。 一旦发布,GstStreamCollection就是不可变的。更新是通过发送新的GstStreamCollection消息来完成的,这个新消息可能会或可能不会与它替换的集合共享一些GstStream对象。接收者可以检查流集合消息的发送者,以了解哪个集合已过时。 管道中的多个元素可以提供GstStreamCollection。 ... Read More
-
十七、GstStreams
1 GstStream基本概念 GstStream对象是一个高级对象,定义了一个数据流,在GstPipeline中存在或可以存在。 它由一个唯一标识符“Stream ID”定义。一个GstStream并不自动意味着该流在管道或元素中存在。 能够在管道中引入新流的任何元素都应该创建适当的GstStream对象,并可以通过GST_EVENT_STREAM_START事件和/或GstStreamCollection传递该对象。 不修改流的性质的元素可以为其添加额外信息(例如丰富GstCaps或GstTagList)。这通常是由解析元素完成的。 1.1 GstStreams继承关系 GObject ... Read More
-
12月第一周
给以下markdown表格音标列添加音标,要求是英国音标,只要第一列是有单词的时候,才添加音标。每一个行每一列的空格平均分配。最后以markdown可复制表格形式输出: Dec-1 单词 音标 词性与释义 附加信息 leave v.离开;离去;留下 leave left left left adj.左边的;剩余的 v. leave 的过去式和过去分词 lease... Read More
-
十六、GstTaskPool
1 GstTaskPool基本概念 GstTaskPool中提供了两种对象,GstTaskPool 和 GstSharedTaskPool,其中共享任务池仅仅在线程池中创建了一个线程(最大可执行线程数是1),而 GstTaskPool 没有同时最大可执行线程数量限制。 创建GstTaskPool对象后,必须要使用 gst_task_pool_prepare 函数创建线程池,否则,没有线程池执行任务函数。 2 GstTaskPool类型结构 2.1 GstTaskPool结构分析 2.2 GstTaskPool相关函数总结 /** * @brief: 创建一个GstTaskPool对象 * @note: 此时并没有创建 G... Read More
-
十五、GstTask
1 GstTask基本概念 GstTask是由GstElement和GstPad用于提供在GstPipeline中进行数据传递的线程的工具。 通常情况下,GstPad会启动一个GstTask来将数据推送到到对等GstPad中,或者从对等GstPad中获取数据。大多数source元素会启动一个GstTask来推送push数据。在某些情况下,分离器demuxer元素可以启动一个GstTask来从对等元素中拉取数据。这通常在分离器demuxer可以对上游对等元素执行随机访问以提高性能时执行。 尽管GstPad上存在用于启动start/暂停pause/停止stop任务tasks的便捷函数,但如果与GstPad无关,有时可能需要手动创建G... Read More
-
十四、GstContext
1 GstContext基本概念 GstContext 是一个容器对象,用于存储诸如设备上下文、显示服务器连接以及应在多个元素之间共享的类似概念。 应用程序可以通过使用 gst_element_set_context 在整个管道上设置上下文,然后该上下文将被传播到所有子元素。元素可以在 set_context 中处理这些上下文,并将它们与已有的上下文信息合并。 当一个元素需要一个上下文时,它将按以下顺序执行以下操作,直到其中一个步骤成功: 检查元素是否已经有一个上下文。 使用 GST_QUERY_CONTEXT 向下游查询上下文。 使用 GST_QUERY_CONTEXT 向上游查... Read More
-
十三、GstTagList
1 GstTagList基本概念 用于描述媒体metadata元数据的标签tag和值value的列表。 结构中的字符串必须是ASCII或UTF-8编码。不允许使用其他编码。字符串不得为空或为%NULL。 2 GstTagList类型结构 2.1 GstTagList类型注册宏定义 /* filename: gsttaglist.h */ GST_API GType _gst_tag_list_type; #define GST_TYPE_TAG_LIST (_gst_tag_list_type) /* filename: gsttaglist.c */ GType _gst_tag_list_type = 0; ... Read More
-
十二、GstBufferList
1 GstBufferList基本概念 缓冲列表(Buffer lists)是包含一系列缓冲(buffers)的对象。 缓冲列表可以通过 gst_buffer_list_new 创建,并使用 gst_buffer_list_insert 填充数据。 当需要一次性推送多个缓冲时,可以使用 gst_pad_push_list 将缓冲列表推送到源端口(srcpad)。这在需要推送多个缓冲时非常有用,因为它可以减少逐个推送每个缓冲时的开销。 GstBufferList中的buffer需要用户自己申请内存空间,然后使用 gst_buffer_list_insert 插入到列表中 2 GstBufferList... Read More
-
十一、GstCpas
1 GstCpas基本概念 Caps(capabilities)是描述媒体类型的轻量级引用计数对象。它们由一系列 GstStructure 组成。 Caps 在 GstPadTemplate 上公开,用于描述给定 pad 可以处理的所有可能类型。它们也存储在 GstRegistry 中,连同 GstElement 的描述一起。 Caps 通过element pads 上的 gst_pad_query_caps 函数公开。这个函数描述了 pad 在运行时可以处理或产生的可能类型。 可以使用以下代码片段构建 GstCaps: GstCaps *caps = gst_caps_new_simple ("video/... Read More
-
十、GstCapsFeatures
1 GstCapsFeatures基本概念 GstCapsFeatures 可以选择性地设置在 GstCaps 上,以添加对特定 GstStructure 的额外特性要求。具有相同名称但带有非等值特性集的 Caps 结构不兼容。如果一个 pad 支持多组特性,它必须添加多个相同的结构,但具有不同的特性集到 caps 中。 空的 GstCapsFeatures 等同于仅包含 GST_CAPS_FEATURE_MEMORY_SYSTEM_MEMORY 的 GstCapsFeatures。任何由 gst_caps_features_new_any 创建的 ANY GstCapsFeatures 与其他任何 GstCapsFeatures 相等,并可用于指... Read More
-
九、GstPoll
1 GstPoll基本概念 GstPoll 类似于 fd_set(与 select() 一起使用)或 struct pollfd 数组(与 poll() 一起使用),用于跟踪文件描述符。一旦通过 gst_poll_new 创建,这个集合就可以用来等待文件描述符变为可读和/或可写。通过在创建集合时(或稍后调用 gst_poll_set_controllable)为 controllable 标志指定 TRUE,可以使这种等待受控。 新的文件描述符通过 gst_poll_add_fd 添加到集合中,并通过 gst_poll_remove_fd 移除。控制哪些文件描述符应该等待变为可读和/或可写是通过使用 gst_poll_fd_ctl_read、gs... Read More
-
八、GstBufferPool
1 GstBufferPool基本概念 GstBufferPool 是一个用于re-allocate(预分配p)和recycle(回收再利用)具有相同大小和属性的buffer的对象。 通过 gst_buffer_pool_new 创建 GstBufferPool。创建后,需要进行配置。使用 gst_buffer_pool_get_config 获取池的当前配置结构。通过 gst_buffer_pool_config_set_params 和 gst_buffer_pool_config_set_allocator 可以配置bufferpool的参数和分配器。根据bufferpool的实现,还可以配置其他属性。 缓冲池buffer... Read More
-
11月单词
给以下markdown表格音标列添加音标,要求是英国音标,只要第一列是有单词的时候,才添加音标。每一个行每一列的空格平均分配。最后以markdown可复制表格形式输出: Nov-28 单词 音标 词性与释义 附加信息 experience /ɪkˈspɪərɪəns/ v. 经历;体验 n.经验;阅历 experienced /ɪkˈspɪərɪənst/ adj.有经验的 v. “exp... Read More
-
七、GstBuffer
1 GstBuffer基本概念 缓冲区(Buffers)是 GStreamer 中数据传输的基本单元。Buffers包含事件timing、偏移量offset、GstMemory和GstMemory块相关联的其他任意元数据metadata。 通常使用 gst_buffer_new 创建缓冲区。创建缓冲区后,通常会为其分配内存并将其添加到缓冲区中。以下示例创建了一个可以容纳给定宽度、高度和每像素位数的视频帧的缓冲区。 GstBuffer *buffer; GstMemory *memory; gint size, width, height, bpp; ... size = width * height * bpp; ... Read More
-
六、GstMeta
1 GstMeta基本概念 GstMeta 结构应作为 GstBuffer 元数据结构的第一个成员被包含。该结构定义了元数据的 API,并且应该对所有使用该元数据的元素可访问。 元数据 API 通过 gst_meta_api_type_register 注册,该函数接受元数据 API 的名称和一些与元数据相关联的标签。通过 gst_meta_api_type_has_tag,可以检查某个元数据 API 是否包含给定的标签。 可以注册多个元数据 API 的实现。要实现一个元数据 API,应该使用 gst_meta_register。这个函数接受创建、释放和转换元数据所需的所有参数,以及元数据的大小。该函数返回一个 GstMetaInfo 结构,其中包含实现 API 的信息。 特定... Read More
-
五、GstMemory
1 GstMemory基本概念 GstMemory 是一个轻量级的引用计数对象(继承于GstMiniObject),用于包装内存区域。 GstBuffer 的就是由多个 GstMemory 构成。一个 GstMemory 对象有一个分配的内存区域,最大大小为 maxsize。在内存对象的生命周期内,最大大小不会改变。内存还有一个偏移量和大小属性,用于指定分配区域内有效的内存范围。 GstMemory 通常由分配器通过 gst_allocator_alloc 方法调用创建。当使用 NULL 作为分配器时,将使用默认分配器。可以通过 gst_allocator_register 注册新的分配器。分配器通过名称标识,并可以通过 gst_allocator_find 检索。可以... Read More
-
三、内存对齐
1 为什么要内存对齐 现在的操作系统一般都是32位或者64位,一次性内存访问可以读取4个字节或者8个字节。 比如我们使用64位操作系统,地址从0开始,我们把8字节double放到了0x4位置。系统读取内存的时候,就需要两次读取再合并数据。先从0x0读取8字节,再从0x08读取8字节。 2 内存对齐规则 第一个成员在与结构体变量偏移量为0的地址处。 其他变量要对齐到某个数字(对齐数)的整数倍的地址处(一般对齐数都等于成员本身占用内存字节数) 结构体总大小为最大对齐数(每个成员变量都有对齐数)的整数倍 3 举例 示例程序目录/assets/CProgrammingLanguage/02_MemoryAlignmen... Read More
-
四、GstAllocator
1 GstAllocator基本概念 GstAllocator 是用来创建内存 GstMemory。 内存(GstMemory)通常是通过分配器使用 gst_allocator_alloc 方法调用创建的。当使用 NULL 作为分配器时,将使用默认的分配器。 可以通过 gst_allocator_register 注册新的分配器。分配器通过名称来识别,并且可以通过 gst_allocator_find 检索。可以使用 gst_allocator_set_default 来更改默认分配器。 可以使用 gst_memory_new_wrapped 创建新的内存,该方法包装在其他地方分配的内存。 注意: GstAllocator是一个抽象对象,意味着它只能被继承,... Read More
-
十四、GInitiallyUnowned类型
1 GInitiallyUnowned基本概念 一个用于具有初始浮动引用的对象的类型。该对象继承于GObject,除了实例初始化的时候把该对象初始位浮点引用外,其余都和GObject对象一样。 我们在GTK库或者其他库的时候,使用继承 GInitiallyUnowned 的GTK对象,处于浮点状态的时候,不能直接解引用。 浮点引用状态调用 g_object_ref_sink ,浮点引用状态变成正常引用状态,引用数不变。 正常引用状态调用 g_object_ref_sink ,引用数 +1。 2 GInitiallyUnowned结构体与定义 通过查看 gobject 源文件和头文件,不难发现 GInitiallyU... Read More
-
三、GstObject
1 GstObject基本概念 GstObject为由GStreamer库填充的对象层次树提供了一个root。它目前是GInitiallyUnowned之上的一个简单封装。它是一个抽象类,不能单独使用(不能被实例化)。 GstObject提供了基本的引用计数、父对象功能和锁定。大多数函数只是针对特殊的GStreamer需求进行了扩展,并且可以在其基类GObject中找到相同的名称(例如,g_object_ref变为gst_object_ref)。 由于GstObject派生自GInitiallyUnowned,它还继承了浮动引用。请注意,诸如gst_bin_add和gst_element_add_pad之类的函数会获取浮动引用的所有权。 与GObject实例相比,GstObje... Read More
-
二、valist的使用方法(队可变参数的处理)
va_list是C语言中解决可变阐述的一组宏,很多不确定输入参数个数的函数,会在函数定义的时候调用##__VA_ARGS__宏变量来表示“…”可变参数,在函数中需要处理这一组可变参数,需要用到va_list相关的宏操作组函数,具体函数介绍如下: val_list:宏定义了一个指针类型,这个指针类型指向参数列表中的参数 void va_start(va_list ap,last_arg):修改了用va_list申明的指针,比如ap,使这个指针指向了不定长阐述列表省略号中的第一个参数 type va_arg(va_list ap,type):获取参数列表的下一个参数,并以type类型返回 void va_end(... Read More
-
二、GstMiniObject
1 GstMiniObject基本概念 “GstMiniObject” 是一个简单的结构体,可用于实现引用计数类型。 GstMiniObject使用的是 G_DEFINE_BOXED_TYPE 进行的定义。(也就是结构体对象,并没有普通对象的信号,属性等功能),GstMiniObject内部实现了引用计数功能。 具体G_DEFINE_BOXED_TYPE可以参考GObject学习笔记 因为不是GObject对象,所以不能使用GObject的相关函数,比如常用的 g_object_new, g_object_unref等函数。仅仅是注册一个GType类型。 子类将在其结构体中首先包含 “GstMiniObject”,然... Read More
-
一、GstStructure
1 GstStructure 基本概念 GstStructure 是由一个结构体名称(用GQuarks表示)和一组键/值对组成的对象。键用 GQuarks 表示(GQuarks其实就是字符串,但是字符串和数字一一映射起来,为了字符串使用起来便利),而值可以是任何 GType 类型。结构体名称以字母开头,可以由字母、数字以及”/-_.:”中的任何字符组成。 GstStructure 没有引用计数,因为它通常是更高级对象的一部分,例如 GstCaps、GstMessage、GstEvent、GstQuery。它提供了一种通过父级的引用计数来实施可变性的方法,可以使用 gst_structure_set_parent_refcount 方法。 ... Read More
-
十三、GValue学习笔记
我第一次学习GValue应该是二零二一年九月九日,那是一段最美的时光。漫山遍野你的脸庞,唯有遗忘是最漫长。那时候刚接触GLib库,我在CSDN中,给这一概念放到了GLib分类中记录,其实是错误的。 GValue 是 GObject 系统中用于通用值存储的结构体。它被设计用来存储各种不同类型的值,包括基本数据类型、对象类型等。也就是说,所有GType类型系统注册的类型,都可以被GValue存储。 GValue 可以看作是一个变量容器,由类型标识符(GType)和类型的特定值组成。 要创建一个未定义的 GValue 结构体,并使用,有以下步骤注意: 只需创建一个零填充的 GValue 结构体即可。(因为该结构体里面有联合体,需要把所有空间置零) ... Read More
-
十二、GBoxed类型
学习GStreamer过程中,有很多基本对象是通过 G_TYPE_BOXED 宏进行定义的。所以我们在GObject库学习过程中,很有必要对此做一下总结。 1 结构体封装对象特点 G_DEFINE_BOXED_TYPE` 在 GObject 系统中是一个宏,用于定义新的 “boxed type” 。GObject 的 boxed types 用于处理纯旧数据(POD)结构,这些数据类型如结构体或联合体,并使其与 GObject 类型系统兼容。 定义了 boxed type 后,你可以在 GObject 系统中,例如在 GValue 或信号中,使用这些类型。 这类型对象没有信号,属性,引用计数等GObject具有的特性。 GBoxed不区分实例... Read More
-
十一、接口补充
九、接口 已经讲了接口的一些知识,我在这里对接口进行补充一下。 接口的总结不放到第十节讲的原因是,这已经不是一个标准对象的相关声明与定义宏。我这里讲的标准对象是具有类结构体和实例结构体,而且具备引用计数等特性。而接口具有以下特点。 1 接口结构体定义 只有接口结构体定义(结构结构体可以理解成前几章讲的类结构(或者抽象类)),没有实例结构体,也就是实例结构体就不定义和注册。 /* 接口结构体定义 */ struct _TComparableInterface { GTypeInterface parent; /* signal */ void (*arg_error) (TComparable *self); /* virtual function... Read More
-
一、GLib——GQuark
1 GQuark概念 Quark 是字符串和整数标识符之间的关联。给定字符串或 GQuark 标识符,可以检索到另一个。 Quark 被用于数据集和键控数据列表。 要从字符串创建一个新的 quark,请使用 g_quark_from_string() 或 g_quark_from_static_string()。 要找到与给定 GQuark 对应的字符串,请使用 g_quark_to_string()。 要找到与给定字符串对应的 GQuark,请使用 g_quark_try_string()。 用于 quark 函数的字符串池的另一个用途是字符串规范化,使用 g_intern_string() 或 g_intern_static_string()。规范化的字符串是字符串的规... Read More
-
GStreamer核心对象-前言
1 GStreamer核心对象如何学习 每一章都是如何布置结构,如何去学习 核心对象基本概念,基本概念基本都来自GStreamer官网开头的前几段。 核心对象基本结构。 核心对象类型注册定义,例如:G_DEFINE_TYPE、G_DEFINE_BOXED_TYPE等等。 这一节要包含结构体定义(头文件里面的结构体和源文件里面的结构体),特别要注意非标准GObject对象,可能会通过头文件是对象Public成员,源文件是对象Private成员。标准GObject对象可能会有私有结构体。 源文件和头文件中的枚举类型,每种枚... Read More
-
GLib——前言
Gio—2.0: Gio是一个提供通用输入输出 (I/O)、网络、进程间通信 (IPC)、设置settings以及其他高级应用功能的类的库。 C headers: gio/gdesktopappinfo.h, gio/gfiledescriptorbased.h , gio/gio.h , gio/gunixfdmessage.h , gio/gunixinputstream.h , gio/gunixmounts.h , gio/gunixoutputstream.h pkg-config files: gio-2.0 , gio-unix-2.0 GLib—2.0: 基础实用程序库。GLib是一个通用、可移植的实用程序库,提供了许... Read More
-
十、声明和定义类型宏总结
1 G_DEFINE_XX_TYPE 学习GStreamer过程中,代码中用到了一些其他的 G_DEFINE_XX_TYPE ,我在这里补充总结一下。 普通对象 G_DEFINE_TYPE:普通的GObject继承对象。 抽象对象 G_DEFINE_ABSTRACT_TYPE:抽象对象不能创建实例。它只能被继承。 最终对象 G_DEFINE_FINAL_TYPE:最终对象,没有自己的类结构体成员。 接口对象 G_DEFINE_INTERFACE:接口对象可以当做一个抽象类来看待(注册该类型的时候也就仅仅注册了类,并没有注册实例结构体),但是与抽象类不同的是,虚函数可以由任意对象实现。 结... Read More
-
九、接口
接口类似于抽象类。接口定义了虚拟函数,这些函数预期会被另一个可实例化对象中的函数覆盖。 本节提供了一个简单的例子,TComparable。TComparable 是一个接口。它定义了比较的函数,这些函数包括: t_comparable_cmp(self, other):它比较 self 和 other。第一个参数 self 是运行 t_comparable_cmp 的实例。第二个参数 other 是另一个实例。这个函数需要在实现了该接口的对象中被覆盖。 如果 self 等于 other,t_comparable_cmp 返回 0。 如果 self 大于 other,t_compar... Read More
-
八、子类扩展父类的功能
本节的示例是 TNumStr 对象。TNumStr 是 TStr 对象的子类。TNumStr 包含一个字符串及其类型,类型为 t_int、t_double 或 t_none。 t_int:字符串表示一个整数 t_double:字符串表示一个双精度(浮点)数 t_none:字符串不表示上述两种数字 t_int 或 t_double 类型的字符串被称为数字字符串。这不是一个通用术语,仅在本教程中使用。简而言之,数字字符串是表示数字的字符串。例如,”0”、”-100” 和 “123.456” 都是数字字符串。它们是字符串,同时表示数字。 “0” 是一个字符串。它是一个字符数组,其元素是 ‘0’ 和 ‘\0’... Read More
-
七、可派生和非抽象类型
创建非抽象可派生类型比创建抽象类型更常见。本节介绍如何创建非抽象可派生类型对象。派生类型的例子是string的对象。它是TStr。它的子对象是一个数字字符串对象。数字字符串是表示数字的字符串。例如“0”、“-100”、“123.45”。子对象(数字字符串)将在下一节中解释。 我想先写字符串,再写可派生对象。因为TStr是字符串的对象,我们需要小心使用字符串编写程序。 1 字符串和内存管理 TStr有一个字符串类型的值。它类似于TInt或TDouble,但string比int和double更复杂。在编写TStr程序时,需要注意内存管理,这对于TInt和TDouble来说是不必要的。 1.1 字符串和内存 String是一个字符数组,以’\0’结束。String不是C... Read More
-
六、可派生和抽象类型
1 可派生类型 这个可派生是声明型宏 G_DECLARE_DERIVABLE_TYPE 声明了一下特性,告诉我们这个对象是可派生,也就是可继承的。声明型宏还有 G_DECLARE_FINAL_TYPE。 有两种类型,final类型和derivable类型。final类型没有任何子对象。derivable有子对象。 这两个对象之间的主要区别是它们的类。final类型对象没有自己的类区域。类的唯一成员是它的父类。 派生对象在类中有自己的区域。该类对其子类开放。 G_DECLARE_DERIVABLE_TYPE 用于声明可派生类型。它像这样写在头文件中: #define T_TYPE_NUMBER (t_number_get_type ()) G_DECL... Read More
-
五、属性
1 属性 GObject系统提供属性。属性是由实例保存的值,实例是GObject的后代,它们对其他实例开放。可以通过他们的名字访问他们。 例如,GtkWindow具有”title”、”default-width”、”default-height”等属性。字符串”title”是属性的名称。属性的名称是一个字符串,以字母开头,然后是字母、数字、破折号(‘-‘)或下划线(‘_’)。破折号和下划线用作分隔符,但它们不能混合使用。使用dash比使用underscore更高效。例如,”value”、”double”和”double-value”是正确的属性名。“_value”或“-value”不正确。 属性的值有各种类型。”title”属性的类型是string。”default-width”... Read More
-
四、信号
1 信号 信号提供了对象之间的通信手段。当某些事情发生或完成时,就会发出信号。 编写信号的步骤如下所示: 注册一个信号。信号属于对象,所以注册是在对象的类初始化函数中完成的。 编写一个信号处理程序。信号处理程序是在信号发出时调用的函数。 连接信号和处理程序。信号连接到g_connect_signal或其族函数的处理程序。 发出信号。 第一步和第四步是在信号所属的对象上完成的。第三步通常在对象之外完成。 信号的处理过程是复杂的,要解释所有的特征需要很长的时间。本节的内容仅限于编写简单信号的最基本内容,不一定准确。如果您需要准确的信息,请参阅GObject API参考。描述信号有四个部分。 2 信号注册 本节中的一个例子是在发生除零时发出的信号。首先... Read More
-
三、类型系统和注册流程
1 类型系统和注册流程 GObject是一个基类。我们通常不使用GObject本身。因为GObject非常简单,在大多数情况下不足以单独使用。相反,我们使用GObject的子类对象,例如各种GtkWidget。可以说,这种可继承是GObject最重要的特性。本节介绍如何定义GObject的子对象。 2 命令惯例 本节的一个例子是一个对象表示一个实数。它不是很有用,因为我们已经在C语言中使用了双类型来表示实数。但是,我认为这个例子对于了解定义子对象的技术来说并不是那么糟糕。 首先,您需要了解命名约定。对象名称由名称空间和名称组成。例如,“GObject”由名称空间“G”和名称“Object”组成。“GtkWidget”由名称空间“Gtk”和名称“Widget”组成。设... Read More
-
二、GObject
1 类和实例 GObject实例用函数g_object_new创建。GObject不仅仅有实例,也有类。 一个GObject类在第一次访问g_object_new时候创建,只有有一个GObject类存在。 GObject实例在任何时候访问g_object_new都会被创建,所以就会创建更多GObject实例。 从广义上讲,GObject意味着对象,这个对象包括它的类和实例。在狭义上将,GObject是一个C结构体的定义。 typedef struct _GObject GObject; struct _GObject{ GTypeInstance g_type_instance; /*< private >*/ guint ref_count; /... Read More
-
一、GObject学习笔记-前言
1 GObject学习经历 我的GObject系统性学习可以分为两次 第一次是学习参考的是 http://garfileo.is-programmer.com/categories/6934/posts,这部分学习笔记分类名称是GObject学习笔记202109,相关文件在 /assets/GObjectStudy/202109/。该参考文章编写于2012年,现在许多Glib库已经更新了许多内容,而且以链表为例,不便于学习。 第二次学习参考的是 https://github.com/ToshioCP/Gobject-tutorial/tree/main,这部分笔记的分类名称是GObject学习笔记,这是目前主要的GObject学习笔记分类,相关文... Read More
-
四、Ubuntu美化
1 安装美化工具 sudo apt-get install gnome-tweaks # tweak sudo apt-get install gnome-shell-extensions # 扩展 22.04 以前版本 sudo apt-get install gnome-tweak-tool # 优化工具、22.04版本中已被取消 22.04 版本 sudo apt install gnome-shell-extension-manager -y 如果在网页gnome extension无法设置扩展软件,可以打开gnome-shell-extension-manager设置 2 安装扩展工具 Dash to Dock插件:https://extension... Read More
-
三、Ubuntu输入法
1 常用的输入法框架介绍 Fcitx (英文全称为FlexibleInput Method Framework) ,中文名为小企鹅输入法 Fcitx是一个以 GPL 方式发布的输入法平台,编写它的目是为桌面环境提供一个灵活的输入方案,彻底解决在GNU/Linux下没有一个好的中文输入法的问题。Fcitx支持XIM和GTK2,GTK3,QT4的IM Module,可为支持 XIM 的 X 应用程序提供输入服务。 fcitx 的源码包内提供了区位和全/简/双拼,并支持基于码表的输入法。可以输入UTF-8编码中的文字。有配置界面,界面展现形式更接近与windows,比较适合windows转linux的用户。资源占用低,处理速度快。 ... Read More
-
一、NVIDIA——显卡驱动、CUDA、cuDNN、TensorRt安装
NVIDIA显卡驱动和CUDA选择 run 文件进行安装,cuDNN和TensorRt选择 tar 文件解压放到指定目录,添加相关环境变量。 我这里暂时不适用apt进行安装,因为暂时没了解过apt安装软件包原理。 1 NVIDIA显卡驱动安装 1.1 禁用nouveau(nouveau是通用的驱动程序)(必须) lsmod | grep nouveau 命令查看是否有输出 如果有输出, sudo gedit /etc/modprobe.d/blacklist.conf末尾输入: blacklist nouveau options nouveau modeset=0 3.重启后,重新查看lsmod | grep... Read More
-
20231109——Github个人主页
Jekyll是一个简单的,博客感知的静态站点生成器。 你将内容创建为文本文件(Markdown),并将其放到到文件夹中。然后,使用Liquid-enhanced HTML模板构建网站。Jekyll自动将内容和模板联系在一起,生成完全由静态资源组成的网站,它适合上传到任何服务器。 Jekyll恰好是GitHub Pages的引擎,因此你可以在GitHub的服务器上免费托管项目的Jekyll页面/博客/网站。 Ruby: Ruby 是一种高级、解释型的编程语言,以其面向对象、灵活和易于使用的特性而闻名。它被广泛用于 Web 开发、自动化脚本、数据处理等领域。 Gems: 在 Ruby 世界中,一个 “gem” 是一个库或应用程序的包装,它包含了代码... Read More
-
二、Ubuntu更新时间
sudo apt-get install ntpdate -y # 在ubuntu下更新本地时间 sudo ntpdate time.windows.com # 将本地时间更新到硬件上 sudo hwclock --localtime --systohc Read More
-
四、Linux命令grep、ps、top
1 grep 命令 grep 命令是一个强大的文本搜索工具,它使用正则表达式来搜索文件,并输出匹配的行。它的名字来源于全局正则表达式打印(global regular expression print)的缩写。在 UNIX 和类 UNIX 系统中,grep 被广泛用于各种场景,从简单的文件搜索到管道命令中复杂的数据分析。 1.1 基本语法 grep [选项] [模式] [文件...] [选项]:grep 的行为可以通过选项进行控制,例如 -i(忽略大小写),-v(反转匹配),-r(递归搜索)等。 [模式]:这是你想要搜索的文本模式,可以是字符串或正则表达式。 [文件…]:这是你想要搜索的一个或多个文件名。如果没有指定文件... Read More
-
六、X11基础——窗户层次结构
12 Windows Hierarchy 当窗口在X服务器上显示时,它们总是按照某种层次结构进行排列的 - 每个窗口都可能有子窗口,每个子窗口都可能有自己的子窗口,等等。让我们看看这个层次结构的一些属性,以及它们如何影响绘图或事件传播等操作。 12.1 Root, Parent And Child Windows 在每个屏幕上,都有一个根窗口Root。根窗口始终覆盖整个屏幕大小。这个窗口不能被销毁、调整大小或最小化。当应用程序创建窗口时,它首先必须创建至少一个顶级窗口。这个窗口成为根窗口的直接后代,直到它首次在屏幕上映射。在这个窗口被映射之前,窗口管理器会被通知即将发生的操作。然后,窗口管理器有权限重新指定新的顶级窗口的父窗口。这是为了添加一个将包含新窗口的窗口,并用于绘制其框架... Read More
-
五、X11基础——文本和字体
11 Handling Text And Fonts 除了在窗口上绘制图形外,我们经常想要绘制文本。文本字符串有两个主要属性 - 要绘制的字符和用于绘制的字体。为了绘制文本,我们首先需要请求X服务器加载字体。然后我们将字体分配给GC,最后我们使用GC在窗口中绘制文本。 11.1 The Font Structure 为了支持灵活的字体,定义了一种类型为XFontStruct的字体结构。此结构用于包含关于字体的信息,并传递给处理字体选择和文本绘制的多个函数。 11.2 Loading A Font 作为绘制文本的第一步,我们使用字体装载函数,例如XLoadQueryFont()。该函数要求X服务器装载给定名字的字体。如果字体被发现了,服务器装载那个字体,返回一个XFontStr... Read More
-
四、X11基础——X事件
10 X Events 在一个Xlib程序里,所有的动作都是被事件驱动的。针对事件”expose”的反应是在屏幕上画些什么。如果程序窗口的一部分被遮住,然后又露出来了(例如一个窗口遮住了另一个窗口),X服务器将会发送一个”expose”事件来让程序知道它的窗口的一部分应该被重新绘制。用户的输入(按下键盘,鼠标移动等)也是被做成一系列的事件。 10.1 Registering For Event Types Using Event Masks 在Xlib里,我们使用函数XSelectInput()来注册要接受的事件。该函数接受3个参数 - 显示结构,一个窗口ID,和一个它想要接受的事件类型的面具。参数窗口ID允许我们为不同的窗口注册接受不同类型的事件。下面的例子展示了我们为窗口ID... Read More
-
三、X11基础——窗口里进行绘画
9 Drawing In A Window 在窗口里绘图可以使用各种绘图函数 - 画点,线,圈,矩形,等等。为了能在一个窗口里绘图,我们首先需要定义各种参数 - 如线的宽度,使用什么颜色,等等。这都需要使用一个图形上下文(GC)。 9.1 Allocating A Graphics Context (GC) 如我们已经提到的,一个图形上下文定义一些参数来使用绘图函数。因此,为了绘制不同的风格,我们可以在一个窗口里使用多个图形上下文。使用函数XCreateGC()可以申请到一个新的图形上下文,如以下例(在这段代码里,我们假设”display”指向一个显示结构,”win”是当前创建的一个窗口的ID): /* this variable will contain the handle... Read More
-
二、X11基础——创建一个基本窗口
8 Creating A Basic Window - Our “hello world” Program 在我们获得一些窗口的基本信息之后,我们就可以开始创建我们的第一个窗口了。Xlib支持好几个函数来创建窗口,它们其中的一个是XCreateSimpleWindow()。这个函数使用很少的几个参数来指定窗口的尺寸,位置等。以下是它完整的参数列表: /* 指向显示结构的指针 */ Display* display /* 新窗口的父窗口的ID。 */ Window parent /* 窗口的左上X坐标(单位为屏幕像素) */ int x /* 窗口的左上Y坐标(单位为屏幕像素) */ int y /* 窗口的宽度(单位为屏幕像素) */ unsigned int width /* 窗... Read More
-
一、X11基础——介绍
1 基本概念 1.1 X11 X Window System 是一套标准,而不是具体的程序或者代码。 X11 是这套标准 X Window System 的第十一个版本,该版本一直使用至今,较为稳定。这套标准采用的是Client和Server模型,XServer负责输出(显卡)和获取输入(键盘鼠标)。XClient就是我们写的程序,这个程序使用libX11.so库跟XServer通信,获取服务的输入事件和告知服务器我们要显示的图像。 1.2 Xorg Xorg 是一个 XServer,是 X11 的一个最广为使用的实现(同时也指代该实现背后的组织/基金会),“广”到貌似没有其他实现。现在大多时候,X11、Xorg、X Server... Read More
-
X11——前言
BasicGraphicsProgramming(基础部分) 参考:Basic Graphics Programming With The Xlib Library 参考:Basic Graphics Programming With The Xlib Library PDF版本 参考:Xlib基础图形编程 XlibTutorial 参考:Xlib tutorial part Extension:对于上面两部分学习后,根据自己的使用需求,进行扩展总结 Linux系统管理技术手册——第25章 X窗口系统 Read More
-
GStreamer核心对象-Template
1 GstBuffer基本概念 2 GstBuffer类型结构 2.1 GstBuffer类型注册宏定义 2.2 GstBuffer类型相关枚举 2.3 GstBuffer相关结构体 3 GstBuffer对象相关函数 Read More
-
三、Linux串口开发(详解)
具体来说,termios 所控制的终端通常包括: 物理终端:这些是传统的字符终端设备,比如通过串行接口连接的终端,键盘,串口通信设备等。 虚拟终端:这些通常是在现代操作系统中通过软件创建的终端,如 Linux 系统中的 /dev/tty 设备。这些设备提供了与物理终端类似的接口。 终端仿真器:这些是在图形用户界面环境下运行的程序,模仿传统终端的行为,例如 Linux 中的 GNOME 终端、Xterm 或 macOS 的 Terminal.app。 1 termios.h相关结构体和函数 1.1 struct termios termios (terminal input/output settings)结构体在 ... Read More
-
三、Linux串口开发
1 Linux串口测试工具 1.1 Linux下命令行串口工具minicom 1.1.1 安装 minicom sudo apt-get install minicom -s 1.1.2 运行 minicom # -s 参数表示进入配置界面 -c 表示开启彩色显式参数 sudo minicom -s # sudo minicom -s -c on Serial port setup: 界面可以配置波特率、数据位停止位等。 Screen and keyboard: 可以配置Hex显式 Save setup as dfl: 保存配置到dfl文件 1.1.3 退出 minicom 运行过程中按下 Ctr... Read More
-
Step5:补充
对于官方课程未涉及到或者没有理解的知识点进行补充 1 Step5 1.1 install install命令为项目生成一系列的安装规则。在执行make install时,所指定的安装规则会被依次执行,最终将目标文件(so,exe,其他文件等)复制到指定的路径下。 目标文件的安装 install(TARGETS targets... [EXPORT <export-name>] [[ARCHIVE|LIBRARY|RUNTIME|FRAMEWORK|BUNDLE| PRIVATE_HEADER|PUBLIC_HEADER|RESOURCE] [DESTINATION <dir>] [... Read More
-
20231027——调试工具学习
一般常用的调试工具gdb。 glib库支持DTrace和systemtap追踪,为了更好的开发稳定应用程序,所以学习DTrace和SystemTap。 1 systemtap SystemTap是一个Linux非常有用的调试(跟踪/探测)工具,常用于Linux内核或者应用程序的信息采集。 比如:获取一个函数里面运行时的变量、调用堆栈,甚至于直接修改变量的值,对诊断性能或功能问题非常有帮助。SystemTap提供非常简单的命令行接口和很简洁的脚本语言,以及非常丰富的tapset和例子。 1.1 用途 定位(内核)函数位置 查看函数被调用时的调用堆栈、局部变量、参数 查看函数指针变量实际指的是哪个函数 ... Read More
-
Step1-4:补充
对于官方课程未涉及到或者没有理解的知识点进行补充 1 Step1 1.1 set命令 set命令可以设置普通变量、缓存条目、环境变量三种变量的值,分别对应以下三种命令格式。set的值<value>...表示可以给变量设置0个或者多个值,当设置多个值时(大于2个),多个值会通过分号连接符连接成一个真实的值赋值给变量,当设置0个值时,实际上是把变量变为未设置状态,相当于调用unset命令。 # [PARENT_SCOPE]是该命令的参数,去掉方括号直接使用该参数 set(<variable> <value>... [PARENT_SCOPE]) #设置普通变量 set(<variable> <value>... CACH... Read More
-
十九、Meson构建文件函数——declare_dependency()
Meson本质上是用 Python 编写的,所以这些函数也都是Python函数。 1 declare_dependency() 这个函数返回一个 dep 对象,其行为类似于 dependency() 的返回值,但是仅在当前构建内部使用。这在子项目中非常有用。它允许子项目轻松指定如何被使用。这使得它可以与系统外部提供的同一依赖项互换。 2 declare_dependency()定义 # This function returns a dep object that dep declare_dependency( compile_args : list[str] ... Read More
-
十八、Meson构建文件函数——dependency翻译版本
Meson本质上是用 Python 编写的,所以这些函数也都是Python函数。 1 dependency() dependency 函数用于查找给定名称的外部依赖项(通常是系统上安装的库),首先通过 pkg-config 查找,如果失败则通过 CMake。此外,还支持框架(仅限 OSX)和特定于库的回退fallback检测逻辑。 自 0.60.0 版本起,可以提供多个名称,它们将按顺序尝试,首个找到的名称将被使用。只有当系统上没有找到这些名称中的任何一个时,才会使用回退fallback子项目。一旦找到其中一个名称,所有其他名称都将添加到缓存中,因此后续对这些名称的任何调用都将返回相同的值。这在依赖项可能有不同名称的情况下很有用,例如 png 和 libpng。 自 0.... Read More
-
十八、Meson构建文件函数——dependency笔记总结版本
Meson本质上是用 Python 编写的,所以这些函数也都是Python函数。 1 dependency() dependency 用于查找给定名称的外部依赖项(通常是系统上安装的库),首先通过 pkg-config 查找,如果失败则通过 CMake。如果查找失败,可以使用fallback回退处理,支持 pkg-config、cmake、extraframework(OSX only) 、 qmake 等。 dependency 返回的是 dep 对象,该对象一共有以下六种方式创建: 2 dependency()定义 dep dependency( str names..., # The names of the ... Read More
-
十七、Meson构建文件函数——static_library()
Meson本质上是用 Python 编写的,所以这些函数也都是Python函数。 1 static_library() 使用给定的源代码构建静态库,返回lib对象。 2 static_library()定义 # Builds a static library with the given sources lib static_library( str target_name, # The *unique* name of the build target str | file | custom_tgt | custom_idx | generated_li... Read More
-
十六、Meson构建文件函数——subproject()
Meson本质上是用 Python 编写的,所以这些函数也都是Python函数。 1 subproject() -此功能接受位置参数中指定的项目,并通过返回一个子项目对象将其纳入当前构建规范。子项目必须始终放置在顶级源目录的 subprojects 目录内。例如,名为 foo 的子项目必须位于 ${MESON_SOURCE_ROOT}/subprojects/foo 中。 2 subproject() # Takes the project specified in the positional argument and brings that subproject subproject( str subproject_name, # Name of the sub... Read More
-
十五、Meson构建文件函数——subdir()
Meson本质上是用 Python 编写的,所以这些函数也都是Python函数。 1 subdir() 进入指定的子目录并执行其中的 meson.build 文件。一旦完成,它将返回并继续执行 subdir() 命令之后的内容。在子目录 meson.build 文件中定义的变量(子目录的 meson.build执行完毕之后),之后所有的meson.build中文件都可以使用。 请注意,这意味着源代码树中的每个 meson.build 文件只能且必须执行一次。 1. 子目录的 meson.build 文件没有 project 函数(子项目的构建文件才有project) 2. 子目录的 meson.build 中定义变量,后续的主构建文件或者子目录构建文件都可以直接使用(也就相... Read More
-
十四、Meson构建文件函数——get_option()
大多数非平凡的构建都需要用户可设置的选项。例如,一个程序可能有两种不同的数据后端,可以在构建时选择。Meson 通过拥有一个选项定义文件来实现这一点。其名称为 meson.options,放置在源代码树的根目录。在 1.1 版本之前的 Meson 版本中,这个文件被称为 meson_options.txt。 这是一个简单的选项文件。 option('someoption', type : 'string', value : 'optval', description : 'An option') option('other_one', type : 'boolean', value : false) option('combo_opt', type : 'combo', choic... Read More
-
十三、Meson构建文件函数——include_directories()
Meson本质上是用 Python 编写的,所以这些函数也都是Python函数。 1 include_directories() 仅仅调用该函数,并不会把目录添加到搜索路径中,因为meson不像cmake不具有全局搜索路径。 给出的每个目录都被转换为两个包含路径:一个相对于源代码根目录,另一个相对于构建根目录。(所以可以不提供绝对路径,我们既可以获取构建目录路径,也同时获取源代码根目录,源代码根目录就是meson.build所在目录) @includes变量可以同时传入多个目录。 2 include_directories()定义 ''' Brief: 根据传入的目录,返回一个不透明对象 Param:... Read More
-
十二、Meson构建文件函数——executable()
Meson本质上是用 Python 编写的,所以这些函数也都是Python函数。 1 executable() 创建一个新的可执行文件。第一个参数指定其名称,其余的位置参数定义要使用的输入文件。 kwargs 的列表(例如 sources、objects 和 dependencies)总是被扁平化处理,这意味着在创建最终列表时,你可以自由嵌套和添加列表。 2 executable()定义 # Creates a new executable exe executable( str target_name, # The *un... Read More
-
十一、Meson构建文件函数——project()
Meson本质上是用 Python 编写的,所以这些函数也都是Python函数。 1 project() project() 每个项目中调用的第一个函数,用于初始化 Meson。 此函数的第一个参数必须是一个字符串,用于定义该项目的名称。 项目名称可以是您想要的任何字符串,它只用于描述目的。然而,由于它被写入,例如依赖性清单,通常有意义的是将其与项目压缩包或 pkg-config 名称保持一致。因此,例如,你可能希望使用 libfoobar 而不是 The Foobar Library 作为名称。 其后可以跟随项目使用的编程语言列表。(自 0.40.0 版本起)语言列表是可选的。 这些语言可用于 native: false(默认值)(host机器)目标和 native: t... Read More
-
十、Meson构建文件——快速开始
这个页面从头开始演示了如何为一个简单项目创建一个Meson构建定义,然后扩展到使用外部依赖项,以展示如何轻松地将它们集成到您的项目中。 这个教程主要是针对Linux使用的。它假设您的系统上已经安装了GTK开发库。在基于Debian的系统(如Ubuntu)上,您可以使用以下命令来安装它们: sudo apt install libgtk-3-dev -y 关于编写构建文件中使用到的函数,可以参考后续文章获取详细解释。 常用参考: Meson Build System Function 1 编写meson.build 该节示例文件 /assets/BuildSystem/Meson/10_WriteMesonFile/ 让我们从最基本的程序开始,即经典的 hell... Read More
-
五、Makefile补充
这一部分补充,主要是针对cmake生成的Makefile知识点解析。 1 默认伪目标 # Default target executed when no arguments are given to make. .PHONY: default_target default_target: all # The main all target all: @echo "测试" .PHONY: all .PHONY: clean clean: @echo "删除" # The main all target all: @echo "测试" .PHONY: all .PHONY: clean clean: @echo "删除" 第一个伪目标或者直接定义的第一个规则... Read More
-
四、Makefile使用变量
在Makefile中的定义的变量,就像是C/C++语言中的宏一样,他代表了一个文本字串,在Makefile中执行的时候其会自动原模原样地展开在所使用的地方。其与C/C++所不同的是,你可以在Makefile中改变其值。在Makefile中,变量可以使用在“目标”,“依赖目标”, “命令”或是Makefile的其它部分中。 变量的命名字可以包含字符、数字,下划线(可以是数字开头),但不应该含有 : 、 # 、 = 或是空字符(空格、回车等)。变量是大小写敏感的,“foo”、“Foo”和“FOO”是三个不同的变量名。传统的Makefile的变量名是全大写的命名方式,但我推荐使用大小写搭配的变量名,如:MakeFlags。这样可以避免和系统的变量冲突,而发生意外的事情。 有一些变量是很奇... Read More
-
三、Makefile书写命令
每条规则中的命令和操作系统Shell的命令行是一致的。make会一按顺序一条一条的执行命令,每条命令的开头必须以 Tab 键开头,除非,命令是紧跟在依赖规则后面的分号后的。在命令行之间中的空格或是空行会被忽略,但是如果该空格或空行是以Tab键开头的,那么make会认为其是一个空命令。 我们在UNIX下可能会使用不同的Shell,但是make的命令默认是被 /bin/sh ——UNIX的标准Shell 解释执行的。除非你特别指定一个其它的Shell。Makefile中, # 是注释符,很像C/C++中的 // ,其后的本行字符都被注释。 1 显示命令 通常,make会把其要执行的命令行在命令执行前输出到屏幕上。当我们用 @ 字符在命令行前,那么,这个命令将不被make显示出来,最具... Read More
-
二、Makefile书写规则
规则包含两个部分,一个是依赖关系,一个是生成目标的方法。 在Makefile中,规则的顺序是很重要的,因为,Makefile中只应该有一个最终目标,其它的目标都是被这个目标所连带出来的,所以一定要让make知道你的最终目标是什么。一般来说,定义在Makefile中的目标可能会有很多,但是第一条规则中的目标将被确立为最终的目标。如果第一条规则中的目标有很多个,那么,第一个目标会成为最终的目标。make所完成的也就是这个目标。 好了,还是让我们来看一看如何书写规则。 1 规则举例 foo.o: foo.c defs.h # foo模块 cc -c -g foo.c 文件的依赖关系, foo.o 依赖于 foo.c 和 defs.h 的文件,如... Read More
-
一、Makefile介绍
1 Makefile文件是什么 可以简单的认为是一个工程文件的编译规则,描述了整个工程的编译和链接规则。其中包含了那些文件需要编译,那些文件不需要编译,那些文件需要先编译,那些文件需要后编译,那些文件需要重建等等。编译整个工程需要涉及到的,在 Makefile 中都可以进行描述。换句话说,Makefile 可以使得我们的项目工程的编译变得自动化,不需要每次都手动输入一堆源文件和参数。 2 Makefile的规则 在讲述这个makefile之前,还是让我们先来粗略地看一看makefile的规则。 target ... : prerequisites ... recipe ... ... target:可以是一个object file(目标文件),也可... Read More
-
Step7:Adding System Introspection
让我们考虑向我们的项目添加一些依赖于目标平台可能没有的功能的代码。在这个示例中,我们将添加一些依赖于目标平台是否具有对数(log)和指数(exp)函数的代码。当然,几乎每个平台都具有这些功能,但在本教程中假设它们不常见。 1 Exercise 1 - Assessing Dependency Availability 1 Goal 根据可用的系统依赖项来更改实现。 1.1 Getting Started 起始源代码已经提供在Step7目录中。在这个练习中,完成TODO 1到TODO 5。 首先编辑MathFunctions/CMakeLists.txt。包含CheckCXXSourceCompiles模块。然后,使用check_cxx_source_compiles来确定c... Read More
-
Step6:Adding Support for a Testing Dashboard
添加支持将我们的测试结果提交到dashboard很简单。我们已经在测试支持中为项目定义了许多测试。现在,我们只需运行这些测试并将它们提交到CDash。 1 Exercise - Send Results to a Testing Dashboard 1.1 Goal 显示我们的CTest结果用CDash 1.2 Getting Started 在这个练习中,通过在顶层CMakeLists.txt中完成TODO 1来包含CTest模块。这将启用使用CTest进行测试以及将测试结果提交到CDash的功能,因此我们可以安全地删除enable_testing()的调用。 此外,我们还需要获取一个名为CTestConfig.cmake的文件,将其放置在顶层目录中。当运行时,ctest... Read More
-
Step5:Installing and Testing
通常,仅构建可执行文件是不够的,它还应该具备可安装性。使用CMake,我们可以使用install()命令来指定安装规则。在CMake中,为你的构建支持本地安装通常只需要指定一个安装位置以及要安装的目标和文件,这非常简单。 1 Exercise - Install Rules 1.1 Goal 安装Tutorial可执行文件和MathFunctions库 1.2 Getting Started 在Step5目录中提供了初始代码。在这个练习中,请完成TODO 1到TODO 4。 首先,更新MathFunctions/CMakeLists.txt文件,将MathFunctions和tutorial_compiler_flags库安装到lib目录中。在同一文件中,指定安装规则以将M... Read More
-
Step4:Adding Generator Expressions
生成器表达式(Generator Expressions)在生成构建系统时进行评估,以生成特定于每个构建配置的信息。 生成器表达式(Generator Expressions)可以用在许多目标属性的上下文中,如LINK_LIBRARIES、INCLUDE_DIRECTORIES、COMPILE_DEFINITIONS等。它们也可以在使用命令来填充这些属性时使用,比如target_link_libraries()、target_include_directories()、target_compile_definitions()等。 生成器表达式(Generator Expressions)可以用于启用条件化的链接、在编译时使用的条件化定义、条件化的包含目录等。条件可以基于构建配置、目... Read More
-
Step3:Adding Usage Requirements for a Library
1 Exercise - Adding Usage Requirements for a Library 目标参数的Usage Requirements允许更好地控制库或可执行文件的链接和包含行,同时还能更好地控制CMake中目标的传递属性。主要利用使用要求的命令包括: target_compile_definitions() target_compile_options() target_include_directories() target_link_directories() target_link_options() target_precompile_headers() target_sources() 1.1 Goal 为库添加使用... Read More
-
Step2:Adding a Library
在这一点上,我们已经看到了如何使用CMake创建一个基本项目。在这一步中,我们将学习如何在项目中创建和使用库。我们还将看到如何使库的使用成为可选的。 1 Exercise - Creating a Library 要在CMake中添加一个库,使用add_library()命令并指定哪些源文件应该组成该库。 与将所有源文件放在一个目录中不同,我们可以使用一个或多个子目录来组织项目。在这种情况下,我们将为我们的库创建一个子目录。在这里,我们可以添加一个新的CMakeLists.txt文件和一个或多个源文件。在顶层CMakeLists.txt文件中,我们将使用 add_subdirectory() 命令将子目录添加到构建中。 一旦库被创建,就可以使用 target_include_d... Read More
-
Step1:A Basic Starting Point
我应该从哪里开始学习CMake?这一步将介绍CMake的基本语法、命令和变量。随着这些概念的介绍,我们将完成三个练习并创建一个简单的CMake项目。 还请注意,教程中的每一步都是基于下一步构建的。例如,下一章的起始代码是上一章cm的完整解决方案。 1 Exercise - Building a Basic Project 最基本的CMake项目是通过单个源代码文件构建的可执行文件。对于这样简单的项目,只需一个包含三个命令的CMakeLists.txt文件即可。 注意:虽然CMake支持大写、小写和大小写混合的命令,但推荐使用小写命令,并将在整个教程中使用小写命令。 cmake_minimum_required():命令指定最低CMake版本(任何项目的顶层CM... Read More
-
一、构建系统 前言
1 前言 1.1 什么是构建系统? 构建系统的需求是随着软件规模的增大而提出的。如果只是做软件编程训练,通常代码量比较小,编写的源代码只有几个文件。比如你编写了一段代码放入helloworld.c文件中,要编译这段代码,只需要执行以下命令:gcc helloworld.c。 构建系统(build system):是用来从源代码生成用户可以使用的目标(targets)的自动化工具。目标可以包括库、可执行文件、或者生成的脚本等等。常见的比如Make、Ninja等。 元构建系统(Meta Build System):元构建系统是一个更高层次的工具,用于管理和配置一个或多个构建系统。简单来说就是生成构建系统文件的作用,比如Cmake、Meson等。 1.2 为什么需要构建系... Read More
-
三、Meson编译项目——重新配置
1 改变项目配置 meson configure build --prefix=/usr 2 重新生成项目 meson setup build -Dsomeoption=value --reconfigure Read More
-
二、Meson编译项目——环境变量
1 编译器和链接器选择变量 例如,如果我们想用 Clang 编译器而不是系统默认的编译器来测试构建源代码,我们可以输入以下命令: CC=clang CXX=clang++ meson setup buildclang windows系统下: export CC='C:/Program Files/Microsoft Visual Studio/2022/Community/VC/Tools/MSVC/14.34.31933/bin/Hostx64/x64/cl.exe' 其他变量列表参考:https://mesonbuild.com/Reference-tables.html#compiler-and-linker-selection-variables 2 编译器和链接... Read More
-
一、Meson编译项目——快速开始
Meson(The Meson Build System)是个元构建系统,类似的构建系统有 CMake。Meson 一般和 ninja 组合使用。ninja 是构建系统,类似于 make。Meson 生成 ninja 所需要的 build.ninja 文件,ninja 调用编译工具链(例如:gcc),最后编译生成可执行文件或者库。 1 需求 Python 3 Ninja:类似于Make一样的构建系统,Meson 是元构建系统,生成 build.ninja 文件。 Ubuntu: sudo apt-get install -y python3 python3-pip python3-setuptools \ python3... Read More
-
Makefile前言
该部分关于Makefile学习记录 Read More
-
Step:前言
学习过程 1 阶段一 Step1-7是第一次学习CMake笔记(根据官网教程)。 官方参考示例下载链接:https://cmake.org/cmake/help/latest/_downloads/1a9a1000125aebaaee08cbe0859e560c/cmake-3.27.5-tutorial-source.zip 每个步骤都有自己的子目录,其中包含的代码都可以作为下一个步骤的起始代码。本教程示例是渐进的,因此每一步都为前一步提供完整的解决方案。 2 阶段二 2024年4月份CMake标题开头系列,是为了以后: <font color=#7744FF> 快速使用CMake进行编译项目。 记录常用的CMake构建文件... Read More
-
Meson前言
1-9:编写关于编译项目的内容 10- :如何编写构建文件的内容 Read More
-
二、Linux中pkg-config的使用
meson中的dependency命令使用的是pkg-config命令,学习meson之前,先学习pkg-config。 1 pkg-config简单介绍 pkg-config用途:是用来检索系统中已经安装库的信息。在编译应用程序和库的时候作为一个工具来使用。 pkg-config用法: pkg-config [OPTION] [package名称] pkg-cofig常用选项: –version: 查看pkg-config版本 –list-all: 查看系统所有已经安装的package –modversion: 查看已经安装package的版本信息 –libs: 获取package库文... Read More
-
一、Linux动态库路径
1 基础知识 变量是计算机系统用于保存可变值的数据类型,我们可以直接通过变量名称来提取到对应的变量值。 在Linux系统中,环境变量是用来定义系统运行环境的一些参数,比如每个用户不同的家目录(HOME)等。 值得一提的是,Linux 系统中环境变量的名称一般都是大写的,这是一种约定俗成的规范。 1.1 Linux环境变量详解 查看系统所有环境变量 env 查看单个环境变量值 echo $ENVNAME # 例如,查看HOME echo $HOME 设置环境变量的值 ENVNAME=value 使用 env 命令,我们可以查看当前系统所有的环境变量,使用 echo 命令,可以查看单个环境变量的值,直接使用 “环境变量名=值” 的形式即可以设置环境变量的... Read More
-
三、GRUB 启动加载器问题总结
GRUB(Grand Unified Bootloader)是一个多操作系统启动程序,它允许用户在计算机启动时从多个不同的操作系统中进行选择。GRUB 是开源项目,是许多基于 Linux 的操作系统,如 Ubuntu、Fedora 和 Debian 等的标准启动加载器。 主要特点 多操作系统支持: 允许在单个物理计算机上安装的多个操作系统之间进行选择。 例如,如果你的电脑上同时安装了 Windows 和 Linux,GRUB 会在启动时让你选择要启动哪个系统。 配置灵活性: 提供广泛的配置选项,可通过修改其配置文件(通常是 /boot/grub/grub.cfg)实现。 包括改变启动菜单的... Read More
-
二、关于电脑安装多系统
1 基础知识 1.1 分区表 上一节学习了文件系统的相关基本知识,其实就是每个分区的文件系统格式。像适用于windows的NTFS,用于Mac系统的Hfs+,还有用于通用格式的exfat等等。这些我们只需要使用磁盘工具简单的格式化成相应的分区就可以了。它的作用就像是一个盛水的容器。 但如果是在一个大容量硬盘里分了2个区,或者是在硬盘里安装了操作系统,那么就来到了这一节的话题。分区表。 分区表顾名思义,就是记录着硬盘里所有分区信息的文件,它的作用就是告知启动系统,需要加载硬盘的哪块部分。到哪里去找文件。分区表的作用,就像是一个指引你要去拿正确盛水容器的人。 其实,我们在安装系统的时候,经常会手动选择分区格式,其中就有guid和mbr两种,那么guid和mbr格式有什么区别呢,其实... Read More
-
一、文件系统
1 背景 在计算机领域,文件系统是操作系统用来管理和组织计算机储存设备上的文件和目录的一种方法。不同的文件系统有不同的特点和适用场景。 我把小结写到前面。因为小结的内容可能比下面每一部分的阐述更重要。 EXT4是Linux操作系统的默认文件系统。Linux系统可以支持查看ext、ext2、ext3、ext4、xfs、NTFS、FAT(FAT16)、FAT32、exFAT。 NTFS是Windows操作系统的默认文件系统。(Windows系统下不支持查看EXT系统文件)。 2 文件系统 2.1 NTFS NTFS(New Technology File System)是由微软开发的一种高性能的文件系统。它是Windows操作系统的默认文件系统,提供了许多先进的功能和特性。 ... Read More
-
一、Ubuntu22.04修改用户登录背景图
我们需要做的第一件事是下载一个 Bash 脚本,它可以帮助我们轻松更改登录屏幕的背景图像。该脚本托管在 GitHub 存储库中,可以使用以下 wget 命令下载。 wget -qO - https://github.com/PRATAP-KUMAR/ubuntu-gdm-set-background/archive/main.tar.gz | tar zx --strip-components=1 ubuntu-gdm-set-background-main/ubuntu-gdm-set-background 以下软件包是脚本运行所必需的,必须首先安装: sudo apt update sudo apt install libglib2.0-d... Read More
-
二十九、QML——Drawer
https://blog.csdn.net/u013125105/article/details/143894067 https://blog.csdn.net/kenfan1647/article/details/125370551 https://doc.qt.io/qt-6/qml-qtquick-controls-drawer.html#dragMargin-prop https://www.linkedin.com/pulse/how-design-dashboard-ui-10-best-practices-shafayetul-islam/ https://www.google.com/imgres?q=dashboard%20UI&imgurl=http... Read More
-
二十八、QML——QtQuick Controls
1 qml控制组件风格 QtQuick Controls控件有几种风格: 1 Basic Style 基本风格是一个简单和轻量级的全方位风格,为Qt快速控制提供了最大的性能。 2 Fusion Style Fusion Style的轻主题。融合风格的黑暗主题。融合风格是一种平台无关的风格,为Qt快速控件提供了面向桌面的外观和感觉。 3 Imagine Style 4 Universal Style 基于微软Window类似的风格 5 Material Style 6 FluentWinUI3 Style FluentWinUI3 风格是一种现代的、原生的风格,专为运行 Windows 11 及更高版本的平台而设计。 2 Material风... Read More
-
二十七、QML——SinglePointHandler
Read More
-
二十五、QML——ShaderEffect
在 Qt5 中,效果是以 GLSL (OpenGL着色语言)源码的形式提供的,通常以字符串的形式嵌入到QML中。从 Qt 5.8 开始,也可以引用文件,无论是本地文件还是 Qt 资源系统中的文件。 在 Qt 6 中,Qt Quick 还支持诸如 Vulkan、Metal 和 Direct3D 11 等图形 API。因此,使用 GLSL 源字符串不再可行。会把 GLSL 源字符串转换成相应的着色语言。生成的资源会打包成一个单一的包,通常存储在扩展名为 .qsb 的文件中。这个过程是在离线或最迟在应用程序构建时完成的。在运行时,场景图和底层图形抽象会使用这些 .qsb 文件。因此,在 Qt 6 中,ShaderEffect 需要引用文件(本地或 qrc文件),而不是内联的着色器代码。 ... Read More
-
二十四、QML——Gradient、LinearGradient、ConicalGradient、RadialGradient
首先要区分 Gradient 和 LinearGradient、ConicalGradient、RadialGradient 的两种情况。 非Item项的 Gradient,该类型的Gradient不能直接使用,必须是给属性赋值。比如:Gradient 给 Rectangle 的属性 gradient 赋值。ShapeGradient 给 ShapePath 的属性 fillGradient 赋值。使用 import QtQuick.Shapes 1.8 导入这三种渐变。 继承 Item 可以独立使用的渐变 LinearGradient、ConicalGradient、RadialGradient。使用 import QtQuick... Read More
-
二十三、QML——Qt Design Studio生成CMake
qds 就是Qt Design Studio,本章节记录,如何创建 Qt Design Studio 和 Qt Creator 共同开发项目。 第一节实现了 Qt Design Studio 生成 CMakeList 文件,然后使用 Qt Creator 编辑。 第二节是对整个项目文件的分析 第三节想把C++对象封装成QML插件,然后使用 Qt Design Studio 访问,实例化创建对象,但是没有成功,可能是因为动态库的链接问题。 1 创建共同开发项目 1.1 创建一个 Qt Design Studio 项目 创建一个 Qt Design Studio 项目 使能该项目 Enable CMake Gen... Read More
-
二十、QML——Models
大多数应用程序需要格式化显示数据。Qt Quick具有Models、Views、Delegate的概念,用于显示数据。它们将数据的可视化进行模块化,以便开发者和设计师可以控制数据的不同方面。开发者可以对数据做很少修改的情况下,将列表视图替换为网格视图。同样,通过将数据的一个实例封装在委托Delegate中,开发者可以决定如何呈现或处理数据。 模型 (Model):包含数据及其结构。QML 提供了多种类型用于创建模型。 视图 (View):用于显示数据的容器。视图可以以列表或网格的形式显示数据。 委托 (Delegate):决定数据在视图中应该如何显示。委托将模型中的每个数据单元封装起来,并通过委托可以访问数据。委托还可以将数... Read More
-
十九、QML——C++交互
QML 与 C++ 混合编程就是使用 QML 高效便捷地构建 UI,而 C++ 则用来实现业务逻辑和复杂算法。 1 QML访问C++ QML访问C++有两个方法: Qt元对象系统中注册C++类,在QML中实例化、访问。 在C++中实例化,并设置为QML上下文属性,在QML中直接使用。 2 C++访问QML C++ 访问 QML 的前提是获取到实例化 Item 对象的指针。 QML创建的实例化的组件有一个对象树,可以一层一层获取含有哪些对象的指针,但是,好像有些对象是无法获取到指针的,导致无法使用C++访问QML。 无论使用 QQmlComponent,还是使用 QQmlApplicationEngine 实例化创建 QML 界面... Read More
-
十八、QML——QQmlApplicationEngine
QQmlContext:负责 QML 和 C++ 之间进行通信(属性绑定、数据传递) QQmlEngine:解析 QML文件的对象,便于C++实例化这些QML对象。管理 QQmlContext 上下文层次结构。 QQmlComponent:能够创建(实例化)QML对象。 1 QQmlContext QQmlContext 是 Qt 中的一个类,负责管理 QML 和 C++之间的上下文和数据通信。它运行将 C++对象、属性或数据传递给 QML 层,并在 QML 中使用这些数据进行绑定和操作。QQmlContext 在 QML 引擎中扮演了连接 QML 视图和 C++ 逻辑的桥梁作用。 /*... Read More
-
十七、QML——ChartView
https://cloud.tencent.com/developer/article/2440835 Read More
-
十六、QML——Graphs(2D)
Qt Graphs 组件能够用 2D 和 3D 图graphs可视化数据显示。 Qt Graphs 是基于 Qt6 构建的图表类型,跟 Qt Chart 不同, Qt Chart 是基于 Qt5 构建的图表类型。Qt Graphs 适用于高性能、响应速度要求较高的领域。 Qt Graphs 3D图表基于 Qt Quick 3D,利用了硬件加速和 Qt Quick 的优势。 2D领域,支持区域图area、柱状图bar、圆环图donut、折线图、饼图pie、散点图scatter、样条图spline。 目前、这部分都是基类2D图表,后续如果学习3D图表,开一新的章节记录 1 GraphsView 这是放置 series 的... Read More
-
十五、QML——ArcItem
Read More
-
十四、QML——Shape
1 Shape 通过从 QPainterPath 对几何图形进行三角化来渲染路径。 这种方法与通过 QQuickPaintedItem 或 2D 画布渲染形状不同,因为路径不会在软件中进行光栅化。因此 Shape 适用于在屏幕较大区域内创建形状,避免了纹理上传或帧缓冲区传输带来的性能损耗。 此外,声明式 API 允许操作、绑定甚至动画化路径元素的属性,例如起始和结束位置、控制点等。 指定路径元素的类型在 PathView 和 Shape 之间共享。不过,并非所有 Shape 实现都支持所有路径元素类型,同时有些类型对于 PathView 来说可能不合适。Shape 当前支持的子集包括:PathMove、PathLine、PathQuad、PathCubic、PathArc、Pa... Read More
-
十三、QML——Flickable
Flickable 项目将其子项放置在一个可拖动和快速滑动的表面上Surface,从而使得视图可以滚动。这种行为构成了用于显示大量item项目(例如ListView和GridView)的基础。 在传统的用户界面中,可以使用标准控件(如滚动条和箭头按钮)来滚动视图。在某些情况下,也可以通过按住鼠标按钮并移动光标直接拖动视图。在基于触摸的用户界面中,这种拖动操作通常会伴随着快速滑动操作,即在用户停止触摸视图后,滚动会继续进行。 Flickable 不会自动裁剪其内容。如果它不是用作全屏项目,您应考虑将 clip 属性设置为 true。 Read More
-
十二、QML——属性总结
1 自定义属性 自定义属性的格式如下: [default] [required] [readonly] property <propertyType> <propertyName> 属性名称必须以小写字母开头,并且只能包含字母、数字、下划线。 default、required 和 readonly 关键字是可选的,用于修改所声明属性的语义。 声明自定义属性会隐式地为该属性创建一个值更改信号,以及一个命名 on<PropertyName>Changed 的关联信号处理程序,其中 <PropertyName> 是属性的名称,但是这里需要首字母大写` 1.1 属性别名 ... Read More
-
十一、QML——布局(Row、Column、Grid)
在 Qt Design Studio 中,选择要布局的元素、右击选择 Layout 。 有三种布局,分别是 Row、Column 和 Grid 。 1 Row 2 Column 3 Grid Read More
-
十、QML——Component
Component 是能够可重用、封装好QML组件的一种类型。可以理解为,Component能够实例化(创建)QML组件。调用一次,实例化一次qml组件。 每个qml对象,都能使用 Component.completed() 和 Component.destruction() 这和使用C++实例化qml组件是类似的,只不过只是,qml文件内部有一次进行实例化另一个qml组件。 Read More
-
九、QML——import
第一部分先了解 qmldir 文件如何定义,以及各部分含义。 第二部分再总结关于 import 语句(其实就是告诉引擎QML文档中能够使用哪些模块、JavaScript资源和组件目录)。接下来会讲解这三种类型的导入,每种导入类型的语法略有不同,适用于不同导入类型的语义也不同。 1 Moudle模块的定义 1.1 手动编写qmldir文件 模块是由一个名为 qmldir 的文件指定的,我们可以打开QT中模块所在的文件夹看看,每个模块都对应一个 qmldir 文件。 我们在 /assets/Qt6/qml_09_import/ 下创建一个 qmldir 文件。 基本内容格式如下: module <Module... Read More
-
七、QML——FastBlur
毛玻璃效果:https://www.qt.io/blog/qt-quick-and-blurred-panels Read More
-
七、QML——OpacityMask
1 OpacityMask OpacityMask: 通过 MaskSource 提供的非透明区域跟 Source 区域进行与运算,保留 MaskSource 跟 Source 重叠的的非透明区域。 1.1 属性 1.1.1 cached 是否允许缓存效果输出像素以提高渲染性能。默认为 false。 每次更改源或效果属性时,都必须更新缓存中的像素。 内存消耗增加,因为需要额外的内存缓冲区来存储效果输出。 建议在源或效果属性动画时禁用缓存。 1.1.2 invert 此属性控制 sourceMask 的 alpha 值的行为方式。默认为 false。 如果此属性为 false,则生成的不透明度是源 alpha 乘以掩码 alpha,As * Am。 如果此属性为... Read More
-
六、QML——Animation
动画将应用于属性的更改。当属性值更改时,动画将定义从一个值到另一个值的插值曲线。这些动画曲线创建从一个值到另一个值的平滑过渡。 Animation 是一个基础类型,这个类型不能实例化。 PropertyAnimation 是基础于 Animation 的一个属性动画类型。可以在属性值变化区间插值,调整属性值变化的速度和如何变化。 ColorAnimation 和 NumberAnimation 以及 RotationAnimation 是继承于 PropertyAnimation。其中 PropertyAnimation 适用于任意类型的属性动画,而这三种只适用于颜色、数值、旋转属性动画。 Sequentia... Read More
-
五、QML——State
比如我们页面某些控件(Button、Label等),需要在不同时候,显示不同的状态。比如鼠标点击按钮,按钮背景颜色和前景色变化。State只是属性变化,并没有动画的设置等相关。 鼠标未被按下状态 鼠标按下状态 1 基本概念 state 是从默认配置中批量更改的一组集合。 所有项目都有一个默认状态,该状态定义了对象的默认配置和属性值。通过将 State 项添加到 states 属性中,可以定义新的状态,从而允许项目在不同的配置之间切换。这些配置可以用于应用不同的属性值集或执行不同的脚本。 以下示例显示了一个简单的矩形。在默认状态下,矩形的颜色是黑色。在 “clicked” 状态下,PropertyChanges... Read More
-
四、QML——Glow
有两种Item,都可以组件具备光晕效果,分别是 Glow 和 RectangularGlow 。 Glow 是一个视觉效果项,用于为对象创建发光效果(也称为辉光效果)。这种效果常用于突出显示或增强对象的可视吸引力。对于所有Item都可以。 RectangularGlow 具有良好的性能。光晕的形状限制为具有自定义角半径的矩形。对于需要自定义形状的情况,考虑光晕效应,使用 Glow。 1 Glow 1.1 Glow相关属性 1.1.1 cached 这个属性是布尔类型,是否允许缓存效果的输出像素,以提高渲染的性能。 如果source的相关属性是进行动画效果变化时,禁用该选项 1.1.2 color 设置光晕的颜色 1.1.... Read More
-
三、QML——ApplicationWindow
1 窗口类型 在Qt Quick中,ApplicationWindow 和 Window 是用于创建应用程序窗口的两个重要元素。 1.1 Window 是 QtQuick 模块中的一个类型,用于创建独立的窗口或弹出窗口。 不提供应用程序窗口的结构,需要自行定义窗口的外观和功能,如菜单栏、工具栏、页面视图等。 1.2 ApplicationWindow 是 QtQuick.Controls 模块中的一个元素,用于创建应用程序的顶级窗口。 ApplicationWindow 继承 Window 类型,额外添加了标题栏、工具栏、页面视图等属性。 2 QtQuick.Co... Read More
-
二、QML——Item
1 Item Item类型是所有可视化类型的基类,Item类型是在QtQuick中。Item是继承于QtObject元素。 QtQuick中所有可视项都继承自Item。尽管Item对象没有视觉外观,但他定义了所有视觉类型的基本属性,比如x,y位置,宽高以及锚点等。 Item类型可以作为根元素包含视觉项目。 import QtQuick 2.0 Item { Image { source: "tile.png" } Image { x: 80 width: 100 height: 100 source: "til... Read More
-
一、QML——QtObject
Qt Object 是一个非视觉性元素,它仅仅含有 objectName 属性。 我们可以使用 QtObject 用来创建属于项目的一组自定义属性,比如 Qt Design Studio 中一般都会创建的 Constants.qml 视觉类型的元素,跟元素其实就是 QtObject Read More
-
QML——前言
QML是一种声明式语言,通过这种语言可以描述如何创建图形界面。 Qt Quick是QML类型的标准库,提供QML类型和相关函数。 1 什么是QML? QML是一种用户界面规范和编程语言。它允许开发人员和设计师创造高性能、流畅动画和视觉吸引力的应用程序。QML提供了高度可读的、声明式的、类JSON语法,支持结合动态属性绑定的命令式JavaScript表达式。 import QtQuick import QtQuick.Controls ApplicationWindow { width: 400 height: 400 visible: true Button { id: button ... Read More
-
一、Arm架构基本概念
1 Linux下查询系统架构命令 uname -m lieryang@lieryang-desktop:~/Downloads$ uname -m aarch64 2 ARMv7、ARMv8和ArmV9 ARMv7架构 特点: 32位架构,引入了Thumb-2指令集用于提高代码密度。 主要代表核心: Cortex-A7, Cortex-A9, Cortex-A15, Cortex-A17, Cortex-A53, Cortex-A57等。 ARMv8架构 特点: 64位架构,引入了AArch64指令集用于64位模式,保留了AArch32指令集用于32位模式。 主要代表核心: Cortex-A53, Cortex-A57, Cortex-A72, Cortex-A... Read More
-
一、C语言编程注释规范
1 说明性文件头部应进行注释 说明性文件(如头文件.h 文件、.inc 文件、.def 文件、编译说明文件.cfg 等)头部应进行注释,注释必须列出:版权说明、版本号、生成日期、作者、内容、功能、与其它文件的关系、修改日志等,头文件的注释中还应有函数功能简要说明。 示例:下面这段头文件的头注释比较标准,当然,并不局限于此格式,但上述信息建议要包含在内。 /** * Copyright (C), 2020-2099, Lieryng Tech. Co., Ltd. * File name: // 文件名 * Author: Version: Date: // 作者、版本及完成日期 * Description: // 用于详... Read More
-
九、GObject信号机制--信号Accumulator
1 类设计 /* file name : signal-demo.h */ #ifndef SIGNAL_DEMO_H #define SIGNAL_DEMO_H #include <glib-object.h> #define SIGNAL_TYPE_DEMO (signal_demo_get_type ()) #define SIGNAL_DEMO(object) \ G_TYPE_CHECK_INSTANCE_CAST ((object), SIGNAL_TYPE_DEMO, SignalDemo) #define SIGNAL_IS_DEMO(object) \ G_TYPE_CHECK_INSTANCE_TYPE ((objec... Read More
-
八、GObject信号机制
1 编写SignalDemo类 /* file name : signal-demo.h */ #ifndef SIGNAL_DEMO_H #define SIGNAL_DEMO_H #include <glib-object.h> #define SIGNAL_TYPE_DEMO (signal_demo_get_type ()) #define SIGNAL_DEMO(object) \ G_TYPE_CHECK_INSTANCE_CAST ((object), SIGNAL_TYPE_DEMO, SignalDemo) #define SIGNAL_IS_DEMO(object) \ G_TYPE_CHECK_INSTAN... Read More
-
七、GObject闭包
闭包:一个函数加上它所访问的所有非局部变量(传入的参数?) #include <math.h> #include <glib-object.h> void g_cclosure_user_marshal_INT__VOID_VOID (GClosure *closure, GValue *return_value G_GNUC_UNUSED, guint n_param_values, ... Read More
-
六、回调函数与闭包
1 回调函数 1.1 C库函数-qsort() void qsort(void *base, size_t nitems, size_t size, int (*compar)(const void *, const void*)) 参数 base – 指向要排序的数组的第一个元素的指针。 nitems – 由base指向的数组中元素的个数。 size – 数组中每个元素的大小,以字节为单位。 compar – 用来比较两个元素的函数。 #include<stdio.h> #include<stdlib.h> #include<string.h> static int str_compare(const void *s1... Read More
-
五、GObject对接口的模拟
1 USB接口 1.1 USB接口头文件 /* file name : my-iusb.h */ #ifndef MY_IUSB_H #define MY_IUSB_H #include <glib-object.h> #define MY_TYPE_IUSB (my_iusb_get_type ()) #define MY_IUSB(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj),MY_TYPE_IUSB, MyIUsb)) #define MY_IS_IUSB(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), MY_TYPE_IUSB)) /* 用于MyIUsb接口的实例结构体中取出类结构体指... Read More
-
四、GObject子类的继承
1 Bibtex文献类的设计 1.1 Bibtex类头文件 /* file name: my-bibtex.h */ #ifndef KB_BIBTEX_H #define KB_BIBTEX_H #include<glib-object.h> #define MY_TYPE_BIBTEX (my_bibtex_get_type()) #define MY_BIBTEX(object) \ G_TYPE_CHECK_INSTANCE_CAST ((object), MY_TYPE_BIBTEX, MyBibtex) typedef struct _MyBibtex MyBibtex; struct _MyBibtex{ GObject paren... Read More
-
三、GObject私有属性的查看与设置
1.1 类头文件 #ifndef PM_DLIST_H #define PM_DLIST_H #include <glib-object.h> #define PM_TYPE_DLIST (pm_dlist_get_type ()) /* 将基类指针类型转换为PMDList类的指针类型 */ #define PM_DLIST(object) G_TYPE_CHECK_INSTANCE_CAST ((object),\ PM_TYPE_DLIST, PMDList) typedef struct _PMDList PMDList; struct _PMDLis... Read More
-
二、GObject子类对象的私有属性模拟
1.1 PMDList类头文件 /* file name : pm-dlist.h */ #ifndef PM_DLIST_H #define PM_DLIST_H #include <glib-object.h> /** * 通过该宏指向的pm_dlist_get_type函数 * 可以获得PMDList类结构体信息和初始化函数 * pm_dlist_get_type函数内部的实现由G_DEFINE_TYPE宏实现 */ #define PM_TYPE_DLIST (pm_dlist_get_type ()) typedef struct _PMDList PMDList; struct _PMDList { GObje... Read More
-
一、使用GObject库模拟类的封装
1 子类结构体 本人GObject学习主要参考博客,讲的深入浅出,基本把我学习GStreamer遇见的基于GObject函数将明白了。 1.1 PM_Dlist类的头文件 /* file name : pm-dlist.h */ #ifndef PM_DLIST_H #define PM_DLIST_H #include<glib-object.h> /* pm_dlist_get_type 函数的作用就是获取PMDList类的具体结构 */ #define PM_TYPE_DLIST (pm_dlist_get_type()) typedef struct _PMDListNode PMDListNode; struct _PMDListNode{ PM... Read More