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

GEC6818蜂鸣器驱动开发

相关知识:Linux设备驱动开发

insmod 编译好的.ko文件后再运行beep_app.c编译完成的可执行文件即可使板子蜂鸣。

beep_drv.c:

#include <linux/module.h> //包含了加载模块时需要使用的大量符号和函数声明
#include <linux/kernel.h> //包含了printk内核打印函数等函数声明
#include <linux/init.h>  //包含了模块加载函数和模块释放函数的宏定义
#include <linux/errno.h>
#include <linux/cdev.h>
#include<linux/fs.h>
#include <linux/device.h>
#include <linux/ioport.h>
#include <linux/io.h>
#include <linux/uaccess.h>int devno_major=0;//beep的主设备号
int devno_minor=0;//beep的次设备号
struct class *beep_class;
struct device *beep_device;
struct resource *beep_resource;
void __iomem *gpioc_base_va;
void __iomem *gpiocout_va;    
void __iomem *gpiocoutenb_va; 
void __iomem *gpiocaltfn0_va; 
void __iomem *gpiocaltfn1_va; 
void __iomem *gpiocpad_va;    module_param(devno_major,int,0660);
module_param(devno_minor,int,0660);enum beep_state{BEEP_OFF,BEEP_ON};int beep_state=BEEP_OFF;/*1、定义一个字符设备 ---> struct cdev*/
struct cdev beep_cdev;/*2、定义并初始化字符设备的文件操作集 ---> struct file_operations*/
int gec6818_beep_open(struct inode *inode, struct file *filp)
{printk("beep have been opened!\n");return 0;
}
ssize_t gec6818_beep_read (struct file *filp, char __user *user_buf,size_t size, loff_t *off)
{int r = copy_to_user(user_buf, (void*)&beep_state, size);if(r != 0)return EINVAL;return size;
}
ssize_t gec6818_beep_write (struct file *filp, const char __user *user_buf, size_t size, loff_t *off)
{int r = copy_from_user((void*)&beep_state, user_buf, size);if(r != 0)return EINVAL;if(beep_state == BEEP_ON)writel(readl(gpiocout_va)|(0x01<<14),gpiocout_va);elsewritel(readl(gpiocout_va)&(~(0x01<<14)),gpiocout_va);return size;
}
int gec6818_beep_release (struct inode *inode, struct file *filp)
{printk("beep have been closed!\n");return 0;
}static const struct file_operations gec6818_beep_fops = {.owner = THIS_MODULE,.open = gec6818_beep_open,.read = gec6818_beep_read,.write = gec6818_beep_write,.release = gec6818_beep_release
};//入口函数 -->安装驱动
static int  __init gec6818_beep_init(void)
{dev_t devno;//beep的设备号int ret=0;/*3、给字符设备申请一个设备号 ---> 设备号=主设备号<<20 + 次设备号*/if(devno_major != 0){devno = MKDEV(devno_major,devno_minor);if(register_chrdev_region(devno, 1, "gec6818_beep")){printk("register_chrdev_region error!\n");if(alloc_chrdev_region(&devno, devno_minor, 1, "gec6818_beep")){printk("alloc_chrdev_region error!\n");ret = EINVAL;goto alloc_chrdev_region_err;}}}else{if(alloc_chrdev_region(&devno, devno_minor, 1, "gec6818_beep")){printk("alloc_chrdev_region error!\n");ret = EINVAL;goto alloc_chrdev_region_err;}}devno_major = MAJOR(devno);devno_minor = MINOR(devno);/*4、初始化字符设备*/cdev_init(&beep_cdev, &gec6818_beep_fops);/*5、将字符设备加入内核*/if(cdev_add(&beep_cdev, devno, 1)<0){ret = EINVAL;goto cdev_add_err;	}/*6、创建class*/beep_class = class_create(THIS_MODULE, "gec6818_beep");if(beep_class == NULL){ret = EBUSY;goto class_create_err;}/*7、创建device*/beep_device = device_create(beep_class, NULL,devno, NULL, "gec6818_beep");if(beep_device == NULL){ret = EBUSY;goto device_create_err;}/*8、申请物理内存区*/beep_resource = request_mem_region(0xC001C000, 0x1000, "GPIOC_MEM");if(beep_resource == NULL){ret = EBUSY;goto request_mem_region_err;}/*9、IO内存动态映射,得到虚拟地址*/gpioc_base_va = ioremap(0xC001C000, 0x1000);if(gpioc_base_va == NULL){ret = EBUSY;goto ioremap_err;}/*10、使用虚拟地址,把beep进行初始化*/gpiocout_va    = gpioc_base_va + 0x00;gpiocoutenb_va = gpioc_base_va + 0x04;gpiocaltfn0_va = gpioc_base_va + 0x20;gpiocaltfn1_va = gpioc_base_va + 0x24;gpiocpad_va    = gpioc_base_va + 0x18;//GPIOCALTFN0 &= ~(0x03<<28);//把GPIOC14设置为GPIO功能writel(readl(gpiocaltfn0_va)&(~(0x03<<28)),gpiocaltfn0_va);//GPIOCALTFN0 |= (0x01<<28);writel(readl(gpiocaltfn0_va)|((0x01<<28)),gpiocaltfn0_va);//GPIOCOUTENB |= 1<<14;//把GPIOC14设置为输出模式writel(readl(gpiocoutenb_va)|((0x01<<14)),gpiocoutenb_va);//GPIOCOUT &= ~(1<<14);//把GPIOC14输出低电平,默认beep不响writel(readl(gpiocout_va)&(~(0x01<<14)),gpiocout_va);printk("gec6818 beep init success!\n");return 0;
ioremap_err:release_mem_region(0xC001C000, 0x1000);
request_mem_region_err:device_destroy(beep_class, devno);
device_create_err:class_destroy(beep_class);
class_create_err:
cdev_add_err:unregister_chrdev_region(devno, 1);//注销设备号
alloc_chrdev_region_err:return ret;
}//出口函数 -->卸载驱动
static void __exit gec6818_beep_exit(void)
{iounmap(gpioc_base_va);release_mem_region(0xC001C000, 0x1000);device_destroy(beep_class, MKDEV(devno_major,devno_minor));class_destroy(beep_class);unregister_chrdev_region(MKDEV(devno_major,devno_minor), 1);//注销设备号printk("6818gec beep exit\n ");
}//驱动程序的入口: #insmod hello.ko ==> module_init() ==> gec6868_hello_init();
module_init(gec6818_beep_init);
//驱动程序的出口: #rmmod hello.ko ==> module_exit() ==> gec6818_hello_exit();
module_exit(gec6818_beep_exit);
//module的描述: #modinfo  hello.ko
MODULE_AUTHOR("GEC_Liudehua@163.com");
MODULE_DESCRIPTION("beep driver for GEC6818");
MODULE_LICENSE("GPL");
MODULE_VERSION("V1.0");

 beep_app.c:

