我正在尝试在MSP430的汇编器中构建一个非常简单的操作系统。 我想使用先占式调度程序,以循环方式循环处理任务。 所有任务都将无限期地执行,所以我对任何花式的优先级或等待状态都不感兴趣。
我已经在C中查看了一个实施示例,因此我很好地掌握了事情发生的顺序。 但是,我正在努力将每个任务的可用RAM分成堆栈。
在C实现中:
stack_pointer[0]= initialize_stack (Task1,&task1ram[stack_top]); stack_pointer[1]= initialize_stack (task2,&task2ram[stack_top]); stack_pointer[2]= initialize_stack (task3, &task3ram[stack_top]);
每个堆栈只是RAM的数组,因此堆栈指针设置为第一个地址。
但是在汇编程序中,我不知道我的堆栈在内存中的位置。 只为每个堆栈指针划分纸张上的RAM和硬代码地址是否是不好的做法?
例如,我可以说:
---------------------------------- RSEG代码 ;组装到闪存 RSEG CSTACK DC16 0x20E4 DC16 0x21E4 DC16 0x22E4 ----------------------------------
其中,每个常量都是硬编码的内存位置,我希望我的三个堆栈都从这里开始。 然后,当我执行上下文切换时,我只想将我的栈指针设置为这些常量之一,然后使用以下命令还原上下文的其余部分:
restoreContext:Pop R15 Pop r14. Pop R13 Pop R12 Pop r11. Pop R10 Pop R9. Pop R8. Pop r7. Pop R6. POP R5 POP R4 印度
因此,我的问题是:
是否有人在汇编程序中有一个简单调度程序的好例子?
将RAM分成堆栈并生成堆栈指针的推荐方法是什么?