1 问题:
最近调试ST-link 单步调试时发现:rt_system_scheduler_start->rt_hw_context_switch_to

rt_hw_context_switch_to 执行完后,会继续往下执行, ;never reach here! 被笑话了
2 初步分析:
在《ARM Cortex-M3与Cortex-M4权威指南》chapter10 讲了 SVC和 PenSV异常:
|

|

这个很符合我们观察到的现象。
3 测试一下
3.1 直接追加LDR指令

然后在PenSV入口处设置断点,可以看到R0 确实被我们改变了,;never reacher here 注释确实不准确。
3.2 延迟了几条指令
准确说应该是时钟周期,不同指令,占用时钟周期不同。为了测试直观:
直接使用SVC 指令触发 SVC异常(里面死循环,OS 就运行不了),作为结束指令,
在SVC前加简单的NOP 指令,看看几条后,PendSV才运行, SVC指令未执行
3.2.1 1个NOP

断点调试发现, 程序先运行到 PendSV,然后运行SVC 死循环(发生了中断咬合,PendSV和SVC优先级均为配置,默认0)
3.2.2 2个NOP
未运行SVC 死循环,OS 正常运行
3.3 LDR 指令

未运行SVC 死循环,OS 正常运行
来个图总结一下
4 处理建议:
目前看来, 有几种处理方法
4.1 基于测试结果,直接在rt_hw_context_switch_to后面追加两个NOP
4.2 使用BL 返回
其实在正常调度使用的rt_hw_context_switch_interrupt, 也是这样做的

碰巧现在的源码后面有个rt_hw_interrupt_thread_switch也算是实现了这个方法, 但这不是我们的本意, 还是在 never reach here!前加合适

这又要担心返回到rtthread_startup后,是否还会执行其他指令

加了一个内联SVC 0指令,发现没有被执行,这么看BX lr 也挺占机器周期
4.3 d*** i***指令
参考FreeRTOS常用的同步指令d*** i***,搜索《ARM Cortex-M3与Cortex-M4权威指南》发现这个表格

完美的解决方案!
至于rt_hw_context_switch_interrupt里需不需要加这两条指令,线程任务中,BL lr后还是在线程任务里,最多多执行一两条下面的指令,问题不大。
FreeRTOS 倒是比较谨慎,在portYIELD里加了