#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
int beep_state;
int readbuf;int main()
{int fd = open("/dev/gec6818_beep",O_RDWR);if(fd == -1){printf("open failed!\n");return -1;}while(1){beep_state=1;int r = write(fd,&beep_state,4);if(r !=4 ){printf("write error!\n");}read(fd,&readbuf,4);printf("read buf is %d\n",readbuf);sleep(2);beep_state=0;write(fd,&beep_state,4);read(fd,&readbuf,4);printf("read buf is %d\n",readbuf);sleep(2);}
}

makefile:


#KERNELRELEASE这个变量,在内核源码的根目录下面的Makefile会初初始化的ifeq ($(KERNELRELEASE),)KERN_DIR := /home/china/6818GEC/kernel#在Makefile中可以调用shell的命令,调用方法如下:
# $(shell  shell命令) -> 整个这个表达式,表示调用该shell命令的输出结果
PWD := $(shell pwd)CROSS_COMPILE := /home/china/6818GEC/prebuilts/gcc/linux-x86/arm/arm-eabi-4.8/bin/arm-eabi-modules:make -C $(KERN_DIR)  M=$(PWD) ARCH=arm CROSS_COMPILE=$(CROSS_COMPILE)  modules
clean:rm -rf *.orm -rf  modules.order  .tmp_versions *.ko  Module.symversrm -f  *.cmd .*.cmd  *.mod.celseobj-m += beep_drv.oendif

相关文章:

GEC6818蜂鸣器驱动开发

