自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 无人车技术浪潮真的挡不住了~

正文无人驾驶汽车其实也不算是新鲜玩意了,早在十年前大家都开始纷纷投入研发,在那时就已经蠢蠢欲动,像目前大部分智驾系统和辅助驾驶系统都是无人驾驶系统的一个中间过度版本,就像手机进入智能机时代的中间版本。然而前段时间突然一口气就投入几百上千台无人车进入运营,还能满足大部分需求,这对大多数人的认知和饭碗是有冲击的。其实这种格局变化也不是第一次见证了,像在零售行业电商对实体行业的冲击,其实两者也并非相互排...

2024-07-20 20:31:35 379

原创 分不清 同步与异步,阻塞与非阻塞~

正文大家好,我是bug菌~最近跟几个伙计交流技术的时候,经常性的把"同步与异步","阻塞与非阻塞"两组概念搞混,其实两者还是有着本质的区别的,更何况还有"同步阻塞"、“异步非阻塞”等等各种组合,那么今天大致跟大家一起聊聊:1同步与异步同步和异步区别在于当你的程序处理一项事务时是否需要等待操作完成才能继续执行其他任务。同步表示的是顺序执行,当程序执行一个任务需要的等待任务完成,才能继续往下执行。而对...

2024-07-16 22:13:14 370

原创 这不是在搞技术,而是在玩心态~

正文大家好,我是bug菌~如今为制造业提供大型设备的研发型公司大多数都是做系统集成,一部分有技术实力的公司会把核心部分自研,其他相对比较通用的周边设备由其他公司产品来集成;也有一部分公司只是做做方案和资源整合,几乎没什么自研部分,相对技术实力薄弱一点,但手头有人脉有资源,照样混得风生水起。系统集成的好处就是做技术整合、缩短研发周期、加快产品上市周期,从而满足客户复杂的定制化需求;坏处便是技术的更新...

2024-07-09 22:22:46 436

原创 看来大部分公司的嵌入式软件只有debug版本

正文大家好,我是bug菌~大部分开发工具或者IDE中都为你创建的工程配置为debug和release两个版本,字面上很好理解,一个用于调试debug,一个用于发布release,那么是不是很多伙计都是debug版本用到老?那么今天聊聊release的必要性吧。1两个版本的通用解读在大型嵌入式应用软件开发中,如linux应用程序,这两个版本类型主要针对软件开发在不同阶段的构建过程的一些优化和设置,当...

2024-07-01 21:26:53 658

原创 分享一种高速串行扩展总线-PCIe

正文大家好,我是bug菌~随着半导体、芯片的快速发展,嵌入式平台越来越趋向于廉价、高性能的方向发展,外设接口丰富度和高性能愈来愈突出,那么今天bug菌跟大家介绍一下一种高速串行扩展总线-PCIe,相信不久的将来大家会用到此接口。1什么是PCIePCIe英文名:Peripheral Component Interconnect Express,它是一种高速串行计算机扩展总线标准,旨在取代传统的并行P...

2024-06-23 22:14:27 765

原创 linux的repo工具的入门

repo 是一个工具,用于管理 Git 仓库的集合,尤其在 Android 开发中被广泛使用。它是 Google 为 Android 项目开发的,以简化对大量 Git 仓库的管理。

2024-06-16 14:35:22 379 2

原创 linux用户态操作GPIO首先需要export导出

通过 export 文件来导出 GPIO 是为了让内核知道用户空间程序正在使用哪一个 GPIO 引脚,从而进行必要的初始化和管理,确保资源的正确分配和安全访问。这种机制使得 GPIO 的管理更加系统化和规范化,提高了系统的可靠性和灵活性。

2024-06-11 22:40:18 493

原创 显示子系统,显示子前后端,linuxfb,wayland

