热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

开发笔记:驱动代码编译和测试

篇首语:本文由编程笔记#小编为大家整理,主要介绍了驱动代码编译和测试相关的知识,希望对你有一定的参考价值。

篇首语:本文由编程笔记#小编为大家整理,主要介绍了驱动代码编译和测试相关的知识,希望对你有一定的参考价值。








目录


  • 一、交叉编译测试文件及驱动发送至树莓派
    • 1、驱动编译与发送
    • 2、测试文件交叉编译与发送

  • 二、测试驱动
    • 1、加载内核驱动
    • 2、更改权限
    • 3、运行测试文件调用驱动




一、交叉编译测试文件及驱动发送至树莓派

1、驱动编译与发送

驱动框架程序:

#include <linux/fs.h> //file_operations声明
#include <linux/module.h> //module_init module_exit声明
#include <linux/init.h> //__init __exit 宏定义声明
#include <linux/device.h> //class devise声明
#include <linux/uaccess.h> //copy_from_user 的头文件
#include <linux/types.h> //设备号 dev_t 类型声明
#include <asm/io.h> //ioremap iounmap的头文件
static struct class *pin4_class;
static struct device *pin4_class_dev;
static dev_t devno; //设备号
static int major &#61;231; //主设备号
static int minor &#61;0; //次设备号
static char *module_name&#61;"pin4"; //模块名
//led_open函数
static int pin4_open(struct inode *inode,struct file *file)
{
printk("pin4_open\\n"); //内核的打印函数和printf类似

return 0;
}
//led_write函数
static ssize_t pin4_write(struct file *file,const char __user *buf,size_t count, loff_t *ppos)
{
return 0;
}
static struct file_operations pin4_fops &#61; {
.owner &#61; THIS_MODULE,
.open &#61; pin4_open,
.write &#61; pin4_write,
};
int __init pin4_drv_init(void)
{
int ret;
devno &#61; MKDEV(major,minor); //创建设备号
ret &#61; register_chrdev(major, module_name,&pin4_fops); //注册驱动 告诉内核&#xff0c;把这个驱动加入到内核驱动的链表中
pin4_class&#61;class_create(THIS_MODULE,"myfirstdemo");
pin4_class_dev &#61;device_create(pin4_class,NULL,devno,NULL,module_name); //创建设备文件

return 0;
}
void __exit pin4_drv_exit(void)
{
device_destroy(pin4_class,devno);
class_destroy(pin4_class);
unregister_chrdev(major, module_name); //卸载驱动
}
module_init(pin4_drv_init); //入口
module_exit(pin4_drv_exit);
MODULE_LICENSE("GPL v2");

进入如下路径&#xff0c;打开Makefile文件
在这里插入图片描述
Makefile文件里加入如图代码&#xff0c;-m为模块化方式&#xff0c;pin4deiver2为文件名
在这里插入图片描述
输入如下编译&#xff1a;modules模块化方式

ARCH&#61;arm CROSS_COMPILE&#61;arm-linux-gnueabihf- KERNEL&#61;kernel7 make modules

可以看到生成了pin4driver2.ko
在这里插入图片描述
通过scp指令将该ko文件发送到树莓派上 文件路径和ip需要更改

scp drivers/char/pin4driver2.ko pi&#64;192.168.137.6:/home/pi

2、测试文件交叉编译与发送

#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdio.h>
int main()
{
int fd;
int a&#61;&#39;1&#39;;
fd&#61;open("/dev/pin4",O_RDWR);
if(fd<0){
printf("open failed\\n");
perror("reason:");
}else{
printf("open success\\n");
}
fd&#61;write(fd,&a,1);
}

对该.c文件进行交叉编译

arm-linux-gnueabihf-gcc pin4test.c -o pin4test

用scp指令将pin4test文件发送到树莓派上

scp pin4test pi&#64;192.168.137.6:/home/pi

二、测试驱动

1、加载内核驱动

树莓派上输入如下命令

sudo insmod pin4driver2.ko

在这里插入图片描述
在这里插入图片描述
可以看到设备号和程序写的一致


2、更改权限

666所有用户均可读写

sudo chmod 666 /dev/pin4

在这里插入图片描述


3、运行测试文件调用驱动

./pin4test可以看到运行成功&#xff0c;dmesg可以看到内核调用函数成功
在这里插入图片描述