相关知识&#xff1a;Linux设备驱动开发 insmod 编译好的.ko文件后再运行beep_app.c编译完成的可执行文件即可使板子蜂鸣。 beep_drv.c: #include <linux/module.h> //包含了加载模块时需要使用的大量符号和函数声明 #include <linux/kernel.h> //包含了printk内…...

WPF MVVM入门系列教程(五、命令和用户输入)

&#x1f9ed; WPF MVVM入门系列教程 一、MVVM模式介绍二、依赖属性三、数据绑定四、ViewModel五、命令和用户输入六、ViewModel案例演示 WPF中的命令模型 在WPF中&#xff0c;我们可以使用事件来响应鼠标和键盘动作。 但使用事件会具备一定的局限性&#xff0c;例如&#x…...

基于Jetson Nano与PyTorch的无人机实时目标跟踪系统搭建指南

引言&#xff1a;边缘计算赋能智能监控 在AIoT时代&#xff0c;将深度学习模型部署到嵌入式设备已成为行业刚需。本文将手把手指导读者在NVIDIA Jetson Nano&#xff08;4GB版本&#xff09;开发板上&#xff0c;构建基于YOLOv5SORT算法的实时目标跟踪系统&#xff0c;集成无人…...

创建简易个人关系图谱(Neo4j )

1. 启动 Neo4j 并进入 Neo4j Browser 确保 Neo4j 已启动&#xff0c;访问&#xff1a; http://localhost:7474/2. 创建人物节点&#xff08;Person&#xff09; (1) 创建 Alice CREATE (alice:Person {name: "Alice", age: 28, gender: "Female"}) RETUR…...

JavaScript 到命令和控制 (C2) 服务器恶意软件分析及防御

攻击始于一个经过混淆的JavaScript文件,该文件从开源服务中获取编码字符串以执行PowerShell脚本。然后,该脚本从一个IP地址和一个URL缩短器下载一个JPG图像和一个文本文件,这两个文件都包含使用隐写术嵌入的恶意MZ DOS可执行文件。这些有效载荷一旦执行,就会部署Stealer恶意…...

[原创](现代Delphi 12指南):[macOS 64bit App开发]: 如何自动打开“安全性与隐私“控制面板?

[作者] 常用网名: 猪头三 出生日期: 1981.XX.XX 企鹅交流: 643439947 个人网站: 80x86汇编小站 编程生涯: 2001年~至今[共24年] 职业生涯: 22年 开发语言: C/C++、80x86ASM、Object Pascal、Objective-C、C#、R、Python、PHP、Perl、 开发工具: Visual Studio、Delphi、XCode、…...

springboot微服务连接nacos超时

问题现象 java应用启动失败&#xff0c;查看日志&#xff0c;发现是连接Nacos超时&#xff0c;获取不到配置&#xff0c;导致dubbo注册失败&#xff0c;错误日志如下&#xff1a; 2025-05-01 14:50:08.973 ERROR [TW-172.29.245.61-9063-3] [com.alibaba.nacos.common.utils.…...

react-transition-group 在 React 18 及以上版本中的兼容性问题

出现问题 在React19中下载react-transition-group&#xff08;4.4.5&#xff09;&#xff0c;正常导入使用&#xff1a; 出现下述报错&#xff1a; 报错原因 React18开始&#xff0c;已废弃findDOMNode &#xff0c;而 react-transition-group 的 4.4.5 版本仍然使用了 findD…...

day17 天池新闻数据KMeans、DBSCAN 与层次聚类的对比

在数据分析中&#xff0c;聚类是一种常见的无监督学习方法&#xff0c;用于将数据划分为不同的组或簇。本文将通过news数据集&#xff08;news.csv&#xff09;&#xff0c;使用 KMeans、DBSCAN 和层次聚类三种方法进行聚类分析&#xff0c;并对比它们的性能。 数据来源于天池 …...

数学复习笔记 3

background music 《有人懂你》赵十三 前言 也别开始强化吧&#xff0c;复盘前面复习过的内容&#xff0c;可能是更稳的方式。 无穷级数 写无穷级数的例题。感觉自己真的学会了么&#xff0c;我生怕一写一个不吱声了。呜呜呜。这一章有 27 个例题。我从最后一个例题开始写…...

Navicat Premium 17 备份,还原数据库(PostGreSql)

