自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 do { ... } while (0) 的意义

如果直接定义多条语句的宏,可能会导致问题,尤其是在控制流语句(如 `if-else`)中使用时,代码逻辑可能会被破坏。`do { ... } while (0)` 语法结构在 C 和 C++ 中有一个非常常见的用途,它主要用于定义宏(`#define`)时,帮助保持语法的一致性,尤其是在宏包含多条语句的情况下。这会导致编译错误,因为 `else` 与 `if` 的匹配被打乱了,只有 `printf` 语句在 `if` 块中,而 `a = a + 1;` 被认为是与 `else` 无关的代码。

2024-09-18 19:07:29 703

原创 driver_override 的功能

driver_override` 是一个用于动态指定设备驱动程序的字段,主要目的是允许用户空间或内核代码覆盖自动匹配的驱动程序,而不是通过设备树来进行设置。`driver_override` 允许你为一个 `platform_device` 强制指定一个驱动程序名称,绕过默认的驱动匹配机制。这在调试或者运行时修改驱动绑定时非常有用。- `platform_device.driver_override` 不是从设备树中的某个属性获得的,它是用于动态重写设备驱动程序匹配的字段,通常通过用户空间工具设置。

2024-09-08 20:23:51 226

原创 const可以节省空间,避免不必要的内存分配

const在C++中确实可以节省空间,避免不必要的内存分配。:当你将一个值标记为const时,编译器可以将其视为只读数据,避免为每次使用该值时创建新的副本。这里的value是常量,编译器可以优化其使用,将其保存在只读数据段中,而不是每次使用时分配新的内存。:编译器可以在编译时处理const值,而不是在运行时计算。这不仅提高了效率,还避免了不必要的内存使用。:如果某个对象被声明为const,编译器可以确保它不会被修改,从而避免了不必要的深拷贝。当然,让我们通过一个具体的例子来解释如果不使用const。

2024-09-07 16:34:44 560

原创 关键字volatile有什么含意?

1. 并行设备的硬件寄存器。存储器映射的硬件寄存器通常加volatile,因为寄存器随时可以被外设硬件修改。当声明指向设备寄存器的指针时一定要用volatile,它会告诉编译器不要对存储在这个地 址的数据进行假设,也就是要去相应的内存地址里取。2. 一个中断服务程序中修改的供其他程序检测的变量。volatile提醒编译器,它后面所定义的变量随时都有可能改变。因此编译后的程序每次需要存储或读取这个变量的时候,都会直接从变量地址中读取数据。

2024-09-07 16:13:32 305

原创 虚拟地址和逻辑地址之间的区别

Linux系统的每一个段都是从0开始,也就是所有段的起始地址都一样,就等于屏蔽了处理器里面逻辑地址的概率(即在Linux里面逻辑地址=线性地址=虚拟地址),段只被用来进行访问控制和内存保护。逻辑地址:程所使用的地址,比如某一行代码所在的地址。逻辑地址=段+段偏移。线性地址(虚拟地址):逻辑地址经过段式内存映射后的地址。物理地址:虚拟地址经过页式转换后的地址。

2024-08-06 11:21:46 201

原创 中断处理函数(ISR)设计为可重入的是什么意思

设计可重入的ISR有助于提高系统的稳定性和可靠性,尤其是在高中断负载的情况下。4. **快速执行**:可重入的ISR通常设计得非常短小,只执行最必要的操作,以减少执行时间并避免长时间占用CPU。6. **硬件寄存器处理**:如果ISR需要访问硬件寄存器,它应该确保对寄存器的访问是安全的,不会与其他操作冲突。7. **中断屏蔽**:在ISR执行期间,可能需要临时屏蔽同一类型的进一步中断,直到当前中断处理完成。5. **避免阻塞操作**:ISR中不执行任何可能引起阻塞的操作,如I/O操作、等待锁的释放等。

2024-07-29 17:23:08 293

原创 那一个中断没有处理完,又来了一个一样的中断会怎么样

软件设计中,可以通过实现中断底半部(bottom half)或使用工作队列(workqueues)来处理中断,这样可以将中断处理函数的执行与实际的处理逻辑分离,减少中断处理时间。- 设计中断处理函数时,应该考虑到可能的连续中断,并确保函数能够正确处理这种情况,例如通过检查硬件状态或使用标志位来确定是否需要再次处理中断。但是,如果中断处理函数执行时间较长,可能会增加中断丢失的风险。- 在某些情况下,如果硬件或操作系统不支持中断嵌套或优先级管理,新的中断可能会被丢失或忽略,直到当前的中断处理完成。

2024-07-29 17:20:23 451

原创 每次相同的中断来了,触发的中断处理函数是同一个,还是会拷贝一个副本

每次相同的中断发生时,触发的中断处理函数(ISR)是同一个预定义的函数,而不是每次中断发生时都拷贝一个副本。总之,每次中断发生时,触发的中断处理函数是同一个预定义的函数,而不是每次中断都创建一个新的副本。3. **单实例执行**:中断处理函数是一个单一的代码实例,每次中断发生时,CPU都会执行这个函数的代码。4. **可重入性**:由于中断处理函数可能在任何时间被调用,因此它们通常需要设计为可重入的,以避免潜在的竞态条件和资源冲突。2. **函数指针**:操作系统通常使用函数指针来注册和识别中断处理函数。

2024-07-29 17:18:46 181

原创 为什么请求频率高,就应该使用轮询而不是中断呢?

在某些实时性要求较高的应用中,轮询可以提供更可预测的响应时间(比使用延时队列,到时间了必然会触发延时队列完成任务)。然而,使用轮询也有一些缺点,如可能会增加CPU的负载,因为它需要不断地检查设备状态。此外,轮询可能会引入一些延迟,因为它不是在事件发生时立即响应的。- 中断处理函数可能会占用较多的CPU资源,尤其是在中断频繁发生的情况下。- 每次中断发生时,都需要保存和恢复上下文,这会带来一定的开销。- 轮询可以避免中断风暴,因为它以固定或可配置的频率检查设备状态,而不是依赖于外部事件触发。

2024-07-29 17:06:29 317

原创 Linux中信号的机制

此外,信号处理函数中能够安全调用的函数是有限的,这些函数被称为“异步信号安全”(async-signal-safe)函数。异步信号不是由进程当前执行的代码直接引起的,而是由外部事件引起的,这些事件可能与进程的当前活动无关。同步信号通常是由于进程执行中的异常情况引起的,比如违反内存访问规则(段错误),执行非法指令(非法指令),或其他导致核心转储(核心转储)的错误。当一个信号被发送到一个进程时,如果为该信号注册了处理函数(也称为信号处理器),进程的执行流将会暂时中断,然后进程会跳转到注册的信号处理函数执行。

2024-06-28 22:04:17 1086

原创 module_param的用法

`perm`: 参数在sysfs文件系统中的权限(如果使用),通常是使用标准的Linux权限宏(如S_IRUGO和S_IWUSR)。- 使用`module_param`时,你需要确保定义的变量具有全局作用域(即在函数外部定义),因为它们需要在模块加载时可用。有些参数可能需要重新加载模块才能生效。这个简单的例子展示了如何使用`module_param`宏来接受来自命令行的参数,并在模块加载时使用这些参数。首先,创建一个名为`example_module.c`的文件,并添加以下代码:```c。

