簡體   English   中英

8051 的同時任務

[英]simultaneous tasks with 8051

有什么方法可以同時使用 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的LED=ON,P2.2的LED保持在P2.2的閃爍。

task是通常由底層操作系統提供的東西。 如果您在沒有任何操作系統的裸機系統上運行,那么您一開始就沒有任務。

但是您的應用程序可以構建自己的任務。 這項工作或多或少很容易。 您必須構建一個調度程序,通常由用於任務切換的硬件時鍾觸發,為每個任務創建堆棧以及一些用於維護任務的控制結構。 由於在 8051 等裸機系統上沒有 MMU 和 memory 保護,您只需修改堆棧指針即可進行任務切換。

這正是像 FreeRTos 這樣的庫可以為您做的事情。 據我所知,有一個 8051 端口可用。 在 web 上搜索會返回大量指向 8051 FreeRtos 的鏈接。 也許還有更多的圖書館可以為您提供任務。

但主要是調度的開銷和所有的管理工作都非常高。 運行一個通過讀取某種隊列或標志來完成某些工作的無限循環要容易得多,而且通常是更有效的解決方案。 在中斷服務例程中運行一些作業也非常適合裸機要求。

我假設您在沒有節電要求的裸機上運行。 我假設您現在可以編寫一個程序,將其加載到您的設備並運行它。 我建議你做的大致是這樣的。

這個程序應該有一個主循環,最簡單的應該是這樣的:

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)

時間 0 的任務被單獨檢查,然后是時間任務,這樣時間 0 的任務就不會互相阻塞,也不會阻止時間任務被調用。 同樣可以通過不同的方式實現,這只是一個例子。

那么您的要求確實需要 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)

未來發展:以上是針對少量static任務。 迭代到... 5-10 項表是如此之快,以至於沒有必要嘗試對其進行優化。 一旦你有更多的任務,你應該考慮使用優先級堆來存儲任務。 然后你也可以考慮讓主循環在它無事可做的時候休眠,並使用中斷來喚醒它(定時器中斷、串口中斷、引腳激活中斷等)。 此外,您可能有不同的任務類型,例如當有一些 IO(按鈕按下,來自串行端口的字節等)時激活的任務。 等等。在這個添加功能的上端確實是一個完整的操作系統,但對於簡單的事情,我上面寫的真的足夠了。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM