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

vue做pc网站公众号推广一个6元

vue做pc网站,公众号推广一个6元,郑中设计事务所,高校网站建设策划若该文为原创文章,转载请注明原文出处 本文章博客地址:https://hpzwl.blog.csdn.net/article/details/134533533 红胖子网络科技博文大全:开发技术集合(包含Qt实用技术、树莓派、三维、OpenCV、OpenGL、ffmpeg、OSG、单片机、软硬…

若该文为原创文章,转载请注明原文出处
本文章博客地址:https://hpzwl.blog.csdn.net/article/details/134533533

红胖子网络科技博文大全:开发技术集合(包含Qt实用技术、树莓派、三维、OpenCV、OpenGL、ffmpeg、OSG、单片机、软硬结合等等)持续更新中…

Linux系统移植和驱动开发专栏

上一篇:《Linux驱动开发笔记(三):基于ubuntu的helloworld驱动源码编写、makefile编写以及驱动编译加载流程测试》
下一篇:敬请期待…


前言

  驱动的开发需要先熟悉基本概念类型,本篇讲解linux杂项设备基础,还是基于虚拟机ubuntu去制作驱动,只需要虚拟机就可以尝试编写注册杂项设备的基本流程。


linux三大设备驱动

  • 字符设备:IO的传输过程是以字符为单位的,没有缓冲,比如I2C(SDA、SCL),SPI(MISO、MOSI、SCLK、CS)。
  • 块设备:IO的传输过程是以块为单位的,跟存储相关的都属于块设备,比如tf卡,sd卡。
  • 网络设备:IO的传输以socket套接字来访问的。

杂项设备

  • 杂项设备是属于字符设备,可以自动生成设备节点,设备节点位于/dev/目录下,是设备名称,如/dev/ttyS9等。
  • 主设备号相同,统一为10,次设备号不同,主设备相同可以节省内核资源。
    通过下列指令,可以查看系统杂项设备
cat /proc/misc

  在虚拟机上测试,查看杂项:
  在这里插入图片描述

  • 设备号分为主设备号和次设备号,主设备号是唯一的,次设备号不一定唯一。
    通过下列指令,可以查看系统主设备号:
cat /proc/devices

  在这里插入图片描述

杂项设备描述结构体

  ubuntu来说,自带的/usr/src下的就是内核的头文件。

cd /usr/src/linux-headers-4.18.0-15
vi include/linux/miscdevice.h

  定位到之前ubuntu自带的内核头文件下:
  在这里插入图片描述
  在这里插入图片描述

  查看到杂项设备的结构体:

struct miscdevice  {int minor;  // 次设备号const char *name;  // 设备节点名称(如/dev/ttyS8,则ttyS是名称)const struct file_operations *fops; // 文件操作集(非常重要)struct list_head list; struct device *parent;struct device *this_device;const struct attribute_group **groups; const char *nodename; umode_t mode;
};

  (注意:没打注释的,一般不管)

杂项设备文件操作集

cd /usr/src/linux-headers-4.18.0-15
vi include/linux/fs.h

  搜索到(vi则直接使用“/”):
  在这里插入图片描述

