当前位置: 首页 > news >正文

RTX5可以在中断中调用的API

RTX5(Keil RTX5 实时操作系统) 中,中断服务程序(ISR) 可以调用部分 线程安全(ISR Callable) 的 API 函数,但必须遵循 非阻塞、无优先级反转 的原则。以下是 RTX5 允许在中断中调用的 API 列表(基于 CMSIS-RTOS2 规范):


✅ RTX5 中断中可安全调用的 API

1. 线程管理(Thread Management)

API 函数功能是否可中断调用
osThreadFlagsSet向指定线程发送标志位(用于中断→任务通信)可以
osThreadResume恢复被挂起的线程可以

不可调用osThreadNewosThreadTerminateosThreadSuspend(可能阻塞或影响调度)。


2. 事件标志(Event Flags)

API 函数功能是否可中断调用
osEventFlagsSet设置事件标志(任务可等待)可以
osEventFlagsClear清除事件标志可以

不可调用osEventFlagsWait(会阻塞,只能在任务中调用)。


3. 信号量(Semaphore)

API 函数功能是否可中断调用
osSemaphoreRelease释放信号量(任务可获取)可以
osSemaphoreAcquire获取信号量(不可在中断调用,会阻塞不可以

不可调用osSemaphoreNewosSemaphoreDelete(可能涉及内存分配)。


4. 消息队列(Message Queue)

API 函数功能是否可中断调用
osMessageQueuePut发送消息(非阻塞模式)可以
osMessageQueueGet接收消息(仅限超时=0 时可用⚠️ 部分可调用(仅 timeout=0 时)

不可调用osMessageQueueNewosMessageQueueDelete(可能涉及内存分配)。


5. 内存池(Memory Pool)

API 函数功能是否可中断调用
osMemoryPoolAlloc分配内存(仅限 timeout=0 时可用⚠️ 部分可调用(仅 timeout=0 时)
osMemoryPoolFree释放内存可以

不可调用osMemoryPoolNewosMemoryPoolDelete(可能涉及内存分配)。


6. 定时器(Timer)

API 函数功能是否可中断调用
osTimerStart启动定时器可以
osTimerStop停止定时器可以
osTimerDelete删除定时器不可以(可能涉及内存释放)

不可调用osTimerNew(可能涉及内存分配)。


7. 互斥锁(Mutex) & 递归互斥锁(Recursive Mutex)

API 函数功能是否可中断调用
osMutexRelease释放互斥锁(任务可获取)可以
osMutexAcquire获取互斥锁(不可在中断调用,会阻塞不可以
osRecursiveMutexRelease释放递归互斥锁可以
osRecursiveMutexAcquire获取递归互斥锁(不可在中断调用不可以

不可调用osMutexNewosMutexDelete(可能涉及内存分配)。


❌ RTX5 中断中不可调用的 API

以下 API 绝对不能在中断中调用(会导致系统崩溃或未定义行为):

  • 任何阻塞操作(如 osDelayosSemaphoreAcquireosMutexAcquireosEventFlagsWaitosMessageQueueGet 带超时)。
  • 动态内存分配/释放(如 osThreadNewosTimerNewosMutexNewosMemoryPoolNew)。
  • 线程挂起/删除(如 osThreadSuspendosThreadTerminate)。
  • 系统初始化/关闭(如 osKernelInitializeosKernelStartosKernelLock)。

✅ 中断与任务通信的最佳实践

1. 使用 osThreadFlagsSet(推荐)

// 中断中(非阻塞)
osThreadFlagsSet(task_id, 0x01);  // 向任务发送标志位// 任务中(等待标志位)
uint32_t flags = osThreadFlagsWait(0x01, osFlagsWaitAny, osWaitForever);

2. 使用 osSemaphoreRelease

// 中断中(非阻塞)
osSemaphoreRelease(mySemaphore);  // 释放信号量// 任务中(等待信号量)
osSemaphoreAcquire(mySemaphore, osWaitForever);  // 阻塞等待

3. 使用 osMessageQueuePut

// 中断中(非阻塞)
osMessageQueuePut(myQueue, &data, 0, 0);  // 发送消息(不阻塞)// 任务中(接收消息)
osMessageQueueGet(myQueue, &data, NULL, osWaitForever);  // 阻塞等待

📌 总结

API 类型是否可中断调用备注
osThreadFlagsSet推荐用于中断→任务通信
osSemaphoreRelease任务可 osSemaphoreAcquire 等待
osMessageQueuePut任务可 osMessageQueueGet 等待
osMemoryPoolFree释放内存
osEventFlagsSet设置事件标志
osTimerStart / osTimerStop控制定时器
osMutexRelease释放互斥锁
任何阻塞 APIosDelayosSemaphoreAcquire
动态创建/删除 APIosThreadNewosTimerNew

关键规则

  1. 中断中只能调用非阻塞 API
  2. 避免在中断中分配/释放内存(除非使用静态分配)。
  3. 优先使用 osThreadFlagsSet 或信号量进行中断→任务通信

参考官方文档:https://arm-software.github.io/CMSIS_5/RTOS2/html/group__CMSIS__RTOS__Definitions.html

http://www.dtcms.com/a/267445.html

相关文章:

  • 08_容器化与微服务:构建弹性架构
  • Ubuntu 22.04 修改默认 Python 版本为 Python3 笔记
  • Hbase2.6.2集群部署(最新版)
  • spring-initializer
  • OneCode MQTT插件开发实战:基于Paho.Client的物联网通信解决方案
  • python使用fastmcp包编写mcp服务端(mcp server)
  • ServiceNow CAD项目实战详细解析
  • PPT文字精简与视觉化技巧
  • StarRocks × Tableau 连接器完整使用指南 | 高效数据分析从连接开始
  • Eureka和Nacos都可以作为注册中心,它们之间的区别
  • DIODON HP30 防水充气无人机:海上侦察的创新利器
  • 进阶篇:18-使用 Kaniko 在无 Docker Daemon 环境中构建镜像
  • 《数据维度的视觉重构:打造交互式高维数据可视化的黄金法则》
  • 告别 undefined is not a function:TypeScript 前端开发优势与实践指南
  • 缓存解决方案
  • vuedraggable在iframe中无法使用问题
  • MySQL基础和 表的‘CRUD’(基础版)
  • 基础数据结构第04天:单向链表(概念篇)
  • ubuntu手动编译VTK9.3 Generating qmltypes file 失败
  • 解决URL编码兼容性问题:空格转义与HTML实体解码实战
  • 基于企业私有数据实现智能问答
  • 动手学深度学习-学习笔记(总)
  • Kali Linux Wifi 伪造热点
  • 基于Java+SpringBoot的三国之家网站
  • 嵌入式系统内核镜像相关(十二)
  • Flink-Source算子点位提交问题(Earliest)
  • 力扣 hot100 Day35
  • STM32中实现shell控制台(命令解析实现)
  • MySQL回表查询深度解析:原理、影响与优化实战
  • 从UI设计到数字孪生实战部署:构建智慧城市的智慧照明系统