2024-05-31 18:41:55 580

原创 使用 FileZilla 在 Windows 和 Ubuntu 之间传文件

在板端ping电脑端地址,如 ping 192.168.1.10确认是否可以ping通,如果失败可能需要关闭电脑防火墙(Windows自带防火墙);输入指令 ifconfig eth0(具体看wan口对应哪一个) 192.168.1.99。网线一端插在板子的WAN口上,另一段插在电脑上,然后要配一下板子的IP。IP为刚刚ifconfig设置的IP,端口号固定为22.使用串口链接板子与PC端;

2024-05-27 15:11:15 350

原创 链接,静态链接与动态链接

链接器通过把每个符号定义与一个内存位置关联起来,从而重定位这些节,然后修改所有对这些符号的引用,使得它们指向这个内存位置。1.重定位节和符号定义。然后,链接器将运行时内存地址赋给新的聚合节,赋给输人模块定义的每个节,以及赋给输人模块定义的每个符号。当编译器遇到一个不是在当前模块中定义的符号(变量或函数名)时,会假设该符号是在其他某个模块中定义的,生成一个链接器符号表条目,并把它交给链接器处理。2.重定位节中的符号引用。在这一步中,链接器修改代码节和数据节中对每个符号的引用,使得它们指向正确的运行时地址。

2024-05-22 11:02:44 280

