MS-RTOS 中断管理
本章将介绍 MS-RTOS 中断管理接口的使用。
中断相关数据类型
类型 | 描述 |
---|---|
ms_irq_t | 16 位中断号类型 |
ms_isr_ret_t | 中断服务函数、中断底半部工作函数返回值类型 |
ms_isr_t | 中断服务函数、中断底半部工作函数类型 |
ms_isr_ret_t
中断服务函数、中断底半部工作函数返回值类型为以下的宏:
宏 | 值 | 描述 |
---|---|---|
MS_IRQ_FAILED_DIS | -2 | 中断处理失败,请求关闭中断 |
MS_IRQ_HANDLED_DIS | -1 | 中断处理成功,请求关闭中断 |
MS_IRQ_HANDLED | 0 | 中断处理成功 |
MS_IRQ_FAILED | 1 | 中断处理失败 |
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
}