在没有操作系统的情况下,如何创建能够并行运行的线程来编程PIC18微控制器?
不要使用线程,而应该使用事件循环。
PIC18是一个小型处理器,基于事件循环的风格意味着您不必保留许多深度堆栈。您需要按照事件循环的方式编写代码,但这可能是合理的。
如果您有一些长时间运行的任务,请使用定时器和不同的中断优先级来允许更高优先级的事件循环抢占较低优先级的事件循环,并将适当类型的工作放入适当的事件队列中。
8051上,我使用了简单的堆栈切换器实现了双重任务处理。我相信在PIC上也可以做到,只要每个任务只使用16级堆栈。以下是代码示例(假设_altSP在公共bank中):
_InitTask2: movff _STKPTR,_altSP movlw 16 movwf _STKPTR,c goto _Task2Start
_TaskSwitch: movf _altSP,w,c movff _STKPTR,_altSP movwf _STKPTR,c return
主任务应该调用_InitTask2来启动第二个任务。第二个任务将一直运行,直到调用_TaskSwitch,此时主任务将恢复执行并继续从调用_InitTask2的指令处执行。以后,每次任务调用_TaskSwitch时,另一个任务将从上一次调用_TaskSwitch的位置继续执行。
如果您采用这种方法,请通知编译器所有寄存器可能会被_InitTask2或_TaskSwitch的调用清空。还必须告诉它_Task2Start和它所调用的函数必须从主任务分配独立的变量空间。
我不确定你需要告诉编译器什么才能让它满意,但我可以说协作式双任务可以使一些事情运行得非常顺畅。
CCS编译器包含一个RTOS。虽然我没有使用过,但从编译器手册中可以了解到:
CCS实时操作系统(RTOS)允许PIC微控制器定期运行任务而无需中断。这是通过一个函数(RTOS_RUN())来实现的,该函数充当调度程序。当安排要运行的任务时,调度函数将处理器的控制权交给该任务。当任务执行完成或不再需要处理器时,处理器的控制权将返回到调度函数,然后将在适当的时间将处理器的控制权交给下一个要执行的任务。这个过程被称为协作式多任务处理。
只是提醒一句 - 检查他们的论坛以获取有关您正在寻找的特定功能的信息。显然,CCS有一个习惯,在完全测试之前发布新功能。这就是我仍在使用旧版本(v3.249)的原因之一。
这个功能可以执行任务循环,还可以为任务设置优先级。我喜欢将长时间运行的函数分解成片段进行简单编码。