历史上的今天
今天是:2026年03月14日(星期六)
2023年03月14日 | 单片机能实现真正的多线程吗?
2023-03-14 来源:zhihu
所谓多线程都是模拟的,本质都是单线程,因为cpu同一时刻只能执行一段代码。
模拟的多线程就是任务之间快速切换,看起来像同时执行的样子。
据说最近有多核的单片机,不过成本应该会高很多。
对于模拟的多线程,我知道的有两种方式:
1.基于时间片的轮询系统
我自己就写过这样一个系统,原理就是用systick给系统提供一个时间基准,一般我用10ms。
然后把整体产品功能成不同的任务(线程),并且为每个任务分配一个时间片。

我红色框标注的每个任务调度的时间,1代表10ms,50则代表500ms,每个任务执行的频率可以不同,方便释放cpu资源给更需要的任务。
主函数的循环里一直判断每个任务的状态。

这里我把任务直接封装成结构体,通过函数指针的方式去调用,方便不同的任务集中管理。
如果任务就绪,就执行,等该任务执行完,下一个任务才能执行,所以本质还是轮询。
只是每个任务可以灵活分配调度时间,不重要的任务执行次数少,重要的任务执行次数多,看起来像多线程的效果。
这种方式比传统的while(1)去轮询在程序架构上会好一点,任务管理和调度也灵活很多。
缺点就是任务在执行过程中无法被打断,不能马上切换到别的任务去执行。
上一篇:单片机能运行操作系统吗
史海拾趣
|
现有3个线程Status, GetData,Process. Status用于判断设备的状态,当设备准备好后向GetData线程发送ready事件 GetData在得到ready事件后从设备采集数据,采集完毕后向Process线程发送done事件, Process线程得到done事件后开始处理数据。 ready ...… 查看全部问答> |
|
求单片机开发老师,要求会Silicon Labs 芯片(最好在厦门),价钱qq 联系. 我主要是学习Silicon Labs芯片.有一定编程基础.对电子电路略懂一点.求最好在厦门的单片机开发的老师. 有无刷电机开发的最好.… 查看全部问答> |
|
当我在windsh里面 输入主函数 -> user_start value = 0 = 0x0 问题会出在哪呢? 我编译下载都操作过了~ 程序源代码如下: #include \"vxWorks.h\" #include \"taskLib.h\" #include \"logLib.h\" #include \"wdLib.h\" int ...… 查看全部问答> |
|
透镜是根据光的折射规律制成的。透镜是由透明物质(如玻璃、水晶等)制成的一种光学元件。透镜是折射镜,其折射面是两个球面(球面一部分),或一个球面(球面一部分)一个平面的透明体。它所成的像有实像也有虚像。透镜一般可以分为两大类:凸透镜 ...… 查看全部问答> |
|
um0427\\Project\\Examples\\TIM\\TimeBase例程中, /* --------------------------------------------------------------- TIM2 Configuration: Output Compare Timing Mode: TIM2CLK= 36 MHz, Pr ...… 查看全部问答> |
|
ARM RealView ICE Debugger V3.2 谁有ARM RealView ICE Debugger V3.2 工具,或者可以有相同的功能的工具。 我需要,可以购买。 … 查看全部问答> |




