自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 LED 模板驱动程序的改造:总线设备驱动模型

并且,使用时要先加载 a.ko。

2024-07-20 16:19:42 142

原创 驱动进化之路:总线设备驱动模型

最先比较:platform_device. driver_override 和 platform_driver.driver.name。然后比较:platform_device. name 和 platform_driver.id_table[i].name。使用哪个引脚,怎么操作引脚,都写死在代码中。代码稍微复杂,但是易于扩展。,将资源与驱动分离开来。冗余代码太多,修改引脚时设备端的代码需要重新编译。文件,把它传给内核,无需重新编译内核/驱动。无冗余代码,修改引脚时只需要修改。修改引脚时,需要重新编译。

2024-07-16 16:46:07 681

原创 驱动设计的思想:面向对象/分层/分离

比如 board_A.c 使用芯片 chipY,那就可以写出:chipY_gpio.c,它实现芯片 Y 的 GPIO操作,适用于芯片 Y 的所有 GPIO 引脚。以面向对象的思想,在 board_A_led.c 中实现 led_resouce 结构体,它定义“资源”──要用哪一个引脚。在 chipY_gpio.c 中仍是实现 led_operations 结构体,它要写得更完善,支持所有 GPIO。使用时,我们只需要在 board_A_led.c 中指定使用哪一个引脚即可。你要去修改上面结构体中的。

2024-07-15 22:29:58 280

原创 LED 驱动程序框架

【代码】LED 驱动程序框架。

2024-07-15 14:48:56 229

原创 最简单的LED驱动程序

板子没有操作 led 的效果图。函数,驱动层提供自己的。

2024-07-09 23:29:16 274

原创 IMX6UL/6ULL的GPIO操作方法

要用CCM_CCGRy 寄存器中的2位来决定该组GPIO是否使能。哪组GPIO用哪个CCM_CCGR寄存器来设置,可以通过上面的红色框部分知道。:General-purpose input/output, 通用的输入输出口。:Clock Controller Module(时钟控制模块):IOMUX Controller , IO 复用控制器。通过查看手册可以得出;

2024-07-09 23:14:57 311

原创 普适的 GPIO 引脚操作方法

General-purpose input/output,通用的输入输出口。三个寄存器对应的是同一个物理寄存器;原则:不能影响到其他位。

2024-07-06 14:36:55 202

原创 硬件知识 LED 原理图

编写ARM程序时,也应该会有一个像hello一样的程序入门,这个程序就是LED。

2024-07-04 22:43:15 121

原创 hello 驱动程序

内核版本:4.x先不解释概念,让hello 驱动程序能跑起来再说。

2024-07-04 22:04:28 295

原创 驱动与应用层的交互(输入系统应用编程)

常见的输入设备有键盘、鼠标、遥控杆、书写板、触摸屏等等,用户可以通过这些输入设备与Linux 系统进行数据交换。问题来了?输入设备种类繁多,能否统一它们的接口?既在驱动层面统一,也在应用程序层面统一?可以的。Linux系统为了统一管理这些输入设备,实现了一套能兼容所有输入设备的框架:输入系统。驱动开发人员基于这套框架开发出程序,应用开发人员就可以使用统一的API去使用设备。

2024-06-30 18:20:50 880

原创 交叉编译freetype

然后你会看到头文件目录,库目录(LIBRARY_PATH),你需要做的是在头文件目录确定有没有这个文件,或者是自己指定头文件目录。在程序中如果是这样包含的头文件:#include 如果你编译的是一个库,需要把得到的头文件,库文件放入工具链的。运行时不需要头文件,所以头文件不用放到板子上。等目录了,里面有可以执行的程序,库,头文件。,在交叉编译开源软件时,如果它里面有。系统目录:就是交叉编译工具链里的某个。系统目录:就是交叉编译工具链里的某个。这种尖角号里的头文件,去哪里找?

2024-06-29 12:11:38 961

原创 Makefile实例

除了编译参数-Werror,还可以加上-I参数,指定头文件路径,-Iinclude表示当前的inclue文件夹下。,前者表示当前目录,后者表示编译器指定的路径和GCC路径。工作中,我们希望把警告也当成错误来处理。此时就可以把c.c文件里的。