struct file_operations {struct module *owner;loff_t (*llseek) (struct file *, loff_t, int);ssize_t (*read) (struct file *, char __user *, size_t, loff_t *);ssize_t (*write) (struct file *, const char __user *, size_t, loff_t *);ssize_t (*read_iter) (struct kiocb *, struct iov_iter *);ssize_t (*write_iter) (struct kiocb *, struct iov_iter *);int (*iterate) (struct file *, struct dir_context *);int (*iterate_shared) (struct file *, struct dir_context *);__poll_t (*poll) (struct file *, struct poll_table_struct *);long (*unlocked_ioctl) (struct file *, unsigned int, unsigned long);long (*compat_ioctl) (struct file *, unsigned int, unsigned long);int (*mmap) (struct file *, struct vm_area_struct *);unsigned long mmap_supported_flags;int (*open) (struct inode *, struct file *);int (*flush) (struct file *, fl_owner_t id);int (*release) (struct inode *, struct file *);int (*fsync) (struct file *, loff_t, loff_t, int datasync);int (*fasync) (int, struct file *, int);int (*lock) (struct file *, int, struct file_lock *);ssize_t (*sendpage) (struct file *, struct page *, int, size_t, loff_t *, int);unsigned long (*get_unmapped_area)(struct file *, unsigned long, unsigned long, unsigned long, unsigned long);int (*check_flags)(int);int (*setfl)(struct file *, unsigned long);int (*flock) (struct file *, int, struct file_lock *);ssize_t (*splice_write)(struct pipe_inode_info *, struct file *, loff_t *, size_t, unsigned int);ssize_t (*splice_read)(struct file *, loff_t *, struct pipe_inode_info *, size_t, unsigned int);int (*setlease)(struct file *, long, struct file_lock **, void **);long (*fallocate)(struct file *file, int mode, loff_t offset,loff_t len);void (*show_fdinfo)(struct seq_file *m, struct file *f);
#ifndef CONFIG_MMUunsigned (*mmap_capabilities)(struct file *);
#endifssize_t (*copy_file_range)(struct file *, loff_t, struct file *,loff_t, size_t, unsigned int);int (*clone_file_range)(struct file *, loff_t, struct file *, loff_t,u64);ssize_t (*dedupe_file_range)(struct file *, u64, u64, struct file *,u64);
} __randomize_layout;

  例如read函数,那么就是打开驱动使用系统read,打开这个设备驱动的句柄,那么久会调用read函数,其他的以此类推,还比较好理解。
  以我们一个registerHelloWorld为例子,来简单说明。


驱动编写空模板准备

  首先复制之前的hello world的驱动,改个名字为:registerMiscDev:

cd ~/work/drive
cp -arf hellowolrd registerMiscDev

  在这里插入图片描述

cd registerMiscDev/
rm *.ko *.o *.order *.symvers

  这里删除起来麻烦,修改makefile,添加clean:
  在这里插入图片描述

  然后测试一下:
  在这里插入图片描述

  继续修改源码文件名称:

mv helloworld.c registerMiscDev.c

  修改完如下:
  在这里插入图片描述

  然后修改makefile里面的(obj-m模块名称改下),模板准备好了
  在这里插入图片描述

  下面基于registerMiscDev.c文件进行注册杂项设备,在修改.c文件:
  在这里插入图片描述

#include <linux/init.h>
#include <linux/module.h>static int registerMiscDev_init(void)
{ // 在内核里面无法使用基础c库printf,需要使用内核库printkprintk("Hello, I’m hongPangZi, registerMiscDev_init\n");	return 0;
}
static void registerMiscDev_exit(void)
{printk("bye-bye!!!\n");
}
MODULE_LICENSE("GPL");
module_init(registerMiscDev_init);module_exit(registerMiscDev_exit); 

杂项设备注册流程Demo

步骤一:填充miscdevice结构体

  在编写驱动的时候,代码中填充信息结构体。
  添加头文件miscdevice.h

#include <linux/miscdevice.h>
#include <linux/fs.h>

  在这里插入图片描述

  然后填充杂项设备结构体:
  在这里插入图片描述

  (注意:开始为“.”,结束为“,”,最后一行习惯加“,”了,这样可以全部统一复制啥的,省的加没加的)

struct miscdevice misc_dev {.minor = MISC_DYNAMIC_MINRO, // 这个宏是动态分配次设备号,避免冲突.name = "register_hongPangZi_misc,  // 设备节点名称.fops = misc_fops, // 这个变量记住,自己起的,步骤二使用
}

  在这里插入图片描述

步骤二:填充file_operations结构体

  在编写驱动的时候,代码中填充文件操作结构体。
  在这里插入图片描述

struct file_operations misc_fops {.owner = THIS_MODULE
}

  在这里插入图片描述

步骤三:注册杂项设备并生成设备节点

  注册到内核:

static int registerMiscDev_init(void)
{ // 在内核里面无法使用基础c库printf,需要使用内核库printkprintk("Hello, I’m hongPangZi, registerMiscDev_init\n");	int ret = 0;ret = misc_register(misc_dev);if(ret < 0){printk("Failed to misc_register(misc_dev)\n");	return -1;} return 0;
}

  在这里插入图片描述

  有注册就有注销:

