141#ifdef LOSCFG_KERNEL_CPUP
150#define HWI_LOCK(state) LOS_SpinLockSave(&g_hwiSpin, &(state))
151#define HWI_UNLOCK(state) LOS_SpinUnlockRestore(&g_hwiSpin, (state))
176 return OS_HWI_MAX_NUM;
188 *intCnt = *intCnt + 1;
190#ifdef LOSCFG_CPUP_INCLUDE_IRQ
194 OsHookCall(LOS_HOOK_TYPE_ISR_ENTER, intNum);
196#ifndef LOSCFG_NO_SHARED_IRQ
197 while (hwiForm->
pstNext != NULL) {
204 func((
INT32)(*param), (VOID *)(*(param + 1)));
212#ifndef LOSCFG_NO_SHARED_IRQ
217 OsHookCall(LOS_HOOK_TYPE_ISR_EXIT, intNum);
220#ifdef LOSCFG_CPUP_INCLUDE_IRQ
224 *intCnt = *intCnt - 1;
231 if (irqParam != NULL) {
233 if (paramByAlloc == NULL) {
242#ifdef LOSCFG_NO_SHARED_IRQ
269 if (retParam == LOS_NOK) {
271 return OS_ERRNO_HWI_NO_MEMORY;
276 return OS_ERRNO_HWI_ALREADY_CREATED;
291 hwiFormtmp = hwiForm;
293 if ((hwiForm->
uwParam & IRQF_SHARED) && ((irqParam == NULL) || (irqParam->
pDevId == NULL))) {
295 return OS_ERRNO_HWI_SHARED_ERROR;
298 if ((hwiForm->
pstNext != NULL) && !(hwiForm->
uwParam & IRQF_SHARED)) {
312 while (hwiForm != NULL) {
314 hwiFormtmp = hwiForm;
326 if (hwiValid != TRUE) {
328 return OS_ERRNO_HWI_HWINUM_UNCREATE;
347 HWI_MODE_T modeResult = hwiMode & IRQF_SHARED;
349 if (modeResult && ((irqParam == NULL) || (irqParam->
pDevId == NULL))) {
350 return OS_ERRNO_HWI_SHARED_ERROR;
356 if ((hwiForm->
pstNext != NULL) && ((modeResult == 0) || (!(hwiForm->
uwParam & IRQF_SHARED)))) {
358 return OS_ERRNO_HWI_SHARED_ERROR;
361 while (hwiForm->
pstNext != NULL) {
366 return OS_ERRNO_HWI_ALREADY_CREATED;
371 if (hwiFormNode == NULL) {
373 return OS_ERRNO_HWI_NO_MEMORY;
377 if (hwiFormNode->
uwParam == LOS_NOK) {
380 return OS_ERRNO_HWI_NO_MEMORY;
383 hwiFormNode->
pfnHook = hwiHandler;
385 hwiForm->
pstNext = hwiFormNode;
387 if ((irqParam != NULL) && (irqParam->
pName != NULL)) {
405 for (hwiNum = 0; hwiNum < OS_HWI_MAX_NUM; hwiNum++) {
411 (VOID)memset_s(
g_hwiFormName, (
sizeof(
CHAR *) * OS_HWI_MAX_NUM), 0, (
sizeof(
CHAR *) * OS_HWI_MAX_NUM));
438 if (hwiHandler == NULL) {
439 return OS_ERRNO_HWI_PROC_FUNC_NULL;
441 if ((hwiNum > OS_USER_HWI_MAX) || ((
INT32)hwiNum < OS_USER_HWI_MIN)) {
442 return OS_ERRNO_HWI_NUM_INVALID;
445#ifdef LOSCFG_NO_SHARED_IRQ
457 if ((hwiNum > OS_USER_HWI_MAX) || ((
INT32)hwiNum < OS_USER_HWI_MIN)) {
458 return OS_ERRNO_HWI_NUM_INVALID;
461#ifdef LOSCFG_NO_SHARED_IRQ
VOID HalIrqInit(VOID)
中断控制器本身初始化
size_t g_intCount[LOSCFG_KERNEL_CORE_NUM]
记录每个CPUcore的中断数量
VOID(* HWI_PROC_FUNC)(VOID)
LITE_OS_SEC_TEXT_INIT UINT32 LOS_HwiDelete(HWI_HANDLE_T hwiNum, HwiIrqParam *irqParam)
删除一个硬中断
UINT32 LOS_GetSystemHwiMaximum(VOID)
获取系统支持的最大中断数
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会调用该中断处理程序
VOID * LOS_MemAlloc(VOID *pool, UINT32 size)
从指定内存池中申请size长度的内存,注意这可不是从内核堆空间中申请内存
UINT32 LOS_MemFree(VOID *pool, VOID *ptr)
释放从指定动态内存中申请的内存
UINT8 * m_aucSysMem0
异常交互动态内存池地址的起始地址,当不支持异常交互特性时,m_aucSysMem0等于m_aucSysMem1。
LITE_OS_SEC_TEXT_MINOR VOID OsCpupIrqStart(UINT16 cpuid)
LITE_OS_SEC_TEXT_MINOR VOID OsCpupIrqEnd(UINT16 cpuid, UINT32 intNum)
STATIC INLINE UINT32 ArchCurrCpuid(VOID)
LITE_OS_SEC_BSS SPIN_LOCK_INIT(g_hwiSpin)
注意全局变量 g_hwiSpin 是在宏里面定义的
CHAR * OsGetHwiFormName(UINT32 index)
LITE_OS_SEC_TEXT_INIT VOID OsHwiInit(VOID)
STATIC UINT32 OsHwiDelShared(HWI_HANDLE_T hwiNum, const HwiIrqParam *irqParam)
STATIC UINT32 g_hwiFormCnt[LOSCFG_KERNEL_CORE_NUM][OS_HWI_MAX_NUM]
HwiHandleForm g_hwiForm[OS_HWI_MAX_NUM]
中断注册表 @note_why 用 form 来表示?有种写 HTML的感觉
STATIC UINT32 OsHwiDelNoShared(HWI_HANDLE_T hwiNum)
VOID(* HWI_PROC_FUNC2)(INT32, VOID *)
VOID(* HWI_PROC_FUNC0)(VOID)
UINT32 OsGetHwiFormCnt(UINT16 cpuid, UINT32 index)
获取某个中断的中断次数
VOID OsInterrupt(UINT32 intNum)
STATIC CHAR * g_hwiFormName[OS_HWI_MAX_NUM]
记录每个硬中断的名称
STATIC UINT32 OsHwiCreateNoShared(HWI_HANDLE_T hwiNum, HWI_MODE_T hwiMode, HWI_PROC_FUNC hwiHandler, const HwiIrqParam *irqParam)
创建一个不支持共享的中断
STATIC HWI_ARG_T OsHwiCpIrqParam(const HwiIrqParam *irqParam)
申请内核空间拷贝硬中断参数
STATIC UINT32 OsHwiCreateShared(HWI_HANDLE_T hwiNum, HWI_MODE_T hwiMode, HWI_PROC_FUNC hwiHandler, const HwiIrqParam *irqParam)
创建一个共享硬件中断,共享中断就是一个中断能触发多个响应函数
struct tagIrqParam HwiIrqParam
STATIC INLINE VOID OsSchedIrqUsedTimeUpdate(VOID)
STATIC INLINE VOID OsSchedIrqStartTime(VOID)
获取中断开始时间