1

我有兴趣使用可访问硬件堆栈的增强型 MCU 在 XC8 中编写调度程序/RTOS 项目。

我试图弄清楚如何控制软件堆栈的创建,以便每个任务的软件堆栈将在通用 ram 中获得一定的范围。

从概念上讲,这在 ASM 中很容易编程,但我希望能够编写 C 程序并将每个任务的软件堆栈放入正确的地址空间。

似乎没有为特定代码部分创建单独的软件堆栈甚至创建多个软件堆栈的选项 - 我该怎么做?

谢谢

4

1 回答 1

1

堆栈切换是调度程序的责任,而不是编译器的责任 - 所以你不会找到一个编译器选项。您必须在您打算编写的调度程序中实现它——这实际上是调度程序所做的大部分工作。

在 RTOS 中,切换上下文涉及存储与一个执行线程相关的所有寄存器,并将它们替换为另一个执行线程的寄存器。这包括替换堆栈指针 - 这就是您在线程之间切换堆栈的方式。当程序计数器寄存器加载时,上下文切换完成,跳转到新线程的最后一个执行点(所有寄存器,包括堆栈指针恢复)。

上下文切换本身必然涉及至少少量的汇编代码,但其中大部分仍可能用 C 编写,任务本身也可能用 C 编写。Jean Labrosse 的书中提供了对简单 RTOS 调度程序的良好描述在 μC/OS-II 上 -免费提供 PDF 格式。μC/OS-II 的 PIC18 端口在此处通过下载进行描述。

于 2017-01-08T14:56:17.993 回答