轉自:https://blog.csdn.net/qq_23274715/article/details/103524515java
軟件觸發中斷SGI的使用
什麼是SGI
SGI:軟件觸發中斷(Software Generated Interrupt)。在arm處理器中,SGI共有16個,硬件中斷號分別爲ID0~ID15。它一般用於多核間通信。SGI在Linux內核中一般被用做IPI中斷(inter-processor interrupts).
在linux內核中,已經定義了以下的IPI中斷,因此用戶使用自定義的IPI中斷時,建議使用8~15這些未用的中斷。
linux
//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);
}
url
/* 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);
}
...
}
.net
/* 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];
blog
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
微信公衆號:嵌入式的平常
若是上面的文章對你有用,歡迎打賞、點贊、評論。
ip
點贊 2
————————————————
版權聲明:本文爲CSDN博主「theboynoName」的原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處連接及本聲明。
原文連接:https://blog.csdn.net/qq_23274715/java/article/details/103524515
get