網頁

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資料夾下。完整程式請參考範例。

2014年8月24日 星期日

Pixhawk Autopilot 第二步 建立一個應用程式


  1. 檔案設定
    1. 若有更新OS程式碼,至少執行一次make archives
    2. 在Eclipse開發環境下,進入 Firmware/src/modules資料夾中,建立一個新資料夾,例如"px4_test_app",

      在這個資料夾中建立一個新make檔,檔名為"module.mk"。
      在module.mk中加入下列程式碼:
         MODULE_COMMAND = px4_test_app
         SRCS                            = px4_test_app.c
  2. 撰寫程式
    1. 在 Firmeware/src/module/px4_test.app/ 新增C程式碼檔。例如"px4_test_app"。

      Firmware
             └   src
                     └  module
                               └  px4_test_app
                                                └  module.mk
                                                └  px4_test_app.c
    2. 編輯C程式碼,最小程式碼須包含下列程式碼:
      /**
      * @file px4_test_app.c
      * Minimal appliction example for PX4 autopilot
      */
      #include <nuttx/config.h>
      #include <stdio.h>
      #include <errno.h>

      __EXPORT int px4_test_app_main(int argc, char *argv[]);

      int px4_test_app_main(int argc, char *argv[])
      {
           printf("Hello BC!\n");
           return OK;
      }
  3. 向NuttShell註冊應用程式並編譯
    1. 打開 "Firmware/makefiles/" 資料夾中 "config_px4fmu-v2_default.mk" 文件。
    2. 在文件中新增一行程式碼:
      MODULES         += moudles/px4_test_app
    3. 編譯程式碼:執行 clean → px4fmu-v2_defualt。如果沒有註冊新應用程式,只須執行px4fmu-v2_defualt。
    4. 上傳:執行 upload px4fmu-v2_defualt。當出現以下訊息的時候,重置Pixhawk飛控板(FMU Reset 按鈕長押 or USB重新拔插):
          Generating/Users/user/src/Firmware/Images/px4fmu.px4
          Loaded firmware for 9,0, waiting for the bootloader...

      出現以下訊息代表上傳成功:
          Found board 5,0 on /dev/tty.usbmodem1
          erase...
          program...
          verify...
          done, rebooting.
  4. 執行應用程式
    開啟TeraTerm,NSH> 下輸入 px4_test_app。

    註:此範例程式可參考 px4\Firmware\src\example\px4_simple_app資料夾下。完整程式請參考範例。

Pixhawk Autopilot 第一步 安裝及設定開發環境

  1. 安裝
    1. 更新JAVA:第7版第65次更新以上的版本。
    2. 安裝PX4 Toolchain for Windows。
      備註:作業系統 Windows 7
  2. 設定
    1. 取得起始程式碼:選擇"程式集 -> PX4 Toolchain -> PX4 Software Download"。
      備註:程式將在預設路徑建立下列資料夾:
      C:\px4
      └ Firmware:PX4 所有模組的韌體(可新增程式的地方),NuttX RTOS(不須更動)。
      └ libopencm3:Cortex M4 晶片的函式庫,Bootloader用。(不須更動)
      └ Bootloader:(不須更動)
    2. 第一次啟動:"程式集 -> PX4 Toolchain -> PX4 Eclipse"。
    3. 設定工作磁碟區:使用預設路徑C:\px4\workspace
    4. 設定專案(匯入專案Import):Flie -> New -> Makefile Project with Existing Code
      →瀏覽(Brows)並選擇資料夾 C:\px4\Firmware
      →在"Toolchain for Indexer Setting" 中選擇"Cross GCC"後按結束。
      本範例使用路徑為D:\
    5. 在Eclipse環境右方視窗中選擇"Make Target"標籤,選擇"Firmware"資料夾,並按下上方"New Make Target"的按鈕出現設定Make目標的視窗,在視窗中Target name中輸入目標名稱後按OK,勾選same as the target name。
    6. 重複執行上一步驟,設定下列目標(Target)名稱:
      distclean:清理所有程式,包含OS。
      archives:編譯NuttX OS。
      all:根據archives編譯自動駕駛系統全部軟體。
      clean:清理自動駕駛軟體,不包含OS。
      px4fmu-v2_default:編譯自動駕駛軟體。
      upload px4fmu-v2_default:上傳編譯後程式碼至PX4FMU v2.x 飛控板。
    7. Eclipse右方"Make Target" 視窗Firmware資料下出現上一步所建立之Make目標,雙擊滑鼠左鍵可以執行。
      依序執行 distclean→archives→all→upload px4fmu-v2_default
      註:
      若有新增使用者自定義app程式,須執行
      clean→px4fmu-v2_default→upload px4fmu-v2_default。不須重新編譯OS。
      若只是修改現有app程式,只須執行
      px4fmu-v2_default→upload px4fmu-v2_default。不須執行clean
    8. 上網下載最新Firmware程式碼。(可透過git,在此先不討論)
  3. 透過NuttShell(NSH)與飛控板OS溝通
    1. 利用USB連接電腦及Pixhawk飛控板。
    2. 開啟軟體:程式集 -> PX4 Toolchain -> TeraTerm
    3. 按Enter鍵。出現NSH> 符號。可輸入指令,按Enter執行。
  4. 參考文獻
    1. JAVA Installer 載點
    2. Toolchain Installer for Windows 載點
    3. Toolchain Installer 安裝步驟(原文)
    4. Toolchain Installer Video 影片