当前位置: 首页 > news >正文

做网站首页有什么网站主办单位负责人

做网站首页有什么,网站主办单位负责人,淮南市网站开发的方式,做网站维护怎么找客户瑞芯微RK3568芯片是一款定位中高端的通用型SOC,采用22nm制程工艺,搭载一颗四核Cortex-A55处理器和Mali G52 2EE 图形处理器。RK3568 支持4K 解码和 1080P 编码,支持SATA/PCIE/USB3.0 外围接口。RK3568内置独立NPU,可用于轻量级人工…

瑞芯微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主板


第92章 引用计数器实验

92.1实验程序的编写

92.1.1 驱动程序编写

本实验对应的网盘路径为:iTOP-RK3568开发板【底板V1.7版本】\03_【iTOP-RK3568开发板】指南教程\02_Linux驱动配套资料\04_Linux驱动例程\68_kref\module

我们编写驱动代码,这段代码用于定义并初始化两个自定义内核对象 mykobject01 和 mykobject02,并将它们添加到一个自定义内核对象集合 mykset 中。这些自定义内核对象可以用于在Linux内核中表示和管理特定的功能或资源。代码中的注释对各个部分进行了解释,帮助理解代码的功能和目的。编写完成的kref.c代码如下所示:

#include <linux/module.h>
#include <linux/init.h>
#include <linux/slab.h>
#include <linux/configfs.h>
#include <linux/kernel.h>
#include <linux/kobject.h>// 定义了三个kobject指针变量:mykobject01、mykobject02、mykobject03
struct kobject *mykobject01;
struct kobject *mykobject02;
struct kobject *mykobject03;// 定义了一个kobj_type结构体变量mytype,用于描述kobject的类型。
struct kobj_type mytype;
// 模块的初始化函数
static int mykobj_init(void)
{int ret;// 创建kobject的第一种方法// 创建并添加了名为"mykobject01"的kobject对象,父kobject为NULLmykobject01 = kobject_create_and_add("mykobject01", NULL);printk("mykobject01 kref is %d\n", mykobject01->kref.refcount.refs.counter);// 创建并添加了名为"mykobject02"的kobject对象,父kobject为mykobject01。mykobject02 = kobject_create_and_add("mykobject02", mykobject01);printk("mykobject01 kref is %d\n", mykobject01->kref.refcount.refs.counter);printk("mykobject02 kref is %d\n", mykobject02->kref.refcount.refs.counter);// 创建kobject的第二种方法// 1 使用kzalloc函数分配了一个kobject对象的内存mykobject03 = kzalloc(sizeof(struct kobject), GFP_KERNEL);// 2 初始化并添加到内核中,名为"mykobject03"。ret = kobject_init_and_add(mykobject03, &mytype, NULL, "%s", "mykobject03");printk("mykobject03 kref is %d\n", mykobject03->kref.refcount.refs.counter);return 0;
}// 模块退出函数
static void mykobj_exit(void)
{printk("mykobject01 kref is %d\n", mykobject01->kref.refcount.refs.counter);printk("mykobject02 kref is %d\n", mykobject02->kref.refcount.refs.counter);printk("mykobject03 kref is %d\n", mykobject03->kref.refcount.refs.counter);// 释放了之前创建的kobject对象kobject_put(mykobject01);printk("mykobject01 kref is %d\n", mykobject01->kref.refcount.refs.counter);printk("mykobject02 kref is %d\n", mykobject02->kref.refcount.refs.counter);printk("mykobject03 kref is %d\n", mykobject03->kref.refcount.refs.counter);kobject_put(mykobject02);printk("mykobject01 kref is %d\n", mykobject01->kref.refcount.refs.counter);printk("mykobject02 kref is %d\n", mykobject02->kref.refcount.refs.counter);printk("mykobject03 kref is %d\n", mykobject03->kref.refcount.refs.counter);kobject_put(mykobject03);printk("mykobject01 kref is %d\n", mykobject01->kref.refcount.refs.counter);printk("mykobject02 kref is %d\n", mykobject02->kref.refcount.refs.counter);printk("mykobject03 kref is %d\n", mykobject03->kref.refcount.refs.counter);
}module_init(mykobj_init); // 指定模块的初始化函数
module_exit(mykobj_exit); // 指定模块的退出函数MODULE_LICENSE("GPL");   // 模块使用的许可证
MODULE_AUTHOR("topeet"); // 模块的作者

