自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 设备树的reg属性

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

2024-04-22 17:10:59 385

原创 解决所以类似问题: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 152

原创 应用程序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 655

原创 linux 串口通讯模板

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

2024-03-21 21:31:32 252

原创 Zigbee协议的优点

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

2024-03-19 19:16:01 247

原创 总线设备驱动框架

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 798

原创 const 和#define的区别

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

2024-03-15 19:47:57 167

原创 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 465

原创 在 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 113

原创 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 345

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

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

2024-03-12 12:19:51 381

原创 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 419

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

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

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

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

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

2024-03-02 14:57:15 245

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

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

2024-03-01 20:26:22 479

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

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

2024-02-28 20:53:38 387

原创 Framebuffer 应用编程基础

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

2024-02-28 20:09:50 227

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

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

2024-02-27 21:49:23 168

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

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

2024-02-27 21:24:50 277

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

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

2024-02-21 21:28:30 110

原创 sizeof()的易错点

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

2024-02-21 21:22:04 283

原创 链表操作:尾插法

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

2024-01-05 19:40:57 467

原创 void类型的本质

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

2024-01-02 16:53:50 356

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

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

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

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

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

2024-01-02 14:18:18 526

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

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

2023-12-26 10:20:45 475

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

dmesg 命令主要用来显示内核信息。使用 dmesg 可以有效诊断机器硬件故障或者添加硬件出现的问题。另外,使用 dmesg 可以确定您的服务器安装了哪些硬件。每次系统重启,系统都会检查所有硬件并将信息记录下来。执行/bin/dmesg 命令可以查看该记录,开机信息亦保存在/var/log目录中,名称为dmesg的文件里。2.插拔usb设备,并用dmesg 查看信息。

2023-12-24 21:14:30 594

原创 strace 用法

通过它启动要跟踪的进程。在原本的命令前加上strace即可。跟踪已经在运行的进程,在不中断进程执行的情况下,理解它在干嘛。这种情况,给strace传递个-p pid 选项即可。将跟踪输出写入指定的文件而不是stderr。常用用法:查看文件的系统调用。结束strace即可。结束strace即可。

2023-12-23 20:02:14 802

原创 mjpg—stream的readline函数

其实也就是在实现行缓存读函数。

2023-12-21 16:20:49 312

原创 驱动框架之_gpio_and_pinctrl-设备树的修改

有 些 芯 片 只 提 供 文 档 , 那 就 去 阅 读 文 档 , 一 般 在 内 核 源 码 目 录Documentation\devicetree\bindings\pinctrl 下面,保存有该厂家的文档。如果连文档都没有,那只能参考内核源码中的设备树文件,在内核源码目录。界面中选择引脚, 配置它的功能,这就可以自动生成 Pinctrl。”后运行,打开 IMX6ULL 的配置文件“回车 即可定位到,然后将信息添加进去。在设备树文件中输入 /1:设置设备树中的信息。最后一步,网络搜索。

2023-12-16 15:15:51 486

原创 字符设备驱动框架——LED为例(有待完善)

修改于韦东山老师的代码修改。

2023-12-15 21:55:16 394

原创 register_chrdev函数使用

注册函数不仅仅有register_chrdev 还有其他,见上文。

2023-12-15 21:42:59 585

原创 100ask imx6ull 驱动(设备树)装载步骤

将生成的arch/arm/boot/dts/100ask_imx6ull-14x14.dtb 传给~/nfs_rootfs/将 *.ko 以及所需要的执行文件传给~/nfs_rootfs/4:将设备树文件传到板子的/boot/ 目录下。2. 回到linux内核目录下,执行命令。3:make 驱动代码。6: 查看设备节点信息。

2023-12-15 17:04:27 608

原创 线程的资源回收:pthread_detach与pthread_cleanup_push/pthread_cleanup_pop的组合

线程退出时需要回收资源,一方面回收线程本身的资源,另一方面还需要回收线程使用的特殊资源,例如互斥锁(回收互斥锁,也就是解锁),malloc开辟的空间。pthread_join 阻塞函数 pthread_tryjoin_np 非阻塞函数。单个线程可以通过3种方式退出,因此可以在不终止整个进程的情况下,停止它的控制流。2)线程可以被同一进程中的其他线程用pthread_cancel所取消。1)线程可以简单地执行完后结束,返回值是线程的退出码。3)线程调用pthread_exit。

2023-12-14 13:13:38 858

原创 网络通信:recv函数细节处理 乱码原因之一

【代码】网络通信:recv函数细节处理 乱码原因之一。

2023-12-12 10:43:50 348

原创 strncmp函数的情景用法:字典查找单词

函数原型:int strncmp(const char* str1, const char* str2, size_t num)str1 > str2 则返回大于0的值,str1 < str2 则返回小于0的值。头 文 件:#include <string.h>返 回 值:str1 = str2 则返回0,作用 : 用来比较两个字符串的。字典:一种按顺序进行排序的文本。

2023-12-12 10:20:48 370

原创 获得系统时间:localtime函数

localtime - 将时间数值变换成本地时间,考虑到本地时区和夏令时标志。

2023-12-12 10:13:20 357

原创 消息队列的注意事项

注意事项3:消息队列容易出错的地方在于send的内容的size和 receive到的size设置的不恰当,从而导致收到的数据不等于发送的数据。内核开辟的一个队列,进程可以通过调用系统API方式调用消息队列函数,给内核消息队列发送或者接收数据。注意事项2:服务器和客户端都会有创建key,两者key要一致才可进行进程间通讯。注意事项1:消息队列中数据读后,数据也不存在了。

2023-12-08 22:18:29 697

原创 global.h 和 global.c的操作

1:包含 global.h #include "global.h" /*因为有些结构体定义在global.h*/2:global.c里面定义的函数,变量的extern声明。1:结构体定义以及typeof。值得注意的是 .h 文件一定要包含。2:变量以及函数的定义。

2023-12-07 14:10:08 414

原创 信号量的PV操作的封装

信号量的值与相应资源的使用情况有关,当它的值大于 0 时,表示当前可用的资源数的数量;当它的值小于 0 时,其绝对值表示等待使用该资源的进程个数。信号量的值仅能由 PV 操作来改变。结构体不用自己去定义。

2023-12-05 22:06:50 372

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

编写设备驱动之i2c_client的方法

2024-03-27

空空如也

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

TA关注的人

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