我怎样才能在嵌入式程序中进行多线程处理?

时间:2013-07-02 13:26:11

标签: multithreading embedded 8051

您好,我是一名嵌入式程序员。最近我们遇到了一个我们被迫使用多线程的项目。我在java中使用了相同的但我无法实现它的8051嵌入式代码。可以帮助我吗?

2 个答案:

答案 0 :(得分:4)

线程需要有一些机制来切换线程,通常称为调度程序。

从广义上讲,有两种类型的线程:合作和先发制人。

在协作线程中,每个线程都会执行一些工作,然后将控制权转移回调度程序。这几乎就像将一个while while(1){}循环作为一个程序结构,只是在任务中具有更多的独立性(仅在开发期间)。它仍然存在一个任务占用CPU,甚至锁定并防止其他任何东西运行的风险。实际上,任务之间的独立性只是开发人员的幻想或组织抽象。

在先发制人的多任务处理中,调度程序(可能是从计时器中断驱动)通过从一个线程中获取执行,保存其状态并重新启动另一个线程来定期强制更改任务冻结的线程。设置起来有点棘手,但更可靠。

通常使用这两种方案,您都不会从头开始编写基础结构,而是使用原始操作系统或至少使用其他人开发的调度程序。

对于非常小的嵌入式系统,您还可以考虑中断服务例程本身可以提供类似于备用线程的东西来处理某些简短和/或紧急任务。如果您的串行中断触发,您可以抓取一些字符并将其存储起来,以便以后通过其他方式在方便的时间进行解释。许多任务可以通过使用中断来处理直接部分,然后在while(1){}类型的程序结构中稍后执行结果来实现。

有些人可能会嘲笑在8051上运行调度程序的想法 - 尽管由于一个奇怪的原因,廉价的小8051等效内核现在最终出现在一些相当复杂的专用芯片中(通常由大量的存储器内存访问) ,以及强大的外围引擎来完成实际工作),因此在其上实现动态任务创建的多线程解决方案实际上并不罕见,以便管理设备所做的一切。

答案 1 :(得分:0)

8051的架构不适用于任何合理的抢占式调度。片上RDATA / IDATA中的至少堆栈,甚至更多,必须换成XDATA,它会变得非常混乱。

8051适用于烤面包机/洗衣机控制器。

如果您需要/需要premptive scheduler等功能,请转到ARM。