例如,在 Linux 系统中,显示后端通常由图形驱动程序提供,它与 DRM(Direct Rendering Manager)子系统进行交互,将图形数据传输到显示设备上。它负责接收来自应用程序或图形引擎的图形数据,并将其转换成适合显示的格式,以便发送到显示后端进行处理和输出。图形数据输出:显示后端负责将图形数据转换成适合在显示设备上显示的格式,并将其传输到显示设备上。图形数据生成:显示前端接收来自应用程序或图形引擎的图形数据,可能包括图像、文本、图形元素等,然后将其转换成适合在屏幕上显示的格式。

2024-06-09 23:13:47 758

原创 解读下/etc/network/interfaces配置文件

etc/network/interfaces 是一个常见的网络配置文件,通常在 Debian 及其衍生版本的 Linux 发行版中使用。auto eth0 和 iface eth0 inet static 部分配置了主要的以太网接口(Ethernet interface),通常是 eth0,采用静态 IP 地址分配方式。你的系统上的 /etc/network/interfaces 文件可能会根据网络配置的具体情况有所不同。address 指定了本机的 IP 地址为 192.168.1.100。

2024-06-09 18:27:16 487

原创 嵌入式系统如何尽可能避免存储数据丢失与损坏?

正文大家好,我是bug菌~对于一些需要动态存储数据的嵌入式系统往往我们需要考虑系统在各种状态的数据可靠性问题。当然也不仅仅这些数据敏感的协议,最常见的就是你向存储系统写入数据的过程中给断电了,系统下一次上电跑飞了~掉电过程是最为敏感的情景,也是一般在系统设计前期要重点考虑的,那么今天bug菌就跟大家重点聊聊一般的嵌入式系统如何尽可能的避免重要存储数据的丢失与损坏。1掉电检测前面也提到了,掉电过...

2024-06-08 21:01:53 696

原创 linux中dd命令以及如何测试读写速度

其中,/dev/zero和/dev/null是两个常用的特殊文件,它们分别用于生成无限数量的零字节和丢弃所有写入的数据。测试写入速度时,dd命令会不断地从/dev/zero设备读取数据,并写入到指定的测试文件中,同时使用conv=fdatasync参数确保数据写入到磁盘。测试读取速度时,dd命令会从指定的测试文件中读取数据,并将其丢弃到/dev/null设备中,不写入到任何文件,从而测试读取速度。执行这两个命令后,dd命令会输出读写的速度信息,包括每次读写的数据量以及花费的时间,从而可以计算出读写速度。

2024-06-08 20:25:02 799

原创 详解linux设备下的/dev/null

dev/zero是一个特殊的设备文件,它在Linux系统中通常被用来生成无限数量的零数据流。这个设备文件位于/dev目录下,它不代表任何实际的硬件设备,而是一个虚拟设备。当从/dev/zero设备中读取数据时,会得到无限数量的零字节,这些字节的值都是0。因此,/dev/zero常用于生成大量的零数据流,例如在创建文件时初始化数据、进行测试或者模拟特定场景。

2024-06-08 20:07:45 535

原创 底板外设倒灌到处理器分析

倒灌是指当外设向处理器提供的信号电平超出了处理器能够接受的范围,导致处理器无法正常启动或工作的现象。在设计嵌入式系统时,必须非常注意处理器和外设之间的电气兼容性和信号完整性,以防止倒灌等问题的发生。通过合理的硬件设计和选择合适的电气组件,可以有效地减少这些问题的发生,并确保系统的稳定性和可靠性。信号反向传播: 在系统中,某些情况下可能会发生信号的反向传播,导致外设向处理器发送错误的信号。过电流保护: 如果外设向处理器提供的电流超出了处理器的额定电流范围,可能会导致处理器无法正常工作或损坏。

2024-06-08 12:23:45 288

原创 Flash均衡算法几个点

由于Flash存储器的特性,擦除操作比写入操作要慢得多,而且每个块都有一个有限的擦除寿命,因此如何高效地管理擦除操作对于提高Flash存储器的性能和寿命非常重要。对于使用频繁的块,可以采取较小的擦除操作,对于使用较少的块,则可以进行更大范围的擦除操作。通过采用Flash均衡保存算法,可以有效地减少擦除操作的次数,提高Flash存储器的写入性能和寿命,同时也有助于降低系统的维护成本和延长设备的使用寿命。块合并: Flash均衡保存算法通常会对新数据进行缓冲,等待一定数量的写入操作后再进行实际的擦除操作。

2024-06-08 11:23:10 268

原创 芯片软件复位的作用

综合来看,使用软件复位而不是频繁地通过断电来实现复位操作可以提高系统的稳定性和数据完整性,延长硬件设备和存储介质的使用寿命,但在某些特定情况下,如系统完全崩溃时,仍然需要考虑通过断电操作来恢复系统。故障恢复: 在系统发生软件故障或死锁情况下,软件复位是一种常用的方法来恢复系统运行,它可以通过重新启动系统来清除潜在的问题,并使系统重新回到可用状态。性能优化: 通过定期进行软件复位,可以清除系统中的临时数据和缓存,从而有助于提高系统的性能和响应速度,特别是对于长时间运行的系统而言。

2024-06-08 11:15:49 262

原创 stm32mp157为什么要把相同的tf-A trust烧录emmc的boot1和boot2?

安全性: TF-A是用于启动和配置系统的基础固件,其中包含了一些关键的安全功能,如Secure Monitor,用于安全启动过程的控制。通过将TF-A烧录到两个引导区域,可以增加系统的安全性,因为即使一个区域受到攻击或损坏,系统仍然可以从另一个区域启动,并保持安全性。如果其中一个引导区域发生故障,系统可以从另一个引导区域启动,提高了系统的可靠性和稳定性。综上所述,将相同的TF-A烧录到STM32MP157的eMMC的Boot1和Boot2区域是为了提高系统的冗余性、可靠性和安全性,以及便于固件更新。

2024-06-02 17:59:06 277

原创 写大型C工程makefile构建~

正文最开始学习linux应用开发编写的时候,估计大部分伙伴们都是在一个目录里面编译整个工程,主要是linux通常没有非常合适的集成开发环境。以前单目录的方式实在太过捡漏,在linux环境中进行C代码工程开发很多时候需要编写一个相对比较通用的makefile,一劳永逸,能自动查找并归类每个目录的文件进行编译。可能很多朋友会选择一些cmake,scons等自动化构建工具,但也有部分伙计编写makefi...

2024-05-31 22:20:33 900

原创 详解makefile中的foreach

在这个例子中,$(foreach file, $(FILES), $(file:.c=.o)) 将会遍历 FILES 变量中的每个文件名,并将每个文件名的 .c 扩展名替换成 .o,最终得到 OBJS 变量的值为 “file1.o file2.o file3.o”。在 Makefile 中,foreach 函数用于迭代处理一个以空格分隔的列表,并针对列表中的每个元素执行相同的操作。) 将会遍历 LIBS 变量中的每个库文件名,并将每个库文件复制到 /usr/local/lib/ 目录下。

2024-05-28 23:50:25 706

原创 详解make file中的notdir

在这个例子中,$(notdir $(SRCS)) 将会从 SRCS 变量中的每个文件路径中提取文件名部分,并将处理后的结果赋值给 OBJS 变量。在这个示例中,$(notdir $(wildcard $(addprefix $(VPATH)/,*.c))) 将会从 VPATH 目录下的所有 .c 文件的路径中提取文件名部分,从而得到所有的 .c 文件名。) 函数在 Makefile 中非常有用,可以帮助我们从路径中提取文件名部分,实现灵活的文件处理和路径操作。:一组空格分隔的文件名或路径。

2024-05-28 23:43:05 267

原创 详解makefile中addprefix

(SOURCES:.c=.o)) 将会在 SOURCES 变量中的每个文件名后面添加 obj/ 前缀,并将处理后的结果赋值给 OBJS 变量。在这个示例中,$(addprefix $(VPATH)/,file1.c file2.c file3.c) 将会在 file1.c file2.c file3.c 的每个文件名前面添加 $(VPATH)/ 前缀,从而构建出完整的路径。) 函数在 Makefile 中非常有用,可以帮助我们将指定的前缀添加到一组文件名或路径中,实现灵活的路径拼接和文件处理。

