常见问题 FAQ
启动后没有日志输出?
- 确认实现了
yr_putc()并正确初始化了串口 - 确认
YR_SUPPORT_DEBUG_LOG为 1 - 确认日志长度未超过
YR_PRINTF_BUF_SIZE(默认 128B,超长会被截断) - 确认调用
yr_kernel_init()前硬件已初始化
详见 调试方法。
一启动就 HardFault 或进不了首任务?
- 检查
yr_task_stack_init()构造的初始栈帧是否正确 - 检查 PC 是否指向有效的 Thumb 地址、栈顶是否满足对齐要求
- 检查
SVC_Handler/PendSV_Handler是否接入了正确的向量表 - 检查任务栈是否过小
任务一切换就死机?
- 检查普通任务切换时保存/恢复的寄存器是否完整
- 检查旧任务 SP 是否正确写回、新任务 SP 是否正确读出
- 检查异常返回模式是否正确
延时不准或完全不生效?
- 确认
yr_tick_update()真的在周期中断中被调用 - 确认中断频率等于
YR_TICK_RATE_HZ - 周期任务推荐用
yr_task_sleep_until()而不是反复yr_task_delay()
ISR 唤醒任务后没有切换?
- 确认
*_from_isr()返回的need_switch为YR_TRUE - 确认 ISR 末尾调用了
yr_sched_switch() - 确认中断退出路径允许 PendSV(或等价机制)生效
日志一开就异常?
- 检查
yr_putc()是否可重入、串口发送是否阻塞过久 - 日志格式化使用栈上 128B 缓冲区,任务栈太小时会溢出
- 先关闭日志(
YR_SUPPORT_DEBUG_LOG置 0)可快速判断是否日志导致
在中断里能用哪些 API?
信号量、队列提供专门的 *_isr 接口;任务管理类 API 通常只能在任务上下文调用。高频 ISR 中尽量避免耗时操作。
任务栈开多大合适?
没有固定答案,建议:从 512B 起步,开启断言和日志实测;调用 yr_printf 等格式化输出时至少额外预留 128B+ 调用深度。栈溢出常表现为运行一段时间后莫名异常。
可以动态创建任务/信号量吗?
Yuan RTOS 采用静态分配模型,任务、信号量等对象由用户提供内存(如 yr_task_t + 栈数组)。内核不使用 malloc,需要动态分配时请自行实现内存池/堆。
如何减小 RAM/ROM 占用?
- 编译优化使用
-Os YR_SUPPORT_DEBUG_LOG、YR_SUPPORT_ASSERT、YR_SUPPORT_PARAM_CHECK置 0- 关闭不需要的 IPC 模块(信号量/互斥锁/队列)
- 减小
YR_PRINTF_BUF_SIZE
支持哪些内核与编译器?
官方移植:Cortex-M3 + GCC(libcpu/CM3/port_gcc.c/.s);BSP 提供 STM32F103C8T6 的 CMake 与 EWARM 工程。其它架构需自行移植。
如何移植到其它芯片?
移植分两部分:实现 portable.h 声明的接口(中断开关、任务栈初始化、首任务启动、任务切换、查找最低位 1),并提供匹配 YR_TICK_RATE_HZ 的 tick 中断。完整步骤见 移植指南。
报告问题需要提供什么?
平台、编译器与优化级别、yr_config.h 是否修改、复现步骤,以及能的话附上日志/map 文件。