- 建立一個背景執行緒
- 建立應用程式入口函式(管理函式),如:
__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)
2014年8月24日 星期日
Pixhawk Autopilot 第二步 建立一個應用程式
- 檔案設定
- 若有更新OS程式碼,至少執行一次make archives
- 在Eclipse開發環境下,進入 Firmware/src/modules資料夾中,建立一個新資料夾,例如"px4_test_app",
在這個資料夾中建立一個新make檔,檔名為"module.mk"。
在module.mk中加入下列程式碼:
MODULE_COMMAND = px4_test_app
SRCS = px4_test_app.c - 撰寫程式
- 在 Firmeware/src/module/px4_test.app/ 新增C程式碼檔。例如"px4_test_app"。
Firmware
└ src
└ module
└ px4_test_app
└ module.mk
└ px4_test_app.c - 編輯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;
} - 向NuttShell註冊應用程式並編譯
- 打開 "Firmware/makefiles/" 資料夾中 "config_px4fmu-v2_default.mk" 文件。
- 在文件中新增一行程式碼:
MODULES += moudles/px4_test_app - 編譯程式碼:執行 clean → px4fmu-v2_defualt。如果沒有註冊新應用程式,只須執行px4fmu-v2_defualt。
- 上傳:執行 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. - 執行應用程式
開啟TeraTerm,NSH> 下輸入 px4_test_app。
註:此範例程式可參考 px4\Firmware\src\example\px4_simple_app資料夾下。完整程式請參考範例。
Pixhawk Autopilot 第一步 安裝及設定開發環境
- 安裝
- 更新JAVA:第7版第65次更新以上的版本。
- 安裝PX4 Toolchain for Windows。
備註:作業系統 Windows 7 - 設定
- 取得起始程式碼:選擇"程式集 -> PX4 Toolchain -> PX4 Software Download"。
備註:程式將在預設路徑建立下列資料夾:
C:\px4
└ Firmware:PX4 所有模組的韌體(可新增程式的地方),NuttX RTOS(不須更動)。
└ libopencm3:Cortex M4 晶片的函式庫,Bootloader用。(不須更動)
└ Bootloader:(不須更動) - 第一次啟動:"程式集 -> PX4 Toolchain -> PX4 Eclipse"。
- 設定工作磁碟區:使用預設路徑C:\px4\workspace。
- 設定專案(匯入專案Import):Flie -> New -> Makefile Project with Existing Code
→瀏覽(Brows)並選擇資料夾 C:\px4\Firmware
→在"Toolchain for Indexer Setting" 中選擇"Cross GCC"後按結束。本範例使用路徑為D:\ - 在Eclipse環境右方視窗中選擇"Make Target"標籤,選擇"Firmware"資料夾,並按下上方"New Make Target"的按鈕出現設定Make目標的視窗,在視窗中Target name中輸入目標名稱後按OK,勾選same as the target name。
- 重複執行上一步驟,設定下列目標(Target)名稱:
distclean:清理所有程式,包含OS。
archives:編譯NuttX OS。
all:根據archives編譯自動駕駛系統全部軟體。
clean:清理自動駕駛軟體,不包含OS。
px4fmu-v2_default:編譯自動駕駛軟體。
upload px4fmu-v2_default:上傳編譯後程式碼至PX4FMU v2.x 飛控板。 - 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 - 上網下載最新Firmware程式碼。(可透過git,在此先不討論)
- 透過NuttShell(NSH)與飛控板OS溝通
- 利用USB連接電腦及Pixhawk飛控板。
- 開啟軟體:程式集 -> PX4 Toolchain -> TeraTerm。
- 按Enter鍵。出現NSH> 符號。可輸入指令,按Enter執行。
- 參考文獻
訂閱:
文章 (Atom)