1. 多線程介紹
進程線程概念是操作系統與普通單片機最大的區別,多任務系統可以將系統資源分塊,使得不同任務相互獨立運行,且在宏觀層面觀察,多個應用像同一時間運行一樣,例如瀏覽網頁的同時,也可以播放音樂,這就是引入進程線程的關鍵點。
2. 快速上手
如果您初次閱讀此文檔,請閱讀:《入門指南/源碼管理及編程介紹/源碼工程管理》,按需管理自己工程源碼(注:此文檔必看,并建議采用【遠程掛載管理】方式,否則有代碼丟失風險?。。。?。
2.1 源碼工程下載
先在PC虛擬機定位到nfs服務目錄,再在目錄中創建存放源碼倉庫的管理目錄:
cd ~/nfsroot mkdir GitHub cd GitHub
再通過git工具,在管理目錄內克隆遠程倉庫(需要設備能對外網進行訪問)
git clone https://github.com/EASY-EAI/EASY-EAI-Toolkit-3576.git

注:
* 此處可能會因網絡原因造成卡頓,請耐心等待。
* 如果實在要在gitHub網頁上下載,也要把整個倉庫下載下來,不能單獨下載本實例對應的目錄。
2.2 開發環境搭建
通過adb shell進入板卡開發環境,如下圖所示。
通過以下命令,把nfs目錄掛載上nfs服務器。
mount -t nfs -o nolock : /home/orin-nano/Desktop/nfs/

2.3 例程編譯
然后定位到nfs的掛載目錄,再在目錄中創建存放源碼倉庫的管理目錄:
cd /home/orin-nano/Desktop/nfs/GitHub
進入到對應的例程目錄執行編譯操作,具體命令如下所示:
cd EASY-EAI-Toolkit-3576/Demos/common-system_opt/ ./build.sh

2.4 例程運行及效果
執行下方命令,運行示例程序:
./Release/test-thread-opt
執行效果如下所示。
API的詳細說明,以及API的調用(本例程源碼),詳細信息見下方說明。
3. 時間操作API說明
3.1 引用方式
EASY EAI api庫位于本倉庫的easyeai-api目錄中。為方便客戶在本地工程中直接調用我們的EASY EAI api庫,此處列出工程中需要鏈接的庫以及頭文件等,方便用戶直接添加。
描述 | CMake寫法 | Makefile寫法 |
api.cmake | ${common_root}/system_opt/api.cmake | 無 |
頭文件目錄 | ${SYSTEM_OPT_INCLUDE_DIRS} | -I ../../easyeai-api/common/system_opt |
源文件目錄 | ${SYSTEM_OPT_SOURCE_DIRS} | ../../easyeai-api/common/system_opt |
庫文件目錄 | 無 | 無 |
庫鏈接參數 | ${SYSTEM_OPT_LIBS} | 無 |
API源代碼路徑為EASY-EAI-Toolkit-3576/easyeai-api/common/system_opt/。用戶可通過源代碼了解接口實現,甚至可對源碼進行修改。
3.2 線程任務原型
線程任務原型如下所示,線程任務是程序執行的最小單體,定義如下所示。
typedef void *(*ThreadEntryPtrType)(void *);
3.3 創建線程函數
創建線程函數原型如下所示。
int32_t CreateNormalThread(ThreadEntryPtrType entry, void *para, pthread_t *pid);
原型如下所示。
函數名:CreateNormalThread() | |
頭文件 | easyeai-api/common/system_opt/system_opt.h |
輸入參數 | entry:線程體執行函數 |
para:傳入線程提的參數,用作共享變量 | |
pid:傳入新建的pthread_t類型對象 | |
返回值 | 創建失敗返回-1 |
創建成功返回0 | |
注意事項 | pid變量用于存放線程系統分配的線程號,如果填NULL會導致程序退出 |
3.4 執行shell命令 - 調用system()
執行shell命令函數原型如下所示。
int32_t exec_cmd_by_system(const char *cmd);
本函數通過調用system()實現,原型如下所示。
函數名:exec_cmd_by_system() | |
頭文件 | easyeai-api/common/system_opt/system_opt.h |
輸入參數 | *cmd:shell命令 |
返回值 | 對于fork失敗,system()函數返回-1。如果exec執行成功,也即command順利執行完畢,則返回command通過exit或return返回的值。 |
注意事項 |
建議監控一下system()函數的執行完畢后的errno值,爭取出錯時給出更多有用信息; system()非阻塞方式注意點:’&’轉后臺,同時將輸出重定向。否則變為阻塞方式; |
3.5 執行shell命令 - 調用popen()
執行shell命令函數原型如下所示。
int32_t exec_cmd_by_popen(const char *cmd, char *result);
本函數通過調用popen()實現,可獲取執行結果,原型如下所示。
函數名:exec_cmd_by_popen() | |
頭文件 | easyeai-api/common/system_opt/system_opt.h |
輸入參數 | *cmd:shell命令 |
*result:執行shell命令語句后,返回的結果將存進該段內存中 | |
返回值 | 調用失敗返回-1 |
調用成功返回0(result被正確寫入) | |
注意事項 |
如果 cmd 執行失敗,子進程會把錯誤信息打印到標準錯誤輸出,父進程就無法獲取。 若需要捕獲錯誤信息,可以重定向子進程的錯誤輸出,讓錯誤輸出重定向到標準輸出(2>&1),這樣父進程就可以捕獲子進程的錯誤信息了。 如:exec_cmd_by_popen("ls 2>&1", result); |
4. 線程操作API使用案例
線程操作API使用案例代碼路徑為:
EASY-EAI-Toolkit-3576/Demos/common-system_opt/test-thread-opt.c,線程創建案例由兩部分組成,線程執行主體和創建線程操作。
線程執行主體如下所示。
void *testThreadBody(void *arg) { int *share_para = (int *)arg; while(1) { printf("[tesThread] --- share_para = %dn", *share_para); if(*share_para > 10){ printf("[tesThread] --- exitn"); break; } sleep(1); } pthread_exit(NULL); }
創建線程操作如下所示,pId變量用于存放進程ID,share_para變量是保存輸入參數。
pthread_t pId; int share_para = 0; if(0 == CreateNormalThread(testThreadBody, &share_para, &pId)){ while(1){ printf("[mainThread] --- n"); share_para++; sleep(1); } } 審核編輯 黃宇
-
單片機
+關注
關注
6067文章
44989瀏覽量
650348 -
操作系統
+關注
關注
37文章
7147瀏覽量
125572 -
源碼
+關注
關注
8文章
671瀏覽量
30323 -
rk3576
+關注
關注
1文章
173瀏覽量
719
發布評論請先 登錄
【米爾RK3576開發板評測】+項目名稱【米爾RK3576開發板評測】一個視頻和你共同認識一下米爾RK3576開發板
米爾RK3576和RK3588怎么選?-看這篇就夠了
【米爾RK3576開發板評測】+項目名稱值得購買的米爾RK3576開發板
探索 RK3576 方案:卓越性能與靈活框架,誠邀開發定制合作!
適配多種系統,米爾瑞芯微RK3576核心板解鎖多樣化應用
RK3576 vs RK3588:為何越來越多的開發者轉向RK3576?
Mpp支持RK3576么
RK這2款旗艦芯片RK3588 PK RK3576,誰是最優選
新品體驗 | RK3576開發板

米爾RK3576開發板特惠活動!

RK3576單板發布倒計時:RK3399與RK3576對比

RK3588與RK3576區別解析

評論