2024-05-28 23:39:54 462

原创 解读makefile中$(patsubst pattern,replacement,text)

(OBJ_DIR)/%.o,$(notdir $(wildcard $(addprefix $(VPATH)/,*.c)))) 将会对 VPATH 目录下的所有 .c 文件进行处理,将其替换成输出目录 OBJ_DIR 中对应的 .o 文件名,并且将处理后的结果赋值给 OBJS 变量。在 Makefile 中,$(patsubst pattern,replacement,text) 是一个用于模式替换的函数,它可以将文本中符合指定模式的部分替换为指定的字符串。text:要进行模式替换的文本。

2024-05-28 23:35:46 283

原创 解读makefile中的延迟变量与即时变量

在 Makefile 中,有两种类型的变量:即时变量(immediate variable)和延迟变量(deferred variable)。它们在 Makefile 的执行过程中具有不同的特性和行为。

2024-05-28 23:22:00 324

原创 详解makefile中的$(wildcard pattern)

在 Makefile 中,$(wildcard pattern) 是一个函数,用于匹配指定模式的文件,并返回符合条件的文件列表。这个示例中,$(wildcard src/.c include/.h) 将匹配 src 目录下的所有 .c 文件和 include 目录下的所有 .h 文件,并将结果合并为一个文件列表赋值给变量 FILES。在这个例子中,$(wildcard *.c) 将匹配当前目录下所有以 .c 结尾的文件,并将符合条件的文件名列表赋值给变量 SRCS。

2024-05-28 23:12:47 545

原创 解读makefile中的.PHONY

通常情况下,.PHONY 会被用来声明一组需要执行的动作,例如 clean、all 等,并告诉 Make 工具这些目标并不对应真实的文件,而只是动作的名称。避免与同名文件产生冲突:如果存在一个与目标同名的文件,且用户误输入了该目标名字,Make 工具会尝试去构建这个同名文件,而不是执行我们期望的动作。使用 .PHONY 声明伪目标可以避免因为存在同名文件而导致意外的行为,同时也能让 Make 工具知道这些目标并不对应真实文件,从而正确地执行相应的动作。

2024-05-28 23:01:20 593

原创 makefile一些特殊且常用的符号

|:表示所有比目标文件更新的依赖文件列表,但不移除重复的依赖文件。#:注释符号,在Makefile中以#开头的行会被解释为注释。+=:追加赋值符号,用于将值追加到变量中而不覆盖原有值。$^:表示所有的依赖文件列表,多个文件以空格分隔。+:类似于+:类似于^,但是会保留重复的依赖文件。$*:表示目标文件的主文件名(不包括扩展名)。:表示所有比目标文件更新的依赖文件列表。-:减号,用于忽略赋值语句中的错误。$<:表示第一个依赖文件的名称。=:赋值符号,用于变量的赋值。$@:表示目标文件的名称。

2024-05-28 22:53:06 258

原创 老显示器该换了,否则会摧毁你的眼睛~

正文大家好,我是bug菌~今天给大家带来一篇关于程序员护眼的文章,大部分伙计都是敲代码的,即使不是码农,也多半每天要抱着电脑处理各种事务,那么对眼睛来说还是挺大负担的特别眼睛原本就不好的朋友更加不友好,那么今天bug菌就大致聊聊显示器是如何摧残我们眼睛的,知己知彼才能减少伤害。1太阳VS显示器显示器是一种发光的电子设备,相对于眼睛而言,它就是一种光源,然而我们都知道自然界最大光源当属太阳了,太...

2024-05-25 11:20:14 441

原创 万车互联很有必要呢~

