linux中软件触发中断SGI(IPI)的使用
软件触发中断SGI的使用
什么是SGI
SGI:软件触发中断(Software Generated Interrupt)。在arm处理器中,SGI共有16个,硬件中断号分别为ID0~ID15。它通常用于多核间通讯。SGI在Linux内核中通常被用作IPI
中断(inter-processor interrupts).
在linux内核中,已经定义了如下的IPI中断,所以用户使用自定义的IPI中断时,建议使用8~15这些未用的中断。
//arch\arm\kernel\smp.c
enum ipi_msg_type {IPI_WAKEUP,IPI_TIMER,IPI_RESCHEDULE,IPI_CALL_FUNC,IPI_CPU_STOP,IPI_IRQ_WORK,IPI_COMPLETION,IPI_CPU_BACKTRACE,/** SGI8-15 can be reserved by secure firmware, and thus may* not be usable by the kernel. Please keep the above limited* to at most 8 entries.*/
};
linux驱动中如何使用SGI
相关函数
void gic_raise_softirq(const struct cpumask *mask, unsigned int irq)
- 描述:释放一个软件中断
- mask: 使用cpumask_of(number),传递要控制的cpu.
- irq: 中断号。0~15.
- eg:
gic_raise_softirq(cpumask_of(1), 14)
.给cpu1发送14号SGI.
int set_ipi_handler(int ipinr, void *handler, char *desc)
- 描述: 申请并设置SGI的中断回调函数。
- ipinr: 中断号。0~15。
- handler: 中断函数指针。需要的中断函数类型为
void handler_name(void)
. - desc: 名称。如
"sgi14handler"
. - return: 成功返回0.
- eg:
set_ipi_handler(14, ipi_kick,"sgi14handler")
.
clear_ipi_handler(int ipinr)
- 描述: 清除申请的中断。
- ipinr: 中断号。0~15。
- eg:
clear_ipi_handler(14)
.
使用步骤
- 在驱动初始化时使用
set_ipi_handler()
函数注册要使用的SGI中断号以及回调函数。 - 在驱动卸载时使用
clear_ipi_handler()
函数注销。 - 在驱动中合适的地方调用
gic_raise_softirq()
触发一个软中断。 - 启动linux后,使用
insmod
挂载编写好的驱动。 - 挂载成功后可以使用
cat /proc/interrupts
来查看中断是否申请成功。
驱动的部分程序如下:
/* 1. 使用的软件中断号 */
#define REV_SGI_ID 14/* 2. sgi 回调函数,由set_ipi_handler()函数在初始化时回调 */
static void ipi_kick(void)
{printk("ipi_kick:%d\n",++kickcount);
}/* 3. 模块初始化部分程序 */
static int __init char_init(void)
{.../* 申请加初始化软中断 */int ret = 0;ret = set_ipi_handler(REV_SGI_ID, ipi_kick,"Firmware kick");if(ret){printk("ipi(%d) error.\n",REV_SGI_ID);}
...
}/* 4. 模块注销部分程序 */
static void __exit char_exit(void)
{.../* 注销中断 */clear_ipi_handler(REV_SGI_ID);
...
}/* 5. 写函数部分程序,用户触发软中断使用 */
static ssize_t char_write(struct file *filp,const char __user *buf,size_t cnt,loff_t *offt)
{int revalue = 0;char tempbuff[2];revalue = copy_from_user(tempbuff,buf,2);if(revalue == 0){/* 触发软中断。1. eg: tempbuff[0] = 0,tempbuff[1] =14; 则触发cpu0的14号中断1. eg: tempbuff[0] = 1,tempbuff[1] =13; 则触发cpu1的13号中断*/gic_raise_softirq(cpumask_of(tempbuff[0]), tempbuff[1]);}return 0;
}
关于技术交流
此处后的文字已经和题目内容无关,可以不看。
qq群:825695030
微信公众号:嵌入式的日常
如果上面的文章对你有用,欢迎打赏、点赞、评论。
linux中软件触发中断SGI(IPI)的使用相关推荐
- Linux课程---11、Linux中软件安装和调试
Linux课程---11.Linux中软件安装和调试 一.总结 一句话总结: 启动过程:1.安装软件,2.修改配置文件,3.启动服务 查看过程:4.查看进程,5.查看端口 关闭过程:6.关闭软件,7. ...
- qt打包rpm时候先安装其他软件_云计算学习路线图素材课件,Linux中软件安装的方式...
很多初学者感觉云计算就是一个听起来比较高大上的名词,每次想要了解它的时候都像是雾里看花,迷迷糊糊看不真切,至于它是干什么的就更不了解了,其实云计算学起来在IT行业中还是比较容易上手的,接下来我给大家分 ...
- _云计算学习路线图素材课件,Linux中软件安装的方式
很多初学者感觉云计算就是一个听起来比较高大上的名词,每次想要了解它的时候都像是雾里看花,迷迷糊糊看不真切,至于它是干什么的就更不了解了,其实云计算学起来在IT行业中还是比较容易上手的,接下来我给大家分 ...
- Linux中软件的安装,vim编辑器
文章目录 Linux中软件的安装,vim编辑器 Linux中软件的安装 vim编辑器 在线安装vim编辑器 vim的使用 vim的命令 Linux中软件的安装,vim编辑器 Linux中软件的安装 L ...
- Tms320F28335中软件触发信号采样(ADC)
//该程序用于信号ADC,其中,采用定时器0中断读取采样结果 // //该程序ADC触发源为软件触发(S/w),然后,通过AdcRegs.ADCST.bit.INT_SEQ1标志位为1判断转换结果 ...
- Linux 笔记 - 第九章 Linux 中软件的安装
博客地址:http://www.moonxy.com 一.前言 在 Linux 系统中,应用程序的软件包主要分为两种: 1)第一种是二进制的可执行软件包,也就是解开包后就可以直接运行.在 Window ...
- Linux中软件自启动三种方式
一.介绍 Linux环境中软件自启动的三种方式,测试环境为Centos7.三种方式为: 1.systemd服务 2.使用 /etc/rc.d/rc.local 3.使用crontab定时计划中的@re ...
- Linux中软件的安装方式
Linux系统中软件的主要安装方式 [方式一]下载编译好的压缩包 这种安装方式与Windows下的.exe可执行安装文件类似,压缩包内一般是编译好的可执行二进制文件,直接解压.配置软件的相关文件即可使 ...
- Linux中软件管理的yum命令
yum命令 注意:yum命令的使用必须是在yum源搭建成功后才能正常运行. yum clean all 清除原有yum缓存 yum repolist 列出仓库信息 yum install softwa ...
最新文章
- Zoom 袁征码农逆袭:8 次申请美国签证被拒,独闯硅谷成亿万富翁
- oracle 修索引改空间_记一次Oracle分区表全局索引重修的历程
- Linux运维常用命令总结
- Flume学习笔记(二)问题整理
- 一码阻塞,万码等待:ASP.NET Core 同步方法调用异步方法“死锁”的真相
- 粘贴复制Android复制和粘贴的实现
- typescript语法高亮插件_vscode常用插件
- 如何使用be动词来确认请求_12
- 在libvirt中使用SanLock
- 3DSmax里的nurms toggle命令中文版是什么意思
- unity NGUI下载 支持unity高版本
- 教你如何用PQ魔法师调整硬盘分区大小【图解教程】
- android直播录像,安卓手机怎么录制直播视频
- 利用Vant完成登录页面!
- signal(SIGCHLD, SIG_IGN)和signal(SIGPIPE, SIG_IGN);
- Pytorch min函数详解
- git pull 时一直卡在Unpacking objects【待解决】
- 三台机器互相免密登录
- Pytorch的model.train() model.eval() torch.no_grad() 为什么测试的时候不调用loss.backward()计算梯度还要关闭梯度
- iOS 开发资源汇总 肯定有你想要的资源(Continuously updated)
热门文章
- java开心餐厅_菜鸟操作—HTML5制作开心餐厅页面
- java 图片拼接_Java分割拼接图片
- html图片如何摆在右侧,css里面,怎么让背景图片在最右边,且上下...
- 玩转Mysql系列 - 第10篇:常用的几十个函数详解
- 从零开始的嵌入式系统开发学习Day1(初识linux)
- 跨境电商账号关联指南:电商浏览器下载与使用,电商浏览器防关联
- vue实现打字机动画
- 【医学影像】超声(UltraSound)影像与 CT/MRI 多模态融合配准
- 链路聚合channel
- 最近收到最多的5个抖音问题,10个人有9人都会出现的,我总结了解决办法!