原创 USB枚举过程以及与驱动如何匹配

左边的usb_driver的id_table和右边的usb_interface如果匹配,则调用usb_driver.probe。的请求这一次是为了获取整个设备描述符的内容,成功后再发送获取配置描述符请求来获取配置描述符、接口描述符、端点描述符等信息。usb_device被"drivers\usb\core\generic.c"驱动认领后,会选择、设置某个配置。设备进行枚举,在此过程中获取设备的描述符信息,并据此加载合适的驱动程序等。USB控制器或Hub识别出USB设备后,会创建、注册usb_deive。

2024-05-21 20:15:37 341

原创 设备树的reg属性

reg`属性通常包含一系列的地址和长度对,它们指定了设备在物理或虚拟地址空间中的位置和大小。在这个上下文中,`reg`属性告诉操作系统UART(通用异步接收/发送器)设备从物理地址`0x101f0000`开始,占用4096字节的地址空间。- `reg`属性指定了设备的基地址`0x101f0000`和映射的地址范围大小`0x1000`(4096字节)。- `uart0`是节点的标签,`serial@101f0000`是节点的名称和它的基地址。- `interrupts`属性指定了设备使用的中断号。

2024-04-22 17:10:59 882

原创 解决所有类似问题:fatal error: XXXX.h: No such file or directory

sudo apt-get install apt-file //下载apt-file这个工具。sudo apt-file update//下载完之后需要updata。apt-file search XXXX.h //搜素你需要的文件。当我们日常编译的时候,出现某个.h文件找不到怎么办?

2024-04-17 16:50:13 499

原创 应用程序open如何调用到驱动程序的open函数,inode和file的理解+主次设备号

在该函数中通过inode结构体中的成员变量(inode->i_rdev 包含设备号),在 cdev_map 中查找设备号所对应的字符设备驱动程序cdev 结构体的成员变量kobject,利用该成员变量找到对应的 cdev 结构体,此时,完成由设备驱动节点(inode)找到对应设备驱动(cdev)的步骤。1.知道主设备号与次设备号,可通过dev_t dev = MKDEV(主设备号,次设备号)获得设备号;驱动只有一份,存在多个同类字符设备的时候,得由驱动来区分不同的设备,怎么区别呢?

2024-03-30 20:11:04 805

原创 linux 串口通讯模板

若干年前使用Windows下的串口调试助手对单片机串口进行调试就是使用的 RAW 模式, 单片机发送的数据被原封不动的发送给 PC 端,PC 端发送的数据也同样原封不动的发送回单片机。非RAW模式下,系统会对串口收到的数据中某些具有特殊意义的字符或组合进行转义。这种工作模式的典型是在 Linux 下使用 minicom 配置交换机或串口登录其他Linux系统。简单的来说,就是发送端发动的二进制码原封不动的被接收端接收。RAW模式与非RAW模式。

2024-03-21 21:31:32 270

原创 Zigbee协议的优点

• 3、如果考虑节能,可以根据数据采集周期启用内部封装的定时器,定时时间到就唤醒 ZigBee 的终端节点,终端节点唤醒后,自动采集传感器数据,然后将数据发送给路由器或者直接发给协调器。网状结构的ZigBee网络中可有65000多个节点。• 1、用户对于 ZigBee 无线网络的开发就简化为应用层的 c 语 言程序开发,不需要深入研究复杂的 ZigBee 协议栈;通信时延和从休眠状态激活的时延都非常短,典型的搜索设备时延30ms,休眠激活的时延是15ms, 活动设备信道接入的时 延为15ms。

2024-03-19 19:16:01 353

原创 总线设备驱动框架

4. 注意: 所谓的platform_device并不是与字符设备、块设备和网络设备并列的概念,而是Linux系统提供的一种附加手段,例如,把内部集成的I2C、RTC、SPI、LCD、看门狗等控制器都归纳为platform_device,而它们本身就是字符设备。1.知道主设备号与次设备号,可通过dev_t dev = MKDEv(主设备号,次设备号)获得设号;1.platform_device:修改设备树,添加设备(device)节点,设备树节点部分会被转换为 platform_device。

2024-03-18 19:59:08 834

原创 const 和#define的区别

而 `#define` 更适合定义宏或者一些简单的常量,但在实际开发中应尽量避免过度使用 `#define`。当然.h 文件应该采用 #ifndef **** #define *** #endif 的组合。- `#define` 定义的常量是预处理器指令,在整个文件中都有效,直到文件结束或者被另一个 `#undef` 指令取消。- `#define` 除了可以定义常量外,还可以定义宏,可以实现更复杂的功能,如条件编译、函数宏等。- 使用 `const` 定义常量时会进行类型检查,可以避免一些类型错误。

