wordpress 調(diào)用分類目錄描述金華seo扣費(fèi)
第三篇 環(huán)境搭建及開發(fā)板操作
文章目錄
- 第三篇 環(huán)境搭建及開發(fā)板操作
- 1.配置VMware使用橋接網(wǎng)卡
- 1.1 vmware設(shè)置
- 1.2 虛擬網(wǎng)絡(luò)編輯器設(shè)置
- 2.安裝軟件
- 2.2 安裝 Windows 軟件
- 2.3 使用MobaXterm遠(yuǎn)程登錄Ubuntu
- 2.4 使用FileZilla在Windows和Ubuntu之間傳文件
- 2.5編程示例:Ubuntu上的Hello程序
- 2.5.1 用Source Insight編寫hello.c
- 2.5.2 用FileZilla上傳源碼
- 1.1.1 編譯、運(yùn)行程序
- 3.DongshanPI-Vision開發(fā)板基本操作
- 3.1 DongshanPI-Vision開發(fā)板硬件資源簡介
- 3.2 DongshanPI-Vision開發(fā)板軟件資源介紹
- 3.2.1 開發(fā)開發(fā)環(huán)境
- 3.2.2 核心軟件
- 3.2.3 文件系統(tǒng)
- 3.3 啟動(dòng)方式選擇
- 3.4 開發(fā)板硬件連接
- 3.4.1 天線連接
- 3.4.2 連接攝像頭
- 3.4.3 連接顯示屏
- 3.4.4串口及OTG連接
- 3.5 查看串口端口號(hào)
- 3.6 使用MobaXterm軟件打開串口
- 3.7 通過串口操作開發(fā)板
- 3.8 開機(jī)自啟應(yīng)用程序
- 3.9 更新系統(tǒng)
- 3.9.1 更新EMMC系統(tǒng)
- 3.9.1.1 硬件操作
- 3.9.1.2 安裝串口驅(qū)動(dòng)
- 3.9.1.3 燒錄鏡像
- 3.9.1.4 安裝燒錄驅(qū)動(dòng)
- 3.9.1.5 完整燒錄鏡像
- 3.9.1.6 啟動(dòng)EMMC系統(tǒng)
- 3.9.2 制作SD卡鏡像
- 3.9.2.1 格式化microSD卡
- 3.9.2.2 使用Etcher燒錄鏡像
- 3.9.2.3 啟動(dòng)SD卡系統(tǒng)
- 3.10 使用wifi連接網(wǎng)絡(luò)
- 3.10.1 結(jié)束開啟聯(lián)網(wǎng)腳本
- 3.10.2 填寫WIFI信息
- 3.10.3 連接WiFi
- 3.11 使用TFTP服務(wù)在Ubuntu和開發(fā)板傳輸文件
- 3.11.1 Ubuntu安裝TFTP服務(wù)
- 3.11.2 開發(fā)板通過tftp傳輸文件
- 3.12 配置開發(fā)板SSH功能
- 3.12.1 修改ssh配置文件
- 3.12.2 啟動(dòng)ssh
- 3.12.3 連接ssh
- 3.12.4 使用MobaXterm傳輸文件
- 4.系統(tǒng)功能及AI應(yīng)用初體驗(yàn)
- 4.1 系統(tǒng)功能體驗(yàn)指南
- 4.1.1 ai demo程序
- 4.1.2 ffmpeg
- 4.1.3 alsa_demo
- 4.1.4 TWOD demo
- 4.1.5 RTC demo
- 4.1.6 WDT demo
- 4.1.7 UART demo
- 4.1.8 ETH demo
- 4.1.9 SDMMC demo
- 4.1.10 SHA/AES demo
- 4.1.11 TRNG demo
- 4.1.12 DRM demo
- 4.1.13 V4L2_DRM demo
- 4.1.14 LVGL demo
- 4.1.15 PWM demo
- 4.1.16 WIFI demo
- 4.1.17 GPIO_KEYS demo
- 4.2 AI應(yīng)用體驗(yàn)指南
- 4.2.1人臉對齊
- 4.2.2人臉檢測
- 人臉檢測器-bf16
- 人臉檢測器-uint8
- 4.2.3人臉表情識(shí)別
- 4.2.4人臉關(guān)鍵點(diǎn)檢測
- 4.2.5人臉識(shí)別
- 5.2.6人形檢測
- 人體關(guān)鍵點(diǎn)檢測-openpose
- 人體關(guān)鍵點(diǎn)檢測-YOLOV5S
- 4.2.7指尖指定區(qū)域識(shí)別
- 4.2.8頭部態(tài)角估計(jì)
- 4.2.9車牌識(shí)別
- 4.2.10YOLOV5目標(biāo)檢測
- YOLOV5目標(biāo)檢測-bf16
- YOLOV5目標(biāo)檢測-uint8
- 4.2.11自學(xué)習(xí)KNN算法
- 5.編寫一個(gè)簡單的helloword程序
- 5.1 編寫helloword應(yīng)用程序
- 5.2.編寫Makefile編譯規(guī)則
- 5.3 交叉編譯hellowrod程序
- 5.2 上傳程序到開發(fā)板上運(yùn)行
- 6.編譯一個(gè)簡單的AI demo程序
- 6.1 編譯hello AI的demo程序
- 6.2 上傳程序到開發(fā)板運(yùn)行
- 6.3 hello AI程序講解
- 6.3.1 程序框架
- 6.3.2 程序講解
- 7.嵌入式開發(fā)
- 7.1編譯工具鏈
- 7.2 交叉編譯工具鏈
- 7.3 獲得合適的交叉編譯工具鏈
- 7.4 Makefile構(gòu)建工具
- 7. 5 CMake構(gòu)建工具
1.配置VMware使用橋接網(wǎng)卡
1.1 vmware設(shè)置
? 使用橋接模式下,虛擬主機(jī)與真實(shí)主要在VMnet0構(gòu)成的局域網(wǎng)內(nèi)通信,同時(shí)通過真實(shí)主機(jī)中的網(wǎng)關(guān)與外網(wǎng)通信,即可實(shí)現(xiàn)Ubuntu與開發(fā)板進(jìn)行文件傳輸。
設(shè)置網(wǎng)絡(luò)適配器為橋接模式。
點(diǎn)擊網(wǎng)絡(luò)適配器 NAT,將網(wǎng)絡(luò)連接方式選擇為橋接模式。
1.2 虛擬網(wǎng)絡(luò)編輯器設(shè)置
在開始菜單搜索“虛擬網(wǎng)絡(luò)編輯器”,點(diǎn)擊“以管理員身份運(yùn)行”打開虛擬網(wǎng)絡(luò)編輯器:
參考圖 1.4,點(diǎn)擊“VMnet0”,選擇“橋接模式”,在橋接模式下的“已橋接至”下拉框中,選中你電腦中實(shí)際使用WIFI網(wǎng)卡,最后點(diǎn)擊確定即可完成vmware配置。
注意:必須是“VMnet0”,如果沒有“VMnet0”可以點(diǎn)擊“添加網(wǎng)絡(luò)”。
2.安裝軟件
2.2 安裝 Windows 軟件
“<開發(fā)板配套資料>\2_DongshanPI-Vision_配套工具\(yùn)”
在網(wǎng)盤資料包的上述目錄中,可以得到一系列的安裝軟件,建議全部安裝。有如下軟件:
軟件名 | 說明 |
---|---|
VMwareWorkstation | 虛擬機(jī)軟件,安裝時(shí)需要用到管理員權(quán)限 |
SD Card Formatter | SD卡格式化工具 |
MobaXterm | 串口工具、遠(yuǎn)程登錄工具 |
Filezilla | 文件傳輸工具,在Windows和Ubuntu之間傳輸文件 |
Source insight | 閱讀、編寫源碼的工具,即裝即用;推薦初學(xué)者使用 |
2.3 使用MobaXterm遠(yuǎn)程登錄Ubuntu
先確認(rèn)Ubuntu的IP,在Ubuntu終端執(zhí)行ifconfig
命令確定橋接網(wǎng)卡IP(注意:這個(gè)IP過一段時(shí)間會(huì)發(fā)生變化,那就使用新IP重新連接),如圖 2.3所示:
安裝、運(yùn)行MobaXterm,如下建立Session:
按圖 2.4操作后,在MobaXterm左側(cè)就可以看到圖 2.5這項(xiàng),雙擊它就可以登錄Ubuntu(第1次登錄時(shí)會(huì)提示你輸入密碼,密碼是ubuntu),然后就可以執(zhí)行各種Linux命令了:
2.4 使用FileZilla在Windows和Ubuntu之間傳文件
使用MobaXterm既可以ssh登錄又可以傳輸文件,不過Mobaxterm在傳輸文件時(shí)使用效率上沒有 FileZilla高,所以我們推薦Windows和Ubuntu互相傳輸文件時(shí)使用FileZilla。
雙擊打開FileZilla后,按圖 2.6操作:
第1次連接時(shí),會(huì)有如圖 2.7所示的提示,選擇“總是信任”:
在Filezilla中,左邊是Windows文件,右邊是Ubuntu的文件,如圖 2.8:
2.5編程示例:Ubuntu上的Hello程序
本節(jié)演示如何在Windows編寫程序、上傳到Ubuntu,在Ubuntu中編譯、執(zhí)行。只涉及一個(gè)簡單的Hello程序,使用命令行編譯,不涉及Makefile等知識(shí),這些知識(shí)在后面的應(yīng)用基礎(chǔ)中講解。
2.5.1 用Source Insight編寫hello.c
啟動(dòng)Source Insight,點(diǎn)擊“File”->“New”,新建文件,如圖 2.9:
接下來編寫代碼,保存文件,如圖 2.10所示:
圖 2.10 SI編寫代碼并保存
hello.c的源碼如下:
#include <stdio.h>
int main(int argc, char **argv)
{printf("hello, world!\n");return 0;
}
2.5.2 用FileZilla上傳源碼
如圖 2.11操作:
1.1.1 編譯、運(yùn)行程序
如圖 2.12操作,對于gcc命令的用法在后面講到應(yīng)用開發(fā)基礎(chǔ)時(shí)再細(xì)講,這里只是體驗(yàn)一下:
3.DongshanPI-Vision開發(fā)板基本操作
3.1 DongshanPI-Vision開發(fā)板硬件資源簡介
? DongshanPI-Vision開發(fā)板是圍繞著嘉楠 勘智K510芯片構(gòu)建的,采用64位雙核RISC-V架構(gòu) ,主頻為:800MHz,支持雙精度FPU擴(kuò)展。采用64位DSP擴(kuò)展,主頻為:800MHz。芯片內(nèi)置通用神經(jīng)網(wǎng)絡(luò)引擎KPU,擁有2.5TFLOPS BF16/2.5TOPS INT8算力,支持TensorFlow、PyTorch、ONNX等多種框架的算子庫。
特征 | 描述 |
---|---|
處理器 | 嘉楠 勘智K510 |
內(nèi)存 | 512MB LPDDR3 |
存儲(chǔ) | 4GB EMMC |
WIFI/藍(lán)牙 | 天線:2.4GHz |
視頻輸出 | MIPI顯示(MIPI DSI)/HDMI顯示(HDMI)/SPI顯示(SPI DSI) |
視頻輸入 | 兩路MIPI攝像頭(MIPI CSI *2)/DVP攝像頭(DVP Canera) |
音頻輸入 | MIC咪頭 |
音頻輸出 | 揚(yáng)聲器/耳機(jī) |
其他連接器 | ·TF卡槽 ·2個(gè)USB連接器 · JTAG調(diào)試口 ·電池接口 |
開發(fā)板組成位置
? 本章節(jié)介紹開發(fā)板中關(guān)鍵的元器件及位置功能介紹如下所示,各個(gè)標(biāo)號(hào)對應(yīng)的硬件在板子上都寫有名字。
開發(fā)板正面圖:
開發(fā)板背面圖:
3.2 DongshanPI-Vision開發(fā)板軟件資源介紹
3.2.1 開發(fā)開發(fā)環(huán)境
3.2.2 核心軟件
3.2.3 文件系統(tǒng)
3.3 啟動(dòng)方式選擇
板子上的撥碼開關(guān)用來設(shè)置啟動(dòng)方式,支持這3種方式:EMMC啟動(dòng)、SD卡啟動(dòng)、串口燒寫。啟動(dòng)方式如表3-1所示:
BOOT MODEL | SW1(BOOT0) | SW2(BOOT1) |
---|---|---|
EMMC | OFF | OFF |
SD | OFF | ON |
串口燒錄 | ON | ON |
這3種啟動(dòng)方式的設(shè)置示意圖 3.7如下:
注意:設(shè)置為串口燒錄時(shí),不能插上SD卡、TF卡;上電之后才可以插卡。剛出廠的板子在EMMC上燒寫了系統(tǒng),你可以設(shè)置為EMMC啟動(dòng)方式。
3.4 開發(fā)板硬件連接
3.4.1 天線連接
要使用WIFI,您需要連接DongshanPI-Vision盒子中提供的2.4GHz天線,下面是將天線連接到DongshanPI-Vision開發(fā)板的指南。
3.4.2 連接攝像頭
? 要使用攝像頭獲取圖像數(shù)據(jù),如果您只單獨(dú)購買了DongshanPI-Vision開發(fā)板,可能還需另外購買MIPI攝像頭。下面圖片是將MIPI攝像頭連接到DongshanPI-Vision開發(fā)板的指南。
3.4.3 連接顯示屏
? 要使用顯示屏顯示攝像頭獲取的圖像,如果您只單獨(dú)購買了DongshanPI-Vision開發(fā)板,可能還需另外購買MIPI顯示屏,或者也可直接使用HDMI線連接電腦顯示器。下面是將MIPI顯示屏連接到DongshanPI-Vision開發(fā)板的指南。
3.4.4串口及OTG連接
? 通過Type-C線將板連接到PC電腦,您可以使用DongshanPI-Vision盒子中的的兩條Type-C線。連接指南如下所示:
注意:請直接將兩條數(shù)據(jù)線連接到電腦端,請勿使用USB HUB連接兩條Type-C數(shù)據(jù)線。如果您的電腦沒有多余的USB口,可使用5V1A的電源適配器,連接到OTG口進(jìn)行供電。
一旦開發(fā)板套件通電后,核心板上會(huì)亮起紅燈,紅燈位置如下圖中藍(lán)色箭頭所示:
3.5 查看串口端口號(hào)
? 在接好串口處的Type-C數(shù)據(jù)線連接電腦和開發(fā)板后,打開電腦的設(shè)備管理器,并展開端口(COM和LPT)列表??梢钥吹较聢D中,連接后的端口號(hào)為COM37。開發(fā)板上的USB串口芯片可能是CP210x或CH9102,它們的性能是一樣的。你電腦上顯示的COM序號(hào)可能不一樣,記住你電腦顯示的數(shù)字。
如果電腦沒有顯示出端口號(hào),就需要手動(dòng)安裝驅(qū)動(dòng),已經(jīng)將驅(qū)動(dòng)安裝包放入網(wǎng)盤資料中了:
圖 3.10 USB串口驅(qū)動(dòng)
如果電腦中沒有自動(dòng)安裝驅(qū)動(dòng),在“設(shè)備管理器”會(huì)有黃色感嘆號(hào)提示當(dāng)前連接的是哪種類型的串口芯片,根據(jù)提示選擇驅(qū)動(dòng)安裝。如果提示中有“CP210x”字樣則選擇“CP210x_Windows_Drivers.zip”,否則就選擇另外一個(gè)驅(qū)動(dòng)安裝。
3.6 使用MobaXterm軟件打開串口
? 打開MobaXterm,點(diǎn)擊左上角的“Session”,在彈出的界面選中“Serial”,如下圖所示選擇端口號(hào)(前面設(shè)備管理器顯示的端口號(hào)COM17或COM19)、波特率(Speed 115200)、流控(Flow Control: none),最后點(diǎn)擊“OK”即可。步驟如圖 3.11所示。
注意:流控(Flow Control)一定要選擇none,否則你將無法在MobaXterm中向串口輸入數(shù)據(jù)。
隨后顯示一個(gè)黑色的窗口, 此時(shí)打開板子的電源開關(guān),將收到板子串口發(fā)過來的數(shù)據(jù),如圖 3.12所示。
4.進(jìn)入串口調(diào)試控制臺(tái)后,如果開發(fā)板正在啟動(dòng)uboot或者kernel則會(huì)不斷打印輸出信息直到系統(tǒng)完全啟動(dòng),如果開發(fā)板已經(jīng)完全啟動(dòng)則不會(huì)打印信息,可直接按下回車鍵,進(jìn)入開發(fā)板系統(tǒng)控制臺(tái)。
3.7 通過串口操作開發(fā)板
在串口看到root@canaan
這類登錄的提示信息時(shí),輸入回車即可,然后就可以執(zhí)行各種Linux命令了,如圖 3.14所示:
3.8 開機(jī)自啟應(yīng)用程序
? 當(dāng)系統(tǒng)啟動(dòng)后,如果您正常連接兩個(gè)攝像頭和顯示屏,系統(tǒng)會(huì)在uboot系統(tǒng)啟動(dòng)階段顯示canaan官方logo,效果圖如下所示:
當(dāng)系統(tǒng)完全啟動(dòng)后會(huì)自動(dòng)運(yùn)行實(shí)時(shí)預(yù)覽程序,使用V4L2抓取攝像頭圖像并實(shí)時(shí)顯示在顯示屏上。效果圖如下所示:
如果您想結(jié)束掉該進(jìn)程或者想運(yùn)行其他需要使用攝像頭和顯示屏的程序,您可以通過在串口終端控制臺(tái)輸入ps
查看所以進(jìn)程,并找到進(jìn)程名.為v4l2_drm.out所對對應(yīng)的進(jìn)程號(hào),如下所示:
188 root 0:00 ./v4l2_drm.out -f video_drm_1920x1080.conf -e 1 -s
可以看到最前面的為進(jìn)程號(hào),可能您的進(jìn)程號(hào)和我不一致,這里我的進(jìn)程號(hào)為188,此時(shí)我應(yīng)該輸入:
kill -9 188
如果您的進(jìn)程號(hào)不是188,需要將188修改為您實(shí)際的進(jìn)程號(hào)才能正常結(jié)束該應(yīng)用程序。
3.9 更新系統(tǒng)
3.9.1 更新EMMC系統(tǒng)
? 硬件要求:
- DongshanPI-Vision開發(fā)板
- Type-c數(shù)據(jù)線 x2
? 軟件要求:
- DongshanPI-Vision開發(fā)板EMMC鏡像:https://dongshanpi.cowtransfer.com/s/5482c150ff6147
- KendryteBurningTool 燒錄工具:https://dongshanpi.cowtransfer.com/s/b3709a719d2342
開始前請下載DongshanPI-Vision開發(fā)板EMMC鏡像 ,并記住它在計(jì)算機(jī)中保存的位置。
3.9.1.1 硬件操作
? 將下圖中的撥碼開關(guān)的boot0和boot1都向上撥,使開發(fā)板進(jìn)入下載模式。使用兩條Type-C線連接開發(fā)板端和電腦端,用于給開發(fā)板進(jìn)行供電和使用串口進(jìn)行燒錄EMMC系統(tǒng)。
3.9.1.2 安裝串口驅(qū)動(dòng)
- 串口驅(qū)動(dòng)安裝程序:
2_DongshanPI-Vision_配套工具/【W(wǎng)indows】串口驅(qū)動(dòng)工具
安裝前說明:每臺(tái)計(jì)算機(jī)安裝一次即可。
打開串口驅(qū)動(dòng)安裝軟件CH341SER.EXE
,打開后會(huì)進(jìn)入如下界面:
點(diǎn)擊安裝
等待安裝完成即可。
3.9.1.3 燒錄鏡像
下載EMMC鏡像并記住它在計(jì)算機(jī)中的位置。打開KendryteBurningTool 燒錄工具,進(jìn)入KendryteBurningTool\bin
目錄下,雙擊打開BurningTool.exe
,如下所示的文件。
注意:在使用KendryteBurningTool 燒錄工具時(shí)需要關(guān)閉串口軟件和虛擬機(jī),防止串口被占用。
打開BurningTool.exe
程序后會(huì)進(jìn)入如下界面:
點(diǎn)擊選擇文件,選擇下載好的EMMC鏡像。選擇完成后點(diǎn)擊保存,操作步驟如下所示:
保存后需要在串口選擇中選擇開發(fā)板的串口號(hào),當(dāng)我們將開發(fā)板和PC電腦端通過Type-C連接起來后,可以在BurningTool軟件中點(diǎn)擊紅色箭頭處查看我開發(fā)板的端口號(hào),選擇開發(fā)板的串口端口號(hào)。(我們也可以在設(shè)備管理器中確認(rèn)開發(fā)的端口號(hào))
選擇完成后,點(diǎn)擊開始燒錄燒錄。如果您不是第一次進(jìn)行燒錄,此時(shí)等待成功燒錄完成即可。如果您是第一次進(jìn)行燒錄請繼續(xù)閱讀下面的內(nèi)容。第一次燒錄步驟如下所示:
當(dāng)PC電腦首次進(jìn)行燒錄時(shí),第一個(gè)進(jìn)度條結(jié)束后,會(huì)顯示下圖中的錯(cuò)誤信息。此時(shí)需要安裝驅(qū)動(dòng)。
3.9.1.4 安裝燒錄驅(qū)動(dòng)
- zadig-2.4燒錄驅(qū)動(dòng)安裝文件:``
安裝前說明:每臺(tái)計(jì)算機(jī)安裝一次即可。
打開zadig-2.4
軟件,進(jìn)入如下界面
點(diǎn)擊Option
中的選擇List All Devices
(列出所有設(shè)備),具體操作如下所示:
上述操作完成后,可以看到在虛線框內(nèi)出現(xiàn)了設(shè)備名,我們需要切換設(shè)備為 Mass storage devices
,具體操作如下所示:
點(diǎn)擊Replace Driver
替換驅(qū)動(dòng)程序,此時(shí)會(huì)彈出一個(gè)確認(rèn)窗口,點(diǎn)擊是
。
安裝完成后會(huì)彈出以下窗口點(diǎn)擊close
到此燒錄驅(qū)動(dòng)成功安裝。
3.9.1.5 完整燒錄鏡像
? 安裝完成燒錄鏡像后,再次打開BurningTool.exe
燒錄工具軟件,按照1.3章節(jié)中的操作進(jìn)行燒錄即可。完整燒錄步驟如下所示:
3.9.1.6 啟動(dòng)EMMC系統(tǒng)
? 將下圖中的撥碼開關(guān)的boot0和boot1都向下?lián)?#xff0c;使開發(fā)板進(jìn)入EMMC啟動(dòng)模式。使用兩條Type-C線連接開發(fā)板端和電腦端,用于給開發(fā)板進(jìn)行供電和使用串口登錄開發(fā)板控制臺(tái)。
使用串口軟件查看串口控制臺(tái),成功啟動(dòng)后會(huì)進(jìn)入開發(fā)板控制臺(tái)。
3.9.2 制作SD卡鏡像
硬件要求:
- DongshanPI-Vision開發(fā)板
- microSD卡(建議最小8G)
- Type-c數(shù)據(jù)線 x2
軟件要求:
- DongshanPI-Vision開發(fā)板SD卡鏡像:https://dongshanpi.cowtransfer.com/s/bac8fbdce7c046
- SD卡格式化工具:SD Memory Card Formatter
- SD卡刷機(jī)工具:ETCHER
開始前請下載DongshanPI-Vision開發(fā)板SD卡鏡像,并記住它在計(jì)算機(jī)中保存的位置。
3.9.2.1 格式化microSD卡
將您的SD卡使用讀卡器通過USB口插入您的PC電腦,使用SD卡格式化工具SD Memory Card Formatter格式化您的SD卡。點(diǎn)擊下圖中紅框位置,開始格式化內(nèi)存卡。
點(diǎn)擊完成后會(huì)彈出下圖所示的提示框,該提示警告我們格式化將清空卡中的所有數(shù)據(jù),詢問我們是否繼續(xù),這里點(diǎn)擊是
等待格式化完成后,會(huì)彈出以下對話框,提示我們格式化后的文件系統(tǒng)為FAT32
以及內(nèi)存大小可用空間,點(diǎn)擊確定即可完成SD卡的格式化。
3.9.2.2 使用Etcher燒錄鏡像
? 使用Etcher將DongshanPI-Vision開發(fā)板SD卡鏡像寫入您的microSD卡。
? 下載Etcher燒寫工具并安裝它。啟動(dòng)Etcher應(yīng)用程序,啟動(dòng)后界面如下圖所示:
點(diǎn)擊Flash from file
,如下圖所示,點(diǎn)擊下圖紅框處。
此時(shí)會(huì)彈出文件資源管理器,選擇您剛剛下載的DongshanPI-Vision開發(fā)板SD卡鏡像。
選擇完成后會(huì),顯示下面的界面,點(diǎn)擊下圖中紅框處Select target
,選擇要寫入的目標(biāo)microSD卡。
點(diǎn)擊完成后會(huì)彈出選擇目標(biāo),此時(shí)選擇您通過讀卡器插入電腦中的microSD卡。
選擇完成后,會(huì)顯示以下界面,點(diǎn)擊Flash
后即可開始燒寫。
如下圖所示等待燒寫完成即可。
使用Etcher燒寫完成后,Windows可能會(huì)不知道如何讀取您的microSD卡,會(huì)彈出如下圖所示警告,點(diǎn)擊取消
后拔出microSD卡即可。
3.9.2.3 啟動(dòng)SD卡系統(tǒng)
? 將下圖中的撥碼開關(guān)的boot0向下?lián)芎蚥oot1向上撥,使開發(fā)板進(jìn)入SD卡啟動(dòng)模式。將SD卡插入開發(fā)板的卡槽中,步驟如下圖所示:
使用兩條Type-C線連接開發(fā)板端和電腦端,用于給開發(fā)板進(jìn)行供電和使用串口登錄開發(fā)板控制臺(tái)。
使用串口軟件查看串口控制臺(tái),成功啟動(dòng)后會(huì)進(jìn)入開發(fā)板控制臺(tái)。
3.10 使用wifi連接網(wǎng)絡(luò)
3.10.1 結(jié)束開啟聯(lián)網(wǎng)腳本
安裝啟動(dòng)開發(fā)板完成后,打開串口終端進(jìn)入開發(fā)板控制臺(tái)。由于開發(fā)板啟動(dòng)后會(huì)啟動(dòng)聯(lián)網(wǎng)腳本,我們第一次配網(wǎng)時(shí)需要手動(dòng)結(jié)束聯(lián)網(wǎng)腳本。輸入ps
,查看進(jìn)程,找到下面所示的兩個(gè)進(jìn)程。
159 root 0:00 wpa_supplicant -D nl80211 -i wlan0 -c /etc/wpa_supplicant.178 root 0:00 udhcpc -R -n -p /var/run/udhcpc.eth0.pid -i eth0 -b
通過上述信息可以發(fā)現(xiàn),我們需要手動(dòng)結(jié)束159和178這兩個(gè)進(jìn)程,您的進(jìn)程號(hào)可能和我不一致,按您開發(fā)板上世紀(jì)的進(jìn)程操作。輸入:
kill -9 <PID>
假設(shè)我使用的開發(fā)板中wpa_supplicant
和udhcpc
進(jìn)程號(hào)分別為159和178,此時(shí)我應(yīng)該輸入以下命令
kill -9 159
kill -9 178
手動(dòng)結(jié)束后使用ps
查看是否還存在對應(yīng)進(jìn)程。
3.10.2 填寫WIFI信息
修改/etc/wpa_supplicant.conf
文件,填寫wifi名稱和密碼,輸入
vi /etc/wpa_supplicant.conf
進(jìn)入vi
編輯器后會(huì)顯示以下信息
ctrl_interface=/var/run/wpa_supplicant
update_config=1
ap_scan=1
在文件末尾增加網(wǎng)絡(luò)信息
network={ssid="<wifi名稱>"psk="<密碼>"}
假設(shè)我的WiFi名稱為Programmers,密碼為123456,則實(shí)際添加的網(wǎng)絡(luò)信息為:
network={ssid="Programmers"psk="12345678"}
添加完成后保存并退出vi編輯器。
3.10.3 連接WiFi
連接到 SSID,輸入:
wpa_supplicant -B -iwlan0 -c /etc/wpa_supplicant.conf
執(zhí)行完成后,如下所示
獲取ip地址,輸入:
udhcpc -i wlan0
獲取完成后即為成功連接互聯(lián)網(wǎng)。
測試WiFi是否可以訪問互聯(lián)網(wǎng),輸入ping www.baidu.com
,輸入后如下所示:
[root@canaan ~ ]$ ping www.baidu.com
PING www.baidu.com (14.119.104.189): 56 data bytes
64 bytes from 14.119.104.189: seq=0 ttl=55 time=10.241 ms
64 bytes from 14.119.104.189: seq=1 ttl=55 time=16.292 ms
64 bytes from 14.119.104.189: seq=2 ttl=55 time=15.699 ms
64 bytes from 14.119.104.189: seq=3 ttl=55 time=12.508 ms
在后續(xù)啟動(dòng)開發(fā)板中,開發(fā)板會(huì)自動(dòng)連接到SSID,您只需要重新獲取ip地址即可訪問互聯(lián)網(wǎng)。
3.11 使用TFTP服務(wù)在Ubuntu和開發(fā)板傳輸文件
3.11.1 Ubuntu安裝TFTP服務(wù)
在Ubuntu中執(zhí)行以下命令安裝TFTP服務(wù):
sudo apt-get install tftp-hpa tftpd-hpa
然后,創(chuàng)建TFTP服務(wù)工作目錄,并打開TFTP服務(wù)配置文件,如下:
mkdir -p /home/ubuntu/tftpboot
chmod 777 /home/ubuntu/tftpboot
sudo gedit /etc/default/tftpd-hpa
在配置文件/etc/default/tftpd-hpa中,將原來的內(nèi)容刪除,修改為:
TFTP_USERNAME="tftp"
TFTP_ADDRESS=":69"
TFTP_DIRECTORY="/home/ubuntu/tftpboot"
TFTP_OPTIONS="-l -c -s"
最后,重啟TFTP服務(wù):
sudo service tftpd-hpa restart
查看tftp服務(wù)是否在運(yùn)行,運(yùn)行如下命令,即可查看是否在后臺(tái)運(yùn)行。
ubuntu@ubuntu2004:~/Desktop$ ps -aux | grep “tftp”
ubuntu 4555 0.0 0.0 9040 652 pts/0 S+ 02:33 0:00 grep --color=auto “tftp”
3.11.2 開發(fā)板通過tftp傳輸文件
首先確保Ubuntu或Windows的tftp服務(wù)目錄內(nèi),有需要下載到板子上的文件,比如:
ubuntu@ubuntu2004:~$ ls /home/ubuntu/tftpboot/
object_detect
確認(rèn)Ubuntu的網(wǎng)絡(luò)IP,例如
比如下載Ubuntu服務(wù)器下的zImage 文件,則在開發(fā)板上執(zhí)行如下命令(Ubuntu的橋接網(wǎng)卡IP是192.168.0.197):
[root@canaan ~ ]$ tftp -g -r object_detect 192.168.0.197
下載過程如下所示:
[root@canaan ~ ]$ tftp -r object_detect -g 192.168.0.197
object_detect 100% |********************************| 894k 0:00:00 ETA
下載完成后,可以在當(dāng)前目錄找到該文件
[root@canaan ~ ]$ ls
data emmc object_detect
如何從開發(fā)板上傳文件到Ubuntu?比如我們現(xiàn)在開發(fā)板家目錄下創(chuàng)建一個(gè)1.txt 的文本文件,然后寫入111111…. :
[root@100ask:~]$ tftp -p -l 1.txt 192.168.5.197
1.txt 100% |********************************| 8 0:00:00 ETA
此時(shí)我們查看Ubuntu服務(wù)器的tftp服務(wù)目錄下,即可看到之前在開發(fā)板上創(chuàng)建的1.txt:
ubuntu@ubuntu2004:~$ ls /home/ubuntu/tftpboot/
1.txt object_detect
3.12 配置開發(fā)板SSH功能
3.12.1 修改ssh配置文件
使用Mobaxterm終端工具訪問開發(fā)板的串口控制臺(tái),等待系統(tǒng)啟動(dòng)后,進(jìn)入/etc/ssh
目錄下
[root@canaan ~ ]$ cd /etc/ssh/
[root@canaan /etc/ssh ]$ ls
moduli ssh_config sshd_config
進(jìn)入ssh目錄可以看到有三個(gè)文件,您需要修改sshd_config
,使用vi命令進(jìn)行修改
[root@canaan /etc/ssh ]$ vi sshd_config
輸入后,進(jìn)入vi編輯器,修改下圖中紅框處的兩項(xiàng)。
配置SSH登錄設(shè)置
將紅框處兩項(xiàng)取消注釋,并將參數(shù)設(shè)置為yes
PermitRootLogin yes
PermitEmptyPasswords yes
修改完成后如下所示:
配置SFTP服務(wù)
修改sshd_config
中的sftp配置項(xiàng)
修改前:
Subsystem sftp /usr/libexec/sftp-server
修改后:
Subsystem sftp internal-sftp
修改完成后,按下esc
,輸入:wq
,保存并退出編輯器。
3.12.2 啟動(dòng)ssh
? 當(dāng)您修改完成配置文件后后,需要手動(dòng)重啟ssh,在終端輸入/etc/init.d/S50sshd restart
。
[root@canaan ~ ]$ /etc/init.d/S50sshd restart
Stopping sshd: killall: sshd: no process killed
OK
Starting sshd: OK
輸入完成后,ssh會(huì)重新啟動(dòng)。
3.12.3 連接ssh
開始前請注意:
- 您的PC電腦需要和開發(fā)板連接同一個(gè)WIFI。
? 在開發(fā)板串口終端輸入udhcpc -i wlan0
,獲取您的開發(fā)板連接WIFI的IP地址
[root@canaan ~ ]$ udhcpc -i wlan0
udhcpc: started, v1.31.1
udhcpc: sending discover
udhcpc: sending select for 192.168.0.154
udhcpc: lease of 192.168.0.154 obtained, lease time 122
deleting routers
adding dns 192.168.0.1
adding dns 192.168.0.1
獲取完成后,輸入ifconfig wlan0
,查看開發(fā)板所連接WIFI的IP地址
[root@canaan ~ ]$ ifconfig wlan0
wlan0 Link encap:Ethernet HWaddr 8C:F7:10:47:9B:6Einet addr:192.168.0.154 Bcast:192.168.0.255 Mask:255.255.255.0inet6 addr: fe80::8ef7:10ff:fe47:9b6e/64 Scope:LinkUP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1RX packets:438 errors:0 dropped:2 overruns:0 frame:0TX packets:21 errors:0 dropped:0 overruns:0 carrier:0collisions:0 txqueuelen:1000RX bytes:34571 (33.7 KiB) TX bytes:2446 (2.3 KiB)
可以看到wlan0選項(xiàng)中的IP地址為:192.168.0.154
3.12.4 使用MobaXterm傳輸文件
使用MobaXterm終端工具,點(diǎn)擊會(huì)話Session
,如下圖中紅框所示
點(diǎn)擊完成后會(huì)彈出以下界面,點(diǎn)擊使用SSH
,如下圖紅框所示:
進(jìn)入ssh
配置界面后,遠(yuǎn)程主機(jī)Remote host
的框輸入開發(fā)板的IP地址,勾選指定用戶名Specify username
前的框,在后面填寫開發(fā)板的用戶名root
,填寫完成后,點(diǎn)擊OK即可。如下圖所示
點(diǎn)擊完成后就會(huì)打開一個(gè)新的終端,如下圖所示:
您可以看到這里也可以訪問開發(fā)的串口終端。您可以看到左邊選項(xiàng)卡中的開發(fā)板對應(yīng)的文件系統(tǒng),例如data/emmc
,您在選項(xiàng)卡中可以對文件夾中內(nèi)容進(jìn)行下載或者上傳。如下圖所示,這里我進(jìn)入/root/emmc/p3/app/ai/exe/
目錄中,選擇face_detect
文件,單擊右鍵后彈出選項(xiàng)欄,選擇Download即可開始下載該文件。
如果您想上傳文件到當(dāng)前目錄,在左側(cè)選項(xiàng)卡的空白處,點(diǎn)擊右鍵,選擇Upload to current folder
上傳到當(dāng)前文件夾即可。
4.系統(tǒng)功能及AI應(yīng)用初體驗(yàn)
4.1 系統(tǒng)功能體驗(yàn)指南
4.1.1 ai demo程序
說明
nncase 的demo程序源碼位于SDK目錄下的package/ai
目錄,目錄結(jié)構(gòu)如下:
$ tree -L 2 ai
ai
├── ai.hash
├── ai.mk
├── code
│ ├── build.sh
│ ├── cmake
│ ├── CMakeLists.txt
│ ├── common
│ ├── face_alignment
│ ├── face_detect
│ ├── face_expression
│ ├── face_landmarks
│ ├── face_recog
│ ├── hand_image_classify
│ ├── head_pose_estimation
│ ├── imx219_0.conf
│ ├── imx219_1.conf
│ ├── license_plate_recog
│ ├── object_detect
│ ├── object_detect_demo
│ ├── openpose
│ ├── person_detect
│ ├── retinaface_mb_320
│ ├── self_learning
│ ├── shell
│ ├── simple_pose
│ ├── video_192x320.conf
│ ├── video_object_detect_320.conf
│ ├── video_object_detect_320x320.conf
│ ├── video_object_detect_432x368.conf
│ ├── video_object_detect_512.conf
│ ├── video_object_detect_640.conf
│ └── video_object_detect_640x480.conf
└── Config.in
可以參考retinaface_mb_320的源碼和CMakeLists.txt
添加新的nncase 的demo程序。
模型的編譯參見nncase_demo.mk
里面定義的POST_INSTALL_TARGET_HOOKS:
NNCASE_DEMO_DEPENDENCIES += mediactl_lib nncase_linux_runtime opencv4 libdrm
define NNCASE_DEMO_COMPILE_MODELmkdir -p $(TARGET_DIR)/app/ai/kmodel/kmodel_compile/retinaface_mb_320cd $(@D) && /usr/bin/python3 retinaface_mb_320/rf_onnx.py --quant_type uint8 --model ai_kmodel_data/model_file/retinaface/retinaface_mobile0.25_320.onnxcp $(@D)/rf.kmodel $(TARGET_DIR)/app/ai/kmodel/kmodel_compile/retinaface_mb_320/rf_uint8.kmodelcd $(@D) && /usr/bin/python3 retinaface_mb_320/rf_onnx.py --quant_type bf16 --model ai_kmodel_data/model_file/retinaface/retinaface_mobile0.25_320.onnxcp $(@D)/rf.kmodel $(TARGET_DIR)/app/ai/kmodel/kmodel_compile/retinaface_mb_320/rf_bf16.kmodelNNCASE_DEMO_POST_INSTALL_TARGET_HOOKS += NNCASE_DEMO_COMPILE_MODEL
模型的編譯需要nncase環(huán)境,關(guān)于nncase環(huán)境的搭建,參考k510_nncase_Developer_Guides.md。以后nncase有更新,buildroot sdk會(huì)同步更新到nncase。
retinaface
功能:人臉檢測,人臉特征點(diǎn)檢測
程序路徑: /app/ai/shell
運(yùn)行: 執(zhí)行非量化模型,./retinaface_mb_320_bf16.sh
執(zhí)行uint8量化模型,./retinaface_mb_320_uint8.sh
腳本里面有關(guān)于QOS的設(shè)置,下面的兩個(gè)demo的設(shè)置一樣。
#devmem phyaddr width value
devmem 0x970E00fc 32 0x0fffff00
devmem 0x970E0100 32 0x000000ff
devmem 0x970E00f4 32 0x00550000
跑demo時(shí),需要優(yōu)先保證屏幕顯示正常,即調(diào)整顯示相關(guān)的QoS為高優(yōu)先級(jí)。 QOS_CTRL0.ax25mp write QoS = 5 QOS_CTRL0.ax25mp read QoS = 5 QOS_CTRL2.ispf2k write QoS = 0xf QOS_CTRL2.ispf2k read QoS = 0xf QOS_CTRL2.ispr2k write QoS = 0xf QOS_CTRL2.ispr2k read QoS = 0xf QOS_CTRL2.isp3dtof write QoS = 0xf QOS_CTRL3.display read QoS = 0xf QOS_CTRL3.display write QoS = 0xf
QOS 控制寄存器0(QOS_CTRL0) offset[0x00f4]
QOS 控制寄存器1(QOS_CTRL1) offset[0x00f8]
QOS 控制寄存器2(QOS_CTRL2) offset[0x00fc]
QOS 控制寄存器3(QOS_CTRL3) offset[0x0100]
模型的編譯安裝詳見文件package/ai/ai.mk:
編譯腳本路徑: 100ask_base-aiApplication-demo/code/retinaface_mb_320/rf_onnx.py
object_detect
功能:物體分類檢測,80分類
程序路徑: /app/ai/shell
運(yùn)行: 執(zhí)行非量化模型,./object_detect_demo_bf16.sh
執(zhí)行uint8量化模型,./object_detect_demo_uint8.sh
模型的編譯安裝詳見文件package/ai/ai.mk
編譯腳本路徑: 100ask_base-aiApplication-demo/code/object_detect_demo/od_onnx.py
4.1.2 ffmpeg
ffmpeg
在ffmpeg-4.4
開源代碼上進(jìn)行移植,0001-buildroot-ffmpeg-0.1.patch
為補(bǔ)丁包,增加了
ff_k510_video_demuxer
:控制isp輸入,引用了libvideo.so
ff_libk510_h264_encoder
:控制h264硬件編碼,引用了libvenc.so
可以通過help指令查看可配置參數(shù)
ffmpeg -h encoder=libk510_h264 #查看k510編碼器的參數(shù)
ffmpeg -h demuxer=libk510_video #查看demuxer的配置參數(shù)
詳細(xì)運(yùn)行說明參考K510_Multimedia_Developer_Guides.md
4.1.3 alsa_demo
alsa demo程序放在/app/alsa_demo
目錄下:
運(yùn)行準(zhǔn)備:
- 插上耳機(jī)
使用ALSA UTILS測試。
4.1.4 TWOD demo
運(yùn)行 rotation 使用方法:
cd /app/twod_app
./twod-rotation-app
將ouput.yuv 拷到y(tǒng)uv顯示器上設(shè)置尺寸1080 x 1920,顯示格式nv12,結(jié)果如下
scaler 使用方法
cd /app/twod_app
./twod-scaler-app
將ouput.yuv 拷到y(tǒng)uv顯示器上設(shè)置尺寸640x480,顯示格式nv12,結(jié)果如下
運(yùn)行 rgb2yuv 使用方法:
cd /app/twod_app
./twod-osd2yuv-app
將ouput.yuv 拷到y(tǒng)uv 顯示器上設(shè)置尺寸320x240,顯示格式nv12,結(jié)果如下
運(yùn)行 yuv2rgb 使用方法:
cd /app/twod_app
./twod-scaler-output-rgb888-app
將ouput.yuv 拷到rgb888顯示器上設(shè)置尺寸640x480,顯示格式rgb24,結(jié)果如下
運(yùn)行 輸出yuv上疊加osd 使用方法:
cd /app/twod_app
./twod-scaler-overlay-osd-app
將ouput.yuv 拷到顯示器上設(shè)置尺寸640x480,顯示格式nv12,結(jié)果如下
API:
/* 創(chuàng)建內(nèi)存 */
twod_create_fb()
/* 配置原圖片參數(shù) */
twod_set_src_picture()
/* 配置輸出圖片參數(shù) */
twod_set_des_picture()
/* 設(shè)置 scaler */
twod_set_scaler()
/* 等待操作完成 */
twod_wait_vsync()
/* Invali cache */
twod_InvalidateCache()
/* flash cache */
twod_flashdateCache()
/* 釋放內(nèi)存*/
twod_free_mem()
/* 設(shè)置旋轉(zhuǎn) */
twod_set_rot()
4.1.5 RTC demo
RTC驅(qū)動(dòng)會(huì)注冊生成/dev/rtc0設(shè)備節(jié)點(diǎn)。
應(yīng)用層遵循Linux系統(tǒng)中的標(biāo)準(zhǔn)RTC編程方法調(diào)用驅(qū)動(dòng),在運(yùn)行參考例程之前,建議通過shell 控制臺(tái)關(guān)閉內(nèi)核信息打印。
echo 0 > /proc/sys/kernel/printk
進(jìn)入/app/rtc目錄,輸入如下命令啟動(dòng)rtc應(yīng)用程序。
cd /app/rtc
./rtc 2021-11-3 21:10:59
程序的執(zhí)行結(jié)果為:
RTC demo程序的主要代碼片段如下,詳細(xì)請參考package/rtc 文件夾下的代碼。
/*解析參數(shù),獲取當(dāng)前年月日、時(shí)分秒*/
if(argc !=3) {fprintf(stdout, "useage:\t ./rtc year-month-day hour:minute:second\n");fprintf(stdout, "example: ./rtc 2021-10-11 19:54:30\n");return -1;
}sscanf(argv[1], "%d-%d-%d", &year, &month, &day);
sscanf(argv[2], "%d:%d:%d", &hour, &minute, &second);/*打開RTC設(shè)備,設(shè)備節(jié)點(diǎn)是:/dev/rtc0 */
fd = open("/dev/rtc0", O_RDONLY);
if (fd == -1) {perror("/dev/rtc0");exit(errno);
}/* 設(shè)置RTC時(shí)間。*/
retval = ioctl(fd, RTC_SET_TIME, &rtc_tm);
if (retval == -1) {perror("ioctl");exit(errno);
}/* 休眠 2秒。 */
sleep(2);/* 讀取RTC當(dāng)前時(shí)間。*/
retval = ioctl(fd, RTC_RD_TIME, &rtc_tm);
if (retval == -1) {perror("ioctl");exit(errno);
}/* 打印 RTC當(dāng)前時(shí)間。*/
fprintf(stdout, "\nRTC date/time: %d/%d/%d %02d:%02d:%02d\n",rtc_tm.tm_mday, rtc_tm.tm_mon + 1, rtc_tm.tm_year + 1900,rtc_tm.tm_hour, rtc_tm.tm_min, rtc_tm.tm_sec);
4.1.6 WDT demo
K510一共有三個(gè)看門狗,WDT驅(qū)動(dòng)會(huì)注冊生成/dev/watchdog0、/dev/watchdog1、/dev/watchdog2 設(shè)備節(jié)點(diǎn)。
應(yīng)用層遵循 Linux系統(tǒng)中的標(biāo)準(zhǔn)WDT編程方法調(diào)用驅(qū)動(dòng),wathdog應(yīng)用程序第一個(gè)參數(shù)可為0、1,分別代表watchdog0、watchdog1,第二個(gè)參數(shù)表示可設(shè)置的超時(shí)時(shí)間(單位秒),例如如下命令表示啟動(dòng)watchdog0,watchdog0溢出時(shí)間40秒。
cd /app/watchdog
./watchdog 0 40
程序啟動(dòng)后將每間隔1秒喂一次看門狗,當(dāng)shell終端中輸入stop字符后,應(yīng)用程序停止喂狗,看門狗將在設(shè)置超時(shí)時(shí)間溢出后復(fù)位設(shè)備重啟,詳細(xì)請參考package/watchdog文件夾下的代碼。
程序的執(zhí)行結(jié)果為:
注意:當(dāng)前k510看門狗模塊的工作時(shí)鐘頻率為757575Hz,以秒為單位的超時(shí)時(shí)間需要轉(zhuǎn)換成看門狗實(shí)際的工作時(shí)鐘頻率的超時(shí)時(shí)間,計(jì)算公式是2^n/757575,因此實(shí)際的超時(shí)時(shí)間會(huì)大于等于輸入的超時(shí)時(shí)間。
實(shí)際超時(shí)時(shí)間的計(jì)算過程是:
-
輸入40,2^25/757575=44 > 40,2^24/757575=22 < 40,因此設(shè)置為44秒;
-
輸入155,2^27/757575=177 > 155,因此設(shè)置為177秒;
-
輸入2000,2^31/757575=2834 > 2000,因此設(shè)置為2834秒;
4.1.7 UART demo
K510一共有4個(gè)串口,當(dāng)前驅(qū)動(dòng)中串口2、3沒有使能,串口0驅(qū)動(dòng)會(huì)注冊生成/dev/ttyS0設(shè)備節(jié)點(diǎn)。
應(yīng)用層遵循Linux系統(tǒng)中的標(biāo)準(zhǔn)UART編程方法調(diào)用驅(qū)動(dòng)。uart應(yīng)用程序第一個(gè)參數(shù)可為0、1,分別代表uart0、uart1。
將開發(fā)板使用有線網(wǎng)連接到路由器,使得開發(fā)板和調(diào)試PC在一個(gè)網(wǎng)絡(luò)中,當(dāng)開發(fā)板上電后將自動(dòng)獲取IP,在開發(fā)板的shell串口終端中輸入ifconfig命令獲取IP地址,調(diào)試PC利用此IP通過telent連接開發(fā)板打開一個(gè)telent窗口。例如調(diào)試PC通過MobaXterm使用telent連接開發(fā)板的操作如下圖。
telent終端窗口中輸入如下命令啟動(dòng)串口0工作。
cd /app/uart
./uart 0
在telent窗口中輸入要發(fā)送的內(nèi)容,可以在shell串口終端窗口看到接收到的數(shù)據(jù),詳細(xì)請參考package/crb_demo/uart文件夾下的代碼。
例如,telent窗口的輸入:
對應(yīng)的Shell串口終端窗口顯示:
4.1.8 ETH demo
應(yīng)用層遵循Linux系統(tǒng)中的標(biāo)準(zhǔn)ETH編程方法調(diào)用驅(qū)動(dòng)。
Client
設(shè)備作為client端,進(jìn)入/app/client目錄,輸入如下命令啟動(dòng)client應(yīng)用程序,ETH應(yīng)用程序第一個(gè)參數(shù)表示要建立TCP鏈接的服務(wù)器ip地址,例如輸入如下命令表示啟動(dòng)ETH程序與10.20.5.1.13的server建立通信。
cd /app/client
./client 10.20.1.13
通過tcp協(xié)議連接server進(jìn)行通信,在另一臺(tái)ubuntu機(jī)器上運(yùn)行server程序,詳細(xì)代碼請參考package/app/client文件夾下內(nèi)容。
設(shè)備端顯示日志:
Server
設(shè)備作為server端,進(jìn)入/app/server目錄,例如輸入如下命令表示啟動(dòng)server程序。
cd /app/server
./server
在另一臺(tái)ubuntu機(jī)器上運(yùn)行client程序,通過tcp協(xié)議連接server進(jìn)行通信,詳細(xì)代碼請參考package/crb_demo/server文件夾下內(nèi)容。
設(shè)備端顯示日志:
4.1.9 SDMMC demo
K510一共有3個(gè)SDMMC主控制器,開發(fā)板上SDMMC0用于接eMMC,SDMMC1用于WIFI模塊,SDMMC2控制器用于接sdcard。
SDMMC驅(qū)動(dòng)會(huì)注冊生成/dev/mmcblk0,EMMC驅(qū)動(dòng)會(huì)注冊成/dev/mmcblk1設(shè)備節(jié)點(diǎn)。
SD卡在系統(tǒng)啟動(dòng)后會(huì)自動(dòng)掛載到/root/data ,進(jìn)入/app/write_read_file目錄,SDMMC應(yīng)用程序第一個(gè)參數(shù)表示要進(jìn)行讀寫操作的文件,如SD卡掛載到/root/data,可對/root/data/目錄下的文件進(jìn)行讀寫操作,先寫后讀,輸入如下命令啟動(dòng)SDMMC應(yīng)用程序?qū)D卡進(jìn)行讀和寫的操作并計(jì)算讀寫速度(單位m/s)。
cd /app/write_read_file
./write_read_file /root/data/test.txt
開啟對SD卡進(jìn)行1G數(shù)據(jù)的讀寫,代碼請參考package/app/write_read_file文件夾下的內(nèi)容。
4.1.10 SHA/AES demo
SHA/AES demo 使用Linux 內(nèi)核導(dǎo)出 AF_ALG 類型的 Netlink 接口,在用戶空間使用內(nèi)核加密 API。詳細(xì)信息請參考https://www.kernel.org/doc/html/latest/crypto/userspace-if.html。
參數(shù):
-h 打印幫助信息
-t 算法類型:hash、skcipher
-n 算法名稱:sha256、ecb(aes)、cbc(aes)
-x 解密操作
-k AES KEY(16進(jìn)制字符串)
-v AES IV(16進(jìn)制字符串)
sha256 test:
cd /app/crypto
echo -n "This is a test file, hello world" > plain.txt
./crypto -t hash -n "sha256" plain.txt sha256.txt
xxd -p -c 32 sha256.txt
sha256sum plain.txt
ecb(aes) 128 test:
cd /app/crypto
echo -n "This is a test file, hello world" > plain.txt
./crypto -t skcipher -n "ecb(aes)" -k 00112233445566778899aabbccddeeff plain.txt ecb_aes_en.bin
./crypto -t skcipher -n "ecb(aes)" -k 00112233445566778899aabbccddeeff -x ecb_aes_en.bin ecb_aes_de.bin
cmp ecb_aes_de.bin plain.txt
cat ecb_aes_de.bin
cbc(aes) 128 test
cd /app/crypto
echo -n "This is a test file, hello world" > plain.txt
./crypto -t skcipher -n "cbc(aes)" -k 00112233445566778899aabbccddeeff -v 00112233445566778899aabbccddeeff plain.txt cbc_aes_en.bin
./crypto -t skcipher -n "cbc(aes)" -k 00112233445566778899aabbccddeeff -v 00112233445566778899aabbccddeeff -x cbc_aes_en.bin cbc_aes_de.bin
cmp cbc_aes_de.bin plain.txt
cat cbc_aes_de.bin
aes-ecb-128和aes-cbc-128加密時(shí)要求明文要16字節(jié)對齊,不足會(huì)自動(dòng)補(bǔ)0。
4.1.11 TRNG demo
TRNG demo通過讀取/dev/hwrng字符設(shè)備產(chǎn)生指定長度的隨機(jī)數(shù),按16進(jìn)制字符串輸出。
./trng的輸入?yún)?shù)含義:
-h 打印幫助信息
-b 指定輸出隨機(jī)數(shù)長度,單位byte
4.1.12 DRM demo
drm demo展示了VO硬件多圖層功能。
VO共有8個(gè)layer:
-
背景層,可配置背景色。
-
layer0是video層,支持YUV422和YUV420,支持NV12和NV21格式,大小端可配,支持硬件scaling up和scaling down。
-
layer1-layer3是video層,支持YUV422和YUV420,支持NV12和NV21格式,大小端可配。
-
layer4-layer6是OSD層,支持多種ARGB格式。
開發(fā)板啟動(dòng)后進(jìn)入/app/drm_demo目錄,輸入命令:
cd /app/drm_demo
./drm_demo
4.1.13 V4L2_DRM demo
v4l2_drm demo展示了攝像頭輸入和顯示的功能。
開發(fā)板啟動(dòng)后進(jìn)入/app/mediactl_lib目錄,輸入命令:
cd /app/mediactl_lib
./v4l2_drm.out -f video_drm_1080x1920.conf
或者
./v4l2_drm.out -f video_drm_1920x1080.conf
或者
./v4l2_drm.out -f imx385_video_1920x1080.conf
imx385 demo :
這個(gè)需要修改配置,具體參照 K510_V4l2_Developer_Guides.md,運(yùn)行命令如下:
./v4l2_drm.out -f imx385_video_1920x1080.conf
啟動(dòng)v4l2_drm.out應(yīng)用程序,v4l2_drm.out顯示效果:
4.1.14 LVGL demo
進(jìn)入/app/lvgl,運(yùn)行以下命令:
cd /app/lvgl
./lvgl
顯示效果如下:
4.1.15 PWM demo
PWM驅(qū)動(dòng)會(huì)注冊生成/sys/class/pwm/pwmchip0和/sys/class/pwm/pwmchip3設(shè)備節(jié)點(diǎn)。
本例程可分別對pwm0和pwm1進(jìn)行配置和使能,進(jìn)入/app/pwm目錄,pwm應(yīng)用程序第一個(gè)參數(shù)表示設(shè)置pwm的周期,單位為ns,第二個(gè)參數(shù)設(shè)置pwm一個(gè)周期中“ON”的時(shí)間,單位為ns,第三個(gè)參數(shù)可以為0、1,分別代表pwm0和pwm1,例如輸入如下命令表示使能pwm0,周期為1s,占空比為1000000000/500000000*100% = 50%,詳細(xì)代碼請參考package/app/pwm文件夾下的內(nèi)容。
cd /app/pwm
./pwm 1000000000 500000000 0
程序的執(zhí)行結(jié)果為:
通過示波器連接K510 CRB5.1.2開發(fā)板J15的28號(hào)引腳,可以示波器上觀察到一個(gè)周期為1秒,占空比為50%的波形圖。
4.1.16 WIFI demo
WiFi模塊驅(qū)動(dòng)加載后會(huì)生成無線網(wǎng)卡wlan0,遵循標(biāo)準(zhǔn)網(wǎng)口驅(qū)動(dòng),正常參考TCP/IP socket編程。
-
在筆記本打開“移動(dòng)熱點(diǎn)”,然后設(shè)置熱點(diǎn)的名稱和密碼
-
在筆記本上啟動(dòng)NetAssist,配置協(xié)議類型、本地主機(jī)IP、本地主機(jī)端口、接收設(shè)置、發(fā)送設(shè)置及需要發(fā)送的數(shù)據(jù),如下圖:
-
wifi測試程序的參數(shù)格式為:
./wifi <AP name> <password> <local ip> <server ip>
例如進(jìn)入/app/wifi目錄,輸入啟動(dòng)wifi測試程序命令,程序的執(zhí)行結(jié)果如下圖:
4.1.17 GPIO_KEYS demo
按鍵驅(qū)動(dòng)使用linux kernel自身集成的基于input子系統(tǒng)的通用gpio-keys驅(qū)動(dòng),驅(qū)動(dòng)加載后在/dev/input目錄下生成事件監(jiān)控節(jié)點(diǎn)eventX,X為事件節(jié)點(diǎn)序號(hào),可以通過cat /proc/bus/input/devices查看
gpio-keys例程阻塞式讀取按鍵上報(bào)事件并打印事件信息,其信息包括按鍵編碼和按鍵動(dòng)作,按鍵編碼標(biāo)識(shí)按鍵身份,按鍵動(dòng)作分為pressed和released,在按鍵release時(shí)例程會(huì)計(jì)算按鍵按下的持續(xù)時(shí)間
程序執(zhí)行結(jié)果如下圖所示:
4.2 AI應(yīng)用體驗(yàn)指南
? 開發(fā)板系統(tǒng)中內(nèi)置了豐富的AI應(yīng)用示例程序,對每個(gè)示例程序我們都提供有對應(yīng)的腳本文件,腳本文件中已經(jīng)設(shè)置需要運(yùn)行AI應(yīng)用程序和對應(yīng)的參數(shù)。
? 在開始演示AI應(yīng)用指南前,需要確保您已經(jīng)正確連接攝像頭和顯示屏并正常上電啟動(dòng)開發(fā)板。啟動(dòng)開發(fā)板后可以發(fā)現(xiàn)會(huì)自動(dòng)運(yùn)行攝像頭獲取圖像并在顯示屏上實(shí)時(shí)預(yù)覽程序,需要手動(dòng)結(jié)束該應(yīng)用程序。使用方法如下:
-
輸入
ps
查看應(yīng)用程序查看進(jìn)程號(hào),例如實(shí)時(shí)預(yù)覽程序進(jìn)程端口號(hào)為189。189 root 0:01 ./v4l2_drm.out -f video_drm_1920x1080.conf -e 1 -s
-
輸入
kill -9 <進(jìn)程號(hào)>
,結(jié)束實(shí)時(shí)預(yù)覽程序進(jìn)程,例如我查看的端口號(hào)為189,則應(yīng)該輸入kill -9 189
結(jié)束實(shí)時(shí)預(yù)覽程序后,顯示屏?xí)@示白屏,即代表成功結(jié)束攝像頭獲取圖像并在顯示屏上實(shí)時(shí)預(yù)覽程序。
?
本章節(jié)介紹開發(fā)板內(nèi)置的AI應(yīng)用程序運(yùn)行腳本都位于/app/ai/shell/
目錄中。進(jìn)入該目錄,查看是否有對應(yīng)腳本文件。
[root@canaan ~ ]$ cd /app/ai/shell/
[root@canaan /app/ai/shell ]$ ls
face_alignment.sh object_detect_demo_bf16.sh
face_detect.sh object_detect_demo_uint8.sh
face_expression.sh open_pose.sh
face_landmarks.sh person_detect.sh
face_recog.sh retinaface_mb_320_bf16.sh
hand_image_classify.sh retinaface_mb_320_uint8.sh
head_pose_estimation.sh self_learning.sh
license_recog.sh simple_pose.sh
object_detect.sh
下面介紹每個(gè)腳本對應(yīng)的AI應(yīng)用程序的運(yùn)行指南,在進(jìn)行以下演示時(shí)需要確保您的串口終端控制臺(tái)已進(jìn)入/app/ai/shell/
目錄下。
4.2.1人臉對齊
人臉對齊,可得到圖像或視頻中的每個(gè)人臉估計(jì)出來的depth或者pncc信息。其中pncc信息為三維人臉形狀上的頂點(diǎn),不僅包含這一點(diǎn)的三維坐標(biāo)信息,還包含此處的RGB取值。
論文鏈接:https://sci-hub.et-fine.com/10.1109/TPAMI.2017.2778152
將3D平均人臉的頂點(diǎn)坐標(biāo)和RGB取值進(jìn)行歸一化操作,即NCC操作。如下圖所示,下圖取自論文中的截圖。
Face Alignment 人臉對齊任務(wù)是基于一定量的訓(xùn)練集,得到一個(gè)模型,使得該模型對輸入的一張任意姿態(tài)下的人臉圖像能夠進(jìn)行特征點(diǎn)(landmark)標(biāo)記。Face Alignment 任務(wù)一般的呈現(xiàn)方式是人臉特征點(diǎn)的檢測與標(biāo)記。
運(yùn)行人臉對齊演示示例,在終端輸入:
./face_alignment.sh
效果圖如下所示:
4.2.2人臉檢測
人臉檢測采用了retina-face網(wǎng)絡(luò)結(jié)構(gòu),backbone選取0.25-mobilenet。
論文鏈接:https://arxiv.org/pdf/1905.00641.pdf
GitHub鏈接:https://github.com/deepinsight/insightface
下圖為單階段逐像素密集人臉定位方法。
使用該應(yīng)用時(shí),可得到圖像或視頻中的每個(gè)人臉檢測框以及每個(gè)人臉的左眼球/右眼球/鼻尖/左嘴角/右嘴角五個(gè)landmark。使用方法如下所示,輸入:
./face_detect.sh
人臉檢測器-bf16
執(zhí)行非量化模型。使用方法如下所示,輸入:
./retinaface_mb_320_bf16.sh
人臉檢測器-uint8
執(zhí)行uint8量化模型。使用方法如下所示,輸入:
./retinaface_mb_320_uint8.sh
4.2.3人臉表情識(shí)別
人臉表情識(shí)別中需要用到兩個(gè)模型一個(gè)模型用于檢測人臉;一個(gè)模型用于進(jìn)行人臉表情識(shí)別。人臉表情識(shí)別采用了人臉表情分類的方式,使用該應(yīng)用可得到圖像或視頻中的每個(gè)人臉屬于以下表情的概率。使用方法如下所示,輸入:
./face_expression.sh
4.2.4人臉關(guān)鍵點(diǎn)檢測
人臉關(guān)鍵點(diǎn)檢測采用了PFLD(practical facial landmarks detection)。
論文鏈接:https://arxiv.org/pdf/1902.10859.pdf
使用該應(yīng)用,可得到圖像或視頻中的每個(gè)人臉輪廓的106個(gè)關(guān)鍵點(diǎn)。使用方法如下所示,輸入:
./face_landmarks.sh
4.2.5人臉識(shí)別
人臉識(shí)別采用了人臉特征提取后比對的方式,相同的人的特征會(huì)盡可能的像,而不同的人的特征則會(huì)有較大差距,使用該應(yīng)用可得到圖像或視頻中的每個(gè)人臉與人臉底庫中的人臉的相似度,以進(jìn)行人臉識(shí)別任務(wù)。使用方法如下所示,輸入:
./face_recog.sh
執(zhí)行完成后會(huì)進(jìn)入人臉檢測模式,當(dāng)攝像頭檢測到人臉后會(huì),按下開發(fā)板的Key1,位置如下所示:
按下之后,可以在串口控制臺(tái)中看到以下輸出信息
>>>>> key code: 30, action: pressed <<<<<
total took 55.4448 ms
total took 56.2784 ms
Please Enter Your Name to Register:
>>>>> key code: 30, action: released <<<<<
上述輸出信息提示您需要在串口終端輸入人臉的登記名稱,可直接輸入錄入人臉的信息,輸入完成后按下回車即可。注意:目前登記信息僅支持英文輸入。假設(shè)我這里輸入登記名稱為A,如下所示:
輸入完成后會(huì)繼續(xù)進(jìn)入人臉檢測模式,此時(shí)如果您剛剛登記的人臉再次被檢測,則會(huì)在檢測時(shí)標(biāo)注出該人臉的登記信息。 您可重復(fù)進(jìn)行登記人臉信息,登記后可以在人臉檢測模式中進(jìn)行人臉識(shí)別,區(qū)分登記不同信息的人臉。但當(dāng)檢測到?jīng)]有登記的人臉信息則不會(huì)在檢測時(shí)標(biāo)注出人臉信息。
5.2.6人形檢測
使用該應(yīng)用時(shí),可得到圖像或視頻中人體的檢測框。使用方法如下所示,輸入:
./person_detect.sh
人體關(guān)鍵點(diǎn)檢測-openpose
人體關(guān)鍵點(diǎn)檢測主要有兩種檢測方式,一個(gè)是自上而下,一種是自下而上。本應(yīng)用采用了自下而上的模型openpose。使用該應(yīng)用,可得到圖像或視頻中的每個(gè)人體的17個(gè)關(guān)鍵點(diǎn)。使用方法如下所示,輸入:
./open_pose.sh
人體關(guān)鍵點(diǎn)檢測-YOLOV5S
人體關(guān)鍵點(diǎn)檢測主要有兩種檢測方式,一個(gè)是自上而下,一種是自下而上。本應(yīng)用采用了自上而下的模型采用了YOLOV5S進(jìn)行人體檢測,然后使用simplepose進(jìn)行關(guān)鍵點(diǎn)回歸。使用該應(yīng)用,可得到圖像或視頻中的每個(gè)人體的17個(gè)關(guān)鍵點(diǎn)。使用方法如下所示,輸入:
./simple_pose.sh
4.2.7指尖指定區(qū)域識(shí)別
指尖指定區(qū)域識(shí)別主要包含3個(gè)流程,手掌檢測+手掌關(guān)鍵點(diǎn)檢測+圖像識(shí)別。其中,手掌檢測使用了512x512分辨率的 tiny-yolov3;手掌關(guān)鍵點(diǎn)檢測使用了256x256分辨率的squeezenet1.1;圖像識(shí)別使用了基于imagenet訓(xùn)練出來的mobilenetv2。通過手部關(guān)鍵點(diǎn)檢測,利用兩個(gè)食指尖,框定待識(shí)別區(qū)域。利用imagenet分類模型,確定待識(shí)別區(qū)域。使用方法如下所示,輸入:
./hand_image_classify.sh
4.2.8頭部態(tài)角估計(jì)
頭部態(tài)角估計(jì),可得到圖像或視頻中的每個(gè)人臉的roll/yaw/pitch。roll代表了人頭歪的程度;yaw代表了人頭左右旋轉(zhuǎn)的程度;pitch代表了人頭低頭抬頭的程度。使用方法如下所示,輸入:
./head_pose_estimation.sh
4.2.9車牌識(shí)別
車牌識(shí)別的整體流程實(shí)際上包含了車牌檢測+車牌識(shí)別兩個(gè)流程。車牌檢測采用了retinanet,車牌識(shí)別采用了lprnet。使用該應(yīng)用,可得到圖像或視頻中的每個(gè)車牌的內(nèi)容。使用方法如下所示,輸入:
./license_recog.sh
4.2.10YOLOV5目標(biāo)檢測
目標(biāo)檢測采用了YOLOV5,使用該應(yīng)用,可得到圖像或視頻中屬于以下標(biāo)簽的目標(biāo)的檢測框。
"person", "bicycle", "car", "motorcycle", "airplane", "bus", "train", "truck",
"boat", "traffic light", "fire hydrant", "stop sign", "parking meter", "bench", "bird", "cat",
"dog", "horse", "sheep", "cow", "elephant", "bear", "zebra", "giraffe",
"backpack", "umbrella", "handbag", "tie", "suitcase", "frisbee", "skis", "snowboard",
"sports ball", "kite", "baseball bat", "baseball glove", "skateboard", "surfboard", "tennis racket", "bottle",
"wine glass", "cup", "fork", "knife", "spoon", "bowl", "banana", "apple",
"sandwich", "orange", "broccoli", "carrot", "hot dog", "pizza", "donut", "cake",
"chair", "couch", "potted plant", "bed", "dining table", "toilet", "tv", "laptop",
"mouse", "remote", "keyboard", "cell phone", "microwave", "oven", "toaster", "sink",
"refrigerator", "book", "clock", "vase", "scissors", "teddy bear", "hair drier", "toothbrush"
使用方法如下所示,輸入:
./object_detect.sh
YOLOV5目標(biāo)檢測-bf16
執(zhí)行非量化模型,使用方法如下所示,輸入:
./object_detect_demo_bf16.sh
YOLOV5目標(biāo)檢測-uint8
執(zhí)行uint8量化模型。使用方法如下所示,輸入:
./object_detect_demo_uint8.sh
4.2.11自學(xué)習(xí)KNN算法
自學(xué)習(xí)借鑒的是KNN(k-Nearest Neighbors)的思想。該算法的思想是: 一個(gè)樣本與數(shù)據(jù)集中的k個(gè)樣本最相似, 如果這k個(gè)樣本中的大多數(shù)屬于某一個(gè)類別, 則該樣本也屬于這個(gè)類別。使用方法如下所示,輸入:
./self_learning.sh
執(zhí)行完成后會(huì)在顯示屏上出現(xiàn)一個(gè)綠色的框。
該AI示例需要用到按鍵(Key 1)和按鍵(Key 2),兩個(gè)按鍵的位置如下所示:
? 將需要識(shí)別的物體放在攝像頭范圍內(nèi),使該物體可以顯示在綠色框中的正中間,此時(shí)需要手動(dòng)標(biāo)記按下Key1開始標(biāo)記class0,按下Key1時(shí)會(huì)串口終端會(huì)提示以下信息:
>>>>> key code: 30, action: pressed <<<<<
Please press UP or DOWN button, UP: confirm, DOWN: switch!
>>>>> key code: 30, action: released <<<<<
上述信息為提示您,如果按下Key1則為標(biāo)注圖像,按下Key2則為切換模式。
繼續(xù)按下Key1可開始自動(dòng)標(biāo)記該物體,此時(shí)串口終端會(huì)輸出如下信息:
>>>>> key code: 30, action: pressed <<<<<
Pressed UP button!
class_0 : 1
>>>>> key code: 30, action: released <<<<<
此時(shí)再按下Key1會(huì)繼續(xù)繼續(xù)讓您選擇繼續(xù)標(biāo)注圖像還是切換。
>>>>> key code: 30, action: pressed <<<<<
Please press UP or DOWN button, UP: confirm, DOWN: switch!
>>>>> key code: 30, action: released <<<<<
如果需要重復(fù)標(biāo)記多次圖像,可以繼續(xù)按下Key1標(biāo)記該物體。如下所示:
當(dāng)標(biāo)注完類別1(class 0)后按下Key2,串口終端會(huì)輸出以下內(nèi)容:
>>>>> key code: 48, action: released <<<<<
>>>>> key code: 48, action: pressed <<<<<
Pressed DOWN button!
switch to class_1
此時(shí)會(huì)切換標(biāo)注類別1(class 1),繼續(xù)按下Key 1進(jìn)行標(biāo)注類別1,選擇功能。
>>>>> key code: 30, action: pressed <<<<<
Please press UP or DOWN button, UP: confirm, DOWN: switch!
>>>>> key code: 30, action: released <<<<<
繼續(xù)按下Key 1標(biāo)注類別1物體
>>>>> key code: 30, action: pressed <<<<<
Pressed UP button!
class_1 : 1
>>>>> key code: 30, action: released <<<<<
如果需要重復(fù)標(biāo)記多次圖像,可以繼續(xù)按下Key1標(biāo)記該物體,與上面類別0(class 0)標(biāo)注方法一直。
在標(biāo)注完成后,在不進(jìn)入功能選擇時(shí),按下key 2結(jié)束標(biāo)注,如下圖所示。
>>>>> key code: 30, action: pressed <<<<<
Pressed UP button!
class_1 : 8
>>>>> key code: 30, action: released <<<<<
>>>>> key code: 48, action: released <<<<<
>>>>> key code: 48, action: pressed <<<<<
Pressed DOWN button!
Enter recog!
將剛才標(biāo)注過的物體放在綠框內(nèi),此時(shí)會(huì)開發(fā)板會(huì)在顯示屏上自動(dòng)檢測識(shí)別的物品,識(shí)別到物體時(shí),左上角會(huì)顯示對應(yīng)物體的類別以及檢測的精準(zhǔn)度。
5.編寫一個(gè)簡單的helloword程序
5.1 編寫helloword應(yīng)用程序
? 打開Ubuntu虛擬機(jī),打開終端進(jìn)入Home目錄中,新建helloword文件夾
ubuntu@ubuntu2004:~$ mkdir helloword
進(jìn)入 helloword文件夾下,新建hello.c程序。
ubuntu@ubuntu2004:~$ cd helloword/
ubuntu@ubuntu2004:~/helloword$ touch helloword.c
在終端內(nèi)gedit工具會(huì)打開一個(gè) 文本編輯器,進(jìn)入文本編輯器內(nèi), 將helloword程序代碼粘貼進(jìn)去,粘貼完成后,直接按下 ctrl + s 保存,最后點(diǎn)擊 右上角的 x 關(guān) 閉文本編輯器:
ubuntu@ubuntu2004:~/helloword$ gedit helloword.c
helloword程序代碼:
#include <stdio.h>
int main (void)
{ printf("hello word!\n");return 0;
}
編寫完成后,保存到 helloword.c 之后。我們需要指定存放交叉編譯需要使用的庫文件頭文件的文件夾。如果需要在任意位置或者終端都可以使用交叉編譯工具鏈,則需要單獨(dú) 增加 工具鏈bin的路徑至 ubuntu PATH環(huán)境變量里,可以添加至 ~/.bashrc
也可以在每一個(gè)終端單獨(dú)配置。在終端執(zhí)行以下命令:
export PATH=$PATH:~/100ask_base-aiApplication-demo/riscv64-buildroot-linux-gnu_sdk-buildroot/bin/
輸入完成后,需要驗(yàn)證是否添加成功,在終端輸入:
riscv64-linux-gcc -v
輸入后可以正常打印gcc version 7.3.0 (2019-11-20_nds64le-linux-glibc-v5d-6c120106e03)
即可。
5.2.編寫Makefile編譯規(guī)則
ubuntu@ubuntu2004:~/helloword$ touch Makefile
ubuntu@ubuntu2004:~/helloword$ gedit Makefile
將下面的程序復(fù)制到Makefile文件中
CC := riscv64-linux-gcc
helloword: helloword.c${CC} -o helloword helloword.c
clean:rm helloword
填寫完成后,按下Crtl+s保存Makefile文件。
5.3 交叉編譯hellowrod程序
查看當(dāng)前目錄下是否存在helloword.c和Makefile:
ubuntu@ubuntu2004:~/helloword$ ls
helloword.c Makefile
確定文件存在后執(zhí)行編譯命令make
進(jìn)行編譯,如下所示:
ubuntu@ubuntu2004:~/helloword$ make
riscv64-linux-gcc -o helloword helloword.c
編譯完成后會(huì)生成可執(zhí)行文件hellword
。
可以執(zhí)行 file hellword
命令 來查看編譯出來的文件類型 是否是 riscv 架構(gòu)類型。
ubuntu@ubuntu2004:~/helloword$ file helloword
helloword: ELF 64-bit LSB executable, UCB RISC-V, version 1 (SYSV), dynamically linked, interpreter /lib/ld-linux-riscv64-lp64d.so.1, for GNU/Linux 4.15.0, with debug_info, not stripped
5.2 上傳程序到開發(fā)板上運(yùn)行
? 把編譯生成的 hello 文件通過 ssh或者TFTP拷貝到開發(fā)板上運(yùn)行,這里使用TFTP傳輸,將生成的hello程序拷貝到tftpboot目錄下:
ubuntu@ubuntu2004:~/helloword$ cp helloword /home/ubuntu/tftpboot
拷貝完成后,查看Ubuntu當(dāng)前IP地址,輸入ifconfig
后,獲得IP地址為192.168.0.163
進(jìn)入開發(fā)板的串口終端界面,獲取tftpboot目錄中helloword文件。
[root@canaan ~ ]$ tftp -g -r helloword 192.168.0.163
helloword 100% |********************************| 11680 0:00:00 ETA
為helloword程序增加可執(zhí)行權(quán)限
[root@canaan ~ ]$ chmod 777 helloword
在開發(fā)板端執(zhí)行helloword程序。
[root@canaan ~ ]$ ./helloword
hello word!
6.編譯一個(gè)簡單的AI demo程序
6.1 編譯hello AI的demo程序
在任意目錄中使用終端獲取Hello AI的demo程序,輸入以下命令獲取
git clone https://e.coding.net/weidongshan/dongsahnpi-vision/100ask_hello-ai_demo.git
例如:
如果你無法下載,可訪問百度網(wǎng)盤資料中的<開發(fā)板名稱>/5_DongshanPI-Vision_嵌入式AI應(yīng)用開發(fā)資料/2.Hello-AI_demo程序,該目錄有demo程序壓縮包,傳入U(xiǎn)buntu并解壓即可。
下載完成后進(jìn)入/home/ubuntu/100ask_base-aiApplication-demo/code
,新建hello_ai_demo
文件夾
ubuntu@ubuntu2004:~$ cd /home/ubuntu/100ask_base-aiApplication-demo/code/
ubuntu@ubuntu2004:~/100ask_base-aiApplication-demo/code$ mkdir hello_ai_demo
進(jìn)入hello_ai_demo目錄下,將獲取Hello AI的demo程序拷貝到當(dāng)前的hello_ai_demo目錄下
cp /home/ubuntu/100ask_hello-ai_demo/* ./ -rf
拷貝完成后,可以看到hello-ai-demo文件夾下的文件如下所示:
ubuntu@ubuntu2004:~/100ask_base-aiApplication-demo/code/hello_ai_demo$ ls
CMakeFiles cv2_utils.cc format main.cc object_detect.h
cmake_install.cmake cv2_utils.h images Makefile README.md
CMakeLists.txt file include object_detect.cc
拷貝完成,返回上一級(jí)的code目錄下,修改code目錄下的CMakeLists.txt文件
ubuntu@ubuntu2004:~/ai_demo/100ask_base-aiApplication-demo/code/hello_ai_demo$ cd ../
ubuntu@ubuntu2004:~/100ask_base-aiApplication-demo/code$ gedit CMakeLists.txt
在文件末尾增加一句add_subdirectory(hello_ai_demo)
,修改后的CMakeLists.txt如下所示:
cmake_minimum_required(VERSION 3.2)
project(ai C CXX)#set(DEMO_ROOT "${PROJECT_SOURCE_DIR}/../crb_demo")
set(CMAKE_C_FLAGS_DEBUG "-O0 -g3")
set(CMAKE_C_FLAGS_RELEASE "-O2 -s")
set(CMAKE_CXX_FLAGS_DEBUG "-O0 -g3")
set(CMAKE_CXX_FLAGS_RELEASE "-O2 -s")
SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fopenmp")set(input imx219_1080x1920_0.conf imx219_0.conf imx219_1.conf video_192x320.conf video_object_detect_320.conf video_object_detect_432x368.conf video_object_detect_512.conf video_object_detect_640x480.conf video_object_detect_320x320.conf video_object_detect_480x640.conf video_object_detect_640.conf)
install(PROGRAMS ${input} DESTINATION exe)add_subdirectory(face_detect)
add_subdirectory(face_landmarks)
add_subdirectory(object_detect)
add_subdirectory(face_alignment)
add_subdirectory(face_expression)
add_subdirectory(head_pose_estimation)
add_subdirectory(face_recog)
add_subdirectory(simple_pose)
add_subdirectory(openpose)
add_subdirectory(person_detect)
add_subdirectory(hand_image_classify)
add_subdirectory(license_plate_recog)
add_subdirectory(self_learning)
add_subdirectory(object_detect_demo)
add_subdirectory(retinaface_mb_320)
add_subdirectory(hello_ai_demo)
修改完成后,按下Crtl+s
保存修改后的文件。
在code目錄的終端下激活環(huán)境,輸入:
ubuntu@ubuntu2004:~/100ask_base-aiApplication-demo/code$ source build.sh
激活環(huán)境完成,進(jìn)入hello_ai_demo目錄,開始進(jìn)行編譯Hello AI的demo程序
ubuntu@ubuntu2004:~/100ask_base-aiApplication-demo/code$ cd hello_ai_demo/
ubuntu@ubuntu2004:~/100ask_base-aiApplication-demo/code/hello_ai_demo$ make
編譯完成,即可在hello_ai_demo目錄下查看編譯完成的可執(zhí)行程序,如下圖紅框中所示文件:
6.2 上傳程序到開發(fā)板運(yùn)行
把編譯生成的 hello 文件通過 ssh或者TFTP拷貝到開發(fā)板上運(yùn)行,這里使用TFTP傳輸,將生成的hello_ai_demo程序拷貝到tftpboot目錄下:
ubuntu@ubuntu2004:~/100ask_base-aiApplication-demo/code/hello_ai_demo$ cp hello_ai_demo ~/tftpboot/
將待檢測的圖像傳入開發(fā)板,待測圖像已經(jīng)提前準(zhǔn)備在hello_ai_demo目錄下的images文件夾下
ubuntu@ubuntu2004:~/100ask_base-aiApplication-demo/code/hello_ai_demo$ cd images/
ubuntu@ubuntu2004:~/100ask_base-aiApplication-demo/code/hello_ai_demo/images$ ls
01_person.bmp 02_cat.bmp
將兩張圖像拷貝到tftpboot目錄下:
ubuntu@ubuntu2004:~/100ask_base-aiApplication-demo/code/hello_ai_demo/images$ cp ./* ~/tftpboot/
拷貝完成后,查看Ubuntu當(dāng)前IP地址,輸入ifconfig
后,獲得IP地址為192.168.0.163
進(jìn)入開發(fā)板的串口終端界面,獲取tftpboot目錄中helloword文件。
[root@canaan ~ ]$ tftp -g -r hello_ai_demo 192.168.0.163
hello_ai_demo 100% |********************************| 818k 0:00:00 ETA
[root@canaan ~ ]$ tftp -g -r 01_person.bmp 192.168.0.163
01_person.bmp 100% |********************************| 300k 0:00:00 ETA
[root@canaan ~ ]$ tftp -g -r 02_cat.bmp 192.168.0.163
02_cat.bmp 100% |********************************| 300k 0:00:00 ETA
由于該程序需要使用模型文件對待測圖像進(jìn)行預(yù)測,我們可以拷貝開發(fā)板中模型文件使用
[root@canaan ~ ]$ cp /app/ai/kmodel/kmodel_release/object_detect/yolov5s_320/yol
ov5s_320_sigmoid_bf16_with_preprocess_output_nhwc.kmodel ./
拷貝完成后可以在當(dāng)前目錄看到對應(yīng)文件。
[root@canaan ~ ]$ ls
01_person.bmp
02_cat.bmp
data
emmc
hello_ai_demo
yolov5s_320_sigmoid_bf16_with_preprocess_output_nhwc.kmodel
為hello_ai_demo程序增加可執(zhí)行權(quán)限
[root@canaan ~ ]$ chmod 777 hello_ai_demo
在開發(fā)板端執(zhí)行hello_ai_demo程序。
./hello_ai_demo ./yolov5s_320_sigmoid_bf16_with_preprocess_output_nhwc.kmodel ./01_person.bmp
執(zhí)行結(jié)果如下所示:
例子1:
[root@canaan ~ ]$ ./hello_ai_demo ./yolov5s_320_sigmoid_bf16_with_preprocess_out
put_nhwc.kmodel ./01_person.bmp
hello 100ask AI demo!
==> run inference finished!
image inference result: person:0.89
程序識(shí)別出01_person.bmp文件中,有人,概率為0.89。
例子2:
[root@canaan ~ ]$ ./hello_ai_demo ./yolov5s_320_sigmoid_bf16_with_preprocess_out
put_nhwc.kmodel ./02_cat.bmp
hello 100ask AI demo!
==> run inference finished!
image inference result: cat:0.86
它識(shí)別出02_cat.bmp圖片文件中,有貓,概率為0.86。
注意:您可以傳入自定義的圖像進(jìn)行預(yù)測,需要保證圖像格式為bmp,尺寸為320x320。
6.3 hello AI程序講解
6.3.1 程序框架
6.3.2 程序講解
從BMP文件提取RGB分量
int get_rgb_from_bmp(char *file, uint8_t *rbuf, uint8_t *gbuf, uint8_t *bbuf)
{ int err;unsigned int *p;unsigned int rgb32;int r_pos = 0, g_pos = 0, b_pos = 0;/* 點(diǎn)陣數(shù)據(jù) */T_PixelDatas bmpPixelDatas;/* 解析BMP文件 */err = GetPixelDatasForIcon(file, &bmpPixelDatas);if (err){DebugPrint("Can not get digit bmp file: %s\n", file);return -1;}/* 把里面的RGB單獨(dú)拆出來 */for (int y = 0; y < MIN(320, bmpPixelDatas.iHeight); y++){p = (unsigned int *)(bmpPixelDatas.aucPixelDatas + y * bmpPixelDatas.iLineBytes);r_pos = g_pos = b_pos = y*320;for (int x = 0; x < MIN(320, bmpPixelDatas.iWidth); x++){rgb32 = p[x];/*將RGB三通道的數(shù)據(jù)分別存入3個(gè)buf*/rbuf[r_pos++] = (rgb32 >> 16) & 0xff;gbuf[g_pos++] = (rgb32 >> 8) & 0xff;bbuf[b_pos++] = (rgb32 >> 0) & 0xff;}}return 0;}
初始化模型
objectDetect od(0.5, 0.45, 320, {320, 320});//置信度、nms閾值、模型尺寸、圖像尺寸
od.load_model(argv[1]); //加載模型 yolov5s_320_sigmoid_bf16_with_preprocess_output_nhwc.kmodel
od.prepare_memory(); // memory allocation 準(zhǔn)備內(nèi)存
使用模型
/* 把RGB數(shù)據(jù)復(fù)制進(jìn)od里 */od_r = (uint8_t *)od.virtual_addr_input[0]; od_g = od_r + 320*320;od_b = od_g + 320*320;memcpy(od_r, rbuf, 320*320);memcpy(od_g, gbuf, 320*320);memcpy(od_b, bbuf, 320*320);od.set_input(0);//設(shè)置輸入od.set_output();//設(shè)施輸出od.run();//運(yùn)行推理od.get_output();//獲得推理結(jié)果
后處理
/*后處理:將推理結(jié)果轉(zhuǎn)換為可使用的數(shù)據(jù)*/std::vector<BoxInfo> result;od.post_process(result);//運(yùn)行后處理 for (auto r : result){std::string text = od.labels[r.label] + ":" + std::to_string(round(r.score * 100) / 100.0).substr(0,4);cout<<"image inference result: ";cout<<text<<endl;}
7.嵌入式開發(fā)
7.1編譯工具鏈
工具鏈是一組編程工具,用于開發(fā)軟件、創(chuàng)建軟件產(chǎn)品。工具鏈通常是另一個(gè)計(jì)算機(jī)程序或一組相關(guān)程序。通常,工具鏈里有多個(gè)工具,前一個(gè)工具的輸出結(jié)果,是下一個(gè)工具的輸入,也就是說前一個(gè)工具處理完,再交給下一個(gè)工具處理。
一個(gè)簡單工具鏈可能由三部分組成:編譯器和鏈接器(將源代碼轉(zhuǎn)換為可執(zhí)行程序)、庫(為操作系統(tǒng)提供接口)和調(diào)試器(用于測試和調(diào)試創(chuàng)建的程序)。一個(gè)復(fù)雜的軟件產(chǎn)品,如視頻游戲,需要準(zhǔn)備音效、音樂、紋理、3 維模型和動(dòng)畫的工具,以及將這些資源組合成成品的附加工具。
**GNU ** 工具鏈 是一個(gè)廣泛收集的、遵守GNU協(xié)議的、眾多編程工具。這些工具形成一個(gè)工具鏈,用于開發(fā)應(yīng)用程序和操作系統(tǒng)。
GNU 工具鏈在Linux、一些BSD系統(tǒng)和嵌入式系統(tǒng)軟件的開發(fā)中起著至關(guān)重要的作用。
7.2 交叉編譯工具鏈
**交叉編譯器:**在平臺(tái)A上使用它能夠生成程序,這個(gè)程序時(shí)運(yùn)行在平臺(tái)B上的。例如,在PC上運(yùn)行程序,但這個(gè)程序是在Android 智能手機(jī)上運(yùn)行的,這個(gè)編譯器就是交叉編譯器。
在PC上為其他平臺(tái)(目標(biāo)平臺(tái))編譯代碼時(shí),需要交叉編譯器。能否直接在目標(biāo)平臺(tái)上編譯程序?比如在ARM板上編譯程序?大多時(shí)候不可行,因?yàn)锳RM板資源很可能受限。
交叉編譯器的基本用途是將構(gòu)建環(huán)境與目標(biāo)環(huán)境分開。這在幾種情況下很有用:
-
設(shè)備資源極其有限的嵌入式計(jì)算機(jī)。例如,微波爐將有一個(gè)非常小的計(jì)算機(jī)來讀取它的鍵盤和門傳感器,向數(shù)字顯示器和揚(yáng)聲器提供輸出,并控制烹飪食物的機(jī)器。這臺(tái)計(jì)算機(jī)通常不夠強(qiáng)大,無法運(yùn)行編譯器、文件系統(tǒng)或開發(fā)環(huán)境。
-
為多目標(biāo)編譯。例如,公司可能希望用同一套代碼,支持多個(gè)不同的操作系統(tǒng)。通過使用交叉編譯器,可以設(shè)置單個(gè)構(gòu)建環(huán)境,為每個(gè)目標(biāo)系統(tǒng)單獨(dú)編譯程序。
-
在服務(wù)器上編譯。服務(wù)器性能強(qiáng)大,很多公司都是在服務(wù)器上為其他平臺(tái)編譯程序。
-
引導(dǎo)到新平臺(tái)。在為新平臺(tái)開發(fā)軟件時(shí),人們使用交叉編譯器來編譯必要的工具,例如操作系統(tǒng)和本地編譯器。
7.3 獲得合適的交叉編譯工具鏈
-
獲取現(xiàn)成的
- 來自發(fā)行版系統(tǒng)內(nèi): Ubuntu 和 Debian 有許多現(xiàn)成的交叉編譯器。
-
來自不同組織:
-
芯片原廠提供的交叉編譯工具鏈(一般包含在配套的BSP內(nèi))。
-
Bootlin社區(qū)提供的各種架構(gòu)工具鏈 。
-
ARM 官方提供的aarch32 aarch64工具鏈。
-
Linaro 提供 ARM 和 AArch64 工具鏈,以及一些早期版本工具鏈。
-
gnutoolchains 提供可以在windows上運(yùn)行的交叉編譯工具鏈。
-
riscv-collab 提供的riscv GNU 工具鏈。
-
-
自己編譯構(gòu)建
-
Crosstool-NG,專門構(gòu)建交叉編譯工具鏈的工具。 迄今為止擁有最可配置選項(xiàng)/并支持多種功能的。
-
嵌入式Linux構(gòu)建系統(tǒng)一般都知道如何構(gòu)建交叉編譯工具鏈:Yocto/OpenEmbedded、Buildroot、OpenWRT等。
-
-
參考文檔
-
Crosstool-NG 文檔,https://github.com/crosstool-ng/crosstool-ng/blob/master/docs/
-
GCC 文檔,https://gcc.gnu.org/onlinedocs/
-
Binutils 文檔,https://sourceware.org/binutils/docs/
-
7.4 Makefile構(gòu)建工具
7. 5 CMake構(gòu)建工具
CMake 是一個(gè)開源的跨平臺(tái)工具系列,旨在構(gòu)建、測試和打包軟件。 CMake 用于使用簡單的平臺(tái)和編譯器獨(dú)立配置文件來控制軟件編譯過程,并生成可在您選擇的編譯器環(huán)境中使用的本機(jī) makefile 和工作區(qū)。 CMake 工具套件是由 Kitware 創(chuàng)建的,旨在響應(yīng) ITK 和 VTK 等開源項(xiàng)目對強(qiáng)大的跨平臺(tái)構(gòu)建環(huán)境的需求。
CMake 是 Kitware 的商業(yè)支持開源軟件開發(fā)平臺(tái)集合的一部分。