更新日期: 2022/06/01 来源: https://gitee.com/weharmony/kernel_liteos_a_note
los_hwi.c
浏览该文件的文档.
1/*!
2 * @file los_hwi.c
3 * @brief 硬中断主文件
4 * @link
5 * @verbatim
6 基本概念
7 中断是指出现需要时,CPU暂停执行当前程序,转而执行新程序的过程。即在程序运行过程中,
8 出现了一个必须由CPU立即处理的事务。此时,CPU暂时中止当前程序的执行转而处理这个事务,
9 这个过程就叫做中断。通过中断机制,可以使CPU避免把大量时间耗费在等待、查询外设状态的操作上,
10 大大提高系统实时性以及执行效率。
11
12 异常处理是操作系统对运行期间发生的异常情况(芯片硬件异常)进行处理的一系列动作,
13 例如虚拟内存缺页异常、打印异常发生时函数的调用栈信息、CPU现场信息、任务的堆栈情况等。
14
15 外设可以在没有CPU介入的情况下完成一定的工作,但某些情况下也需要CPU为其执行一定的工作。
16 通过中断机制,在外设不需要CPU介入时,CPU可以执行其它任务,而当外设需要CPU时,产生一个中断信号,
17 该信号连接至中断控制器。中断控制器是一方面接收其它外设中断引脚的输入,另一方面它会发出中断信号给CPU。
18 可以通过对中断控制器编程来打开和关闭中断源、设置中断源的优先级和触发方式。
19 常用的中断控制器有VIC(Vector Interrupt Controller)和GIC(General Interrupt Controller)。
20 在ARM Cortex-A7中使用的中断控制器是GIC。CPU收到中断控制器发送的中断信号后,中断当前任务来响应中断请求。
21
22 异常处理就是可以打断CPU正常运行流程的一些事情,如未定义指令异常、试图修改只读的数据异常、不对齐的地址访问异常等。
23 当异常发生时,CPU暂停当前的程序,先处理异常事件,然后再继续执行被异常打断的程序。
24
25 中断特性:
26 中断共享,且可配置。
27 中断嵌套,即高优先级的中断可抢占低优先级的中断,且可配置。
28 使用独立中断栈,可配置。
29 可配置支持的中断优先级个数。
30 可配置支持的中断数。
31
32 中断相关的硬件介绍
33 与中断相关的硬件可以划分为三类:设备、中断控制器、CPU本身。
34 设备
35 发起中断的源,当设备需要请求CPU时,产生一个中断信号,该信号连接至中断控制器。
36 中断控制器
37 中断控制器是CPU众多外设中的一个,它一方面接收其它外设中断引脚的输入,另一方面,
38 它会发出中断信号给CPU。可以通过对中断控制器编程来打开和关闭中断源、设置中断源
39 的优先级和触发方式。常用的中断控制器有VIC(Vector Interrupt Controller)和
40 GIC(General Interrupt Controller)。在ARM Cortex-M系列中使用的中断控制器是
41 NVIC(Nested Vector Interrupt Controller)。在ARM Cortex-A7中使用的中断控制器是GIC。
42 CPU
43 CPU会响应中断源的请求,中断当前正在执行的任务,转而执行中断处理程序。
44 中断相关概念
45 中断号
46 每个中断请求信号都会有特定的标志,使得计算机能够判断是哪个设备提出的中断请求,这个标志就是中断号。
47 中断请求
48 “紧急事件”需向CPU提出申请(发一个电脉冲信号),要求中断,及要求CPU暂停当前执行的任务,
49 转而处理该“紧急事件”,这一申请过程称为中断请求。
50 中断优先级
51 为使系统能够及时响应并处理所有中断,系统根据中断时间的重要性和紧迫程度,将中断源分为若干个级别,
52 称作中断优先级。
53 中断处理程序
54 当外设产生中断请求后,CPU暂停当前的任务,转而响应中断申请,即执行中断处理程序。产生中断的每个设备
55 都有相应的中断处理程序。
56 中断嵌套
57 中断嵌套也称为中断抢占,指的是正在执行一个中断处理程序时,如果有另一个优先级更高的中断源提出中断请求,
58 这时会暂时终止当前正在执行的优先级较低的中断源的中断处理程序,转而去处理更高优先级的中断请求,待处理完毕,
59 再返回到之前被中断的处理程序中继续执行。
60 中断触发
61 中断源向中断控制器发送中断信号,中断控制器对中断进行仲裁,确定优先级,将中断信号送给CPU。
62 中断源产生中断信号的时候,会将中断触发器置“1”,表明该中断源产生了中断,要求CPU去响应该中断。
63 中断触发类型
64 外部中断申请通过一个物理信号发送到NVIC/GIC,可以是电平触发或边沿触发。
65 中断向量
66 中断服务程序的入口地址。
67 中断向量表
68 存储中断向量的存储区,中断向量与中断号对应,中断向量在中断向量表中按照中断号顺序存储。
69 中断共享
70 当外设较少时,可以实现一个外设对应一个中断号,但为了支持更多的硬件设备,可以让多个设备共享
71 一个中断号,共享同一个中断号的中断处理程序形成一个链表。当外部设备产生中断申请时,系统会
72 遍历执行中断号对应的中断处理程序链表直到找到对应设备的中断处理程序。在遍历执行过程中,
73 各中断处理程序可以通过检测设备ID,判断是否是这个中断处理程序对应的设备产生的中断。
74 核间中断
75 对于多核系统,中断控制器允许一个CPU的硬件线程去中断其他CPU的硬件线程,这种方式被称为核间中断。
76 核间中断的实现基础是多CPU内存共享,采用核间中断可以减少某个CPU负荷过大,有效提升系统效率。
77 目前只有GIC中断控制器支持。
78 使用场景
79 当有中断请求产生时,CPU暂停当前的任务,转而去响应外设请求。根据需要,用户通过
80 中断申请,注册中断处理程序,可以指定CPU响应中断请求时所执行的具体操作。
81 开发流程
82 调用中断创建接口LOS_HwiCreate创建中断。
83 如果是SMP模式,调用LOS_HwiSetAffinity设置中断的亲和性,否则直接进入步骤4。
84 调用LOS_HwiEnable接口使能指定中断。
85 调用LOS_HwiTrigger接口触发指定中断(该接口通过写中断控制器的相关寄存器模拟外部中断,一般的外设设备,不需要执行这一步)。
86 调用LOS_HwiDisable接口屏蔽指定中断,此接口根据实际情况使用,判断是否需要屏蔽中断。
87 调用LOS_HwiDelete接口删除指定中断,此接口根据实际情况使用,判断是否需要删除中断。
88 注意事项
89 根据具体硬件,配置支持的最大中断数及可设置的中断优先级个数。
90 中断共享机制,支持不同的设备使用相同的中断号注册同一中断处理程序,但中断处理程序的入参pDevId(设备号)
91 必须唯一,代表不同的设备。即同一中断号,同一dev只能挂载一次;但同一中断号,同一中断处理程序,dev不同则可以重复挂载。
92 中断处理程序耗时不能过长,否则会影响CPU对中断的及时响应。
93 中断响应过程中不能执行引起调度的函数。
94 中断恢复LOS_IntRestore()的入参必须是与之对应的LOS_IntLock()的返回值(即关中断之前的CPSR值)。
95 Cortex-M系列处理器中0-15中断为内部使用,Cortex-A7中0-31中断为内部使用,因此不建议用户去申请和创建。
96
97 以ARMv7-a架构为例,中断和异常处理的入口为中断向量表,中断向量表包含各个中断和异常处理的入口函数。
98 * @endverbatim
99 * @image html https://gitee.com/weharmonyos/resources/raw/master/44/vector.png
100 * @version
101 * @author weharmonyos.com | 鸿蒙研究站 | 每天死磕一点点
102 * @date 2021-11-16
103 *
104 * @history
105 *
106 */
107/*
108 * Copyright (c) 2013-2019 Huawei Technologies Co., Ltd. All rights reserved.
109 * Copyright (c) 2020-2021 Huawei Device Co., Ltd. All rights reserved.
110 *
111 * Redistribution and use in source and binary forms, with or without modification,
112 * are permitted provided that the following conditions are met:
113 *
114 * 1. Redistributions of source code must retain the above copyright notice, this list of
115 * conditions and the following disclaimer.
116 *
117 * 2. Redistributions in binary form must reproduce the above copyright notice, this list
118 * of conditions and the following disclaimer in the documentation and/or other materials
119 * provided with the distribution.
120 *
121 * 3. Neither the name of the copyright holder nor the names of its contributors may be used
122 * to endorse or promote products derived from this software without specific prior written
123 * permission.
124 *
125 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
126 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
127 * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
128 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
129 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
130 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
131 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
132 * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
133 * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
134 * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
135 * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
136 */
137
138#include "los_hwi.h"
139#include "los_memory.h"
140#include "los_spinlock.h"
141#ifdef LOSCFG_KERNEL_CPUP
142#include "los_cpup_pri.h"
143#endif
144#include "los_sched_pri.h"
145#include "los_hook.h"
146
147
148/* spinlock for hwi module, only available on SMP mode */
149LITE_OS_SEC_BSS SPIN_LOCK_INIT(g_hwiSpin); ///< 注意全局变量 g_hwiSpin 是在宏里面定义的
150#define HWI_LOCK(state) LOS_SpinLockSave(&g_hwiSpin, &(state))
151#define HWI_UNLOCK(state) LOS_SpinUnlockRestore(&g_hwiSpin, (state))
152
153size_t g_intCount[LOSCFG_KERNEL_CORE_NUM] = {0};///< 记录每个CPUcore的中断数量
154HwiHandleForm g_hwiForm[OS_HWI_MAX_NUM]; ///< 中断注册表 @note_why 用 form 来表示?有种写 HTML的感觉
155STATIC CHAR *g_hwiFormName[OS_HWI_MAX_NUM] = {0};///< 记录每个硬中断的名称
156STATIC UINT32 g_hwiFormCnt[LOSCFG_KERNEL_CORE_NUM][OS_HWI_MAX_NUM] = {0};
157
158/**
159 * @brief 获取某个中断的中断次数
160 *
161 * @param index
162 * @return UINT32
163 */
165{
166 return g_hwiFormCnt[cpuid][index];
167}
168
169CHAR *OsGetHwiFormName(UINT32 index)//获取某个中断的名称
170{
171 return g_hwiFormName[index];
172}
173/// 获取系统支持的最大中断数
175{
176 return OS_HWI_MAX_NUM;
177}
178typedef VOID (*HWI_PROC_FUNC0)(VOID);
179typedef VOID (*HWI_PROC_FUNC2)(INT32, VOID *);
180VOID OsInterrupt(UINT32 intNum)//中断实际处理函数
181{
182 HwiHandleForm *hwiForm = NULL;
183 UINT32 *intCnt = NULL;
184 UINT16 cpuid = ArchCurrCpuid();
185
186 /* Must keep the operation at the beginning of the interface */
187 intCnt = &g_intCount[cpuid];//当前CPU的中断总数量 ++
188 *intCnt = *intCnt + 1;//@note_why 这里没看明白为什么要 +1
189
190#ifdef LOSCFG_CPUP_INCLUDE_IRQ //开启查询系统CPU的占用率的中断
191 OsCpupIrqStart(cpuid);
192#endif
194 OsHookCall(LOS_HOOK_TYPE_ISR_ENTER, intNum);
195 hwiForm = (&g_hwiForm[intNum]);//获取对应中断的实体
196#ifndef LOSCFG_NO_SHARED_IRQ //如果没有定义不共享中断 ,意思就是如果是共享中断
197 while (hwiForm->pstNext != NULL) { //一直撸到最后
198 hwiForm = hwiForm->pstNext;//下一个继续撸
199#endif
200 if (hwiForm->uwParam) {//有参数的情况
201 HWI_PROC_FUNC2 func = (HWI_PROC_FUNC2)hwiForm->pfnHook;//获取回调函数
202 if (func != NULL) {
203 UINTPTR *param = (UINTPTR *)(hwiForm->uwParam);
204 func((INT32)(*param), (VOID *)(*(param + 1)));//运行带参数的回调函数
205 }
206 } else {//没有参数的情况
207 HWI_PROC_FUNC0 func = (HWI_PROC_FUNC0)hwiForm->pfnHook;//获取回调函数
208 if (func != NULL) {
209 func();//运行回调函数
210 }
211 }
212#ifndef LOSCFG_NO_SHARED_IRQ
213 }
214#endif
215 ++g_hwiFormCnt[cpuid][intNum];
216
217 OsHookCall(LOS_HOOK_TYPE_ISR_EXIT, intNum);
219
220#ifdef LOSCFG_CPUP_INCLUDE_IRQ
221 OsCpupIrqEnd(cpuid, intNum);
222#endif
223 /* Must keep the operation at the end of the interface */
224 *intCnt = *intCnt - 1;
225}
226///申请内核空间拷贝硬中断参数
227STATIC HWI_ARG_T OsHwiCpIrqParam(const HwiIrqParam *irqParam)
228{
229 HwiIrqParam *paramByAlloc = NULL;
230
231 if (irqParam != NULL) {
232 paramByAlloc = (HwiIrqParam *)LOS_MemAlloc(m_aucSysMem0, sizeof(HwiIrqParam));
233 if (paramByAlloc == NULL) {
234 return LOS_NOK;
235 }
236 (VOID)memcpy_s(paramByAlloc, sizeof(HwiIrqParam), irqParam, sizeof(HwiIrqParam));
237 }
238 /* When "irqParam" is NULL, the function return 0(LOS_OK). */
239 return (HWI_ARG_T)paramByAlloc;
240}
241
242#ifdef LOSCFG_NO_SHARED_IRQ
244{
245 UINT32 intSave;
246
247 HWI_LOCK(intSave);//申请硬中断自旋锁
248 g_hwiForm[hwiNum].pfnHook = NULL;//回调函数直接NULL
249 if (g_hwiForm[hwiNum].uwParam) {//如有参数
250 (VOID)LOS_MemFree(m_aucSysMem0, (VOID *)g_hwiForm[hwiNum].uwParam);//释放内存
251 }
252 g_hwiForm[hwiNum].uwParam = 0; //NULL
253
254 HWI_UNLOCK(intSave);//释放硬中断自旋锁
255 return LOS_OK;
256}
257///创建一个不支持共享的中断
259 HWI_PROC_FUNC hwiHandler, const HwiIrqParam *irqParam)
260{
261 HWI_ARG_T retParam;
262 UINT32 intSave;
263
264 HWI_LOCK(intSave);
265 if (g_hwiForm[hwiNum].pfnHook == NULL) {
266 g_hwiForm[hwiNum].pfnHook = hwiHandler;//记录上回调函数
267
268 retParam = OsHwiCpIrqParam(irqParam);//获取中断处理函数的参数
269 if (retParam == LOS_NOK) {
270 HWI_UNLOCK(intSave);
271 return OS_ERRNO_HWI_NO_MEMORY;
272 }
273 g_hwiForm[hwiNum].uwParam = retParam;//作为硬中断处理函数的参数
274 } else {
275 HWI_UNLOCK(intSave);
276 return OS_ERRNO_HWI_ALREADY_CREATED;
277 }
278 HWI_UNLOCK(intSave);
279 return LOS_OK;
280}
281#else //删除一个共享中断
282STATIC UINT32 OsHwiDelShared(HWI_HANDLE_T hwiNum, const HwiIrqParam *irqParam)
283{
284 HwiHandleForm *hwiForm = NULL;
285 HwiHandleForm *hwiFormtmp = NULL;
286 UINT32 hwiValid = FALSE;
287 UINT32 intSave;
288
289 HWI_LOCK(intSave);
290 hwiForm = &g_hwiForm[hwiNum];//从全局注册的中断向量表中获取中断项
291 hwiFormtmp = hwiForm;
292
293 if ((hwiForm->uwParam & IRQF_SHARED) && ((irqParam == NULL) || (irqParam->pDevId == NULL))) {
294 HWI_UNLOCK(intSave);
295 return OS_ERRNO_HWI_SHARED_ERROR;
296 }
297
298 if ((hwiForm->pstNext != NULL) && !(hwiForm->uwParam & IRQF_SHARED)) {
299 hwiForm = hwiForm->pstNext;
300 if (hwiForm->uwParam) {
301 (VOID)LOS_MemFree(m_aucSysMem0, (VOID *)hwiForm->uwParam);
302 }
303 (VOID)LOS_MemFree(m_aucSysMem0, hwiForm);
304 hwiFormtmp->pstNext = NULL;
305
306 g_hwiFormName[hwiNum] = NULL;
307
308 HWI_UNLOCK(intSave);
309 return LOS_OK;
310 }
311 hwiForm = hwiForm->pstNext;
312 while (hwiForm != NULL) {
313 if (((HwiIrqParam *)(hwiForm->uwParam))->pDevId != irqParam->pDevId) {
314 hwiFormtmp = hwiForm;
315 hwiForm = hwiForm->pstNext;
316 } else {
317 hwiFormtmp->pstNext = hwiForm->pstNext;
318 (VOID)LOS_MemFree(m_aucSysMem0, (VOID *)hwiForm->uwParam);
319 (VOID)LOS_MemFree(m_aucSysMem0, hwiForm);
320
321 hwiValid = TRUE;
322 break;
323 }
324 }
325
326 if (hwiValid != TRUE) {
327 HWI_UNLOCK(intSave);
328 return OS_ERRNO_HWI_HWINUM_UNCREATE;
329 }
330
331 if (g_hwiForm[hwiNum].pstNext == NULL) {
332 g_hwiForm[hwiNum].uwParam = 0;
333 g_hwiFormName[hwiNum] = NULL;
334 }
335
336 HWI_UNLOCK(intSave);
337 return LOS_OK;
338}
339///创建一个共享硬件中断,共享中断就是一个中断能触发多个响应函数
341 HWI_PROC_FUNC hwiHandler, const HwiIrqParam *irqParam)
342{
343 UINT32 intSave;
344 HwiHandleForm *hwiFormNode = NULL;
345 HwiHandleForm *hwiForm = NULL;
346 HwiIrqParam *hwiParam = NULL;
347 HWI_MODE_T modeResult = hwiMode & IRQF_SHARED;
348
349 if (modeResult && ((irqParam == NULL) || (irqParam->pDevId == NULL))) {
350 return OS_ERRNO_HWI_SHARED_ERROR;
351 }
352
353 HWI_LOCK(intSave);//中断自旋锁
354
355 hwiForm = &g_hwiForm[hwiNum];//获取中断处理项
356 if ((hwiForm->pstNext != NULL) && ((modeResult == 0) || (!(hwiForm->uwParam & IRQF_SHARED)))) {
357 HWI_UNLOCK(intSave);
358 return OS_ERRNO_HWI_SHARED_ERROR;
359 }
360
361 while (hwiForm->pstNext != NULL) {//pstNext指向 共享中断的各处理函数节点,此处一直撸到最后一个
362 hwiForm = hwiForm->pstNext;//找下一个中断
363 hwiParam = (HwiIrqParam *)(hwiForm->uwParam);//获取中断参数,用于检测该设备ID是否已经有中断处理函数
364 if (hwiParam->pDevId == irqParam->pDevId) {//设备ID一致时,说明设备对应的中断处理函数已经存在了.
365 HWI_UNLOCK(intSave);
366 return OS_ERRNO_HWI_ALREADY_CREATED;
367 }
368 }
369
370 hwiFormNode = (HwiHandleForm *)LOS_MemAlloc(m_aucSysMem0, sizeof(HwiHandleForm));//创建一个中断处理节点
371 if (hwiFormNode == NULL) {
372 HWI_UNLOCK(intSave);
373 return OS_ERRNO_HWI_NO_MEMORY;
374 }
375
376 hwiFormNode->uwParam = OsHwiCpIrqParam(irqParam);//获取中断处理函数的参数
377 if (hwiFormNode->uwParam == LOS_NOK) {
378 HWI_UNLOCK(intSave);
379 (VOID)LOS_MemFree(m_aucSysMem0, hwiFormNode);
380 return OS_ERRNO_HWI_NO_MEMORY;
381 }
382
383 hwiFormNode->pfnHook = hwiHandler;//绑定中断处理函数
384 hwiFormNode->pstNext = (struct tagHwiHandleForm *)NULL;//指定下一个中断为NULL,用于后续遍历找到最后一个中断项(见于以上 while (hwiForm->pstNext != NULL)处)
385 hwiForm->pstNext = hwiFormNode;//共享中断
386
387 if ((irqParam != NULL) && (irqParam->pName != NULL)) {
388 g_hwiFormName[hwiNum] = (CHAR *)irqParam->pName;
389 }
390
391 g_hwiForm[hwiNum].uwParam = modeResult;
392
393 HWI_UNLOCK(intSave);
394 return LOS_OK;
395}
396#endif
397
398/*
399 * Description : initialization of the hardware interrupt
400 */
401LITE_OS_SEC_TEXT_INIT VOID OsHwiInit(VOID)//硬件中断初始化
402{
403 UINT32 hwiNum;
404
405 for (hwiNum = 0; hwiNum < OS_HWI_MAX_NUM; hwiNum++) {//初始化中断向量表,默认128个中断
406 g_hwiForm[hwiNum].pfnHook = NULL;
407 g_hwiForm[hwiNum].uwParam = 0;
408 g_hwiForm[hwiNum].pstNext = NULL;
409 }
410
411 (VOID)memset_s(g_hwiFormName, (sizeof(CHAR *) * OS_HWI_MAX_NUM), 0, (sizeof(CHAR *) * OS_HWI_MAX_NUM));
412
413 HalIrqInit();
414
415 return;
416}
417
418/**
419 * @brief 创建一个硬中断
420 \n 中断创建,注册中断号、中断触发模式、中断优先级、中断处理程序。中断被触发时,
421 \n handleIrq会调用该中断处理程序
422 * @param hwiNum 硬中断句柄编号 默认范围[0-127]
423 * @param hwiPrio 硬中断优先级
424 * @param hwiMode 硬中断模式 共享和非共享
425 * @param hwiHandler 硬中断处理函数
426 * @param irqParam 硬中断处理函数参数
427 * @return LITE_OS_SEC_TEXT_INIT
428 */
429LITE_OS_SEC_TEXT_INIT UINT32 LOS_HwiCreate(HWI_HANDLE_T hwiNum,
430 HWI_PRIOR_T hwiPrio,
431 HWI_MODE_T hwiMode,
432 HWI_PROC_FUNC hwiHandler,
433 HwiIrqParam *irqParam)
434{
435 UINT32 ret;
436
437 (VOID)hwiPrio;
438 if (hwiHandler == NULL) {//中断处理函数不能为NULL
439 return OS_ERRNO_HWI_PROC_FUNC_NULL;
440 }
441 if ((hwiNum > OS_USER_HWI_MAX) || ((INT32)hwiNum < OS_USER_HWI_MIN)) {//中断数区间限制 [32,96]
442 return OS_ERRNO_HWI_NUM_INVALID;
443 }
444
445#ifdef LOSCFG_NO_SHARED_IRQ //不支持共享中断
446 ret = OsHwiCreateNoShared(hwiNum, hwiMode, hwiHandler, irqParam);
447#else
448 ret = OsHwiCreateShared(hwiNum, hwiMode, hwiHandler, irqParam);
449#endif
450 return ret;
451}
452///删除一个硬中断
453LITE_OS_SEC_TEXT_INIT UINT32 LOS_HwiDelete(HWI_HANDLE_T hwiNum, HwiIrqParam *irqParam)
454{
455 UINT32 ret;
456
457 if ((hwiNum > OS_USER_HWI_MAX) || ((INT32)hwiNum < OS_USER_HWI_MIN)) {
458 return OS_ERRNO_HWI_NUM_INVALID;
459 }
460
461#ifdef LOSCFG_NO_SHARED_IRQ //不支持共享中断
462 ret = OsHwiDelNoShared(hwiNum);
463#else
464 ret = OsHwiDelShared(hwiNum, irqParam);
465#endif
466 return ret;
467}
468
VOID HalIrqInit(VOID)
中断控制器本身初始化
Definition: gic_v2.c:118
UINT16 HWI_PRIOR_T
Definition: los_hwi.h:223
size_t g_intCount[LOSCFG_KERNEL_CORE_NUM]
记录每个CPUcore的中断数量
Definition: los_hwi.c:153
VOID(* HWI_PROC_FUNC)(VOID)
Definition: los_hwi.h:242
LITE_OS_SEC_TEXT_INIT UINT32 LOS_HwiDelete(HWI_HANDLE_T hwiNum, HwiIrqParam *irqParam)
删除一个硬中断
Definition: los_hwi.c:453
UINT32 LOS_GetSystemHwiMaximum(VOID)
获取系统支持的最大中断数
Definition: los_hwi.c:174
UINT16 HWI_MODE_T
Definition: los_hwi.h:229
UINTPTR HWI_ARG_T
Definition: los_hwi.h:236
LITE_OS_SEC_TEXT_INIT UINT32 LOS_HwiCreate(HWI_HANDLE_T hwiNum, HWI_PRIOR_T hwiPrio, HWI_MODE_T hwiMode, HWI_PROC_FUNC hwiHandler, HwiIrqParam *irqParam)
创建一个硬中断 中断创建,注册中断号、中断触发模式、中断优先级、中断处理程序。中断被触发时, handleIrq会调用该中断处理程序
Definition: los_hwi.c:429
UINT32 HWI_HANDLE_T
Definition: los_hwi.h:217
VOID * LOS_MemAlloc(VOID *pool, UINT32 size)
从指定内存池中申请size长度的内存,注意这可不是从内核堆空间中申请内存
Definition: los_memory.c:1123
UINT32 LOS_MemFree(VOID *pool, VOID *ptr)
释放从指定动态内存中申请的内存
Definition: los_memory.c:1369
UINT8 * m_aucSysMem0
异常交互动态内存池地址的起始地址,当不支持异常交互特性时,m_aucSysMem0等于m_aucSysMem1。
Definition: los_memory.c:107
LITE_OS_SEC_TEXT_MINOR VOID OsCpupIrqStart(UINT16 cpuid)
Definition: los_cpup.c:635
LITE_OS_SEC_TEXT_MINOR VOID OsCpupIrqEnd(UINT16 cpuid, UINT32 intNum)
Definition: los_cpup.c:645
STATIC INLINE UINT32 ArchCurrCpuid(VOID)
Definition: los_hw_cpu.h:168
LITE_OS_SEC_BSS SPIN_LOCK_INIT(g_hwiSpin)
注意全局变量 g_hwiSpin 是在宏里面定义的
CHAR * OsGetHwiFormName(UINT32 index)
Definition: los_hwi.c:169
LITE_OS_SEC_TEXT_INIT VOID OsHwiInit(VOID)
Definition: los_hwi.c:401
STATIC UINT32 OsHwiDelShared(HWI_HANDLE_T hwiNum, const HwiIrqParam *irqParam)
Definition: los_hwi.c:282
STATIC UINT32 g_hwiFormCnt[LOSCFG_KERNEL_CORE_NUM][OS_HWI_MAX_NUM]
Definition: los_hwi.c:156
HwiHandleForm g_hwiForm[OS_HWI_MAX_NUM]
中断注册表 @note_why 用 form 来表示?有种写 HTML的感觉
Definition: los_hwi.c:154
STATIC UINT32 OsHwiDelNoShared(HWI_HANDLE_T hwiNum)
Definition: los_hwi.c:243
VOID(* HWI_PROC_FUNC2)(INT32, VOID *)
Definition: los_hwi.c:179
VOID(* HWI_PROC_FUNC0)(VOID)
Definition: los_hwi.c:178
UINT32 OsGetHwiFormCnt(UINT16 cpuid, UINT32 index)
获取某个中断的中断次数
Definition: los_hwi.c:164
VOID OsInterrupt(UINT32 intNum)
Definition: los_hwi.c:180
STATIC CHAR * g_hwiFormName[OS_HWI_MAX_NUM]
记录每个硬中断的名称
Definition: los_hwi.c:155
STATIC UINT32 OsHwiCreateNoShared(HWI_HANDLE_T hwiNum, HWI_MODE_T hwiMode, HWI_PROC_FUNC hwiHandler, const HwiIrqParam *irqParam)
创建一个不支持共享的中断
Definition: los_hwi.c:258
STATIC HWI_ARG_T OsHwiCpIrqParam(const HwiIrqParam *irqParam)
申请内核空间拷贝硬中断参数
Definition: los_hwi.c:227
STATIC UINT32 OsHwiCreateShared(HWI_HANDLE_T hwiNum, HWI_MODE_T hwiMode, HWI_PROC_FUNC hwiHandler, const HwiIrqParam *irqParam)
创建一个共享硬件中断,共享中断就是一个中断能触发多个响应函数
Definition: los_hwi.c:340
struct tagIrqParam HwiIrqParam
STATIC INLINE VOID OsSchedIrqUsedTimeUpdate(VOID)
STATIC INLINE VOID OsSchedIrqStartTime(VOID)
获取中断开始时间
unsigned short UINT16
Definition: los_typedef.h:56
signed int INT32
Definition: los_typedef.h:60
unsigned long UINTPTR
Definition: los_typedef.h:68
unsigned int UINT32
Definition: los_typedef.h:57
char CHAR
Definition: los_typedef.h:63
HWI_PROC_FUNC pfnHook
中断处理函数
Definition: los_hwi.h:253
struct tagHwiHandleForm * pstNext
节点,指向下一个中断,用于共享中断的情况
Definition: los_hwi.h:255
HWI_ARG_T uwParam
中断处理函数参数
Definition: los_hwi.h:254
const CHAR * pName
名称
Definition: los_hwi.h:261
VOID * pDevId
设备ID
Definition: los_hwi.h:260
if(tv==NULL)
Definition: time.c:430