2024-03-15 19:47:57 195

原创 URI(统一资源标识符)和URL(统一资源定位符)之间的区别

http://example.com/about 是一个URL,因为它提供了获取资源的具体方法(HTTP协议)和位置(example.com上的about页面)。2. **URL** 是URI的一个子集,它提供了具体的定位信息,指明了如何通过互联网访问一个资源。- urn:isbn:0-395-36341-5 是一个URI,但不是一个URL,因为它仅标识了一个特定的书籍,而没有提供获取它的方法。1. **URI** 是一个抽象概念,用于唯一地标识任何类型的资源。

2024-03-13 21:06:42 671

原创 在 CMake 中,项目路径的常用变量

3. `CMAKE_SOURCE_DIR`:当前 `CMakeLists.txt` 文件所在的路径。4. `CMAKE_BINARY_DIR`:CMake 生成 Makefile 等构建文件的路径。这些变量可以方便地在 CMakeLists.txt 文件中使用,帮助指定文件路径、包含目录等操作。2. `PROJECT_BINARY_DIR`:项目编译输出目录路径。1. `PROJECT_SOURCE_DIR`:项目的根目录路径。

2024-03-13 19:49:27 210

原创 cmake的一个简单通用模板

add_library(libhello SHARED hello.c) #生成动态库文件。add_library(libhello STATIC hello.c) #生成静态库文件。libhello 目录下的 CMakeLists.txt。若想清理cmake产生的文件,直接删掉build。src 目录下的 CMakeLists.txt。顶层 CMakeLists.txt。如果没有采用变量 默认为静态库。文件的tree结构如下所示。

2024-03-13 19:48:10 365

原创 写一个中断服务需要注意哪些?如果中断产生之后要做比较多的事情怎么办?

用 work 来线程化地处理中断,一个 worker 线程只能由一个 CPU 执行, 多个中断的 work 都由同一个 worker 线程来处理,在单 CPU 系统中也只能忍着 了。所以,为了防止这种情况发生,也是为了简单化中断的处理,在 Linux 系统 上中断无法嵌套:即当前中断 A 没处理完之前,不会响应另一个中断 B(即使它 的优先级更高)。在中断的处理过程中,该 CPU 是不能进行进程调度的,所以中断的处理要越快越好,尽早让其他中断能被处理──进程调度靠定时器中断来实现。

2024-03-12 12:19:51 643

原创 select poll epoll的区别

I/O多路复⽤允许在⼀个线程中处理多个I/O操作,避免了创建多个线程或进程的开销,允许在⼀个线程中处理多个 I/O操作,避免了创建多个线程或进程的开销。边缘触发(Edge Triggered, ET) 在这种模式下,当一个文件描述符满足特定条件(例如,有可读数据)时,epoll_wait()会返回该文件描述符。poll: poll是select的⼀种改进,它也使⽤轮询⽅式来检查多个⽂件描述符的状态,但是 poll() 没有最大文件描述符数量的限制。触发方式:水平触发 and 边缘触发。

2024-03-10 21:47:36 451

原创 http传输为什么是采用TCP传输

TCP 是一种面向字节流的传输协议,能够以流的形式传输数据。而 HTTP 也是基于文本的协议,它需要能够以流的形式传输数据,因此 TCP 的流式传输特性很适合 HTTP 协议的要求。总的来说,TCP 协议提供了稳定的、可靠的、面向连接的数据传输,这与 HTTP 协议的特性相符合,因此 HTTP 通常选择基于 TCP 进行传输。:几乎所有的网络设备和操作系统都支持 TCP 协议,这使得基于 TCP 的 HTTP 在各种环境中都能够使用,具有很好的通用性和可移植性。

2024-03-02 16:52:26 674 1

原创 宏函数的定义和使用-##的妙用

例如,如果 "var" 被替换为 "example",那么在预处理时,"settings->var##_set" 将被展开为 "settings->example_set"。这样可以根据变量名动态地生成新的符号,使代码更加灵活和通用。在C预处理器中,"##" 是一个运算符,用于将两个符号合并成一个符号。在你提供的代码中,"##" 用于将变量名 "var" 和 "_set" 合并成一个新的符号,然后在条件判断和宏调用中使用这个合并后的符号。##的妙用:示例代码如下。