推荐阅读
  • 在进行网络编程时,准确获取本地主机的IP地址是一项基本但重要的任务。Winsock作为20世纪90年代初由Microsoft与多家公司共同制定的Windows平台网络编程接口,为开发者提供了一套高效且易用的工具。通过Winsock,开发者可以轻松实现网络通信功能,并准确获取本地主机的IP地址,从而确保应用程序在网络环境中的稳定运行。此外,了解Winsock的工作原理及其API函数的使用方法,有助于提高开发效率和代码质量。 ... [详细]
  • BZOJ4240 Gym 102082G:贪心算法与树状数组的综合应用
    BZOJ4240 Gym 102082G 题目 "有趣的家庭菜园" 结合了贪心算法和树状数组的应用,旨在解决在有限时间和内存限制下高效处理复杂数据结构的问题。通过巧妙地运用贪心策略和树状数组,该题目能够在 10 秒的时间限制和 256MB 的内存限制内,有效处理大量输入数据,实现高性能的解决方案。提交次数为 756 次,成功解决次数为 349 次,体现了该题目的挑战性和实际应用价值。 ... [详细]
  • C++ 进阶:类的内存布局与虚函数类的实现细节
    C++ 进阶:类的内存布局与虚函数类的实现细节 ... [详细]
  • 在稀疏直接法视觉里程计中,通过优化特征点并采用基于光度误差最小化的灰度图像线性插值技术,提高了定位精度。该方法通过对空间点的非齐次和齐次表示进行处理,利用RGB-D传感器获取的3D坐标信息,在两帧图像之间实现精确匹配,有效减少了光度误差,提升了系统的鲁棒性和稳定性。 ... [详细]
  • 本文详细探讨了C语言中`extern`关键字的简易编译方法,并深入解析了预编译、`static`和`extern`的综合应用。通过具体的代码示例,介绍了如何在不同的文件之间共享变量和函数声明,以及这些关键字在编译过程中的作用和影响。文章还讨论了预编译过程中宏定义的使用,为开发者提供了实用的编程技巧和最佳实践。 ... [详细]
  • 本文详细介绍了如何在Linux系统中搭建51单片机的开发与编程环境,重点讲解了使用Makefile进行项目管理的方法。首先,文章指导读者安装SDCC(Small Device C Compiler),这是一个专为小型设备设计的C语言编译器,适合用于51单片机的开发。随后,通过具体的实例演示了如何配置Makefile文件,以实现代码的自动化编译与链接过程,从而提高开发效率。此外,还提供了常见问题的解决方案及优化建议,帮助开发者快速上手并解决实际开发中可能遇到的技术难题。 ... [详细]
  • ESP32 IRAM 内存优化策略与实践总结
    本文总结了针对ESP32 IRAM内存溢出问题的优化策略与实践经验。通过详细分析ESP32的内存结构和IRAM分配机制,提出了一系列有效的解决方案,包括代码优化、内存管理技巧和编译器配置调整,旨在帮助开发者有效解决`.espressif/tools/xtensa-esp32-elf/esp-2`等类似错误,提升系统性能和稳定性。 ... [详细]
  • 在C#编程中,管理和操作Windows事件日志是一项重要技能。本文详细探讨了如何注册新的事件源,并通过示例代码展示了如何在应用程序中实现这一功能。具体而言,文章介绍了通过检查事件源是否存在,若不存在则进行注册的步骤,以及如何利用`EventLog`类来记录日志消息。此外,还提供了关于事件日志配置和最佳实践的深入分析,帮助开发者更好地理解和应用这一技术。 ... [详细]
  • 深入解析 C 语言与 C++ 之间的差异及关联
    深入解析 C 语言与 C++ 之间的差异及关联 ... [详细]
  • 从 Java 过渡到 Ruby,不仅是一次编程语言的转换,更是一段技术进阶的旅程。本文将深入探讨两种语言在语法、生态系统和开发模式上的差异,帮助开发者顺利实现转型,并在新的环境中高效地编写高质量代码。 ... [详细]
  • 本文将介绍一种扩展的ASP.NET MVC三层架构框架,并通过使用StructureMap实现依赖注入,以降低代码间的耦合度。该方法不仅能够提高代码的可维护性和可测试性,还能增强系统的灵活性和扩展性。通过具体实践案例,详细阐述了如何在实际开发中有效应用这一技术。 ... [详细]
  • 本文探讨了将PEBuilder转换为DIBooter.sh的方法,重点介绍了如何将DI工具集成到启动层,实现离线镜像引导安装。通过使用DD命令替代传统的grub-install工具,实现了GRUB的离线安装。此外,还详细解析了bootice工具的工作原理及其在该过程中的应用,确保系统在无网络环境下也能顺利引导和安装。 ... [详细]
  • 深入解析Java中的进程与线程机制
    在Java中,进程与线程是程序执行的基本单元。进程代表了程序的运行实例,包含了独立的内存空间和系统资源,如CPU时间、内存、文件和I/O接口。操作系统通过进程来管理和分配这些资源,确保每个程序能够高效、安全地运行。线程则是进程内的基本调度单位,多个线程可以共享进程的资源,从而实现高效的并发处理。本文将深入探讨Java中的进程与线程机制,分析其工作原理和应用场景。 ... [详细]
  • C#编程指南:实现列表与WPF数据网格的高效绑定方法 ... [详细]
  • POJ 1696: 空间蚂蚁算法优化与分析
    针对 POJ 1696 的空间蚂蚁算法进行了深入的优化与分析。本研究通过改进算法的时间复杂度和空间复杂度,显著提升了算法的效率。实验结果表明,优化后的算法在处理大规模数据时表现优异,能够有效减少计算时间和内存消耗。此外,我们还对算法的收敛性和稳定性进行了详细探讨,为实际应用提供了可靠的理论支持。 ... [详细]
author-avatar
mobiledu2502897851
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有