92.2 运行测试

92.2.1 编译驱动程序

在上一小节中的kref.c代码同一目录下创建 Makefile 文件,Makefile 文件内容如下所示:

export ARCH=arm64#设置平台架构
export CROSS_COMPILE=aarch64-linux-gnu-#交叉编译器前缀
obj-m += kref.o   #此处要和你的驱动源文件同名
KDIR :=/home/topeet/Linux/linux_sdk/kernel    #这里是你的内核目录                                                                                                                            
PWD ?= $(shell pwd)
all:make -C $(KDIR) M=$(PWD) modules    #make操作
clean:make -C $(KDIR) M=$(PWD) clean    #make clean操作

对于Makefile的内容注释已在上图添加,保存退出之后,来到存放kref.c和Makefile文件目录下,如下图(图92-1)所示:

图 92-1

然后使用命令“make”进行驱动的编译,编译完成如下图(图92-2)所示:

图 92-2

编译完生成kref.ko目标文件,如下图(图92-3)所示:

图 92-3

至此驱动模块就编译成功了,接下来进行测试。

92.2.2 运行测试

开发板启动之后,使用以下命令进行驱动模块的加载,如下图(图92-4)所示:

insmod kref.ko

图92-4

如上图所示,驱动加载之后,第一条打印为“mykobject01 kref is 1”,因为创建了mykobject01,所以引用计数器的值为1,如下图所示的I。第二条打印为:“mykobject01 kref is 2”,因为在mykobject01目录下创建了子目录mykobject02,所以mykobject01的计数器值为2,mykobject02的计数器值为1,如下图所示的II。

图92-5

现在我们拓展学习一下,如上图III所示,如果在objectA下面创建俩个object,objectA的计数器值为3。如上图所示IV,如果在objectA下面创建俩个object,那么objectA的计数器值为3,在objectB下创建object,那么objectB的计数器值为2,objectC的计数器值为1。

最后可以使用以下命令进行驱动的卸载,如下图(图21-11)所示:

rmmod kref

 

图92-6

如上图所示,计数器的值打印如上。当引用计数器的值为0时,表示没有任何引用指向对象或资源,可以安全地释放对象或资源,并进行相关的清理操作。

至此,引用计数器实验就完成了。


 

http://www.yayakq.cn/news/928604/

相关文章:

  • 苏州免费自助建站网站建设文化建设的例子
  • 网站规划与设计h5开贴纸网站要怎么做
  • 一级a做片性视频网站网站后台做1个多少钱
  • 软件开发网站开发龙岩天宫山海拔高度多少
  • 江门建站软件wordpress搬到谷歌服务器
  • 宁波建设网站报价程序员找工作网站
  • 开发网站的申请怎么写系统门窗品牌10大品牌排行
  • 做艺术品拍卖的网站酒店自建网站的功能
  • 网站建设项目结构分析wordpress网络图片不显示
  • 资兴市网站建设哪个好自己做信息网站
  • 企业门户网站建设现状怎么样制作微信小程序
  • 网站开发属于计算机系统开发吗网站的二级页面怎么做代码
  • wordpress island.zipsem优化软件哪家好
  • 给别人做网站必须有icp阜康网站建设
  • 以网站建设专业画一幅画wordpress怎么开启注册
  • 玉溪做网站建设的公司宜兴建设局拍卖房产的网站
  • 宿迁新站seowordpress同步腾讯微博
  • 福州建网站的公司北京餐饮品牌设计公司
  • 韩国风格网站模板网站建设 软件开发
  • 台州专业制作网站网站仿制可用于商业吗
  • 创造网站需要什么条件政务服务网站建设
  • seo网站结构优化杭州网站制作方法
  • 网站建设专家是干嘛的烟台网页制作
  • logo模板下载网站推荐wordpress自动发布
  • 丽江建设公司网站嘉兴市做网站优化
  • psd下载网站模板网络优化是做什么的
  • 学院网站建设策划书星链seo管理
  • 鞋材东莞网站建设o2o的含义
  • 安徽建设厅网站考勤wordpress文章表情插件
  • 工程认证网站的建设教育网站平面设计