2024-03-02 14:57:15 314

原创 aio_read 函数这么好用,还用什么read干嘛?(两者区别)

函数确实提供了异步读取文件的能力,这在某些情况下是非常有用的,尤其是当应用程序需要同时处理多个I/O操作时。异步I/O操作可以在不阻塞主线程的情况下进行,从而提高了应用程序的响应性和效率。函数取决于你的具体需求和场景。如果你需要高性能的异步I/O操作,并且你的应用程序可以处理异步操作的复杂性和潜在的风险,那么。可能是一个不错的选择。然而,如果你只是需要简单地读取数据并且不需要复杂的异步操作,那么。函数可能是更合适的选择。

2024-03-01 20:26:22 662

原创 带有framebuffer的LCD读写的分层封装

【代码】带有framebuffer的LCD读写的分层封装。

2024-02-28 20:53:38 409

原创 Framebuffer 应用编程基础

【代码】Framebuffer 应用编程基础。

2024-02-28 20:09:50 243

原创 imx6ull系列烧录工具:100ask_imx6ull_flashing_tool的使用

视频链接:软件链接: 密码: root。

2024-02-27 21:49:23 258

原创 结构体链表 实现分层管理

链表里的元素为结构体, 这样建立多个链表,每个链表里面管理同一类设备,这样方便我们为一个链表里面的设备写出一个大致通用的程序,通过name区分设备。往链表里面添加元素即可看做像内核里面注册设备一样。在mian.c里面就只需要调用封装好的接口就可以调用设备资源,实现分层管理。外部调用 mian.c 可以直接使用 当然可以进一步封装 FBInit ('name') 用name 来选择初始化哪一个设备。

2024-02-27 21:24:50 298

原创 malloc()分配字符串空间时候的注意点

如果为一个字符串声明空间,请使用以下习惯 用法:malloc(strlen(s) + 1),它使用函数 strlen()获取字符串的长度,并加上 1,以便为字符串结束符留出空间。这里使用 sizeof(s)可能会导致麻烦。

2024-02-21 21:28:30 171

原创 sizeof()的易错点

在第一行,我们为 10 个整数的数组声明了空间。但是,当我们在下 一行使用 sizeof()时,它将返回一个较小的值: 4(在 32 位计算机上)或 8(在 64 位计机上)。原因是在这种情况下,sizeof()但为我们只是问一个整数的指针有多大,而不是我 们动态分配了多少内存。你也可以传入一个变量的名字(而不只是类型)给 sizeof(),但在一些情况下,可能得不到你要的结果,所以要小心使用。在这种情况下,编译器有足够的静态信息,知道已经分配了 40 个字。

2024-02-21 21:22:04 310

原创 链表操作:尾插法

【代码】链表操作:尾插法。

2024-01-05 19:40:57 487

原创 void类型的本质

(2)强类型语言中所有变量都有固定的类型,这个类型有固定的内存占用,有固定的解析方法。弱类型语言中所有变量都是一个类型(一般是字符串),程序在用的时候再根据需要来处理变量。(3)void *类型的指针指向的内存是尚未确定类型的,后续使用时必须强制类型转换为具体的类型,这就是void类型的最终归宿。(2)C语言中的变量必须有确定的数据类型,若没有则无法为这个变量分配内存,更无法解析这个变量对应的内存。(3)但是C语言中的内存可以没有数据类型,在内存还没有和具体的变量绑定之前,它就是没有类型的。

2024-01-02 16:53:50 374

原创 使用liusb读取鼠标数据(异步传输)

【代码】使用liusb读取鼠标数据(异步传输)

2024-01-02 15:37:10 604 1

原创 使用liusb读取鼠标数据(同步传输)

【代码】使用liusb读取鼠标数据(同步传输)

2024-01-02 14:18:18 670

原创 usb设备驱动程序(二)

lsusb -v -d 0x2bdf: 查看usb描述符等信息 (Ubuntu中使用)2bdf为ID号。2.usb驱动程序框架。

2023-12-26 10:20:45 519

10-编写设备驱动之i2c-client

编写设备驱动之i2c_client的方法

2024-03-27

空空如也

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

TA关注的人

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