目录 备份 还原备份 备份 1、点击数据库&#xff0c;点击备份 2、点击新建备份 3、点击备份&#xff0c;查看执行日志 还原备份 1、点击备份、右键还原备份从... 2、 选择文件目录&#xff0c;以及xxx.nb3文件&#xff0c;点击打开 3、点击还原 4、执行日志...

25_05_02Linux架构篇、第1章_03安装部署nginx

Linux_基础篇 欢迎来到Linux的世界&#xff0c;看笔记好好学多敲多打&#xff0c;每个人都是大神&#xff01; 题目&#xff1a;安装部署nginx 版本号: 1.0,0 作者: 老王要学习 日期: 2025.05.02 适用环境: Centos7 文档说明 本文档聚焦于 CentOS 7 环境下 Nginx 的安装部…...

PostgreSQL存储过程“多态“实现:同一方法名支持不同参数

引言 在传统编程语言中&#xff0c;方法重载&#xff08;同一方法名不同参数&#xff09;是实现多态的重要手段。但当我们将目光转向PostgreSQL数据库时&#xff0c;是否也能在存储过程&#xff08;函数&#xff09;中实现类似的功能&#xff1f;本文将深入探讨PostgreSQL中如…...

Messenger.Default.Send 所有重载参数说明

Messenger.Default.Send 是 MVVM 框架中实现消息传递的核心方法,其重载参数主要用于控制消息的发送范围和接收条件。以下是其所有重载形式及参数说明: ‌1. 基本消息发送‌ Send<TMessage>(TMessage message) ‌参数说明‌: TMessage:消息类型(泛型参数),可以是任…...

java安全入门

文章目录 java基础知识this变量方法可变参数构造方法继承的关键字protected super阻止继承方法重载向上转型和向下转型多态抽象接口static静态字段default方法 包final内部类 java序列化与反序列化反射urldns链动态代理类加载器&#xff08;ClassLoader&#xff09;双亲委派模型…...

【开源深度解析】从零打造AI暗棋对战系统:Python实现中国象棋暗棋全攻略

&#x1f3b2;【开源深度解析】从零打造AI暗棋对战系统&#xff1a;Python实现中国象棋暗棋全攻略 &#x1f308; 个人主页&#xff1a;创客白泽 - CSDN博客 &#x1f525; 系列专栏&#xff1a;&#x1f40d;《Python开源项目实战》 &#x1f4a1; 热爱不止于代码&#xff0c;…...

UE5 Daz头发转Blender曲线再导出ABC成为Groom

先安装Daz to Blender Import插件 【神器】 --DAZ一键导入blender插件的详细安装和使用&#xff0c;自带骨骼绑定和控制器&#xff0c;多姿势动画&#xff0c;Importer桥接插件_哔哩哔哩_bilibili 然后安装DAZHairConverter插件 一分钟将DAZ头发转化成Blender粒子毛发_哔哩哔…...

【Java学习】反射

目录 反射类 一、泛型参数 二、反射类类型 三、实例化 1.实例化材料 2.结构信息可使用化 四、使用 1.Class —类完整结构信息 1.1Class<类>实例化 1.2Class<类>实例获取 1.2.1Class类静态获取&#xff1a; 1.2.2信息类静态获取 1.2.3信息类非静态获取 …...

SQLite数据类型

目录 1 SQLite的类型概述 1.1 存储类&#xff08;Storage Classes&#xff09; 1.2 类型亲和性&#xff08;Type Affinity&#xff09; 2 类型亲和性分配规则 3 数据类型详细说明 3.1 INTEGER类型 3.2 REAL类型 3.3 TEXT类型 3.4 BLOB类型 3.5 NULL类型 3.6 NUMERI…...

Django异步任务处理方式总结

在 Django 中实现异步任务处理是优化性能和用户体验的关键。以下是几种常见的异步任务处理方式及详细说明&#xff1a; 1. Celery&#xff08;最主流方案&#xff09; 适用场景&#xff1a;需要可靠、分布式、复杂任务队列的项目&#xff08;如定时任务、重试机制、多节点部署…...

AI技术下研发体系重构

