1# 开发指导<a name="ZH-CN_TOPIC_0000001079036458"></a> 2 3- [接口说明](#section158501652121514) 4- [开发流程](#section11841123033618) 5- [编程实例](#section460018317164) 6 - [结果验证](#section1048572415182) 7 8 9当产生中断请求时,CPU暂停当前的任务,转而去响应外设请求。用户可以根据需要注册对应的中断处理程序,指定CPU响应中断请求时所执行的具体操作。 10 11## 接口说明<a name="section158501652121514"></a> 12 13OpenHarmony LiteOS-M内核的中断模块提供下面几种功能,接口详细信息可以查看API参考。 14 15**表 1** 中断模块接口 16 17<a name="table1415203765610"></a> 18<table><thead align="left"><tr id="row134151837125611"><th class="cellrowborder" valign="top" width="12.85128512851285%" id="mcps1.2.4.1.1"><p id="p16415637105612"><a name="p16415637105612"></a><a name="p16415637105612"></a>功能分类</p> 19</th> 20<th class="cellrowborder" valign="top" width="29.8029802980298%" id="mcps1.2.4.1.2"><p id="p11415163718562"><a name="p11415163718562"></a><a name="p11415163718562"></a>接口名</p> 21</th> 22<th class="cellrowborder" valign="top" width="57.34573457345735%" id="mcps1.2.4.1.3"><p id="p1641533755612"><a name="p1641533755612"></a><a name="p1641533755612"></a>描述</p> 23</th> 24</tr> 25</thead> 26<tbody><tr id="row0415737175610"><td class="cellrowborder" rowspan="2" valign="top" width="12.85128512851285%" headers="mcps1.2.4.1.1 "><p id="p4917132105710"><a name="p4917132105710"></a><a name="p4917132105710"></a>创建、删除中断</p> 27</td> 28<td class="cellrowborder" valign="top" width="29.8029802980298%" headers="mcps1.2.4.1.2 "><p id="p341513372561"><a name="p341513372561"></a><a name="p341513372561"></a>HalHwiCreate</p> 29</td> 30<td class="cellrowborder" valign="top" width="57.34573457345735%" headers="mcps1.2.4.1.3 "><p id="p74151037185617"><a name="p74151037185617"></a><a name="p74151037185617"></a>中断创建,注册中断号、中断触发模式、中断优先级、中断处理程序。中断被触发时,会调用该中断处理程序。</p> 31</td> 32</tr> 33<tr id="row1841519376561"><td class="cellrowborder" valign="top" headers="mcps1.2.4.1.1 "><p id="p64151837155618"><a name="p64151837155618"></a><a name="p64151837155618"></a>HalHwiDelete</p> 34</td> 35<td class="cellrowborder" valign="top" headers="mcps1.2.4.1.2 "><p id="p441516379562"><a name="p441516379562"></a><a name="p441516379562"></a>根据指定的中断号,删除中断。</p> 36</td> 37</tr> 38<tr id="row1141513373562"><td class="cellrowborder" rowspan="3" valign="top" width="12.85128512851285%" headers="mcps1.2.4.1.1 "><p id="p956643365710"><a name="p956643365710"></a><a name="p956643365710"></a>打开、关闭中断</p> 39</td> 40<td class="cellrowborder" valign="top" width="29.8029802980298%" headers="mcps1.2.4.1.2 "><p id="p17765212416"><a name="p17765212416"></a><a name="p17765212416"></a>LOS_IntUnLock</p> 41</td> 42<td class="cellrowborder" valign="top" width="57.34573457345735%" headers="mcps1.2.4.1.3 "><p id="p1972971913115"><a name="p1972971913115"></a><a name="p1972971913115"></a>开中断,使能当前处理器所有中断响应。</p> 43</td> 44</tr> 45<tr id="row1541513745611"><td class="cellrowborder" valign="top" headers="mcps1.2.4.1.1 "><p id="p1332013246116"><a name="p1332013246116"></a><a name="p1332013246116"></a>LOS_IntLock</p> 46</td> 47<td class="cellrowborder" valign="top" headers="mcps1.2.4.1.2 "><p id="p1692710331219"><a name="p1692710331219"></a><a name="p1692710331219"></a>关中断,关闭当前处理器所有中断响应。</p> 48</td> 49</tr> 50<tr id="row14167379561"><td class="cellrowborder" valign="top" headers="mcps1.2.4.1.1 "><p id="p1438619410117"><a name="p1438619410117"></a><a name="p1438619410117"></a>LOS_IntRestore</p> 51</td> 52<td class="cellrowborder" valign="top" headers="mcps1.2.4.1.2 "><p id="p254691522"><a name="p254691522"></a><a name="p254691522"></a>恢复到使用LOS_IntLock、LOS_IntUnLock操作之前的中断状态。</p> 53</td> 54</tr> 55</tbody> 56</table> 57 58## 开发流程<a name="section11841123033618"></a> 59 601. 调用中断创建接口HalHwiCreate创建中断。 612. 调用TestHwiTrigger接口触发指定中断(该接口在测试套中定义,通过写中断控制器的相关寄存器模拟外部中断,一般的外设设备,不需要执行这一步)。 623. 调用HalHwiDelete接口删除指定中断,此接口根据实际情况使用,判断是否需要删除中断。 63 64> **说明:** 65>- 根据具体硬件,配置支持的最大中断数及可设置的中断优先级个数。 66>- 中断处理程序耗时不能过长,否则会影响CPU对中断的及时响应。 67>- 中断响应过程中不能直接、间接执行引起调度的LOS\_Schedule等函数。 68>- 中断恢复LOS\_IntRestore\(\)的入参必须是与之对应的LOS\_IntLock\(\)的返回值(即关中断之前的CPSR值)。Cortex-M系列处理器中0-15中断为内部使用,因此不建议用户去申请和创建。 69 70## 编程实例<a name="section460018317164"></a> 71 72本实例实现如下功能: 73 741. 创建中断。 752. 触发中断。 763. 删除中断。 77 78代码实现如下,演示如何创建中断和删除中断,当指定的中断号HWI\_NUM\_TEST产生中断时,会调用中断处理函数: 79 80``` 81#include "los_interrupt.h" 82 83/*创建中断*/ 84#define HWI_NUM_TEST 7 85 86STATIC VOID HwiUsrIrq(VOID) 87{ 88 printf("in the func HwiUsrIrq \n"); 89} 90 91static UINT32 Example_Interrupt(VOID) 92{ 93 UINT32 ret; 94 HWI_PRIOR_T hwiPrio = 3; 95 HWI_MODE_T mode = 0; 96 HWI_ARG_T arg = 0; 97 98 /*创建中断*/ 99 ret = HalHwiCreate(HWI_NUM_TEST, hwiPrio, mode, (HWI_PROC_FUNC)HwiUsrIrq, arg); 100 if(ret == LOS_OK){ 101 printf("Hwi create success!\n"); 102 } else { 103 printf("Hwi create failed!\n"); 104 return LOS_NOK; 105 } 106 107 /* 延时50个Ticks, 当有硬件中断发生时,会调用函数HwiUsrIrq*/ 108 LOS_TaskDelay(50); 109 110 /*删除中断*/ 111 ret = HalHwiDelete(HWI_NUM_TEST); 112 if(ret == LOS_OK){ 113 printf("Hwi delete success!\n"); 114 } else { 115 printf("Hwi delete failed!\n"); 116 return LOS_NOK; 117 } 118 return LOS_OK; 119} 120``` 121 122### 结果验证<a name="section1048572415182"></a> 123 124编译运行得到的结果为: 125 126``` 127Hwi create success! 128Hwi delete success!. 129``` 130 131