ARM Linux 如何--注册和触发--软中断

简介: 1. 注册软中断当然是通过open_softirq 例子如下: [cpp] view plain copy   void __init init_timers(void)   {       int err = timer_cpu_notify(&timers_nb,...

1. 注册软中断当然是通过open_softirq

例子如下:

[cpp]  view plain  copy
 
  1. void __init init_timers(void)  
  2. {  
  3.     int err = timer_cpu_notify(&timers_nb, (unsigned long)CPU_UP_PREPARE,  
  4.                 (void *)(long)smp_processor_id());  
  5.   
  6.     init_timer_stats();  
  7.   
  8.     BUG_ON(err == NOTIFY_BAD);  
  9.     register_cpu_notifier(&timers_nb);  
  10.     open_softirq(TIMER_SOFTIRQ, run_timer_softirq);  
  11. }  
  12.   
  13. void open_softirq(int nr, void (*action)(struct softirq_action *))  
  14. {  
  15.     softirq_vec[nr].action = action;  
  16. }  

软中断TIMER_SOFTIRQ的中断处理函数为:run_timer_softirq

之所以成为softirq,是因为这些中断是由硬件中断来间接触发的,如何间接触发的呢:
硬件中断处理函数-->对软中断的相应位置位-->唤醒ksoftirqd线程-->执行软中断的中断处理函数

 

2. 硬件中断如何通过置位唤醒ksoftirqd线程

timer interrupt handler->
timer_tick->
update_process_times->
run_local_timers->
hrtimer_run_queues()和raise_softirq(TIMER_SOFTIRQ)->
raise_softirq_irqoff->
__raise_softirq_irqoff { or_softirq_pending(1UL << (nr)); }
即(local_softirq_pending() |= (x))

 

3. 如何执行软中断的action<中断处理函数>

对于TIMER_SOFTIRQ来说,每次system clock产生中断时,即一个tick 到来时,在system clock的中断处理函数中会调用run_local_timers来设置TIMER_SOFTIRQ触发条件;也就是当前CPU对应的irq_cpustat_t结构体中的__softirq_pending成员的第TIMER_SOFTIRQ个BIT被置为1。 而当这个条件满足时,ksoftirqd线程(入口函数run_ksoftirqd,cpu_callback:kthread_create(run_ksoftirqd, hcpu, "ksoftirqd/%d", hotcpu);)会被唤醒,然后按照下面的流程调用TIMER_SOFTIRQ在数组softirq_vec中注册的action,即run_timer_softirq。
run_ksoftirqd--->do_softirq--->__do_softirq--->softirq_vec[TIMER_SOFTIRQ].action


 

[cpp]  view plain  copy
 
  1. static int run_ksoftirqd(void * __bind_cpu)  
  2. {  
  3.     set_current_state(TASK_INTERRUPTIBLE);  
  4.   
  5.     while (!kthread_should_stop()) {  
  6.         preempt_disable();  
  7.         if (!local_softirq_pending()) {  
  8.             preempt_enable_no_resched();  
  9.             schedule();  
  10.             preempt_disable();  
  11.         }  
  12.   
  13.         __set_current_state(TASK_RUNNING);  
  14.   
  15.         while (local_softirq_pending()) {  
  16.             /* Preempt disable stops cpu going offline. 
  17.                If already offline, we'll be on wrong CPU: 
  18.                don't process */  
  19.             if (cpu_is_offline((long)__bind_cpu))  
  20.                 goto wait_to_die;  
  21.             do_softirq();  
  22.             preempt_enable_no_resched();  
  23.             cond_resched();  
  24.             preempt_disable();  
  25.             rcu_sched_qs((long)__bind_cpu);  
  26.         }  
  27.         preempt_enable();  
  28.         set_current_state(TASK_INTERRUPTIBLE);  
  29.     }  
  30.     __set_current_state(TASK_RUNNING);  
  31.     return 0;  
  32.   
  33. wait_to_die:  
  34.     preempt_enable();  
  35.     /* Wait for kthread_stop */  
  36.     set_current_state(TASK_INTERRUPTIBLE);  
  37.     while (!kthread_should_stop()) {  
  38.         schedule();  
  39.         set_current_state(TASK_INTERRUPTIBLE);  
  40.     }  
  41.     __set_current_state(TASK_RUNNING);  
  42.     return 0;  
  43. }  


 

 

目录
相关文章
|
8天前
|
Linux
Linux(1)arm64根目录扩容
Linux(1)arm64根目录扩容
12 0
|
1月前
|
传感器 数据采集 存储
ARM Linux摄像头传感器数据处理全景视野:从板端编码视频到高级应用(一)
ARM Linux摄像头传感器数据处理全景视野:从板端编码视频到高级应用
77 0
|
1月前
|
Linux
linux系统中常见注册函数的使用方法
linux系统中常见注册函数的使用方法
30 1
|
2月前
|
Java Linux Shell
linux自动部署jar包,注册系统服务(基于Centos7)
linux自动部署jar包,注册系统服务(基于Centos7)
95 0
|
1月前
|
传感器 Linux 数据处理
ARM Linux摄像头传感器数据处理全景视野:从板端编码视频到高级应用(二)
ARM Linux摄像头传感器数据处理全景视野:从板端编码视频到高级应用
47 1
|
8天前
|
Ubuntu Linux 数据安全/隐私保护
Linux(7)Ubuntu20.04 arm64安装Docker
Linux(7)Ubuntu20.04 arm64安装Docker
30 0
|
22天前
|
Linux 计算机视觉
Linux交叉编译opencv并移植ARM端
通过以上步骤,你可以在Linux上交叉编译OpenCV,并将生成的库文件和头文件移植到ARM平台上,从而在ARM上使用OpenCV。 买CN2云服务器,免备案服务器,高防服务器,就选蓝易云。百度搜索:蓝易云
45 0
|
27天前
|
JSON Ubuntu Linux
LuaJit交叉编译移植到ARM Linux
LuaJit交叉编译移植到ARM Linux
20 1
|
1月前
|
传感器 存储 编解码
ARM Linux摄像头传感器数据处理全景视野:从板端编码视频到高级应用(三)
ARM Linux摄像头传感器数据处理全景视野:从板端编码视频到高级应用
54 2
|
5月前
|
Linux 异构计算
HMI-66-【MeterDisplay for Arm Linux】液晶仪表Arm Linxu迁移
先说结论,虽然移植成功,但是显示效果不理想,可以直接看和面的视频。先说说做了什么吧。
HMI-66-【MeterDisplay for Arm Linux】液晶仪表Arm Linxu迁移