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

注:
* 此處可能會因網(wǎng)絡(luò)原因造成卡頓,請耐心等待。
* 如果實在要在gitHub網(wǎng)頁上下載,也要把整個倉庫下載下來,不能單獨下載本實例對應(yīng)的目錄。
2.2 開發(fā)環(huán)境搭建
通過adb shell進入板卡開發(fā)環(huán)境,如下圖所示。

通過以下命令,把nfs目錄掛載上nfs服務(wù)器。
mount -t nfs -o nolock : /home/orin-nano/Desktop/nfs/

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

2.4 例程運行及效果
執(zhí)行下方命令,運行示例程序:
./Release/test-thread-opt
執(zhí)行效果如下所示。

API的詳細說明,以及API的調(diào)用(本例程源碼),詳細信息見下方說明。
3. 時間操作API說明
3.1 引用方式
EASY EAI api庫位于本倉庫的easyeai-api目錄中。為方便客戶在本地工程中直接調(diào)用我們的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 |
| 庫文件目錄 | 無 | 無 |
| 庫鏈接參數(shù) | ${SYSTEM_OPT_LIBS} | 無 |
API源代碼路徑為EASY-EAI-Toolkit-3576/easyeai-api/common/system_opt/。用戶可通過源代碼了解接口實現(xiàn),甚至可對源碼進行修改。
3.2 線程任務(wù)原型
線程任務(wù)原型如下所示,線程任務(wù)是程序執(zhí)行的最小單體,定義如下所示。
typedef void *(*ThreadEntryPtrType)(void *);
3.3 創(chuàng)建線程函數(shù)
創(chuàng)建線程函數(shù)原型如下所示。
int32_t CreateNormalThread(ThreadEntryPtrType entry, void *para, pthread_t *pid);
原型如下所示。
| 函數(shù)名:CreateNormalThread() | |
| 頭文件 | easyeai-api/common/system_opt/system_opt.h |
| 輸入?yún)?shù) | entry:線程體執(zhí)行函數(shù) |
| para:傳入線程提的參數(shù),用作共享變量 | |
| pid:傳入新建的pthread_t類型對象 | |
| 返回值 | 創(chuàng)建失敗返回-1 |
| 創(chuàng)建成功返回0 | |
| 注意事項 | pid變量用于存放線程系統(tǒng)分配的線程號,如果填NULL會導(dǎo)致程序退出 |
3.4 執(zhí)行shell命令 - 調(diào)用system()
執(zhí)行shell命令函數(shù)原型如下所示。
int32_t exec_cmd_by_system(const char *cmd);
本函數(shù)通過調(diào)用system()實現(xiàn),原型如下所示。
| 函數(shù)名:exec_cmd_by_system() | |
| 頭文件 | easyeai-api/common/system_opt/system_opt.h |
| 輸入?yún)?shù) | *cmd:shell命令 |
| 返回值 | 對于fork失敗,system()函數(shù)返回-1。如果exec執(zhí)行成功,也即command順利執(zhí)行完畢,則返回command通過exit或return返回的值。 |
| 注意事項 |
建議監(jiān)控一下system()函數(shù)的執(zhí)行完畢后的errno值,爭取出錯時給出更多有用信息; system()非阻塞方式注意點:’&’轉(zhuǎn)后臺,同時將輸出重定向。否則變?yōu)樽枞绞剑?/td> |
3.5 執(zhí)行shell命令 - 調(diào)用popen()
執(zhí)行shell命令函數(shù)原型如下所示。
int32_t exec_cmd_by_popen(const char *cmd, char *result);
本函數(shù)通過調(diào)用popen()實現(xiàn),可獲取執(zhí)行結(jié)果,原型如下所示。
| 函數(shù)名:exec_cmd_by_popen() | |
| 頭文件 | easyeai-api/common/system_opt/system_opt.h |
| 輸入?yún)?shù) | *cmd:shell命令 |
| *result:執(zhí)行shell命令語句后,返回的結(jié)果將存進該段內(nèi)存中 | |
| 返回值 | 調(diào)用失敗返回-1 |
| 調(diào)用成功返回0(result被正確寫入) | |
| 注意事項 |
如果 cmd 執(zhí)行失敗,子進程會把錯誤信息打印到標(biāo)準(zhǔn)錯誤輸出,父進程就無法獲取。 若需要捕獲錯誤信息,可以重定向子進程的錯誤輸出,讓錯誤輸出重定向到標(biāo)準(zhǔn)輸出(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,線程創(chuàng)建案例由兩部分組成,線程執(zhí)行主體和創(chuàng)建線程操作。
線程執(zhí)行主體如下所示。
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);
}
創(chuàng)建線程操作如下所示,pId變量用于存放進程ID,share_para變量是保存輸入?yún)?shù)。
pthread_t pId;
int share_para = 0;
if(0 == CreateNormalThread(testThreadBody, &share_para, &pId)){
while(1){
printf("[mainThread] --- n");
share_para++;
sleep(1);
}
}
審核編輯 黃宇
-
單片機
+關(guān)注
關(guān)注
6078文章
45562瀏覽量
672985 -
操作系統(tǒng)
+關(guān)注
關(guān)注
37文章
7426瀏覽量
129571 -
源碼
+關(guān)注
關(guān)注
8文章
689瀏覽量
31437 -
rk3576
+關(guān)注
關(guān)注
1文章
288瀏覽量
1663
發(fā)布評論請先 登錄
米爾RK3576和RK3588怎么選?-看這篇就夠了
【米爾RK3576開發(fā)板評測】+項目名稱值得購買的米爾RK3576開發(fā)板
探索 RK3576 方案:卓越性能與靈活框架,誠邀開發(fā)定制合作!
RK3576 vs RK3588:為何越來越多的開發(fā)者轉(zhuǎn)向RK3576?
Mpp支持RK3576么
【作品合集】米爾RK3576開發(fā)板測評
【作品合集】靈眸科技EASY EAI Orin Nano(RK3576)開發(fā)板測評
新品體驗 | RK3576開發(fā)板
RK3576單板發(fā)布倒計時:RK3399與RK3576對比
RK3588與RK3576區(qū)別解析
瑞芯微RK3576與RK3576S有什么區(qū)別,性能參數(shù)配置與型號差異解析
迅為如何在RK3576上部署YOLOv5;基于RK3576構(gòu)建智能門禁系統(tǒng)
基于RK3576的線進程系統(tǒng)操作
評論