正文大家好,我是bug菌~前段时间关于车的事故问题那叫一个接连不断。有智驾辅助系统因为前面的广告牌中有人车误识别而紧急制动的。也有因为道路坍塌导致多台车辆接连坠毁的。病驾,醉驾这些马路杀手就更是不计其数了。这些事故现象都指向一个问题:汽车安全。作为技术人应该都会有的一个思维,这些问题靠技术手段有没有办法解决?能不能大幅度降低?至少个人觉得现在这块的技术推进得还是太慢,当然不可否认也存在着这样或那样...

2024-05-16 22:37:45 179

原创 C#委托以及在事件驱动编程中的使用

在C#中,委托是一个类,它能够存储对方法的引用。委托的定义类似于一个方法的原型,它指定了方法的返回类型和参数列表。例如:这个委托可以用来引用任何返回类型为void,且接受一个string参数的方法。首先,定义一个委托,用于指定事件处理方法的签名。委托的签名应该与事件处理方法的签名相匹配。例如:在类中定义一个事件,该事件将触发委托所引用的方法。通常,事件使用event关键字声明。例如:实现事件处理方法,其签名必须与委托所指定的签名匹配。当事件触发时,这些方法将被调用。

2024-05-15 00:08:55 586

原创 C#之partial关键字

这意味着可以将一个类或其他类型的定义分成多个部分,这些部分可以在同一个命名空间或程序集中的多个源文件中进行定义。分部方法(Partial Method):分部方法是分部类的一部分,它们允许在一个部分中声明一个方法的签名而在另一个部分中实现该方法的具体代码。分部类(Partial Class):分部类允许将一个类的定义分成多个部分,并分别在不同的文件中实现。这在大型项目中特别有用,允许多个开发人员独立工作,并在不同的文件中修改和扩展同一个类或类型的定义。编译器会将这两个部分合并成一个完整的类。

2024-05-13 22:36:56 491

原创 MFC重要的初始化函数InitInstance

在应用程序启动时,系统会自动创建这个应用程序类的一个实例,并在这个实例的构造函数中执行一系列的初始化操作,包括初始化应用程序的状态、注册窗口类、加载资源等。在上面的示例中,CMyApp::InitInstance函数创建了应用程序的主窗口,并将其设置为应用程序的主窗口。在MFC应用程序中,通常会派生一个应用程序类,例如CMyApp,并重写InitInstance函数来执行应用程序特定的初始化操作。InitInstance函数是MFC应用程序框架中的一个虚拟函数,用于执行应用程序的实例化和初始化操作。

2024-05-12 22:56:05 421

原创 Windows的消息过程调用与窗口位于同一个线程

这种单线程模型称为消息循环(Message Loop),窗口的消息处理和应用程序的其他逻辑都运行在同一个线程上。在Windows中,每个窗口都有一个与之相关联的线程,这个线程负责处理窗口的消息。当窗口接收到消息时,系统会将消息发送给创建窗口的线程,并在该线程上调用窗口过程函数来处理消息。要确保窗口程序的响应性,通常建议将耗时操作放在单独的线程中执行,或使用异步操作。然而,如果在窗口过程函数中执行耗时操作,会导致窗口的响应性下降,因为窗口线程被阻塞,无法处理其他消息。

2024-05-12 22:49:39 244

原创 windows窗口消息队列与消息过程处理函数

在Windows窗口应用程序中,消息队列和窗口过程函数是实现消息驱动机制的核心组件。

2024-05-12 22:46:00 457

原创 最简单的Winapi编程窗口程序

这个程序创建了一个简单的窗口,窗口的标题为"My First Window",大小为500x400。当用户关闭窗口时,程序会调用PostQuitMessage函数退出消息循环,从而结束程序的运行。

2024-05-12 22:29:55 370

原创 MFC的句柄概念以及句柄类型

在MFC中,通常使用CDC类来进行绘图操作,而设备上下文句柄可以通过CDC::GetSafeHdc()方法获取,用于在设备上下文中进行绘图操作,例如绘制图形、文本或图像等。在MFC中,通过CMenu类可以创建和管理菜单,而菜单句柄可以通过CMenu::GetSafeHmenu()方法获取,用于操作菜单,例如添加菜单项、显示菜单等。在MFC中,通过CWnd::m_hWnd成员变量可以获取窗口句柄,用于操作和管理窗口,例如改变窗口的大小、位置、显示或隐藏窗口等。

