1、汇编启动代码中设置栈
- 这个栈空间只有300字节,是用于汇编启动代码早期,以及调用C语言的main函数(创建任务等)
- 在创建好任务,启动调取器后,这个栈空间就被抛弃掉,后续不会使用到
- 等调度器开启后,运行任务是使用每个任务自己的栈空间,进入中断也有中断专门的栈空间
2、中断处理中设置栈
- 在每次进入中断时,先保存任务执行现场到任务自己的栈空间
- 保存好任务执行现场后,把中断特有的栈空间写到sp寄存器,整个中断处理都使用专门用于中断处理的栈空间
3、任务切换中设置栈
3.1、任务栈空间的申请
参考博客:《freertos任务调度机制深度分析(以RISC-V架构为例)》;
3.2、任务栈空间的切换
4、关于三处栈空间的思考?
- 启动时使用300字节的临时栈空间,当开启任务调度器后,这300字节的栈空间边被丢弃,后续不会再使用
- 开启任务调度后,进入中断先把现场保存到任务栈空间,然后切换到中断独有的栈空间进行中断处理,在返回中断前,从任务栈空间恢复现场
- 疑问:
- 启动时的300字节临时栈空间,就在启动时使用过一次,这不是会造成300字节的资源浪费?为什么不在启动开始就直接使用中断独有的栈空间?
- 我在启动代码里测试,在start.S中直接使用中断处理特有的栈空间,也是可以正常运行的,所以我认为是300字节的临时栈空间不是必须的