导语&#xff1a; 人工智能技术已发展70余年&#xff0c;经历了从逻辑符号主义向数据驱动范式的转变&#xff0c;目前正处于向多模态、通用化以及伦理化方向演化的阶段。在接下来的五年内&#xff0c;人工智能技术的商业化应用预计将迎来关键性的转变。大模型技术的突破、多模…...

UE5 使用插槽和物理约束对角色新增的饰品添加物理效果

这是一条项链,分为链部分和吊坠部分 新增物理碰撞资产,链部分在前面(作为固定),吊坠部分在后面(作为物理模拟) 链部分的Physics设置 连接部分的设置 吊坠部分 添加物理约束,在Constraint里面添加角色名和饰品名 在约束里面可以对特定骨骼约束,这里需要把链部分约束...

邂逅蓝耘元生代:ComfyUI 工作流与服务器虚拟化的诗意交织

往期推荐&#xff1a; 探秘蓝耘元生代&#xff1a;ComfyUI 工作流创建与网络安全的奇妙羁绊-CSDN博客 工作流 x 深度学习&#xff1a;揭秘蓝耘元生代如何用 ComfyUI 玩转 AI 开发-CSDN博客 探索元生代&#xff1a;ComfyUI 工作流与计算机视觉的奇妙邂逅-CSDN博客 解锁元生代&a…...

【Elasticsearch】在kibana中能获取已创建的api keys吗?

在 Kibana 中&#xff0c;目前没有直接的界面功能可以列出或查看已创建的 API 密钥&#xff08;API keys&#xff09;。API 密钥的管理和查看主要通过 Elasticsearch 的 REST API 来完成&#xff0c;而不是通过 Kibana 的管理界面。 在 Kibana 中使用 Dev Tools 查看 API 密钥…...

[论文阅读]Deep Cross Network for Ad Click Predictions

摘要 特征工程是许多预测模型成功的关键。然而&#xff0c;这个过程是困难的&#xff0c;甚至需要手动特征工程或穷举搜索。DNN能够自动学习特征交互&#xff1b;然而&#xff0c;它们隐式地生成所有的交互&#xff0c;并且不一定有效地学习所有类型的交叉特征。在本文中&…...

薪技术|0到1学会性能测试第45课-apache调优技术

前面的推文我们掌握了apache监控技术,今天我们继续来看下apache调优技术,究竟是怎么做性能调优???后续文章都会系统分享干货,带大家从0到1学会性能测试。 Apache调优技术 Apache最近的版本是2.2版,Apache2.2是一个多用途的web服务器,其设计在灵活性、可移植性和性能中…...

Linux之基础开发工具二(makefile,git,gdb)

目录 一、自动化构建-make/makefile 1.1、背景 1.2、基本使用 1.3、推导过程 1.4、语法拓展 二、进度条小程序 2.1、回车与换行 2.2、行缓冲区 2.3、练手-倒计时程序 2.4、进度条程序 三、版本控制器-Git 3.1、版本控制器 3.2、gitee的使用 3.2.1、如何创建仓库 …...

cesium之自定义地图与地图叠加

在appvue中,cesium支持更换不同的地图资源,代码如下 <template><div id"cesiumContainer" ref"cesiumContainer"></div> </template><script setup> import * as Cesium from cesium; import "./Widgets/widgets.css&…...

链表结构深度解析:从单向无头到双向循环的实现全指南

上篇博客实现动态顺序表时&#xff0c;我们会发现它存在许多弊端&#xff0c;如&#xff1a; • 中间/头部的插⼊删除&#xff0c;时间复杂度为O(N) • 增容需要申请新空间&#xff0c;拷⻉数据&#xff0c;释放旧空间。会有不⼩的消耗。 • 增容⼀般是呈2倍的增⻓&#xff0c;…...

Apache Velocity代码生成简要介绍

Apache Velocity 概述 Apache Velocity 是一个基于 Java 的模板引擎&#xff0c;它允许将 Java 代码与 HTML、XML 或其他文本格式分离&#xff0c;实现视图与数据的解耦。在 Web 开发中&#xff0c;Velocity 常用于生成动态网页内容&#xff1b;在其他场景下&#xff0c;也可用…...

阿里云前端Nginx部署完,用ip地址访问却总访问不到,为什么?检查安全组是否设置u为Http(80)!

