芯动大师
InfoQ签约作者,阿里云专家博主,51CTO专家博主,华为云云享专家,嵌入式开发工程师,AE工程师。
座右铭:向着太阳,追逐梦想!
展开
-
Linux设备树(DTS)
Dts:DTS即Device Tree Source,是一个文本形式的文件,用于描述硬件信息。一般都是固定信息,无法变更,无法overlay。原创 2024-08-12 21:07:26 · 33 阅读 · 0 评论 -
PID算法原理分析及优化
今天为大家介绍一下经典控制算法之一的PID控制方法从提出至今已有百余年历史,其由于结构简单、易于实现、鲁棒性好、可靠性高等特点,在机电、冶金、机械、化工等行业中应用广泛。在大学期间,参加的智能汽车竞赛中就使用到了PID经典控制算法,对于智能小车的调试更加的方便。原创 2024-08-09 22:12:40 · 40 阅读 · 0 评论 -
在Ubuntu安装RPM文件
Ubuntu软件源包含数千个deb软件包,可以从Ubuntu软件中心或使用apt命令行安装。Deb是所有基于Debian的Linux发行版,例如包括Ubuntu,Linux mint等发行版使用的安装包格式。如果某些软件在Ubuntu软件源中不可用,可以通过启用适当的软件源来安装,然后使用APT命令安装。在大多数情况下,当软件开发者不提供软件源时,他们都有一个下载页面,您可以在该页面下载并安装deb软件包,或者下载源码然后编译。虽然不常见,但某些软件开发者可能会仅发布RPM包格式的文件。原创 2024-08-08 22:58:31 · 53 阅读 · 0 评论 -
Ubuntu系统上定制文件系统
Forlinx Desktop(Ubuntu)系统基于Ubuntu官方为嵌入式设备制作的操作系统-Lubuntu,该操作系统具备apt-get、ldd等常用的命令,若需要安装软件则直接apt-get在线安装即可,不需进行交叉编译移植等繁琐操作。但是每次重新烧写镜像之后,之前安装的软件就得重新安装,比较繁琐,如果需要批量操作则每块开发板都需要去apt-get安装,这样会大幅增加工作量,很不便于批量化生产。至此,便可以安装所需软件了,在这里用apt-get安装自己所需软件,根据所需安装。原创 2024-08-06 22:44:26 · 41 阅读 · 0 评论 -
C++的基类和派生类构造函数
基类的成员函数可以被继承,可以通过派生类的对象访问,但这仅仅指的是普通的成员函数,类的构造函数不能被继承。构造函数不能被继承是有道理的,因为即使继承了,它的名字和派生类的名字也不一样,不能成为派生类的构造函数,当然更不能成为普通的成员函数。在设计派生类时,对继承过来的成员变量的初始化工作也要由派生类的构造函数完成,但是大部分基类都有 private 属性的成员变量,它们在派生类中无法访问,更不能使用派生类的构造函数来初始化。原创 2024-08-04 15:22:53 · 52 阅读 · 0 评论 -
C++中的AI编程助手添加
这两年 AI 发展迅猛,作为开发人员,我们总是追求更快、更高效的工作方式,AI 的出现可以说改变了很多人的编程方式。AI 对我们来说就是一个可靠的编程助手,给我们提供了实时的建议和解决方案,无论是快速修复错误、提升代码质量,或者查找关键文档和资源,AI 作为编程助手都能让你事半功倍。原创 2024-07-30 23:00:17 · 39 阅读 · 0 评论 -
嵌入式工程师需要掌握哪些技术?
嵌入式系统是当今科技领域中的重要组成部分,它们存在于我们生活的方方面面,从智能手机到汽车控制系统,从家电到医疗设备。因此,对于那些想要进入嵌入式行业的人来说,掌握一些必要的技术能力是至关重要的。在本篇中,我们将讨论入行嵌入式所必须的技术能力。原创 2024-07-24 23:08:40 · 70 阅读 · 0 评论 -
嵌入式Linux的学习误区
我们的目标不是学习linux服务器的配置和使用,linux服务器的高级配置和使用那是另外一个领域,不属于嵌入式linux讨论的范畴。很多想学嵌入式linux 的同学经常问我,我不会linux系统,怎么学习嵌入式linux开发,于是他们就花费了大量的精力和时间去研究学习桌面版本linux系统的使用,什么redhat 、federo,、ubuntu等等都用过,如何配置linux,linux的各种使用命令都背的滚瓜烂熟,linux各种服务器的配置,还原备份各种操作非常熟悉,以为这样就学会了嵌入式linux开发。原创 2024-07-23 22:15:09 · 54 阅读 · 0 评论 -
QT设置widget背景图片
首先说方法,在给widget或者frame或者其他任何类型的控件添加背景图时,在样式表中加入如下代码,指定某个控件,设置其背景。drawPixmap在Widget的整个矩形区域绘制背景图片,第三个参数为要绘制的图片区域,传入空的矩形表示整个图片区域。特别提醒:类名 # 控件名,其中控件名要准确,假如你把widget的名字改成了其他,那么这里的控件名要一致。首先获得Widget的调色板,然后设置设置调色板背景(setBrush),最后将调色板设置到Widget中。1.使用调色板QPalette来设置图片。原创 2024-07-21 22:17:03 · 306 阅读 · 0 评论 -
DC-DC产品设计PCB注意事项
DC-DC的电路比LDO会复杂很多,噪声也更大,布局和layout要求更高,layout的好坏直接影响DC-DC的性能,所以了解DC-DC的layout至关重要。原创 2024-07-18 22:00:30 · 64 阅读 · 0 评论 -
C++中的语法知识虚继承和虚基类
多继承(Multiple Inheritance)是指从多个直接基类中产生派生类的能力,多继承的派生类继承了所有父类的成员。尽管概念上非常简单,但是多个基类的相互交织可能会带来错综复杂的设计问题,命名冲突就是不可回避的一个。多继承时很容易产生命名冲突,即使我们很小心地将所有类中的成员变量和成员函数都命名为不同的名字,命名冲突依然有可能发生,比如典型的是菱形继承,如下图所示:图1:菱形继承。原创 2024-07-17 23:20:29 · 64 阅读 · 0 评论 -
Ubuntu系统下编译OpenCV4.8源码
其实很简单,只要三步即可搞定,第一步是下载指定版本的源码包;第二步是安装OpenCV4.8编译需要的编译器与第三方库支持;运行一个简单的OpenCV图像显示的程序验证OpenCV4.8 C++开发环境的正确性。在Ubuntu系统化下打开终端命令行窗口,执行下面的命令行即可。按Ctrl+X退出,选择y保存 然后继续运行。把下面的代码粘贴进去,保存以后退出。OpenCV4.8源码编译与安装。在执行该命令行生成安装文件。直接执行下面的命令行即可。使用下面的命令行完成安装。然后把下面的脚本粘贴进去。原创 2024-07-14 21:14:15 · 43 阅读 · 0 评论 -
采用Visual Studio版本的AI编程助手
VisualStudio是一个出色的 IDE,可用于构建适用于 Windows、Mac、Linux、iOS 和 Android 的丰富、精美的跨平台应用程序。使用一系列技术(例如 WinForms、WPF、WinUI、MAUI 或 Xamarin)构建丰富。原创 2024-07-13 21:51:15 · 50 阅读 · 0 评论 -
cout.tellp()和cout.seekp()语法介绍
无论是使用 cout 输出普通数据,用 cout.put() 输出指定字符,还是用 cout.write() 输出指定字符串,数据都会先放到输出流缓冲区,待缓冲区刷新,数据才会输出到指定位置(屏幕或者文件中)。值得一提的是,当数据暂存于输出流缓冲区中时,我们仍可以对其进行修改。ostream 类中提供有 tellp() 和 seekp() 成员方法,借助它们就可以修改位于输出流缓冲区中的数据。原创 2024-07-12 23:11:02 · 32 阅读 · 0 评论 -
深拷贝和浅拷贝介绍
对于基本类型的数据以及简单的对象,它们之间的拷贝非常简单,就是按位复制内存。b 和 obj2 都是以拷贝的方式初始化的,具体来说,就是将 a 和 obj1 所在内存中的数据按照二进制位(Bit)复制到 b 和 obj2 所在的内存,这种默认的拷贝行为就是浅拷贝,这和调用 memcpy() 函数的效果非常类似。对于简单的类,默认的拷贝构造函数一般就够用了,我们也没有必要再显式地定义一个功能类似的拷贝构造函数。原创 2024-07-11 23:03:47 · 34 阅读 · 0 评论 -
采用get()和put()读写文件
在某些特殊的场景中,我们可能需要逐个读取文件中存储的字符,或者逐个将字符存储到文件中。这种情况下,就可以调用 get() 和 put() 成员方法实现。原创 2024-07-10 22:39:20 · 36 阅读 · 0 评论 -
采用read()和write()读写二进制文件
以文本形式读写文件和以二进制形式读写文件的区别,并掌握了用重载的 >> 和原创 2024-07-09 21:05:24 · 39 阅读 · 0 评论 -
对回收站里的文件进行操作
该结构描述了要进行的文件操作的详细信息,包括源文件/文件夹路径、目标路径、操作类型和标志等。1、Boost.Filesystem(文件系统):该模块为C++操作文件系统提供了便捷且跨平台的接口,包括文件路径操作、目录遍历、文件访问等。boost::filesystem::path:表示文件或目录的路径,提供了丰富的路径操作函数,如获取父路径、拼接路径、判断路径是否存在等。3、Boost.DateTime(日期和时间):该模块提供了日期、时间和时间间隔的处理功能,包括日期时间的表示、计算、格式化等。原创 2024-07-07 19:09:27 · 31 阅读 · 0 评论 -
C++友元函数和友元类的使用
在C++中,友元(friend)是一种机制,允许某个类或函数访问其他类的私有成员。通过友元,可以授予其他类或函数对该类的私有成员的访问权限。友元关系在一些特定的情况下很有用,例如在类之间共享数据或实现特定的功能。友元可以分为两种类型:类友元和函数友元。友元的使用场景包括但不限于以下情况:当两个或多个类需要共享私有数据时,可以使用类友元来实现数据的直接访问,而无需通过公有接口。当某个类需要提供特定函数或操作给其他类使用,但这些函数需要访问类的私有成员时,可以使用函数友元。原创 2024-07-06 22:39:07 · 136 阅读 · 0 评论 -
在Ubuntu系统上定制文件系统
Forlinx Desktop(Ubuntu)系统基于Ubuntu官方为嵌入式设备制作的操作系统-Lubuntu,该操作系统具备apt-get、ldd等常用的命令,若需要安装软件则直接apt-get在线安装即可,不需进行交叉编译移植等繁琐操作。但是每次重新烧写镜像之后,之前安装的软件就得重新安装,比较繁琐,如果需要批量操作则每块开发板都需要去apt-get安装,这样会大幅增加工作量,很不便于批量化生产。至此,便可以安装所需软件了,在这里用apt-get安装自己所需软件,根据所需安装。原创 2024-06-22 23:09:42 · 45 阅读 · 0 评论 -
LDO的原理及测试方法
这是LM317芯片的核心,这个电路单元称为Bandgap Reference带隙基准源。属于模拟集成电路中的经典电路结构。常见的基本结构利用VBE的负温度系数,而VT是正温度系数,正负温度系数抵消就的得到稳定的基准参考电压了(三极管的方程VBE=VT*In(lC/IS))。原创 2024-06-20 22:34:17 · 282 阅读 · 0 评论 -
C++的list-map链表与映射表
C++ list-map链表与映射表的简单使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值。原创 2024-06-11 22:28:52 · 69 阅读 · 0 评论 -
c++实现哈希桶
那么这就是哈希桶的插入规则,找到对应位置的链表将数据插入到头部即可,如果要查找的话也是相同的原理先找到数据对应的链表然后循环遍历这个链表找到出现的数据即可,删除也是相同的道理,先找到数据对应的下标然后根据下标找到对应的链表,最后遍历链表找到要删除的数据进行链表的删除即可,那么这就是哈希桶的实现思路接下来我们就来看看这种方法的准备工作。根据前面的学习我们知道要想计算数据对应在哈希表上的位置就得添加对应的仿函数,那么这里的代码就如下。看到这里我们的准备工作就完成了接下来就要实现哈希的每个函数。原创 2024-06-06 22:17:51 · 45 阅读 · 0 评论 -
RA8D1-Vision Board上OSPI-Flash实践
高阶安全性:卓越的加密算法、TrustZone、不可变存储、带DPA/SPA攻击保护的防篡改功能、安全调试、安全工厂编程和生命周期管理支持。(1)FSP配置:最开始自己按照官方例程配置,在尝试无法获取UID后,发现是工程模板默认配置的CS引脚是CS0,实际硬件连接为CS1。(4)编写程序:由于使用的flash芯片型号不同,主要修改了官方例程的配置和初始化内容。(5)下载调试:首先需要调试初始化在识别芯片UID后,此时可确定配置正常,修改芯片状态后再调试和测试FAL执行情况。原创 2024-06-05 22:55:57 · 258 阅读 · 0 评论 -
大模型技术的发展与实践
我们对大模型相关的发展历史、openAI技术的发展脉络、当前国内外主流的大语言模型进行了简单的介绍,同时针对大模型区别于之前模型的核心技术原理进行了简单讲解,本章提到的预训练、指令微调、对齐微调、上下文学习、思维链提示、规划等核心技术读者需要了解。相信通过本章的讲解,读者大致了解了大模型相关的知识。在最后一节从内容生成、问题解答、互动式对话、生产力工具/企业服务、搜索推荐等5个维度介绍了大模型能够赋能的领域和应用场景。未来大模型一定会革新所有的行业和场景的。原创 2024-06-04 22:24:30 · 50 阅读 · 0 评论 -
C++中的注释作用
在 /* 和 */ 注释内部,// 字符没有特殊的含义。在 // 注释内,/* 和 */ 字符也没有特殊的含义。因此,您可以在一种注释内嵌套另一种注释。程序的注释是解释性语句,您可以在 C++ 代码中包含注释,这将提高源代码的可读性。#if 0 ... #endif 属于条件编译,0 即为参数。C++ 注释以 /* 开始,以 */ 终止。块注释符(/*...*/)是不可以嵌套使用的。/* ... */ - 一般用于多行注释。注释以 // 开始,直到行末为止。// - 一般用于单行注释。原创 2024-06-02 22:07:56 · 49 阅读 · 0 评论 -
C++语言的基本语法
想掌握一门编程语言,第一步就是需要熟悉基本的环境,然后就是最重要的语法知识。C++ 程序可以定义为对象的集合,这些对象通过调用彼此的方法进行交互。现在让我们简要地看一下什么是类、对象,方法、即时变量。对象具有状态和行为。例如:一只狗的状态 - 颜色、名称、品种,行为 - 摇动、叫唤、吃。对象是类的实例。类可以定义为描述对象行为/状态的模板/蓝图。从基本上说,一个方法表示一种行为。一个类可以包含多个方法。可以在方法中写入逻辑、操作数据以及执行所有的动作。每个对象都有其独特的即时变量。原创 2024-05-30 21:55:23 · 39 阅读 · 0 评论 -
基于Visual Studio版本的AI编程助手
VisualStudio是一个出色的 IDE,可用于构建适用于 Windows、Mac、Linux、iOS 和 Android 的丰富、精美的跨平台应用程序。使用一系列技术(例如 WinForms、WPF、WinUI、MAUI 或 Xamarin)构建丰富。原创 2024-05-29 22:25:01 · 873 阅读 · 0 评论 -
C++中的AI编程助手添加
这两年 AI 发展迅猛,作为开发人员,我们总是追求更快、更高效的工作方式,AI 的出现可以说改变了很多人的编程方式。AI 对我们来说就是一个可靠的编程助手,给我们提供了实时的建议和解决方案,无论是快速修复错误、提升代码质量,或者查找关键文档和资源,AI 作为编程助手都能让你事半功倍。原创 2024-05-28 22:31:59 · 81 阅读 · 0 评论 -
C++的基类和派生类构造函数
基类的成员函数可以被继承,可以通过派生类的对象访问,但这仅仅指的是普通的成员函数,类的构造函数不能被继承。构造函数不能被继承是有道理的,因为即使继承了,它的名字和派生类的名字也不一样,不能成为派生类的构造函数,当然更不能成为普通的成员函数。在设计派生类时,对继承过来的成员变量的初始化工作也要由派生类的构造函数完成,但是大部分基类都有 private 属性的成员变量,它们在派生类中无法访问,更不能使用派生类的构造函数来初始化。原创 2024-05-26 20:07:41 · 42 阅读 · 0 评论 -
C++ 使用getline()从文件中读取一行字符串
其中,第一种语法格式用于从文件输入流缓冲区中读取 bufSize-1 个字符到 buf,或遇到 \n 为止(哪个条件先满足就按哪个执行),该方法会自动在 buf 中读入数据的结尾添加 '\0'。我们知道,getline() 方法定义在 istream 类中,而 fstream 和 ifstream 类继承自 istream 类,因此 fstream 和 ifstream 的类对象可以调用 getline() 成员方法。这意味着,一旦遇到字符 'c',getline() 方法就会停止读取。原创 2023-10-11 20:50:49 · 625 阅读 · 0 评论 -
C++中的四种类型转换运算符
隐式类型转换是安全的,显式类型转换是有风险的,C语言之所以增加强制类型转换的语法,就是为了强调风险,让程序员意识到自己在做什么。但是,这种强调风险的方式还是比较粗放,粒度比较大,它并没有表明存在什么风险,风险程度如何。再者,C风格的强制类型转换统一使用( ),而( )在代码中随处可见,所以也不利于使用文本检索工具(例如 Windows 下的 Ctrl+F、Linux 下的 grep 命令、Mac 下的 Command+F)定位关键代码。原创 2023-09-20 21:48:06 · 149 阅读 · 0 评论 -
C++中的转换构造函数
在 C/C++ 中,不同的数据类型之间可以相互转换。无需用户指明如何转换的称为自动类型转换(隐式类型转换),需要用户显式地指明如何转换的称为强制类型转换。编译器对 7.5 是作为 double 类型处理的,在求解表达式时,先将 a 转换为 double 类型,然后与 7.5 相加,得到和为 13.5。在向整型变量 a 赋值时,将 13.5 转换为整数 13,然后赋给 a。整个过程中,我们并没有告诉编译器如何去做,编译器使用内置的规则完成数据类型的转换。p1 是int *原创 2023-09-19 21:49:22 · 147 阅读 · 0 评论 -
C++中的深拷贝和浅拷贝介绍
对于基本类型的数据以及简单的对象,它们之间的拷贝非常简单,就是按位复制内存。b 和 obj2 都是以拷贝的方式初始化的,具体来说,就是将 a 和 obj1 所在内存中的数据按照二进制位(Bit)复制到 b 和 obj2 所在的内存,这种默认的拷贝行为就是浅拷贝,这和调用 memcpy() 函数的效果非常类似。对于简单的类,默认的拷贝构造函数一般就够用了,我们也没有必要再显式地定义一个功能类似的拷贝构造函数。原创 2023-09-18 20:50:12 · 133 阅读 · 0 评论 -
C++中的 throw详解
C++ 规定,异常规范在函数声明和函数定义中必须同时指明,并且要严格保持一致,不能更加严格或者更加宽松。//错!定义中有异常规范,声明中没有//错!定义和声明中的异常规范不一致//对!定义和声明中的异常规范严格一致。原创 2023-09-17 19:34:14 · 376 阅读 · 0 评论 -
C++的异常类型与多级catch匹配
我们还遗留下一个问题,就是 catch 关键字后边的,这节就来详细分析一下。是异常类型,它指明了当前的 catch 可以处理什么类型的异常;variable是一个变量,用来接收异常信息。当程序抛出异常时,会创建一份数据,这份数据包含了错误信息,程序员可以根据这些信息来判断到底出了什么问题,接下来怎么处理。异常既然是一份数据,那么就应该有数据类型。C++ 规定,异常类型可以是 int、char、float、bool 等基本类型,也可以是指针、数组、字符串、结构体、类等聚合类型。原创 2023-09-16 22:26:59 · 142 阅读 · 0 评论 -
C++new和delete运算符介绍
有了对 double 运算符的重载,在本该出现 double 类型的变量或常量的地方,如果出现了一个 Complex 类型的对象,那么该对象的 operator double 成员函数就会被调用,然后取其返回值使用。内存管理运算符 new、new[]、delete 和 delete[] 也可以进行重载,其重载形式既可以是类的成员函数,也可以是全局函数。重载强制类型转换运算符时,不需要指定返回值类型,因为返回值类型是确定的,就是运算符本身代表的类型,在这里就是 double。重载后的效果是,第 13 行的。原创 2023-09-15 22:01:42 · 111 阅读 · 0 评论 -
C++的基类和派生类构造函数
基类的成员函数可以被继承,可以通过派生类的对象访问,但这仅仅指的是普通的成员函数,类的构造函数不能被继承。构造函数不能被继承是有道理的,因为即使继承了,它的名字和派生类的名字也不一样,不能成为派生类的构造函数,当然更不能成为普通的成员函数。在设计派生类时,对继承过来的成员变量的初始化工作也要由派生类的构造函数完成,但是大部分基类都有 private 属性的成员变量,它们在派生类中无法访问,更不能使用派生类的构造函数来初始化。原创 2023-09-14 21:52:06 · 128 阅读 · 0 评论 -
C++下标运算符详解
在实际开发中,我们应该同时提供以上两种形式,这样做是为了适应 const 对象,因为通过 const 对象只能调用 const 成员函数,如果不提供第二种形式,那么将无法访问 const 对象的任何元素。我们知道,有些较老的编译器不支持变长数组,例如 VC6.0、VS2010 等,这有时候会给编程带来不便,下面我们通过自定义的 Array 类来实现变长数组。,编译器不管实际上有没有修改对象,只要是调用了非 const 的成员函数,编译器就认为会修改对象(至少有这种风险)。不仅可以访问元素,还可以修改元素。原创 2023-09-14 21:49:24 · 534 阅读 · 0 评论 -
C++重载输入和输出运算符
在C++中,标准库本身已经对左移运算符分别进行了重载,使其能够用于不同数据的输入输出,但是输入输出的对象只能是 C++ 内置的数据类型(例如 bool、int、double 等)和标准库所包含的类类型(例如 string、complex、ofstream、ifstream 等)。如果我们自己定义了一种新的数据类型,需要用输入输出运算符去处理,那么就必须对它们进行重载。本节以前面的 complex 类为例来演示输入输出运算符的重载。原创 2023-09-11 21:20:33 · 264 阅读 · 0 评论