簡體   English   中英

使用C與pic16f877a同時運行多個功能

[英]Run multiple functions simultaneously with pic16f877a using C

我正在使用microC對pic16f877a進行編程,以操作電動機和螺線管。 我有一些功能可以使電動機在不同的時空下運動,例如motor1移動100ms,停止,再次移動100ms等,例如4圈,motor2移動200ms,依此類推。 我希望這些功能同時啟動。

當您想讓機器人每200ms上下左右移動總共2分鍾,然后每400ms左右上下總共移動2分鍾時,考慮一下機器人。 此過程應同時開始。

所以基本上我想開始這樣的事情:

start:
solenoid1 runs functionQuarter(moves up-down every x time) total like 2 mins
solenoid2 runs functionHalf(moves up-down every 2x time) total like 2 mins
stop

是否可以使用Micro C為此圖片執行此操作,如何調用兩個或多個函數同時啟動?

您為什么認為需要線程? 您確切知道何時應該執行某項操作,因此請在該時間正確執行該操作。 您所需要的只是一個適當的計划系統,可以幫助您跟蹤操作。 與線程相比,您不會遇到意外調度的問題,可能會降低等待時間,並且不需要線程間同步。

考慮一下這個草圖:

// this task structure says at what time to set 
// an output to a certain value
struct task {
    time_type when;
    output_type output;
    value_type value;
};

struct task_queue {
    struct task** tasks;
    size_t count;
};
void task_queue_push(struct task_queue* q, struct task* t);
struct task* task_queue_front(struct task_queue* q);
struct task* task_queue_pop(struct task_queue* q);

現在,在循環中,您繼續查看隊列中的第一個元素,然后只是sleep()直到下一個任務開始。 當然,這意味着您需要按開始時間對這些任務進行排序! 如果多個任務同時啟動,則需要同時運行它們,這是“同時”執行每個任務的唯一限制。 如有必要,作為處理一項任務的一部分,您可以創建一項或多項其他任務。 作為一種變體,您也可以使用回調value ,而不僅僅是假設您只想設置一些數字輸出的outputvalue信息。

pic16系列沒有任何解決方案(它太小了),但是有FreeRtos,它是專為微控制器制造的,還有PIC18(和其他一些端口)的端口,請查看支持的設備列表

盡管freeRTOS是“免費”的,可以在個人項目中獲取和使用,但我還是建議您購買其中的一本書,以幫助其實施。 他們的網站上有免費的API,還有演示代碼。 這本書會更容易理解(請注意,我無論如何都不受freeRTOS的束縛,我在帶有atmel控制器的項目中使用了它,並發現它非常易於使用)

使用freeRTOS可以創建一個任務(定義電磁閥控制功能),然后設置優先級,延遲然后啟動內核。 實際上非常簡單。

同樣,這不適用於您的特定芯片pic16,但是如果您可以嘗試其他芯片,則freeRTOS是一個非常知名且非常簡單的解決方案

暫無
暫無

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

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