# 作業系統工程-Interrupt
## Table Of Content
###### tags: `作業系統工程 Operating System Programming note`, `110-1`, `2021`
[TOC]
---
# RT-Thread 中斷管理 function

# RT-Thread include .h file
## Interrupt handler definition
```c=
typedef void (*rt_isr_handler_t)(int vector, void *param);
struct rt_irq_desc
{
rt_isr_handler_t handler;
void *param;
#ifdef RT_USING_INTERRUPT_INFO
char name[RT_NAME_MAX];
rt_uint32_t counter;
#endif
};
```
## Interrupt interfaces
```c=
void rt_hw_interrupt_init(void);
void rt_hw_interrupt_mask(int vector);
void rt_hw_interrupt_umask(int vector);
rt_isr_handler_t rt_hw_interrupt_install(int vector, rt_isr_handler_t handler, void *param, const char *name);
```
- # :star: 以 ARM Cortex-a 介紹相關 function 內的 Coding
# Interrupt .h file
```c=#ifndef __INTERRUPT_H__
#define __INTERRUPT_H__
#include <rthw.h>
#include <board.h>
#define INT_IRQ 0x00
#define INT_FIQ 0x01
void rt_hw_vector_init(void);
void rt_hw_interrupt_control(int vector, int priority, int route);
void rt_hw_interrupt_init(void);
void rt_hw_interrupt_mask(int vector);
void rt_hw_interrupt_umask(int vector);
int rt_hw_interrupt_get_irq(void);
void rt_hw_interrupt_ack(int vector);
rt_isr_handler_t rt_hw_interrupt_install(int vector, rt_isr_handler_t handler,
void *param, const char *name);
#endif
```
# 稍微參考其中幾個 function 的寫法
## void rt_hw_interrupt_init();
- 初始化
1. 中斷向量表
```c=
void rt_hw_vector_init(void)
{
rt_cpu_vector_set_base((unsigned int)&system_vectors);
}
```
2. 例外處理表
```c=
struct rt_irq_desc isr_table[MAX_HANDLERS];
void rt_hw_interrupt_init(void)
{
rt_uint32_t gic_cpu_base;
rt_uint32_t gic_dist_base;
rt_uint32_t gic_irq_start;
rt_hw_vector_init();/* 1. initialize vector table */
rt_memset(isr_table, 0x00, sizeof(isr_table));/* 2. initialize exceptions table */
/* initialize ARM GIC */
gic_dist_base = platform_get_gic_dist_base();
gic_cpu_base = platform_get_gic_cpu_base();
gic_irq_start = GIC_IRQ_START;
arm_gic_dist_init(0, gic_dist_base, gic_irq_start);
arm_gic_cpu_init(0, gic_cpu_base);
}
```
## void rt_hw_interrupt_mask();
```c=
void rt_hw_interrupt_mask(int vector)
{
arm_gic_mask(0, vector);
}
```
- ### Cortex-a 中 gic.c 的實作方式
```c=
#define GIC_DIST_ENABLE_CLEAR(hw_base, n) __REG32((hw_base) + 0x180 + ((n)/32) * 4)
void arm_gic_mask(rt_uint32_t index, int irq)
{
rt_uint32_t mask = 1 << (irq % 32);
RT_ASSERT(index < ARM_GIC_MAX_NR);
irq = irq - _gic_table[index].offset;
RT_ASSERT(irq >= 0);
GIC_DIST_ENABLE_CLEAR(_gic_table[index].dist_hw_base, irq) = mask;
// 差別在這行!
}
```
## void rt_hw_interrupt_umask();
```c=
void rt_hw_interrupt_umask(int vector)
{
arm_gic_umask(0, vector);
}
```
- ### Cortex-a 中 gic.c 的實作方式
```c=
#define GIC_DIST_ENABLE_SET(hw_base, n) __REG32((hw_base) + 0x100 + ((n)/32) * 4)
void arm_gic_umask(rt_uint32_t index, int irq)
{
rt_uint32_t mask = 1 << (irq % 32);
RT_ASSERT(index < ARM_GIC_MAX_NR);
irq = irq - _gic_table[index].offset;
RT_ASSERT(irq >= 0);
GIC_DIST_ENABLE_SET(_gic_table[index].dist_hw_base, irq) = mask;
// 差別在這行!
}
```
## rt_isr_handler_t rt_hw_interrupt_install();
```c=
rt_isr_handler_t rt_hw_interrupt_install(int vector, rt_isr_handler_t handler,
void *param, const char *name)
{
rt_isr_handler_t old_handler = RT_NULL;
if (vector < MAX_HANDLERS)
{
old_handler = isr_table[vector].handler;
if (handler != RT_NULL)
{
#ifdef RT_USING_INTERRUPT_INFO
rt_strncpy(isr_table[vector].name, name, RT_NAME_MAX);
#endif /* RT_USING_INTERRUPT_INFO */
isr_table[vector].handler = handler;
isr_table[vector].param = param;
}
}
return old_handler;
}
```