博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
liteos中中断的注册
阅读量:4215 次
发布时间:2019-05-26

本文共 2059 字,大约阅读时间需要 6 分钟。

在liteos中通过LOS_HwiCreate来注册一个中断,举例如下:UINT32 Example_Interrupt(VOID){    UINTPTR uvIntSave;    uvIntSave = LOS_IntLock();    Example_Exti0_Init();#核心是调用这个函数来新建中断,第一个形参是中断号    LOS_HwiCreate(6, 0, 0, User_IRQHandler, 0);//create interrupt    LOS_IntRestore(uvIntSave);    return LOS_OK;}继续看看LITE_OS_SEC_TEXT_INIT UINT32 LOS_HwiCreate( HWI_HANDLE_T  uwHwiNum,                                      HWI_PRIOR_T   usHwiPrio,                                      HWI_MODE_T    usMode,                                      HWI_PROC_FUNC pfnHandler,                                      HWI_ARG_T     uwArg ){    UINTPTR uvIntSave;#这个数组保存这个所有中断号对应的中断处理函数    if (m_pstHwiForm[uwHwiNum + OS_SYS_VECTOR_CNT] != (HWI_PROC_FUNC)osHwiDefaultHandler)    {        return OS_ERRNO_HWI_ALREADY_CREATED;    }    uvIntSave = LOS_IntLock();#根据中断号更新m_pstHwiForm数组中中断号对应的中断处理函数#if (OS_HWI_WITH_ARG == YES)    osSetVector(uwHwiNum, pfnHandler, uwArg);#else    osSetVector(uwHwiNum, pfnHandler);#endif#使能这个中断    NVIC_EnableIRQ((IRQn_Type)uwHwiNum);#设置这个中断的优先级    NVIC_SetPriority((IRQn_Type)uwHwiNum, usHwiPrio);    LOS_IntRestore(uvIntSave);    return LOS_OK;}可见osSetVector 中更新了两个数组,其中数组m_pstHwiForm 的中每个回调函数都是osInterrupt在osInterrupt;中会调用pfnVector#define osSetVector(uwNum, pfnVector)       \    m_pstHwiForm[uwNum + OS_SYS_VECTOR_CNT] = osInterrupt;\    m_pstHwiSlaveForm[uwNum + OS_SYS_VECTOR_CNT] = pfnVector;#endif为什么会在LOS_HwiCreate中会判断中断的默认处理函数是osHwiDefaultHandlerif (m_pstHwiForm[uwHwiNum + OS_SYS_VECTOR_CNT] != (HWI_PROC_FUNC)osHwiDefaultHandler)    {        return OS_ERRNO_HWI_ALREADY_CREATED;    }这个是因为在下面的函数中会默认对m_pstHwiForm中的所有中断号赋一个初值,所以这里增加一个判断是防止中断的重复注册LITE_OS_SEC_TEXT_INIT VOID osHwiInit(){    UINT32 uwIndex;    for(uwIndex = OS_SYS_VECTOR_CNT; uwIndex < OS_VECTOR_CNT; uwIndex++)    {        m_pstHwiForm[uwIndex] = (HWI_PROC_FUNC)osHwiDefaultHandler;    }    /* Interrupt vector table location */    SCB->VTOR = (UINT32)m_pstHwiForm;#if (__CORTEX_M >= 0x03U)  /* only for Cortex-M3 and above */    NVIC_SetPriorityGrouping(OS_NVIC_AIRCR_PRIGROUP);#endif    return;}

 

转载地址:http://gpnmi.baihongyu.com/

你可能感兴趣的文章
【Big Data 每日一题20180924】Structured Streaming 之 Source 解析
查看>>
【Big Data 每日一题20180925】Structured Streaming 之 Sink 解析
查看>>
【Big Data 每日一题20180927】Structured Streaming 之 Event Time 解析
查看>>
【Big Data 每日一题20180928】Structured Streaming 之 Watermark 解析
查看>>
【Big Data 每日一题20180929】Spark DAG概述
查看>>
【Big Data 每日一题 - 20180930】Spark启动时的master参数以及Spark的部署方式
查看>>
【Big Data 每日一题20181001】java 深拷贝 方案 (中英版)
查看>>
JNI Java Native Interface
查看>>
阅读源码的三种境界 (转 码农翻身 微信公众号)
查看>>
All Things OpenTSDB
查看>>
表格存储最佳实践:一种用于存储时间序列数据的表结构设计
查看>>
OpenTSDB介绍
查看>>
OpenTSDB原理系列:元数据模型
查看>>
解密OpenTSDB的表存储优化
查看>>
OpeTSDB的Configuration配置
查看>>
FQDN
查看>>
时序数据库
查看>>
jmxtrans+influxdb+granafa监控hbase
查看>>
使用jmxtrans监控Spark JVM信息到grafana显示
查看>>
HBase - ROOT 和 META 表结构 (region定位原理)
查看>>