一个字符驱动示例 -- 微秒级别周期 反转GPIO

仅作为自我记录的一个demo
本次GPIO以微妙级别频率的反转实验有以下几个启示:

  1. 一开始在应用层做延时,来实现2微妙周期,占空比50%的GPIO反转,发现波形的频率一直上不去,只能在25hz徘徊,后来索性去掉延时,发现最高也就只能到发现只能到达6.5us周期,一开始是认为system函数内有系统调用,开销比较大,但是后来一想再大应该超不过200ns,后来向组内大佬请求帮助,大佬说sleep函数会引起睡眠,造成进程切换,这个开销是很大的,特别是us级别的延时,得不偿失。另外,一开始操作gpio是用system来执行echo操作gpio,这个过程本质是execvp了进程,也有一定开销。应该用file操作sysfs的文件。
  2. 后来将延时操作迁移到linux内核驱动,这次不加延时,最高可以跑到120ns的周期,我想应该还能跑到更高,因为这个demo是开启一个内核线程去执行的。
  3. 最后,将延时操作换为对时间的读取,使用gettimeofday函数,这个函数的精度刚好是us级别,通过在while循环里判断两次读取时间查是否大于等于1来反转gpio,到这个做法好像不太行,输出的波形不稳定,频率在不断变化:
    在这里插入图片描述
  4. 放弃3中的做法后,可以尝试的方法还有内核定时器,udelay函数可以尝试。看看尝试了udelay的效果:在这里插入图片描述
    效果还行,最终就选择了这个方案。