根据你的描述&#xff0c;Ping测试显示数据包无丢失但无法通过公网IP访问服务&#xff0c;说明网络基础层&#xff08;ICMP协议&#xff09;是通畅的&#xff0c;但更高层&#xff08;如TCP/UDP协议或服务配置&#xff09;存在问题。以下是系统性排查与解决方案&#xff1a; 一…...

【Hive入门】Hive行级安全:基于Apache Ranger的细粒度访问控制深度解析

引言 在大数据时代&#xff0c;数据安全与隐私保护已成为企业不可忽视的核心需求。传统表级权限控制已无法满足"同一张表不同用户看到不同数据"的业务场景&#xff0c;行级安全(Row-Level Security)成为数据仓库系统的必备能力。 1 行级安全概述 1.1 什么是行级安全…...

Marin说PCB之1000-BASE-T1的PCB设计总结--04

另外一路的1000-BASE-T1 Circuit&#xff1a;千兆以太网的仿真电路原理图的连接搭建方式如下&#xff1a; &#xff08;共模电感的连接需要特别注意一下PIN序别搞错了&#xff09; 这一路1000-BASE-T1 Circuit是做了兼容设计的&#xff1a; 其中电容C2099和C2100是百兆以太网的…...

两数之和(暴力+哈希查找)

目录 ​ 一.题目 二.解题过程 题目解析 方法一&#xff08;暴力求解&#xff09; 思路 代码 提交结果 方法二&#xff08;哈希查找&#xff09; 思路 代码 提交结果 作者的个人gitee​​ 作者的算法讲解主页▶️ 每日一言&#xff1a;“愿你纵踩淤泥&#xff0c;也要…...

Qt项目——天气预报

目录 前言结果预览工程文件窗体无状态栏窗口跟随移动HTTP基本概念JSON数据QT解析JSON数据结语 前言 通过对之前Qt的学习其实我们就已经有一点经验了&#xff0c;做天气预报只需要了解以下内容&#xff1a; stylesheet界面美化 Json数据解析 HTTP通信 自定义控件绘制温度 结果预…...

智能推理DeepSeek-R1+Word深度整合业级智能办公构建

前引&#xff1a; 当我们将DeepSeek-R1深度集成到Word时&#xff0c;实际上是在构建智能办公的"数字神经系统"。这个系统不仅理解文字内容&#xff0c;更能感知用户意图&#xff0c;在恰当的时刻提供精准的智能辅助。随着RAG&#xff08;检索增强生成&#xff09;技术…...

【C++ Qt】常用输入类下:Combo Box/Spin Box/DataTimeEdit/Dial/Slide

每日激励&#xff1a;“不设限和自我肯定的心态&#xff1a;I can do all things。 — Stephen Curry” 绪论​&#xff1a; 在Qt开发框架中&#xff0c;UI组件是构建用户交互界面的基石。本章将详细探讨Qt中常用的UI组件&#xff0c;包括下拉框&#xff08;QComboBox&#xff…...

基于Piecewise Jerk Speed Optimizer的速度规划算法(附ROS C++/Python仿真)

目录 1 时空解耦运动规划2 PJSO速度规划原理2.1 优化变量2.2 代价函数2.3 约束条件2.4 二次规划形式 3 算法仿真3.1 ROS C仿真3.2 Python仿真 1 时空解耦运动规划 在自主移动系统的运动规划体系中&#xff0c;时空解耦的递进式架构因其高效性与工程可实现性被广泛采用。这一架…...

K8s 常用命令、对象名称缩写汇总

K8s 常用命令、对象名称缩写汇总 前言 在之前的文章中已经陆续介绍过 Kubernetes 的部分命令&#xff0c;本文将专题介绍 Kubernetes 的常用命令&#xff0c;处理日常工作基本够用了。 集群相关 1、查看集群信息 kubectl cluster-info # 输出信息Kubernetes master is run…...

C++编程语言:从高效系统开发到现代编程范式的演进之路

目录 前言一、c简介1.1 起源1.2 c的特点 二、开发环境搭建 2.1. 安装 Qt 开发工具2.2 修改编码环境 2.3创建第一个 Qt 项目2.4 c的编译过程2.5 代码示例 2.6 qt疑难杂症 2.6.1 遇到无法删除代码&#xff0c;一点击光标就变成小黑块2.6.2 遇到运行不弹出终端 ​编辑 2.6.3 遇到…...

