4.17号驱动

中断子系统

1. 中断工作原理

1.1 异常处理流程

保存现场(cpu自动完成)

保存cpsr寄存器中的值,到spsr_寄存器中

修改cpsr寄存器中的值

        修改状态位(T位)

        根据需要禁止相应的中断位(I/F)

        修改对应模式位

保存函数的返回地址到lr寄存器中

修改pc指向异常向量表

恢复现场(手动完成)

1.2 按键处理异常

2. 基于Linux中断中断子系统工作原理

3. 中断子系统API

#include <linux/interrupt.h>
int request_irq(unsigned int irq, irq_handler_t handler, unsigned long flags,
        const char *name, void *dev)
函数功能:注册中断子系统
参数:
    irq:软中断号
    handler:中断处理函数
        中断处理函数原型:irqreturn_t irq_handler_t(int irqno, void *dev)
    flags:中断触发方式
        IRQF_TRIGGER_RISING:上升沿触发方式
        IRQF_TRIGGER_FALLING:下降沿触发方式
        IRQF_TRIGGER_HIGH:高电平触发方式
        IRQF_TRIGGER_LOW:低电平触发方式
    name:中断名字
    dev:向中断处理函数中传递参数
返回值: 
    成功返回0,失败返回错误码  

 

void *free_irq(unsigned int irq, void *dev);
 函数功能:注销中断子系统
 参数:
     irq:软中断号
     dev:向中断处理函数中传递参数
 返回值:无

4. 编写设备树

4.1 查看硬件电路图连接

4.2 编写设备树思路

4.3 分析设备树

4.4 参考内核帮助文档

4.5 编写设备树

定时器

1. 定时器工作原理

1.1 如何查看内核中定时器频率

在linux内核源码中.config文件中,CONFIG_HZ这个变量表示定时器频率

ARM架构 =====> CONFIG_HZ=100

x86架构 =====> CONFIG_HZ=250

1.2 定时时间加1表示多少

ARM架构 ==> 频率:CONFIG_HZ=100 ==> 周期:0.01s = 10ms

x86架构 ==> 频率:CONFIG_HZ=250 ==> 周期:0.004s = 4ms

1.3 如何获取当前内核时间

jiffies内核时钟节拍数

表示内核启动时,这个时间就随着内核的时间进行增加

jiffies变量就可以获取当前内核时间

1.4 定时1s钟如何表示

ARM架构 ==> jiffies + 100

x86架构 ==> jiffies + 250

2. 定时器API接口

 分配定时器对象
#include <linux/timer.h>
struct timer_list {
    struct hlist_node   entry; //定时器在内核钟构成链表
    unsigned long       expires; //定时时间
    void   (*function)(struct timer_list *); //定时器处理函数
    u32         flags; //默认0
};
struct timer_list mytimer;

初始化定时器
mytimer.expires = jiffies + 100;//定时器事件1s
timer_setup(&mytimer,定时器处理函数, 0) 

启动定时器
void add_timer(struct timer_list *timer) //启动定时器
int mod_timer(struct timer_list *timer, unsigned long expires) //再次启动定时器

注销定时器
int del_timer(struct timer_list *timer)

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【测试开发学习历程】python常用的模块(下)

目录 8、MySQL数据库的操作-pymysql 8.1 连接并操作数据库 9、ini文件的操作-configparser 9.1 模块-configparser 9.2 读取ini文件中的内容 9.3 获取指定建的值 10 json文件操作-json 10.1 json文件的格式或者json数据的格式 10.2 json.load/json.loads 10.3 json.du…

React 快速入门:掌握前端开发的核心技能

React 快速入门&#xff1a;掌握前端开发的核心技能 一、React 简介1.1 React 的历史1.2 React 的概念1.3 React 的特点1.4 React 的官网地址 二、开发环境搭建三、React 基础3.1 JSX3.2 组件3.3 Props3.4 State3.5 props 和 state 的区别3.6 Hook 四、React 生命周期五、添加样…

OceanBase 4.3 列存存储格式和列存索引存储格式

以 t1 表和索引为例子&#xff0c;下面两张图说明了存储层如何存储数据。 create table t1 (id1 int, id2 int, name varchar(10), salary int, primary key(id1, id2)) with column group (each column);create index idx (name) storing(salary) with column group(each co…

代码随想录算法训练营第三十七天| LeetCode 738.单调递增的数字、总结

一、LeetCode 738.单调递增的数字 题目链接/文章讲解/视频讲解&#xff1a;https://programmercarl.com/0738.%E5%8D%95%E8%B0%83%E9%80%92%E5%A2%9E%E7%9A%84%E6%95%B0%E5%AD%97.html 状态&#xff1a;已解决 1.思路 如何求得小于等于N的最大单调递增的整数&#xff1f;98&am…

【云计算】云数据中心网络(六):私网连接

云数据中心网络&#xff08;六&#xff09;&#xff1a;私网连接 1.什么是私网连接2.私网连接的组成3.私网连接的优势4.私网连接的主要应用场景 前面讲到 VPC 网络具有隔离性&#xff0c;VPC 之间无法通信。当一个 VPC 中的终端需要访问部署在另一个 VPC 中的服务时&#xff0c…

C++奇迹之旅:构造函数和析构函数

文章目录 &#x1f4dd;类的6个默认成员函数&#x1f320; 构造函数&#x1f309; 概念&#x1f309;特性&#x1f309;三种默认构造函数 &#x1f320; 特性&#x1f6a9;总结 &#x1f4dd;类的6个默认成员函数 如果一个类中什么成员都没有&#xff0c;简称为空类。 空类中真…

Redis中的订阅发布(一)