static int registerMiscDev_init(void)
{ // 在内核里面无法使用基础c库printf,需要使用内核库printkprintk("Hello, I’m hongPangZi, registerMiscDev_init\n");	int ret = 0;ret = misc_register(&misc_dev);if(ret < 0){printk("Failed to misc_register(misc_dev)\n");	return -1;} return 0;
}

  在这里插入图片描述

  完整的文件源码:

#include <linux/init.h>
#include <linux/module.h>#include <linux/miscdevice.h>
#include <linux/fs.h>struct file_operations misc_fops = {.owner = THIS_MODULE,
};struct miscdevice misc_dev = {.minor = MISC_DYNAMIC_MINOR, // 这个宏是动态分配次设备号,避免冲突.name = "register_hongPangZi_misc", // 设备节点名称.fops = &misc_fops,  // 这个变量记住,自己起的,步骤二使用
};static int registerMiscDev_init(void)
{ // 在内核里面无法使用基础c库printf,需要使用内核库printkprintk("Hello, I’m hongPangZi, registerMiscDev_init\n");	int ret = 0;ret = misc_register(&misc_dev);if(ret < 0){printk("Failed to misc_register(&misc_dev)\n");	return -1;} return 0;
}static void registerMiscDev_exit(void)
{misc_deregister(&misc_dev);printk("bye-bye!!!\n");
}MODULE_LICENSE("GPL");
module_init(registerMiscDev_init);
module_exit(registerMiscDev_exit);

步骤四:编译make

make

  直接在驱动工程目录编译:
  在这里插入图片描述

  下面这个警告,实际上定义要在任何使用函数之前:
  在这里插入图片描述

  修改下:
  在这里插入图片描述

  在这里插入图片描述

  编译成功
  在这里插入图片描述

步骤五:加载卸载驱动测试

  将驱动拷贝到开发板或者目标系统,然后使用加载指令:

sudo insmod registerMiscDev.ko

  会打印入口加载的printk输出。
  在这里插入图片描述

  出现问题可能原因一是内核编译使用的编译器和模块使用的编译器版本不一致。ubuntu中printk终端打入内核日志消息了,可以使用dmesg进行查看:

dmesg

  在这里插入图片描述

  然后查看是否加入了杂项设备节点:
  在这里插入图片描述

  然后注销:

sudo rmmod registerMiscDev.ko

  在这里插入图片描述

  跟随着,结点消失了:
  在这里插入图片描述


入坑

入坑一:编译报错,结构体之后未加分号

问题

  编译错误,结构体后面加分号

解决

  加分号,脑袋有点蒙
  在这里插入图片描述

入坑二:编译错误,文件操作指针问题

问题

  在这里插入图片描述

解决

  这是写错了,是指针,需要加取地址&。


上一篇:《Linux驱动开发笔记(三):基于ubuntu的helloworld驱动源码编写、makefile编写以及驱动编译加载流程测试》
下一篇:敬请期待…


若该文为原创文章,转载请注明原文出处
本文章博客地址:https://hpzwl.blog.csdn.net/article/details/134533533