OpenCV进阶操作:角点检测

文章目录 一、角点检测1、定义2、检测流程1&#xff09;输入图像2&#xff09;图像预处理3&#xff09;特征提取4&#xff09;角点检测5&#xff09;角点定位和标记6&#xff09;角点筛选或后处理&#xff08;可选&#xff09;7&#xff09;输出结果 二、Harris 角点检测&#…...

广州华锐视点邀您参与2025广交会VRAR展【5月10-12日】

2025 广交会数字显示与元宇宙生态博览会暨第 9 届世界 VR&AR 展将在广州盛大举行 。时间&#xff1a;2025 年 5 月 10 日至 12 日&#xff0c;广州华锐视点作为一家深耕 VR、AR、AI、元宇宙内容制作领域的企业&#xff0c;也将携旗下众多创新产品和解决方案闪耀登场&#x…...

mac m2 安装 hbase

默认安装好了 homebrew。 1. 终端先更新下 homebrew brew upgrade再安装 hbase brew install hbase 安装完会有如下图的内容 2. 按照提示启动 hbase brew services start hbase返回启动成功 3. 访问 http://localhost:16010 检验一下 启动成功 4. 在启动 hbase shell之…...

k8s node 报IPVS no destination available

在 Kubernetes 集群中&#xff0c;IPVS no destination available 错误通常表示 kube-proxy&#xff08;IPVS 模式&#xff09;无法为 Service 找到可用的后端 Pod。这会导致流量无法正确转发&#xff0c;影响服务可用性。以下是详细的排查和解决方法&#xff1a; 一、错误原因…...

MySQL 中 EXISTS (SELECT 1 FROM ...) 的用法详解

EXISTS (SELECT 1 FROM ...) 是 MySQL 中用于存在性检查的核心语法&#xff0c;其核心逻辑是判断子查询是否返回至少一行数据。以下从作用原理、使用场景、性能优化等方面展开解析&#xff0c;并结合具体示例说明。 1. 基本语法与作用原理 语法结构&#xff1a; SELECT 列名 F…...

荣耀A8互动娱乐组件部署实录(第3部分:控制端结构与房间通信协议)

作者&#xff1a;曾在 WebSocket 超时里泡了七天七夜的苦命人 一、控制端总体架构概述 荣耀A8控制端主要承担的是“运营支点”功能&#xff0c;也就是开发与运营之间的桥梁。它既不直接参与玩家行为&#xff0c;又控制着玩家的行为逻辑和游戏规则触发机制。控制端的主要职责包…...

前端-HTML+CSS+JavaScript+Vue+Ajax概述

HTML&#xff08;超文本标记语言&#xff09;常见标签 <html><head> <title>这是标题的内容&#xff0c;显示在浏览器的头部</title></head><body><!-- 这里面的内容在浏览器显示给用户看 --><!-- h1 -> h6 : 标题从大到小 …...

20250506格式化NanoPi NEO开发板使用Ubuntu core16.04系统的TF启动卡

https://www.sdcard.org/downloads/formatter/eula_windows/SDCardFormatterv5_WinEN.zip 20250506使用SDCardFormatter工具格式化NanoPi NEO开发板使用Ubuntu core16.04系统的TF启动卡 2025/5/6 20:04 缘起&#xff1a;使用友善之臂的NanoPi NEO开发板&#xff0c;制作了Ubunt…...

信息时代的政治重构:网络空间与主权的未来

一、网络空间&#xff1a;暴力垄断的终结 无边界主权的崛起 网络空间作为“第五阶段”的暴力竞争场域&#xff0c;打破传统领土垄断。政府无法像控制物理世界那样垄断网络暴力&#xff0c;类似公海的法律真空状态。 边区类比&#xff1a;中世纪的安道尔&#xff08;法西共管避…...

Kotlin重构Android项目实践

以下是使用 Kotlin 重构 Android 项目的 5 个常见场景实践&#xff0c;通过对比 Java 实现方式&#xff0c;展示 Kotlin 的简洁性和现代特性&#xff1a; 场景 1&#xff1a;数据类替代 Java POJO Java 传统实现&#xff1a; public class User {private String name;private…...