有没有办法用8051μC同时运行两个任务?例如,
任务一
Delay 1 sec
P2.B2 = 1
Delay 1 sec
P2.B2 = 0任务2
If P1.B0 = 1
P2.B3=1因此,在任何时候,按下连接到P2.0的开关为1,发光二极管为P2.3=ON,而P2.2使发光二极管在P2.2闪烁。
发布于 2019-10-12 16:36:01
task通常由底层操作系统提供。如果您在没有任何操作系统的裸机系统上运行,则在第一个点上没有任务。
但是您的应用程序可以构建自己的任务。这项工作或多或少很容易。您必须构建一个调度器,通常由用于任务切换的硬件时钟触发,为每个任务创建堆栈,并为维护任务创建一些控制结构。由于您在8051等裸机系统上没有MMU和内存保护,因此您可以简单地修改堆栈指针来执行任务切换。
这正是像FreeRTos这样的库可以为您做的事情。据我所知,有一个8051端口可用。在网上搜索会返回很多指向8051 FreeRtos的链接。也许会有更多的库为你提供任务。
但大多数情况下,计划的开销和所有的管理工作都太高了。运行一个无穷无尽的循环,通过读取某种队列或标志来做一些工作要容易得多,而且通常是更有效的解决方案。此外,在中断服务例程中运行一些作业非常适合裸机要求。
发布于 2019-10-13 14:37:14
我假设你是在裸机上运行,没有电池节省的要求。我假设你现在可以编写一个程序,加载到你的设备上并运行它。我建议您大致这样做。
这个程序应该有一个主循环,它最简单的形式如下:
MAX_TIME is the largest possible value of system clock, should never be reached
task_table is table with
next execution time as system clock time (MAX_TIME means disabled)
function pointer
initialize task-table with the three tasks below
forever
for each task with time 0
set task time MAX_TIME (disable)
call task function (task probably enables itself or other task)
find a task with lowest non-zero time in task_queue
if task time is in past or now
set task time MAX_TIME (disable)
call task function (task probably enables itself or other task)Time 0任务是单独检查的,然后是tasks with time,这样time 0任务就不会相互阻塞,或者time任务永远不会被调用。同样可以通过不同的方式来实现,这只是一个例子。
那么你的需求真的需要3个“任务”:
task_p2_b2_0:
P2.B2 = 0
enable task task_p2_b2_1 at current_time + 1 second
task_p2_b2_1:
P2.B2 = 1
enable task task_p2_b2_0 at current_time + 1 second
task_p1_b0_poll:
If P1.B0 = 1
P2.B3=1
enable task task_p1_b0_poll at time 0 (or current time + 10 ms or whatever)未来发展:上面是针对少量静态任务的。正在迭代到...5-10条目表是如此之快,没有任何意义去优化它。一旦你有更多的任务,你应该考虑使用一个优先级堆来存储这些任务。然后,您还可以考虑在主循环空闲时使其休眠,并使用中断将其唤醒(计时器中断、串行端口中断、引脚激活中断等)。此外,您可以有不同的任务类型,例如,当有一些IO时激活的任务(按下按钮、从串口读取字节等)。等。在这个添加功能的上端,实际上是一个完整的操作系统,但对于简单的事情,我上面写的东西真的足够了。
https://stackoverflow.com/questions/58350219
复制相似问题