MS-RTOS 中断管理

更新时间:
2023-08-09
下载文档

MS-RTOS 中断管理

本章将介绍 MS-RTOS 中断管理接口的使用。

中断相关数据类型

类型描述
ms_irq_t16 位中断号类型
ms_isr_ret_t中断服务函数、中断底半部工作函数返回值类型
ms_isr_t中断服务函数、中断底半部工作函数类型

ms_isr_ret_t

中断服务函数、中断底半部工作函数返回值类型为以下的宏:

描述
MS_IRQ_FAILED_DIS-2中断处理失败,请求关闭中断
MS_IRQ_HANDLED_DIS-1中断处理成功,请求关闭中断
MS_IRQ_HANDLED0中断处理成功
MS_IRQ_FAILED1中断处理失败

ms_isr_t

中断服务函数、中断底半部工作函数类型:

typedef ms_isr_ret_t (*ms_isr_t)(ms_ptr_t arg);

以下是一个中断服务函数、中断底半部工作函数定义的示例:

static ms_isr_ret_t xxx_isr(ms_ptr_t arg)
{
    // do some thing
    return MS_IRQ_HANDLED;
}

中断相关 API

下表展示了中断管理相关的 API 在两个权限空间下是否可用:

API用户空间内核空间
ms_int_enter
ms_int_exit
ms_int_nesting
ms_int_enable
ms_int_disable
ms_int_is_enable
ms_int_install
ms_int_uninstall
ms_int_handle
ms_int_add_tasklet

ms_int_enter()

  • 描述 中断进入

  • 函数原型

ms_err_t ms_int_enter(void);
  • 参数

  • 返回值 MS-RTOS 内核错误码

  • 注意事项 只能在中断入口函数中调用,需要与 ms_int_exit 配对使用

  • 示例ms_int_exit()

ms_int_exit()

  • 描述 中断退出

  • 函数原型

ms_err_t ms_int_exit(void);
  • 参数

  • 返回值 MS-RTOS 内核错误码

  • 注意事项 只能在中断入口函数中调用,需要与 ms_int_enter 配对使用

  • 示例

void xxx_int_handle(void)
{
    // enter interrupt
    ms_int_enter();

    // do some thing 

    // exit interrupt
    ms_int_exit();
}

ms_int_nesting()

  • 描述 获得中断嵌套的层次

  • 函数原型

ms_uint8_t ms_int_nesting(void);
  • 参数

  • 返回值 中断嵌套的层次

  • 注意事项 在中断入口函数或中断服务函数中调用才有意义

  • 示例

void xxx_int_handle(void)
{
    ms_uint8_t level;

    // enter interrupt
    ms_int_enter();

    level = ms_int_nesting();

    // do some thing 

    // exit interrupt
    ms_int_exit();
}

ms_int_enable()

  • 描述 使能指定的中断

  • 函数原型

ms_err_t ms_int_enable(ms_irq_t irq);
  • 参数
输入/输出参数描述
[in]irq中断号
  • 返回值 MS-RTOS 内核错误码

  • 注意事项

  • 示例

void xxx(void)
{
    // do some thing
    ms_int_enable(10U);
    // do some thing
}

ms_int_disable()

  • 描述 屏蔽指定的中断

  • 函数原型

ms_err_t ms_int_disable(ms_irq_t irq);
  • 参数
输入/输出参数描述
[in]irq中断号
  • 返回值 MS-RTOS 内核错误码

  • 注意事项

  • 示例

void xxx(void)
{
    // do some thing
    ms_int_disable(10U);
    // do some thing
}

ms_int_is_enable()

  • 描述 判断指定的中断是否使能

  • 函数原型

ms_err_t ms_int_is_enable(ms_irq_t irq, ms_bool_t *penable);
  • 参数
输入/输出参数描述
[in]irq中断号
[out]penable中断是否使能
  • 返回值 MS-RTOS 内核错误码

  • 注意事项

  • 示例

void xxx(void)
{
    ms_bool_t enable;
    
    ms_int_is_enable(10U, &enable);

    // do some thing
}

ms_int_install()

  • 描述 为指定的中断安装中断服务函数

  • 函数原型

ms_err_t ms_int_install(ms_irq_t irq, ms_isr_t isr, ms_ptr_t arg);
  • 参数
输入/输出参数描述
[in]irq中断号
[in]isr中断服务函数指针,不能为空指针
[in]arg中断服务函数参数,可以为空指针
  • 返回值 MS-RTOS 内核错误码

  • 注意事项 不能在内核初始化前调用

  • 示例

static ms_isr_ret_t xxx_isr(ms_ptr arg)
{
    // do some thing
    // clear interrupt pend

    return MS_IRQ_HANDLED;
}

void xxx(void)
{
    // do some thing

    ms_int_install(10U, xxx_isr, MS_NULL);
    ms_int_enable(10U);

    // do some thing
}

ms_int_uninstall()

  • 描述 卸载指定中断的中断服务函数

  • 函数原型

ms_err_t ms_int_uninstall(ms_irq_t irq);
  • 参数
输入/输出参数描述
[in]irq中断号
  • 返回值 MS-RTOS 内核错误码

  • 注意事项 不能在内核初始化前调用

  • 示例

void xxx(void)
{
    // do some thing

    ms_int_disable(10U);
    ms_int_uninstall(10U);

    // do some thing
}

ms_int_handle()

  • 描述 响应指定的中断,调用指定中断的中断服务函数

  • 函数原型

ms_err_t ms_int_handle(ms_irq_t irq);
  • 参数
输入/输出参数描述
[in]irq中断号
  • 返回值 MS-RTOS 内核错误码

  • 注意事项 只能在 CPU 的中断入口函数中调用

  • 示例

void int_ctrl_int_handle(void)
{
    ms_int32_t irq;

    // enter interrupt
    ms_int_enter();

    // process all interrupt request
    while ((irq = int_ctrl_get_request()) >= 0) {
        ms_int_handle(irq);
    }

    // exit interrupt
    ms_int_exit();
}

ms_int_add_tasklet()

  • 描述 为指定的中断增加一个中断底半部工作函数

  • 函数原型

ms_err_t ms_int_add_tasklet(ms_irq_t irq, ms_isr_t job, ms_ptr_t arg);
  • 参数
输入/输出参数描述
[in]irq中断号
[in]job中断底半部工作函数指针,不能为空指针
[in]arg中断底半部工作函数参数,可以为空指针
  • 返回值 MS-RTOS 内核错误码

  • 注意事项 只能在中断入口函数或中断服务函数中调用

  • 示例

static ms_isr_ret_t xxx_isr_tasklet(ms_ptr arg)
{
    // do some thing
    // clear interrupt pend

    // will enable irq
    return MS_IRQ_HANDLED;
}

static ms_isr_ret_t xxx_isr(ms_ptr arg)
{
    // do some thing

    // add a tasklet
    ms_int_add_tasklet(10U, xxx_isr_tasklet, MS_NULL);

    // will disable irq
    return MS_IRQ_HANDLED_DIS;
}

void xxx(void)
{
    // do some thing

    ms_int_install(10U, xxx_isr, MS_NULL);
    ms_int_enable(10U);

     // do some thing
}
文档内容是否对您有所帮助?
有帮助
没帮助