2024-06-26 23:20:45 167

原创 Makefile 函数

patsubst 函数是从var变量中取出每一个值,如果这个符合patten格式,把它替换成 replacement 格式。$(wildcard pattern) # pattern定义了文件名的格式, wildcard取出其中存在的文件。这个函数 wildcard 会以 pattern 这个格式,去寻找存在的文件,返回存在文件的名字。实例:(在该目录下创建三个文件:a.c b.c c.c)同时还可以利用其函数的特点来判断文件是否存在。

2024-06-26 22:39:15 238

原创 Makefile的语法

此时将暴露出问题,如果文件所依赖文件很多,岂不是要写很多规则,这显然是不合理的。下面我们可以使用通配符来解决这些问题。表示,它只有在使用到的时候才确定,在定义的时候等于没有确定下来。很明显看到 D 是等于 100baidu的,因为前面已经定义过了(A := xxx # A的值立即确定,在定义时即确定。B = xxx # B的值使用到时才确定。那怕通过命令行传入 D的值,里面的。前面Makefile 的写法如下。前面定义过,则不会再起作用)想使用变量的时候,使用。:表示第一个依赖文件。

2024-06-25 23:30:55 294

原创 Makefile的引入及规则

实际上widows工具管理程序的内部工具也是Makefile,在Linux开发裸板程序的时候,也是使用Makefile来管理这些程序的。使用开发工具开发程序时,点点鼠标就可以对其进行编译了;但是内部机制是怎么样的呢?他们是怎么管理代码的?又是怎么决定编译哪一个文件的。这条命令虽然简单,但是它完成的功能不简单。当依赖比目标文件新,则执行它们下面的命令。接下来我们手动来管理这个文件和程序。如无更新,就会显示如下。

2024-06-25 22:38:24 290

原创 GCC 编译过程

一个 C/C++文件要经过预处理(preprocessing)、编译(compilation)、汇编(assembly)和链接(linking)等 4 步才能变成可执行文件。

2024-06-24 23:28:32 314

原创 C++ 之模板

模板特化(Template Specialization)是 C++ 中模板的一个概念,它允许针对特定的数据类型或特定的模板参数提供定制化的实现。在C++ 中,模板(Template)是一种通用的编程工具,允许程序员编写泛型代码,使得类或函数能够适用于多种不同的数据类型,而不需要编写相似的代码。模板提供了一种在编写代码时更具通用性的方法,能够处理不同类型的数据而无需为每种类型编写特定的函数或类。完全特化是对模板中的所有模板参数进行特化的情况。在完全特化中,模板参数被指定的类型,为特定的类型提供独特的实现。

2024-05-09 23:07:35 359

原创 qt QComboBox

提供了一系列方法来添加、删除和修改列表中的项,支持通过索引或文本检索项,并可以通过信号和槽机制来响应用户的选择变化。它允许用户从一组选项中选择一个选项,并可以配置可编辑,使用户能够在其中输入文本。该控件广泛应用于需要从多个选项中进行选择的用户界面场景,例如表单和设置界面。是Qt框架中用于创建下拉列表的一个控件。

2024-05-06 22:28:22 265

原创 qt 记事本保存和关闭功能

【代码】qt 记事本保存和关闭功能。

2024-05-05 16:43:53 127

原创 qt 记事本打开功能

【代码】qt 记事本打开功能。

2024-05-05 16:08:07 129

原创 qt 文件选择对话框 QFileDialog

通过调用 exec() 方法显示对话框,并在用户作出选择后执行相应的操作。如果需要,可以设置文件类型过滤器,以限制用户可以选择的文件类型。首先,创建一个 QFileDialog 对象的实例。根据需要设置对话框的模式,如打开文件、保存文件等。

2024-05-05 15:52:21 287

原创 QTextStream

是一个功能强大的类,用于处理文本数据,特别是在需要考虑字符编码和文本格式的情况下。通过这个特性,它提供了一种灵活而强大的方式来读写和操作文本。

2024-05-04 14:37:36 159

原创 qt 文件操作类QFile

是Qt 框架中用于文件处理的一个类。它提供了读取和写入文件的功能,并且支持文本和二进制文件。,因此它可以像其他IO设备一样使用。

2024-05-04 13:38:19 257

原创 qt自定义信号与槽

在Qt中,自定义信号与槽是实现对象间通信的一种机制。信号和槽是是Qt对象通信的核心特性,使得一个对象能够在发生某种事件时通知其他对象。定义信号:在Qt中,信号是由signals关键字声明的类成员函数。他们不需要实现,只需要声明即可:在上面的例子中,有两个信号,一个有参的,一个无参的。定义槽:槽可以是任何普通的成员函数,但通常在类定义中用slots关键字标识。槽可以有返回类型,也可以接受参数,但它们的参数类型需要与发出信号的参数类型匹配。

2024-05-03 16:31:33 263

原创 按键QPushButton设置信号与槽的四种方式

是最通用的方式,而使用Lambda表达式可以在同一位置编写信号处理逻辑,提高代码的可读性。使用函数指针的方式则在编译时提供更好的类型检查。在使用Qt Designer时,可以通过命名约定自动连接信号和槽。当UI文件加载时,以on__ 命名的槽会自动连接到相应的信号。这种方式可以直接在连接点使用匿名函数,使代码更加简洁。Qt 5中引入,允许使用函数指针直接连接信号和槽,这种方式类型安全,且可以利用IDE的代码补全和错误检查。最常用的方式,直接通过QObject::connect 函数连接信号和槽。

2024-05-03 14:08:10 830

原创 qt信号与槽基本认识

当pushButton 发出 clicked (点击信号),就会调用close() ,作用与接受者,也就是把widget关闭掉。在Qt中信号与槽是一种非常强大的事件通信机制。界面上已经按键,如何用按键按下之后有反应呢?

2024-05-03 13:16:32 105

原创 QT记事本项目完成初步布局

新增文本编辑器,底部显示行列和字符编码。

2024-04-25 22:22:48 134

原创 QT记事本项目按键组布局

实现打开、保存、关闭按键, 底部背景颜色。

2024-04-25 21:56:14 143

原创 QT工程介绍

还是Widget在Qt中,创建MainWindow和Widget项目的主要区别在于他们的用途和功能范围MainWindow:这是一个包含完整菜单栏、工具栏和状态栏的主窗口应用程序框架。它适合于更复杂的应用程序,需要这些额外的用户界面元素来提供丰富的功能和交互。Widget:这通常是一个简单的窗口,没有内置的菜单栏、工具栏或状态栏。它适合于更简单或专用的应用程序,不需要复杂的用户界面组件。简而言之,选择"MainWindow"或"Widget"取决于你的应用程序需要多少内置的用户界面元素和复杂性。

2024-04-24 23:13:37 588

原创 C++ 之抽象类与接口

在C++中,虽然没有像其他编程语言(比如Java中的接口Interface)一样直接定义接口的关键字,但可以通过抽象类和纯虚函数的方式来实现接口的概念。接口通常用于定义类应该实现的方法,但不提供具体实现。这样的实现方式允许多个类共享相同的接口,同时让每个类根据需要去实现这些接口。通过以上的方式,可以在C++中模拟出类似接口的行为,允许多个类共享相同接口并提供各自的实现。在C++中抽象类就是定义了派生类应该具有的功能,但不完全实现这些功能。

2024-04-22 22:29:13 356 1

原创 C++ 之多态

多态按字面意思就是多种形态。当类之间存在层次结构,并且类之间是通过继承关联时,就会用到多态。)以他们自己的方式“开”,尽管调用的是相同的函数。这就是多态的优势(相同接口,不同的行为)。在这个例子中,不同的对象(

2024-04-22 21:51:36 222

原创 C++之虚继承

虚继承是C++中一种特殊的继承方式,主要用来解决多重继承中菱形继承问题。在菱形继承结构中,一个类继承来自两个具有共同基类的类时,会导致共同基类的成员在派生类中存在两份拷贝,这不仅会导致资源浪费,还可能引起数据不一致的问题。虚继承通过确保共同基类的单一实例存在于继承层次中,来解决这一问题。虚继承时C++语言中处理复杂继承关系的一种重要机制,但它也带来了一定的复杂性和性能考虑。正确地使用虚继承可以帮助你建立清晰、有效的类层次结构。类中只会有一份 Base 类的成员。的继承声明为虚继承(

2024-04-21 16:53:55 135

原创 C++ 之多重继承

在C++中,多重继承是一种允许一个类同时继承多个基类的特性。这意味着派生类可以继承多个基类的熟悉和方法。多重继承增加了语言的灵活性,但同时也引入了额外的复杂性,特别是多个基类具有相同的成员时。在多重继承中,派生类继承了所有基类的特性。这包括成员变量和成员函数。如果不同的基类有相同名称的成员,则必须明确指出引用的是哪个基类的成员。多重继承是C++的一个强大特性,但应谨慎使用。合理地应用多重继承可以使代码更加灵活和强大,但不当的使用可能导致设计上的问题和维护困难。因此,他可以使用这两个类中定义的方法。

2024-04-21 16:26:39 205

原创 C++ 之虚函数

关键字有助于清晰地表达程序员的意图,并利用编译器检查来避免常见的错误,如签名不匹配导致的非预期的函数重写。关键字用于支持多态。

2024-04-20 16:58:53 136

原创 c++ 之权限对继承的影响

派生类可以访问基类中所有的非私有成员。因此基类成员如果不想被派生类的成员函数访问,则应在基类中声明为 private。无论继承类型如何,基类的 private 成员始终不可直接在派生类中访问。

2024-04-20 16:28:35 287

原创 C++之继承

面向对象程序设计中最重要的一个概念是继承。继承允许我们依据另一个类来定义一个类,这使得创建和维护一个应用程序变得更容易。这样做,也达到了重用代码功能和提高执行效率的效果。在C++中,继承可以是公有(public)、保护(protected)或私有(private)的,这决定了基类成员在派生类中的访问权限。

2024-04-20 15:57:51 206

原创 c++ 之静态成员

静态成员变量在C++中的一个典型应用时用于跟踪类的实例数量。这个案例体现了静态成员变量的特性:他们在类的所有实例之间共享,因此适合存储所有实例共有的信息。上面的例子中,为所有实例提供了一个共同的状态。这种技术在需要跟踪对象数量或实现某种形式的资源管理时特别有用。c++ 类中的静态成员是一个很重要的概念。它包括静态成员变量、静态成员函数。静态成员有以下特点。

2024-04-20 14:54:42 299

原创 c++ 之析构函数

类的析构函数是类的一种特殊的成员函数,它会在每次删除所创建的对象时执行,析构函数特别重要,尤其是在涉及动态分配的资源(如内存、文件句柄、网络连接等)的情况下。

2024-04-20 11:25:44 342

原创 c++ 之this 指针和new关键字

在这个例子中,new 被用来分配一个 MyClass 类型的对象和一个整数数组,然后使用 delete 和 delete[] 来释放内存。**分配单个对象:**使用 new 可以在堆上动态分配一个对象。例如,new int 会分配一个 int 类型的空间,并返回一个指向该空间的指针。//C语言中,int *arr = (int *)malloc(sizeof(int)*10);//C语言中,int *p = (int *)malloc(sizeof(int));

2024-04-05 16:27:58 433

原创 c++构造函数之初始化列表

初始化列表 : a(x), b(y), c(z) 的意思是用 x 初始化 a,用 y 初始化 b,用 z 初始化 c。在C++中,使用初始化列表来初始化类的字段是一种高效的初始化方式,尤其在构造函数中。初始化列表直接在对象的构造过程中初始化成员变量,而不是先创建成员变量后再赋值。初始化列表紧跟在构造函数参数列表后面,以冒号(:)开始,后跟一个或多个初始化表达式,每个表达式通常用逗号分隔。使用初始化列表是C++中推荐的初始化类成员变量的方式,因为它提供了更好的性能和灵活性。

2024-04-05 16:10:33 176

空空如也

空空如也

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

TA关注的人

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