2024-05-12 22:24:55 410

原创 MFC桌面应用中窗口的客户区与非客户区的

在MFC(Microsoft Foundation Class)中,窗口被分为客户区和非客户区。理解这两个概念对于设计和开发Windows应用程序至关重要。

2024-05-12 22:18:49 811

原创 MFC的CPen与CBush画图对象使用步骤

在MFC中,CPen和CBrush是两个常用的绘图对象,分别用于定义画笔和画刷,可以用于绘制图形、填充区域等。下面我会详细介绍如何在MFC中使用CPen和CBrush来绘制和填充图形。使用 CPen 绘制图形:创建 CPen 对象: 首先,你需要创建一个CPen对象,并指定画笔的样式、颜色和宽度等属性。Copy CodeCPen myPen;myPen.CreatePen(PS_SOLID, 2, RGB(255, 0, 0)); // 创建一个红色、宽度为2像素的实线画笔选入画笔对象: 在

2024-05-12 22:12:11 604

原创 MFC窗口更新与重绘

在这些情况下,Windows系统会发送相应的消息给窗口或控件,MFC框架会根据收到的消息调用相应的事件处理函数,例如OnPaint事件,以便应用程序能够重新绘制窗口或控件的外观。窗口重叠或暴露: 当窗口被其他窗口遮挡部分或完全遮挡,或者窗口从被遮挡状态变为可见状态时,需要重新绘制被暴露或遮挡的部分。窗口大小变化: 当用户调整窗口大小时,窗口的客户区大小会改变,需要重新绘制窗口内容以适应新的大小。数据更新: 当窗口或控件显示的数据发生变化时,需要更新窗口或控件的外观以反映最新的数据内容。

2024-05-12 22:03:30 481

原创 MFC通过继承现有控件自定义控件

如果你的自定义控件是一个窗口控件(而不是一个子控件,如在一个对话框中),你可能需要注册控件类。在资源编辑器中,将相应的控件替换为你的自定义控件类(如果你使用的是对话框),或者在你的代码中动态创建并添加你的自定义控件。在MFC 自定义控件,可以通过继承MFC提供的控件类(如CButton、CEdit、CListBox等)并重写其成员函数和消息处理函数来实现。如果你需要自定义控件的外观,你可能需要在DrawItem函数中绘制控件。编译你的MFC项目,并运行以测试你的自定义控件。

2024-05-12 16:34:51 448

原创 MF自定义控件方法

在MFC中,您可以通过自定义控件来实现特定的用户界面元素或功能,以满足您的应用程序需求。自定义控件通常是从CWnd类派生的子类,您可以在其中重写绘制、处理事件等方法,以实现您想要的功能和外观。OnMouseMove、OnLButtonDown、OnLButtonUp:处理鼠标事件,实现交互功能。通过这些步骤,您就可以创建和使用自定义控件了。您可以根据自己的需求和设计来扩展和定制控件的功能和外观。OnSize:在控件大小改变时调用,可以重新布局控件。OnPaint:在控件需要重新绘制时调用。

2024-05-12 16:30:02 413

原创 MFC的view视图为何不能拖入控件

在对话框类和窗口类中,您可以使用资源编辑器直接拖放控件,并在设计时布置它们的位置和大小。自定义设计时支持:您可以使用自定义的方法扩展MFC的设计时支持,使得您可以在View类中拖放控件。在MFC中,View类通常用于显示和处理应用程序的数据,而不是直接用于设计用户界面。因此,默认情况下,MFC的View类是不支持在设计时拖动控件的。使用第三方库或工具:有些第三方库或工具可以帮助您在MFC的View类中实现拖放控件的功能。手动绘制控件:您可以在View类中手动绘制控件,并实现控件的交互行为。

2024-05-12 16:23:44 214

空空如也

空空如也

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

TA关注的人

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