• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1# 中断管理
2
3
4## 基本概念
5
6在程序运行过程中,出现需要由CPU立即处理的事务时,CPU暂时中止当前程序的执行转而处理这个事务,这个过程叫做中断。当硬件产生中断时,通过中断号查找到其对应的中断处理程序,执行中断处理程序完成中断处理。
7
8通过中断机制,在外设不需要CPU介入时,CPU可以执行其它任务;当外设需要CPU时,CPU会中断当前任务来响应中断请求。这样可以使CPU避免把大量时间耗费在等待、查询外设状态的操作上,有效提高系统实时性及执行效率。
9
10下面介绍下中断的相关概念:
11
12- 中断号:
13  中断请求信号特定的标志,计算机能够根据中断号判断是哪个设备提出的中断请求。
14
15- 中断请求:
16  “紧急事件”向CPU提出申请(发一个电脉冲信号),请求中断,需要CPU暂停当前执行的任务处理该“紧急事件”,这一过程称为中断请求。
17
18- 中断优先级:
19  为使系统能够及时响应并处理所有中断,系统根据中断事件的重要性和紧迫程度,将中断源分为若干个级别,称作中断优先级。
20
21- 中断处理程序:
22  当外设发出中断请求后,CPU暂停当前的任务,转而响应中断请求,即执行中断处理程序。产生中断的每个设备都有相应的中断处理程序。
23
24- 中断触发:
25  中断源向中断控制器发送中断信号,中断控制器对中断进行仲裁,确定优先级,将中断信号发送给CPU。中断源产生中断信号的时候,会将中断触发器置“1”,表明该中断源产生了中断,要求CPU去响应该中断。
26
27- 中断向量:
28  中断服务程序的入口地址。
29
30- 中断向量表:
31  存储中断向量的存储区,中断向量与中断号对应,中断向量在中断向量表中按照中断号顺序存储。
32
33
34## 接口说明
35
36OpenHarmony LiteOS-M内核的中断模块提供下面几种功能,接口详细信息可以查看API参考。
37
38  **表1** 创建、删除中断
39
40| 接口名 | 描述 |
41| -------- | -------- |
42| LOS_HwiCreate | 中断创建,注册中断号、中断触发模式、中断优先级、中断处理程序。中断被触发时,会调用该中断处理程序。 |
43| LOS_HwiDelete | 根据指定的中断号,删除中断。 |
44
45  **表2** 打开、关闭中断
46
47| 接口名 | 描述 |
48| -------- | -------- |
49| LOS_IntUnLock | 开中断,使能当前处理器所有中断响应。 |
50| LOS_IntLock | 关中断,关闭当前处理器所有中断响应。 |
51| LOS_IntRestore | 恢复到使用LOS_IntLock、LOS_IntUnLock操作之前的中断状态。 |
52
53  **表3** 其他中断操作
54
55| 接口名             | 描述             |
56| :----------------- | ---------------- |
57| LOS_HwiTrigger     | 中断触发。       |
58| LOS_HwiEnable      | 中断使能。       |
59| LOS_HwiDisable     | 中断禁用。       |
60| LOS_HwiClear       | 中断手动清除。   |
61| LOS_HwiSetPriority | 设置中断优先级。 |
62| LOS_HwiCurIrqNum   | 获取当前中断号。 |
63
64
65## 开发流程
66
671. 调用中断创建接口LOS_HwiCreate创建中断。
68
692. 调用LOS_HwiTrigger接口触发指定中断(写中断控制器的相关寄存器模拟外部中断),或通过外设触发中断。
70
713. 调用LOS_HwiDelete接口删除指定中断,此接口根据实际情况使用,开发者判断是否需要删除中断。
72
73
74> ![icon-note.gif](public_sys-resources/icon-note.gif) **说明:**
75> - 根据具体硬件,配置支持的最大中断数及可设置的中断优先级个数。
76> - 关中断时间或中断处理程序耗时不能过长,否则会影响CPU对中断的及时响应。
77> - 中断响应过程中不能直接、间接执行引起调度的LOS_Schedule等函数。
78> - 中断恢复LOS_IntRestore()的入参必须是与之对应的LOS_IntLock()的返回值(即关中断之前的CPSR值)。
79> - Cortex-M系列处理器中0-15中断为内部使用,因此不建议用户去申请和创建。
80
81
82## 编程实例
83
84本实例实现如下功能:
85
861. 创建中断。
87
882. 触发中断。
89
903. 删除中断。
91
92代码实现如下,演示如何创建中断、触发指定的中断号进而调用中断处理函数、删除中断。
93
94本演示代码在 ./kernel/liteos_m/testsuites/src/osTest.c 中编译验证,在TestTaskEntry中调用验证入口函数ExampleInterrupt。
95
96
97```
98#include "los_interrupt.h"
99#include "los_compiler.h"
100
101/* 验证的中断号 */
102#define HWI_NUM_TEST 7
103
104/* 中断处理程序 */
105STATIC VOID UsrIrqEntry(VOID)
106{
107    printf("in the func UsrIrqEntry\n");
108}
109
110/* 注册的线程回调函数,用于触发中断 */
111STATIC VOID InterruptTest(VOID)
112{
113    LOS_HwiTrigger(HWI_NUM_TEST);
114}
115
116UINT32 ExampleInterrupt(VOID)
117{
118    UINT32 ret;
119    HWI_PRIOR_T hwiPrio = 3; // 3,中断优先级
120    HWI_MODE_T mode = 0;
121    HWI_ARG_T arg = 0;
122
123    /* 创建中断 */
124    ret = LOS_HwiCreate(HWI_NUM_TEST, hwiPrio, mode, (HWI_PROC_FUNC)UsrIrqEntry, arg);
125    if(ret == LOS_OK){
126        printf("Hwi create success!\n");
127    } else {
128        printf("Hwi create failed!\n");
129        return LOS_NOK;
130    }
131
132    TSK_INIT_PARAM_S taskParam = { 0 };
133    UINT32 testTaskID;
134
135	/* 创建一个优先级低优先级的线程,用于验证触发中断 */
136    taskParam.pfnTaskEntry = (TSK_ENTRY_FUNC)InterruptTest;
137    taskParam.uwStackSize = OS_TSK_TEST_STACK_SIZE;
138    taskParam.pcName = "InterruptTest";
139    taskParam.usTaskPrio = TASK_PRIO_TEST - 1;
140    taskParam.uwResved = LOS_TASK_ATTR_JOINABLE;
141    ret = LOS_TaskCreate(&testTaskID, &taskParam);
142    if (LOS_OK != ret) {
143        PRINTF("InterruptTest task error\n");
144    }
145
146    /* 延时50 tick,让出当前线程的调度 */
147    LOS_TaskDelay(50);
148
149    /* 删除注册的中断 */
150    ret = LOS_HwiDelete(HWI_NUM_TEST, NULL);
151    if(ret == LOS_OK){
152        printf("Hwi delete success!\n");
153    } else {
154        printf("Hwi delete failed!\n");
155        return LOS_NOK;
156    }
157
158    return LOS_OK;
159}
160```
161
162
163## 结果验证
164
165编译运行得到的结果为:
166
167
168
169```
170Hwi create success!
171in the func UsrIrqEntry
172Hwi delete success!
173```
174