- 建立一個背景執行緒
- 建立應用程式入口函式(管理函式),如:
__EXPORT int px4_daemon_app_main(int argc, char *argv[]);
int px4_daemon_app_main(int argc, char *argv[])
{
...
} - 在入口函式中px4_daemon_app_main利用task_spawn_cmd函式建立一個新任務。輸入參數如下:
task_spawn_cmd(
const char *name, ← 任務名稱
int scheduler, ← 排序方式:先進先出SCHED_FIFO或是SCHED_RR
int priority, ← 優先順序
int stack_size, ← 設定一記憶體區塊,用來儲存執行緒位址及變數
main_t entry, ← 執行緒本體函式名稱
const char *argv[] ) ← 輸入執行緒參數 - 建立執行緒本體函式,如:
int px4_daemon_thread_main(int argc, char *argv[])
int px4_daemon_thread_main(int argc, char *argv[])
{
while(ture){
... ...
sleep(10);
if(thread_should_exit) break;
}
return 0;
} - 在入口函式(管理函式)中加入指令用來控制執行緒,如:
if (!strcmp(argv[1], "start")) {
... ...
daemon_task = task_spawn_cmd( ... ... );
... ...
}
上述程式碼表示開始執行緒任務。
執行時輸入以下指令:
NSH> px4_daemon_app start
if (!strcmp(argv[1], "stop")) {
... ...
}
上述程式碼表示停止執行緒任務。
執行時輸入以下指令:
NSH> px4_daemon_app stop本範例執行後會每隔10ms顯示Hello daemon - 查詢背景執行程式,如下:
- 執行時輸入以下指令:
NSH> top - 顯示目前背景執行程序:
- 執行daemon後,再次執行top,將發現新的執行任務:
- 跳離top顯示畫面請按鍵盤Ctrl+C,此時輸入以下指令:
NSH> px4_daemon_app stop 因為daemon每10ms自動顯示Hello daemon 所以當輸入指令被中斷時請忽視。 - 執行週期
範例建立了兩個函式,一個是入口函式px4_daemon_app_main,二是執行緒本體函式px4_daemon_thread_main。入口函式只會執行一次,當執行相對應的指令完畢後就會消失。執行緒本體函式則利用while無窮迴圈持續執行,直到入口函式再次被執行,並以stop指令結束執行緒。
所有執行緒本體函式所需用到的變數宣告及定義,都需要撰寫在執行緒本體函式中執行週期內看的到的地方,不可撰寫在入口函式內。
註:此範例程式已存在px4/Firmeware/src/examples/px4_daemon_app資料夾下。完整程式請參考範例。
2014年8月27日 星期三
Pixhawk Autopilot 第三步 建立一個背景執行緒(Daemon:task/thread)
訂閱:
張貼留言 (Atom)
沒有留言:
張貼留言