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

注:
* 此處可能會(huì)因網(wǎng)絡(luò)原因造成卡頓,請(qǐng)耐心等待。
* 如果實(shí)在要在gitHub網(wǎng)頁上下載,也要把整個(gè)倉庫下載下來,不能單獨(dú)下載本實(shí)例對(duì)應(yīng)的目錄。
2.2 開發(fā)環(huán)境搭建
通過adb shell進(jìn)入板卡開發(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
進(jìn)入到對(duì)應(yīng)的例程目錄執(zhí)行編譯操作,具體命令如下所示:
cd EASY-EAI-Toolkit-3576/Demos/common-system_opt/ ./build.sh

2.4 例程運(yùn)行及效果
執(zhí)行下方命令,運(yùn)行示例程序:
./Release/test-thread-opt
執(zhí)行效果如下所示。
API的詳細(xì)說明,以及API的調(diào)用(本例程源碼),詳細(xì)信息見下方說明。
3. 時(shí)間操作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/。用戶可通過源代碼了解接口實(shí)現(xiàn),甚至可對(duì)源碼進(jì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類型對(duì)象 | |
返回值 | 創(chuàng)建失敗返回-1 |
創(chuàng)建成功返回0 | |
注意事項(xiàng) | pid變量用于存放線程系統(tǒng)分配的線程號(hào),如果填NULL會(huì)導(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()實(shí)現(xiàn),原型如下所示。
函數(shù)名:exec_cmd_by_system() | |
頭文件 | easyeai-api/common/system_opt/system_opt.h |
輸入?yún)?shù) | *cmd:shell命令 |
返回值 | 對(duì)于fork失敗,system()函數(shù)返回-1。如果exec執(zhí)行成功,也即command順利執(zhí)行完畢,則返回command通過exit或return返回的值。 |
注意事項(xiàng) |
建議監(jiān)控一下system()函數(shù)的執(zhí)行完畢后的errno值,爭(zhēng)取出錯(cuò)時(shí)給出更多有用信息; system()非阻塞方式注意點(diǎn):’&’轉(zhuǎn)后臺(tái),同時(shí)將輸出重定向。否則變?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()實(shí)現(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é)果將存進(jìn)該段內(nèi)存中 | |
返回值 | 調(diào)用失敗返回-1 |
調(diào)用成功返回0(result被正確寫入) | |
注意事項(xiàng) |
如果 cmd 執(zhí)行失敗,子進(jìn)程會(huì)把錯(cuò)誤信息打印到標(biāo)準(zhǔn)錯(cuò)誤輸出,父進(jìn)程就無法獲取。 若需要捕獲錯(cuò)誤信息,可以重定向子進(jìn)程的錯(cuò)誤輸出,讓錯(cuò)誤輸出重定向到標(biāo)準(zhǔn)輸出(2>&1),這樣父進(jìn)程就可以捕獲子進(jìn)程的錯(cuò)誤信息了。 如: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變量用于存放進(jìn)程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); } } 審核編輯 黃宇
-
單片機(jī)
+關(guān)注
關(guān)注
6067文章
44992瀏覽量
650591 -
操作系統(tǒng)
+關(guān)注
關(guān)注
37文章
7152瀏覽量
125610 -
源碼
+關(guān)注
關(guān)注
8文章
671瀏覽量
30348 -
rk3576
+關(guān)注
關(guān)注
1文章
175瀏覽量
733
發(fā)布評(píng)論請(qǐng)先 登錄
【米爾RK3576開發(fā)板評(píng)測(cè)】+項(xiàng)目名稱【米爾RK3576開發(fā)板評(píng)測(cè)】一個(gè)視頻和你共同認(rèn)識(shí)一下米爾RK3576開發(fā)板
米爾RK3576和RK3588怎么選?-看這篇就夠了
【米爾RK3576開發(fā)板評(píng)測(cè)】+項(xiàng)目名稱值得購買的米爾RK3576開發(fā)板
探索 RK3576 方案:卓越性能與靈活框架,誠(chéng)邀開發(fā)定制合作!
適配多種系統(tǒng),米爾瑞芯微RK3576核心板解鎖多樣化應(yīng)用
RK3576 vs RK3588:為何越來越多的開發(fā)者轉(zhuǎn)向RK3576?
Mpp支持RK3576么
RK這2款旗艦芯片RK3588 PK RK3576,誰是最優(yōu)選
新品體驗(yàn) | RK3576開發(fā)板

米爾RK3576開發(fā)板特惠活動(dòng)!

RK3576單板發(fā)布倒計(jì)時(shí):RK3399與RK3576對(duì)比

RK3588與RK3576區(qū)別解析

評(píng)論