[英]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
,而不僅僅是假設您只想設置一些數字輸出的output
和value
信息。
pic16系列沒有任何解決方案(它太小了),但是有FreeRtos,它是專為微控制器制造的,還有PIC18(和其他一些端口)的端口,請查看支持的設備列表
盡管freeRTOS是“免費”的,可以在個人項目中獲取和使用,但我還是建議您購買其中的一本書,以幫助其實施。 他們的網站上有免費的API,還有演示代碼。 這本書會更容易理解(請注意,我無論如何都不受freeRTOS的束縛,我在帶有atmel控制器的項目中使用了它,並發現它非常易於使用)
使用freeRTOS可以創建一個任務(定義電磁閥控制功能),然后設置優先級,延遲然后啟動內核。 實際上非常簡單。
同樣,這不適用於您的特定芯片pic16,但是如果您可以嘗試其他芯片,則freeRTOS是一個非常知名且非常簡單的解決方案
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.