2016-11-04 5 views
0

나는 태스크 릿은 다음과 같이 일정 인터럽트 핸들러 (의사 코드)를 가지고 - 커널이 다음 인쇄 후 중단하는 것이 관찰된다왜 인터럽트 핸들러에서 예약 된 태스크 릿이 아닌 실행

struct tasklet_struct mytasklet; 

void my_tasklet_function(unsigned long arg1) { 
    ... 
    pr_alert("Inside tasklet function\n"); 
    ... 
} 

int my_probe() { 
    .... 
    .... 
    tasklet_init(&mytasklet, my_tasklet_function, arg1); 
    .... 
    /* Register interrupt handler my_irq_handler*/ 
    .... 
} 

irqreturn_t my_irq_handler(int irq, void *data) { 
    ... 
    status = read_reg(base_addr, intr_status_reg_offset) 
    write_reg(base_addr, intr_status_reg_offset, status); 

    if (status & INTR_MASK_1) { 
     .... 
     pr_alert("intr 1 came\n"); 
    } 
    ... 
    ... 
    pr_alert("Schedule tasklet\n"); 
    tasklet_schedule(&mytasklet); 
    pr_alert("Exit irq\n"); 

    return IRQ_HANDLED; 
} 

intr 1 came 
Schedule tasklet 

"exit irq"인쇄가 절대로 표시되지 않습니다. 작업 표 기능의 인쇄물이 인쇄되지 않습니다.

  • 이 태스크 릿을 예약하지 않은 이유는 무엇입니까?

  • 커널이 멈출 수있는 원인은 무엇입니까?

+0

'mytasklet' 객체가 초기화 (정의) 된 방법을 보여줍니다. – Tsyvarev

+0

mytasklet 초기화를 표시하도록 코드가 업데이트되었습니다 –

+0

tasklet이 초기화 된 후에 인터럽트 핸들러가 호출되는지 확인하십시오? (즉,'my_probe()'함수가 호출 된 후에 irq 핸들러 *를 등록하거나, 그 함수에서 *'tasklet_init' 후에 *를 등록하십시오.) – Tsyvarev

답변

0

작업 분류는 IRQ 처리기에서 수행하지 않아야합니다. lxr에서 schedule_tasklet() 코드를 확인할 수 있습니다. IRQ 처리기에서 schedule_tasklet() 호출은 softirq에 대한 비트 만 설정하고 작업 표를 연결합니다.

irq_exit()가 호출되면 인터럽트 컨텍스트 (중첩 된 인터럽트)에 있는지 여부를 확인합니다. 그렇지 않고 taskletlet이 활성화되어 있으면 softirq 핸들러를 호출하고 tasklet을 호출합니다.