订阅发布 概述 Redis的发布与订阅功能由PUBLISH、SUBSCRIBE、PSUBSCRIBE等命令组成。通过执行SUBSCRIBER命令&#xff0c;客户端可以订阅一个或多个频道&#xff0c;从而成为这些频道的订阅者(subscribe)&#xff1a; 每当有其他客户端向被订阅的频道发送消息(message)时&…

多ip证书实现多个ip地址https加密

在互联网快速发展的现在&#xff0c;很多用户会使用由正规数字证书颁发机构颁发的数字证书&#xff0c;其中IP数字证书就是只有公网IP地址网站的用户用来维护网站安全的手段。由于域名网站比较方便记忆&#xff0c;只有公网IP地址的网站是很少的&#xff0c;相应的IP数字证书产…

基于zookeeper安装Kafka集群

操作系统&#xff1a;centOS 9 Stream&#xff0c;6台&#xff0c;基于vmware虚拟机创建 准备工作 确认系统环境&#xff1a; 确保所有服务器已安装了最新更新。安装Java Development Kit (JDK) 8或更高版本&#xff0c;因为ZooKeeper和Kafka都是基于Java开发的。例如&#x…

【配电网故障定位】基于二进制粒子群算法的配电网故障定位 33节点配电系统故障定位【Matlab代码#78】

文章目录 【获取资源请见文章第6节&#xff1a;资源获取】1. 配电网故障定位2. 二进制粒子群算法3. 算例展示4. 部分代码展示5. 仿真结果展示6. 资源获取 【获取资源请见文章第6节&#xff1a;资源获取】 1. 配电网故障定位 配电系统故障定位&#xff0c;即在配电网络发生故障…

深入理解同步与异步编程及协程管理在Python中的应用

文章目录 1. 同步与异步函数的对比1.1 同步函数1.2 异步函数1.3 对比 2. 管理多个协程与异常处理2.1 并发执行多个协程2.2 错误处理2.3 任务取消 本文将探索Python中同步与异步编程的基本概念及其区别。还会详细介绍如何使用asyncio库来有效管理协程&#xff0c;包括任务的创建…

C++动态内存管理 解剖new/delete详细讲解(operator new,operator delete)

讨厌抄我作业和不让我抄作业的人 讨厌插队和不让我插队的人 讨厌用我东西和不让我用东西的人 讨厌借我钱和不借给我钱的人 讨厌开车加塞和不让我加塞的人 讨厌内卷和打扰我内卷的人 一、C中动态内存管理 1.new和delete操作内置类型 2.new和delete操作自定义类型 二、operat…

人生的关键在于思想、精神和心情

人生的关键在于思想、精神和心情&#xff0c; 努力让自己的思想明澈&#xff0c; 让自己的精神充实而有所支撑&#xff0c; 让自己每天都有一个豁达、平和、开朗的心情&#xff0c; 这很重要。

SQLite的知名用户(二十九)

返回&#xff1a;SQLite—系列文章目录 上一篇:SQLite作为应用程序文件格式&#xff08;二十八&#xff09; 下一篇&#xff1a;SQLite—系列文章目录 SQLite被数以百万计的应用程序使用 从字面上看&#xff0c;有数十亿次部署。 SQLite 是 当今世界。 下面显示了一些…

Taro-vue微信小程序用户隐私保护

Taro-vue微信小程序用户隐私保护 一、在 微信公众平台的【设置】- 【服务内容与声明】 &#xff0c;设置用户隐私保护指引&#xff0c;添加项目需要的接口权限。 【用户隐私保护指引】提交之后&#xff0c;官方会进行审核。审核通过之后&#xff0c;对应的接口权限才会生效。 …

实现 Table 的增加和删除,不依赖后端数据回显

需求 删除前 删除后 分析 首先写一个 Table <a-card style"width:100%"><template#extra><a-button type"text" click"addSelectItem" style"margin-right: 5px">添加</a-button><a-button type&quo…

springboot源码解析(一):启动过程

springboot源码解析(一):启动过程 1、springboot的入口程序 SpringBootApplication public class StartupApplication {public static void main(String[] args) {SpringApplication.run(StartupApplication.class, args);} }当程序开始执行之后&#xff0c;会调用SpringAppli…

大话设计模式之单例模式

单例模式是一种创建型设计模式&#xff0c;它确保类只有一个实例&#xff0c;并提供一个全局访问点来访问该实例。 单例模式通常在以下情况下使用&#xff1a; 当一个类只能有一个实例&#xff0c;并且客户端需要访问该实例时。当该唯一实例需要被公开访问&#xff0c;以便在…

2022年团体程序设计天梯赛-总决赛 L1 -L2

目录 L1-1 今天我要赢 L1-2 种钻石 L1-3 谁能进图书馆 L1-4 拯救外星人 L1-5 试试手气 L1-6 斯德哥尔摩火车上的题 L1-7 机工士姆斯塔迪奥 L1-8 静静的推荐 L2-1 插松枝 L2-2 老板的作息表 L2-3 龙龙送外卖 L2-4 大众情人 L1-1 今天我要赢 分数 5 2018 年我们曾经出…

新游戏-开箱H5游戏【无限贝拉/疯狂骑士团】最新整理Linux手工服务端+详细搭建教程

小编教大家搭建游戏啦 一款H5奉上 先上图 然后再看教程 90GM基地&#xff1a;www.t1gm.com 默认解压密码&#xff1a;www.t1gm.com 本教程只限于技术研究使用&#xff0c;请勿用于商业用途。 本资源由90GM基地独家提供 90GM基地交流群&#xff1a;639140260 ★★★★…