我有兴趣在XC8中使用可访问硬件堆栈的增强型MCU编写调度器/RTOS项目。
我正试图弄清楚如何控制软件堆栈的创建,这样每个任务的软件堆栈都会在通用ram中获得一定的范围。
从概念上讲,这一切都很容易在ASM中编程,但我希望能够编写C程序,并将每个任务的软件堆栈放入正确的地址空间。
似乎没有为某段代码创建单独的软件堆栈,甚至没有创建多个软件堆栈的选项——我该怎么做?
感谢
堆栈切换是调度器的责任,而不是编译器的责任,因此您将找不到用于该的编译器选项。您必须在打算编写的调度器中实现这一点——事实上,这是调度器所做的大部分工作。
在RTOS中,切换上下文涉及存储与一个执行线程相关的所有寄存器,并用另一个线程的寄存器替换它们。这包括替换堆栈指针——这就是在线程之间切换堆栈的方式。当程序计数器寄存器加载时,上下文切换完成,从而跳到新线程的最后一个执行点(所有寄存器,包括堆栈指针已恢复)
上下文切换本身必然涉及至少少量的汇编代码,但其中大部分可能仍然用C编写,任务本身也可能用C编写。Jean Labrosse关于μC/OS-II的书中提供了一个简单RTOS调度器的良好描述,该书以PDF格式免费提供。μC/OS-II的PIC18端口并进行了下载。