软件触发中断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

相关函数

  1. void gic_raise_softirq(const struct cpumask *mask, unsigned int irq)

    1. 描述:释放一个软件中断
    2. mask: 使用cpumask_of(number),传递要控制的cpu.
    3. irq: 中断号。0~15.
    4. eg: gic_raise_softirq(cpumask_of(1), 14).给cpu1发送14号SGI.
  2. int set_ipi_handler(int ipinr, void *handler, char *desc)
    1. 描述: 申请并设置SGI的中断回调函数。
    2. ipinr: 中断号。0~15。
    3. handler: 中断函数指针。需要的中断函数类型为void handler_name(void).
    4. desc: 名称。如"sgi14handler".
    5. return: 成功返回0.
    6. eg: set_ipi_handler(14, ipi_kick,"sgi14handler").
  3. clear_ipi_handler(int ipinr)
    1. 描述: 清除申请的中断。
    2. ipinr: 中断号。0~15。
    3. eg: clear_ipi_handler(14).

使用步骤

  1. 在驱动初始化时使用set_ipi_handler()函数注册要使用的SGI中断号以及回调函数。
  2. 在驱动卸载时使用clear_ipi_handler()函数注销。
  3. 在驱动中合适的地方调用gic_raise_softirq()触发一个软中断。
  4. 启动linux后,使用insmod挂载编写好的驱动。
  5. 挂载成功后可以使用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)的使用相关推荐

  1. Linux课程---11、Linux中软件安装和调试

    Linux课程---11.Linux中软件安装和调试 一.总结 一句话总结: 启动过程:1.安装软件,2.修改配置文件,3.启动服务 查看过程:4.查看进程,5.查看端口 关闭过程:6.关闭软件,7. ...

  2. qt打包rpm时候先安装其他软件_云计算学习路线图素材课件,Linux中软件安装的方式...

    很多初学者感觉云计算就是一个听起来比较高大上的名词,每次想要了解它的时候都像是雾里看花,迷迷糊糊看不真切,至于它是干什么的就更不了解了,其实云计算学起来在IT行业中还是比较容易上手的,接下来我给大家分 ...

  3. _云计算学习路线图素材课件,Linux中软件安装的方式

    很多初学者感觉云计算就是一个听起来比较高大上的名词,每次想要了解它的时候都像是雾里看花,迷迷糊糊看不真切,至于它是干什么的就更不了解了,其实云计算学起来在IT行业中还是比较容易上手的,接下来我给大家分 ...

  4. Linux中软件的安装,vim编辑器

    文章目录 Linux中软件的安装,vim编辑器 Linux中软件的安装 vim编辑器 在线安装vim编辑器 vim的使用 vim的命令 Linux中软件的安装,vim编辑器 Linux中软件的安装 L ...

  5. Tms320F28335中软件触发信号采样(ADC)

    //该程序用于信号ADC,其中,采用定时器0中断读取采样结果  // //该程序ADC触发源为软件触发(S/w),然后,通过AdcRegs.ADCST.bit.INT_SEQ1标志位为1判断转换结果 ...

  6. Linux 笔记 - 第九章 Linux 中软件的安装

    博客地址:http://www.moonxy.com 一.前言 在 Linux 系统中,应用程序的软件包主要分为两种: 1)第一种是二进制的可执行软件包,也就是解开包后就可以直接运行.在 Window ...

  7. Linux中软件自启动三种方式

    一.介绍 Linux环境中软件自启动的三种方式,测试环境为Centos7.三种方式为: 1.systemd服务 2.使用 /etc/rc.d/rc.local 3.使用crontab定时计划中的@re ...

  8. Linux中软件的安装方式

    Linux系统中软件的主要安装方式 [方式一]下载编译好的压缩包 这种安装方式与Windows下的.exe可执行安装文件类似,压缩包内一般是编译好的可执行二进制文件,直接解压.配置软件的相关文件即可使 ...

  9. Linux中软件管理的yum命令

    yum命令 注意:yum命令的使用必须是在yum源搭建成功后才能正常运行. yum clean all 清除原有yum缓存 yum repolist 列出仓库信息 yum install softwa ...

最新文章

  1. Zoom 袁征码农逆袭:8 次申请美国签证被拒,独闯硅谷成亿万富翁
  2. oracle 修索引改空间_记一次Oracle分区表全局索引重修的历程
  3. Linux运维常用命令总结
  4. Flume学习笔记(二)问题整理
  5. 一码阻塞,万码等待:ASP.NET Core 同步方法调用异步方法“死锁”的真相
  6. 粘贴复制Android复制和粘贴的实现
  7. typescript语法高亮插件_vscode常用插件
  8. 如何使用be动词来确认请求_12
  9. 在libvirt中使用SanLock
  10. 3DSmax里的nurms toggle命令中文版是什么意思
  11. unity NGUI下载 支持unity高版本
  12. 教你如何用PQ魔法师调整硬盘分区大小【图解教程】
  13. android直播录像,安卓手机怎么录制直播视频
  14. 利用Vant完成登录页面!
  15. signal(SIGCHLD, SIG_IGN)和signal(SIGPIPE, SIG_IGN);
  16. Pytorch min函数详解
  17. git pull 时一直卡在Unpacking objects【待解决】
  18. 三台机器互相免密登录
  19. Pytorch的model.train() model.eval() torch.no_grad() 为什么测试的时候不调用loss.backward()计算梯度还要关闭梯度
  20. iOS 开发资源汇总 肯定有你想要的资源(Continuously updated)

热门文章

  1. java开心餐厅_菜鸟操作—HTML5制作开心餐厅页面
  2. java 图片拼接_Java分割拼接图片
  3. html图片如何摆在右侧,css里面,怎么让背景图片在最右边,且上下...
  4. 玩转Mysql系列 - 第10篇:常用的几十个函数详解
  5. 从零开始的嵌入式系统开发学习Day1(初识linux)
  6. 跨境电商账号关联指南:电商浏览器下载与使用,电商浏览器防关联
  7. vue实现打字机动画
  8. 【医学影像】超声(UltraSound)影像与 CT/MRI 多模态融合配准
  9. 链路聚合channel
  10. 最近收到最多的5个抖音问题,10个人有9人都会出现的,我总结了解决办法!