瑞芯微RK3568芯片是一款定位中高端的通用型SOC,采用22nm制程工艺,搭载一颗四核Cortex-A55处理器和Mali G52 2EE 图形处理器。RK3568 支持4K 解码和 1080P 编码,支持SATA/PCIE/USB3.0 外围接口。RK3568内置独立NPU,可用于轻量级人工智能应用。RK3568 支持安卓 11 和 linux 系统,主要面向物联网网关、NVR 存储、工控平板、工业检测、工控盒、卡拉 OK、云终端、车载中控等行业。
【公众号】迅为电子
【粉丝群】824412014(加群获取驱动文档+例程)
【视频观看】嵌入式学习之Linux驱动(驱动基础进阶篇_全新升级)_基于RK3568
【购买链接】迅为RK3568开发板瑞芯微Linux安卓鸿蒙ARM核心板人工智能AI主板
进阶2 让驱动快一点被加载实验
在上一章节的最后布置了一个课后作业,即利用上一章中学习到的知识让驱动可以更快的被加载,本章来带大家一起来完成一下该实验。
注:编译进内核的驱动才可以比较加载的速度,所以本章节不会将驱动编译成ko的形式,而是编译进内核中。
2.1 实验程序的编写
由于本章节测试的是驱动的加载速度,所以这里就用最简单的helloworld驱动来进行演示,
编写完成的helloworld_a.c代码如下所示:
#include <linux/module.h>
#include <linux/kernel.h>
static int __init helloworld_init(void) //驱动入口函数
{
printk(KERN_EMERG "This is helloworld A\r\n");//注意:内核打印用 printk 而不是 printf
return 0;
}
static void __exit helloworld_exit(void) //驱动出口函数
{
printk(KERN_EMERG "helloworld_exit\r\n");
}
arch_initcall(helloworld_init); //注册入口函数
module_exit(helloworld_exit); //注册出口函数
MODULE_LICENSE("GPL v2"); //同意 GPL 开源协议
MODULE_AUTHOR("topeet"); //作者信息
编写完成的helloworld_b.c代码如下所示:
两个驱动程序只有第15行注册入口函数有些区别,其中helloworld_a.c使用的arch_initcall入口函数,helloworld_b.c使用的常用的device_initcall入口函数,可以根据下面的表格来确定优先级:
arch_initcall的优先级为3,device_initcall的优先级为6,所以helloworld_a.c驱动会比helloworld_b.c驱动先加载,然后将两个驱动编译进内核,得到boot.img镜像之后,重新烧写到开发板即可(由于在前面的章节中已经学习了如何将驱动编译进内核,所以这里省略了相应的步骤)。
2.2 运行测试
首先需要确保开发板烧写的内核为上一小节编译的boot.img,然后启动开发板,在串口终端输入以下命令进行helloworld打印的查找,如下图所示:
dmesg | grep helloworld
图2-1
可以看到驱动A的加载时间为内核启动后的0.52秒左右,驱动B的加载时间为内核启动后的1.78秒左右,与我们预想的实验现象相同,至此让驱动快一点被加载实验就完成了。该场景适合有依赖关系的外设模块加载。