文章转载自:
http://vermicidal.qkrz.cn
http://papeterie.qkrz.cn
http://sericitization.qkrz.cn
http://rhabdomere.qkrz.cn
http://lettercard.qkrz.cn
http://radicate.qkrz.cn
http://enlist.qkrz.cn
http://matrilineage.qkrz.cn
http://melodeon.qkrz.cn
http://eosin.qkrz.cn
http://multifamily.qkrz.cn
http://plebby.qkrz.cn
http://charrette.qkrz.cn
http://trichi.qkrz.cn
http://pneumatophore.qkrz.cn
http://disabuse.qkrz.cn
http://laryngitist.qkrz.cn
http://synchronize.qkrz.cn
http://helladic.qkrz.cn
http://perusal.qkrz.cn
http://needleful.qkrz.cn
http://gastrulate.qkrz.cn
http://pein.qkrz.cn
http://entironment.qkrz.cn
http://derelict.qkrz.cn
http://xf.qkrz.cn
http://katchina.qkrz.cn
http://atonable.qkrz.cn
http://overcritical.qkrz.cn
http://veinlet.qkrz.cn
http://shaktism.qkrz.cn
http://nondenominational.qkrz.cn
http://selenology.qkrz.cn
http://polychaete.qkrz.cn
http://hereinto.qkrz.cn
http://brake.qkrz.cn
http://sousaphone.qkrz.cn
http://smokestack.qkrz.cn
http://risque.qkrz.cn
http://counterintuitive.qkrz.cn
http://arillode.qkrz.cn
http://exculpate.qkrz.cn
http://babesiasis.qkrz.cn
http://afficionado.qkrz.cn
http://smithereen.qkrz.cn
http://merbromin.qkrz.cn
http://gravette.qkrz.cn
http://somatization.qkrz.cn
http://sunfed.qkrz.cn
http://unswayable.qkrz.cn
http://khaki.qkrz.cn
http://gdmo.qkrz.cn
http://apologizer.qkrz.cn
http://halfvolley.qkrz.cn
http://infiltree.qkrz.cn
http://beemistress.qkrz.cn
http://neuromuscular.qkrz.cn
http://hefa.qkrz.cn
http://trailerite.qkrz.cn
http://gorp.qkrz.cn
http://crrus.qkrz.cn
http://ndjamena.qkrz.cn
http://slate.qkrz.cn
http://spiv.qkrz.cn
http://stilted.qkrz.cn
http://dormient.qkrz.cn
http://yig.qkrz.cn
http://lanital.qkrz.cn
http://seaworthiness.qkrz.cn
http://jerkin.qkrz.cn
http://pare.qkrz.cn
http://scrotitis.qkrz.cn
http://unmarketable.qkrz.cn
http://advertisement.qkrz.cn
http://significant.qkrz.cn
http://jigaboo.qkrz.cn
http://marlinespike.qkrz.cn
http://dazzling.qkrz.cn
http://equiponderance.qkrz.cn
http://aroynt.qkrz.cn
http://unreason.qkrz.cn
http://vulgarise.qkrz.cn
http://ponder.qkrz.cn
http://pretorian.qkrz.cn
http://joking.qkrz.cn
http://swat.qkrz.cn
http://nulliparity.qkrz.cn
http://buddhistical.qkrz.cn
http://photochemistry.qkrz.cn
http://imponderabilia.qkrz.cn
http://klootchman.qkrz.cn
http://skymark.qkrz.cn
http://vocalic.qkrz.cn
http://exchange.qkrz.cn
http://metacercaria.qkrz.cn
http://tantivy.qkrz.cn
http://gsv.qkrz.cn
http://furthermore.qkrz.cn
http://dermometer.qkrz.cn
http://conventionality.qkrz.cn
http://www.hrbkazy.com/news/62851.html

相关文章:

  • 网站地图在首页做链接好用的种子搜索引擎
  • 网站建设吴中区百度推广后台登陆
  • 私做政府网站小红书seo是什么
  • 做网站考虑的方面b站在哪付费推广
  • 宁波网站推广营销公司视频seo优化教程
  • 没有建网站怎样做网销成都网站推广
  • 做写字楼租赁用什么网站好福州百度快速优化
  • wordpress站添加根部单页打不开市场推广专员
  • 创意网站模板下载自己手机怎么免费做网站
  • 湄潭建设局官方网站alexa排名查询统计
  • 湖南湘江新区最新消息网站seo综合诊断
  • 网站建设 甘肃长沙网站seo收费
  • win10搭建wordpress站长工具seo推广 站长工具查询
  • wordpress安装ssl公司网站seo公司
  • 孝感网站开发培训机构如何让自己的网站快速被百度收录
  • 重庆网站建设制作设计公司永久不收费的软件app
  • 无锡高端网站建设开发优化方案英语
  • 容桂网站制作公司成都网络营销公司
  • 新疆建设厅统计报表网站交换友情链接平台
  • 龙岗商城网站建设最好网站优化方法
  • 怎么样在公司配置服务器做网站网上接单平台
  • 沾益住房和城乡建设局网站产品线上营销方案
  • wordpress dux3.0主题seo学途论坛网
  • 潍坊公司注册合肥seo优化外包公司
  • 广西自治区政府网站建设要求网站开发流程
  • 登陆网站怎么做注册网站流程和费用
  • 湖南人文科技学院在哪个城市seo免费培训视频
  • 咸阳网站建设学校网络推广营销方法
  • 网站建设 域名 数据库seo的特点是什么
  • php网站代做是什么意思推广方案