#include <linux/types.h>
#include <linux/errno.h>
#include <linux/ioport.h>
#include <linux/fcntl.h>
#include <linux/init.h>
#include <linux/proc_fs.h>
#include <linux/io.h>
#include <linux/uaccess.h>
#include <linux/mutex.h>
#include <linux/pagemap.h>
#include <linux/kthread.h>
#include <linux/kthread.h>
#include <linux/delay.h>
#include <linux/module.h>#define ENTER() printk(KERN_DEBUG "%s() Enter", __func__)
#define EXIT() printk(KERN_DEBUG "%s() Exit", __func__)
#define ERR(fmt, args...) printk(KERN_ERR "%s()-%d: " fmt "\n", __func__, __LINE__, ##args)
#define DBG(fmt, args...) printk(KERN_DEBUG "%s()-%d: " fmt "\n", __func__, __LINE__, ##args)/** toggle the gpio output value every 1us
*/#define GPIO_PORTB_BASE 0xF244C000
#define GPIOB_DATA_OFF  0x0
#define GPIOB_DIR_OFF   0x4#define IOMUX_BASE      0xF0040500
#define DRIVER_ABLT_R2R_OFF 0x00
#define PINCTRL_OFF         0x2C
#define GPIO_FUNC_NUM   8
#define DRIVER_SET_VAL  1
#define GPIO_PIN_NUM    4
#define PIN_MUX_BIT_WIDTH 4
#define PIN_DRV_BIT_WIDTH 1#define TOGGLE_SPAN_IN_US 1static unsigned int *gpio_handler;
static unsigned int *iomux_handler;
static struct task_struct *test_kthread = NULL;  static void pinctrl(void *handler)
{unsigned int *pinctrl_banke = (unsigned int *)(handler + PINCTRL_OFF);unsigned int *driver_banke = (unsigned int *)(handler + DRIVER_ABLT_R2R_OFF);// PE4 set func 8*pinctrl_banke = (unsigned int)(GPIO_FUNC_NUM << (GPIO_PIN_NUM * PIN_MUX_BIT_WIDTH));// PE4 driver ability set 2ma*driver_banke = (unsigned int)(DRIVER_SET_VAL << (GPIO_PIN_NUM * PIN_DRV_BIT_WIDTH));
}static void gpio_cfg(void *handler)
{unsigned int *gpio_dir_base = (unsigned int *)(handler + GPIOB_DIR_OFF);//set gpiob1 direction output *gpio_dir_base = 0x02;
}inline void gpio_set_high(void *handler)
{unsigned int * gpio_dat_base = (unsigned int *)(handler + GPIOB_DATA_OFF);//set gpiob1 output high*gpio_dat_base = 0x02;
}inline void gpio_set_low(void *handler)
{unsigned int * gpio_dat_base = (unsigned int *)(handler + GPIOB_DATA_OFF);//set gpiob1 output low*gpio_dat_base = 0x00;
}static int gpio_toggle_thread(void* data)
{static volatile unsigned int flg = 0;ENTER();   gpio_handler = ioremap(GPIO_PORTB_BASE, 8);iomux_handler = ioremap(IOMUX_BASE, 50);pr_err("gpio_toggle_thread start \r\n");pinctrl(iomux_handler);gpio_cfg(gpio_handler);while(!kthread_should_stop()){if(flg == 0){gpio_set_high(gpio_handler);flg = 1;} else {gpio_set_low(gpio_handler);flg = 0;}udelay(1);}EXIT();return 0;
}int __init gp_toggle_init(void)
{ENTER();test_kthread = kthread_run(gpio_toggle_thread, NULL, "gpio-toggle");  if(!test_kthread) {ERR("kthread_run fail");return -ECHILD;       }EXIT();return 0;
}void __exit gp_toggle_exit(void)
{ENTER();if (test_kthread) {DBG("kthread_stop");kthread_stop(test_kthread); //停止内核线程test_kthread = NULL;}EXIT();    return;
}module_init(gp_toggle_init);
module_exit(gp_toggle_exit);
MODULE_LICENSE("GPL");

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/13462.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

flink写入到kafka 大坑解析。

1.kafka能不能发送null消息&#xff1f; 能&#xff01; 2 flink能不能发送null消息到kafka&#xff1f; 不能&#xff01; public static void main(String[] args) throws Exception {StreamExecutionEnvironment env StreamExecutionEnvironment.getExecutionEnvironment(…

JavaWeb+jsp+Tomcat的叮当书城项目

点击以下链接获取源码&#xff1a; https://download.csdn.net/download/qq_64505944/88123111?spm1001.2014.3001.5503 技术&#xff1a;ssm jsp JDK1.8 MySQL5.7 Tomcat8.3 源码数据库课程设计 功能&#xff1a;管理员与普通用户和超级管理员三个角色&#xff0c;管理员可…

浅谈 Spring AOP 思想

Spring AOP AOP 切面编程普通代理类JDK动态代理Cglib动态代理AOPAOP术语AOP切面编程的优势Advice通知类型&#xff08;5种&#xff09;通知的执行顺序 Order切入点表达式表达式execution注解annotation Spring事务管理Transactional 及 Transactional 的两个属性Transactional …

常用直线模组的类型

目前&#xff0c;直线模组的应用非常广泛&#xff0c;而且直线模组的种类也有很多可以满足每个行业的应用要求&#xff0c;那么常见的直线模组类型有哪些&#xff0c;大家知道吗&#xff1f; 1、全封闭滚珠丝杆直线模组&#xff1a; 在半封闭式的基础上增加了不锈钢带防尘结构…

[Angular] Import TranslateModule in Angular 16

1.Background Angular 更新至V16版后&#xff0c;支援 standalone&#xff0c;故移除了 NgModule&#xff0c;而TranslateModule 又要在AppModule中 import&#xff0c;那该如何做呢&#xff1f; 2.NPM packages installation npm install ngx-translate/core npm install n…

BUUCTF——reverse3 适合新手的关于base64加密算法代码的分析

作为一个逆向小白&#xff0c;学了点加密算法就来BUU找点乐子&#xff0c;前7题蛮简单的&#xff0c;然后做到了reverse3&#xff0c;典型的base64加密算法&#xff0c;让我折腾了好久&#xff0c;写篇博客记录一下 顺便说下很多博客并没有对这里的加密算法进行代码上的分析&a…

分享VMware Workstation Pro ESXI7创建虚拟机和配置硬盘空间(分享自己的学习历程意在帮助有需要的小伙伴)

背景&#xff1a;因公司项目需求改用VMware Workstation Pro&#xff0c;已经使用1个月目前除了中途出现过一次问题被解决后一直稳定运行至今&#xff0c; 1:这里贴出拿出现的问题提示及解决方法的链接&#xff1a;解决vmWare ESXI 7.3报错; 2:如果你是第一次接触VMware Work…

Echarts 文字太长用省略号代替

xAxis: [{type: category,data: [materialUserEchartsDate.value[0] ? materialUserEchartsDate.value[0].name : ,materialUserEchartsDate.value[1] ? materialUserEchartsDate.value[1].name : ,materialUserEchartsDate.value[2] ? materialUserEchartsDate.value[2].na…

二、前端高德地图、渲染标记(Marker)引入自定义icon,手动设置zoom

要实现这个效果&#xff0c;我们先看一下目前的页面展示&#xff1a; 左边有一个图例&#xff0c;我们可以方法缩小地图&#xff0c;右边是动态的marker标记&#xff0c;到时候肯定时候是后端将对应的颜色标识、文字展示、坐标点给咱们返回、我们肯定可以拿到一个list&#xf…

【广州华锐互动】无人值守变电站AR虚拟测控平台

无人值守变电站AR虚拟测控平台是一种基于增强现实技术的电力设备巡检系统&#xff0c;它可以利用增强现实技术将虚拟信息叠加在真实场景中&#xff0c;帮助巡检人员更加高效地完成巡检任务。这种系统的出现&#xff0c;不仅提高了巡检效率和准确性&#xff0c;还降低了巡检成本…

企业级敏捷转型探索与实践︱极狐Gitlab战略运营部PMO郝韫

极狐Gitlab战略运营部PMO郝韫先生受邀为由PMO评论主办的2023第十二届中国PMO大会演讲嘉宾&#xff0c;演讲议题&#xff1a;企业级敏捷转型探索与实践。大会将于8月12-13日在北京举办&#xff0c;敬请关注&#xff01; 议题简要&#xff1a; 打造持续创新、快速成长的敏捷组织…

python调用百度ai将图片/pdf识别为表格excel

python调用百度ai将图片识别为表格excel 表格文字识别(异步接口)图片转excel 表格文字识别V2图片/pdf转excel通用 表格文字识别(异步接口) 图片转excel 百度ai官方文档&#xff1a;https://ai.baidu.com/ai-doc/OCR/Ik3h7y238 使用的是表格文字识别(异步接口)&#xff0c;同步…

【C#】微软的Roslyn 是个啥?

一、说明 Roslyn 是微软重写的C#编译器并开源。 Roslyn 是 C# 和 Visual Basic.NET 开源编译器的代号。以下是它如何在过去十年企业Microsoft的最黑暗中开始&#xff0c;并成为所有C#&#xff08;和VB&#xff09;的开源&#xff0c;跨平台&#xff0c;公共语言引擎&#xff0c…

springboot+mybatis-plus+vue+element+vant2实现短视频网站,模拟西瓜视频移动端

目录 一、前言 二、管理后台 1.登录 2.登录成功&#xff0c;进入欢迎页 ​编辑 3.视频分类管理 4. 视频标签管理 5.视频管理 6.评论管理 ​编辑 7.用户管理 8.字典管理 &#xff08;类似于后端的枚举&#xff09; 9.参数管理&#xff08;富文本录入&#xff09; 10.管…

Docker容器监控之 CAdvisor+InfluxDB+Granfana

通过docker stats命令可以很方便的看到当前宿主机上所有容器的CPU,内存以及网络流量等数据&#xff0c;一般小公司够用了。但是&#xff0c;docker stats统计结果只能是当前宿主机的全部容器&#xff0c;数据资料是实时的&#xff0c;没有地方存储、没有健康指标过线预警等功能…

VMware搭建Hadoop集群 for Windows(完整详细,实测可用)

目录 一、VMware 虚拟机安装 &#xff08;1&#xff09;虚拟机创建及配置 &#xff08;2&#xff09;创建工作文件夹 二、克隆虚拟机 三、配置虚拟机的网络 &#xff08;1&#xff09;虚拟网络配置 &#xff08;2&#xff09;配置虚拟机 主机名 &#xff08;3&#xf…

(树) 剑指 Offer 26. 树的子结构 ——【Leetcode每日一题】

❓剑指 Offer 26. 树的子结构 难度&#xff1a;中等 输入两棵二叉树 A 和 B&#xff0c;判断 B 是不是 A 的子结构。(约定空树不是任意一个树的子结构) B 是 A 的子结构&#xff0c; 即 A 中有出现和B相同的结构和节点值。 例如: 给定的树 A: 3/ \4 5/ \1 2给定的树 B&…

stable-diffusion-webui汉化教程

第一种方法 1.打开stable diffusion webui&#xff0c;进入"Extensions"选项卡 2.点击"Install from URL" 3、注意"URL for extension’s git repository"下方的输入框 4、填入地址&#xff1a;https://github.com/VinsonLaro/stable-diffus…

C++多线程编程(包含c++20内容)

C多线程编程(包含c20内容) 文章目录 C多线程编程(包含c20内容)线程通过函数指针创建线程通过函数对象创建线程通过lambda创建线程通过成员函数创建线程线程本地存储取消线程自动join线程从线程获得结果 原子操作库原子操作原子智能指针原子引用使用原子类型等待原子变量 互斥互…

[JAVAee]文件操作-IO

本文章讲述了通过java对文件进行IO操作 IO:input/output,输入/输出. 建议配合文章末尾实例食用 目录 文件 文件的管理 文件的路径 文件的分类 文件系统的操作 File类的构造方法 File的常用方法 文件内容的读写 FileInputStream读取文件 构造方法 常用方法 Scan…