網頁

2014年8月27日 星期三

Pixhawk Autopilot 第三步 建立一個背景執行緒(Daemon:task/thread)


  1. 建立一個背景執行緒
    1. 建立應用程式入口函式(管理函式),如:
      __EXPORT int px4_daemon_app_main(int argc, char *argv[]);
      int px4_daemon_app_main(int argc, char *argv[])
      {
         ...
      }
    2. 在入口函式中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[]  )      ← 輸入執行緒參數
    3. 建立執行緒本體函式,如:
      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;
      }
    4. 在入口函式(管理函式)中加入指令用來控制執行緒,如:
      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
    5. 查詢背景執行程式,如下:
      1. 執行時輸入以下指令:
        NSH>   top
      2. 顯示目前背景執行程序:
      3. 執行daemon後,再次執行top,將發現新的執行任務:
      4. 跳離top顯示畫面請按鍵盤Ctrl+C,此時輸入以下指令:
        NSH>   px4_daemon_app stop
        因為daemon每10ms自動顯示Hello daemon 所以當輸入指令被中斷時請忽視。
  2. 執行週期
             範例建立了兩個函式,一個是入口函式px4_daemon_app_main,二是執行緒本體函式px4_daemon_thread_main。入口函式只會執行一次,當執行相對應的指令完畢後就會消失。執行緒本體函式則利用while無窮迴圈持續執行,直到入口函式再次被執行,並以stop指令結束執行緒。
             所有執行緒本體函式所需用到的變數宣告及定義,都需要撰寫在執行緒本體函式中執行週期內看的到的地方,不可撰寫在入口函式內。

    註:此範例程式已存在px4/Firmeware/src/examples/px4_daemon_app資料夾下。完整程式請參考範例。

沒有留言:

張貼留言