BB-Black之PRU-ICSS簡(jiǎn)析
什么是PRU-ICSS?
本文引用地址:http://cafeforensic.com/article/201710/366971.htmBeaglebone Black所使用的TI芯片(XAM3359AZCZ revision 2)包含了一個(gè)主處理器和許多其他的模塊,如下圖:
盡管ARM Cortex-A8內(nèi)核的性能十分強(qiáng)大,但是Linux的本質(zhì)決定了對(duì)于高速外部硬件的控制可能會(huì)不太容易實(shí)現(xiàn)。而TI的這款芯片添加了兩個(gè)額外的CPU(稱為PRU-ICSS或PRUSSv2,即可編程實(shí)時(shí)單元和工業(yè)用通信子系統(tǒng),以后簡(jiǎn)稱PRU),從而使這個(gè)問題得到了改善。這意味著這兩個(gè)CPU可以分別運(yùn)行不同的軟件,以便減輕底層協(xié)議在硬件接口和處理上的工作量。
這款芯片就好像具有Arduino類似功能的處理器,只不過其額外的兩個(gè)CPU工作頻率要高出許多,達(dá)到200MHz,也就是說在許多情況下可以不再需要外部邏輯器件、CPLD或者FPGA。
通常來說,針對(duì)一個(gè)以上的處理器進(jìn)行編程是一件麻煩事,而且處理器之前還需要有通信協(xié)議。而TI的這款芯片則極大的簡(jiǎn)化了這種麻煩,原因有兩點(diǎn),一是用于PRU的代碼可以從主處理器下載,二是為了方便處理器之間通信,芯片集成了共享存儲(chǔ)器。
PRU的作用體現(xiàn)在哪兒?
對(duì)于低速通信來說,傳統(tǒng)的I2C或者常用的協(xié)議就已經(jīng)足夠應(yīng)付了,因此PRU在這些地方并沒有用武之地。而對(duì)于高速通信PRU可能會(huì)非常受歡迎,這是因?yàn)镻RU能夠消除由于Linux環(huán)境切換所造成的中斷,從而連續(xù)對(duì)硬件提供服務(wù),也不會(huì)對(duì)ARM主處理器造成負(fù)擔(dān)。這里有一些常見的并且可行例子;
• 連接到高速ADC(例如模擬信號(hào)捕捉)
• CCD 或者CMOS攝像機(jī)
• LED或者LCD顯示器
• 生成模擬視頻信號(hào)(視頻編碼器)
• 自定義PWM或者其他自定義協(xié)議或非標(biāo)準(zhǔn)協(xié)議
• 帶反饋的電機(jī)控制
據(jù)我所知,PRU甚至能夠用某個(gè)外部時(shí)鐘來作為并行數(shù)據(jù)的時(shí)鐘。
如何使用PRU?
當(dāng)前來說使用PRU即不簡(jiǎn)單也不算困難。主要的難度在于在網(wǎng)上找到完整的實(shí)例。這里提供的內(nèi)容就是從網(wǎng)上收集而來的。
主要步驟如下:
1. 在BB-Black上使能PRU系統(tǒng)
2. 將PRU匯編程序安裝到BBB上(當(dāng)前用于PRU的代碼是都是用匯編寫的,還沒有人開發(fā)出這對(duì)PRU的C編譯器)
3. 編寫代碼。PRU應(yīng)用程序分為兩部分,而且相互之間能夠通過存儲(chǔ)器尋址來進(jìn)行通信,即
?。╝) 匯編代碼,編譯為.bin機(jī)器指令文件,以便在PRU上運(yùn)行
(b) C語言代碼,運(yùn)行于主處理器上,也就是Linux系統(tǒng)上。這些代碼負(fù)責(zé)將匯編代碼下載到RPU
4. 配置Linux設(shè)置樹,啟用所有引腳用于輸入輸出
5. 運(yùn)行程序
PRU使用什么樣的匯編代碼?
還好寄存器數(shù)量很給力(都是32位),而且指令都是正交的,另外用于操作的位和字節(jié)參考都相當(dāng)令人滿意,所以相對(duì)而言,比起某些常見的匯編語言,例如針對(duì)PIC或其他8位處理器的匯編來說,PRU使用的匯編代碼算是比較容易上手的了。匯編命令數(shù)量并不多,目前為止我只使用了大約45條命令中的一小部分,結(jié)果還不錯(cuò)。(通常本人不愿意為了某個(gè)不太好用的處理器花太多時(shí)間學(xué)習(xí)匯編 – 但RPU完全不同,其指令集貌似很好用的樣子)
PRU是否物有所值?
我覺得答案是肯定的,應(yīng)為有了PRU就能夠在高速狀態(tài)下控制硬件(比如50MHz)。每條指令在PRU上只需要5納秒的執(zhí)行時(shí)間(200MHz頻率,每條指令占用一個(gè)周期),并且不存在由于Linux內(nèi)核造成的不規(guī)則延遲。
難點(diǎn)在哪兒?
難點(diǎn)主要在于和設(shè)備樹相關(guān)的東西。希望在未來能夠有所變化或者變得更簡(jiǎn)單。在一個(gè)典型的微控制器上,輸入輸出的設(shè)定是用特定的寄存器完成的,這些寄存器存在于某個(gè)設(shè)備的某一部分存儲(chǔ)映射中。據(jù)我所知,當(dāng)前運(yùn)行在BB-Black上的軟件不允許用戶通過傳統(tǒng)的C代碼對(duì)這些硬件寄存器進(jìn)行直接的修改操作。當(dāng)前采用的方法叫做“設(shè)備樹”。它是一個(gè)文本文件,并且被壓縮成為二進(jìn)制文件,在系統(tǒng)啟動(dòng)時(shí)需要對(duì)其進(jìn)行讀操作。該文件高速系統(tǒng)哪些是用于輸入輸出的引腳。設(shè)備樹的修改也適用于使能RPU系統(tǒng)。
有人曾經(jīng)通過設(shè)備樹關(guān)閉了BB-Black上默認(rèn)閃爍的LED燈。設(shè)備樹文件位于BB-Black的/boot目錄下,是一個(gè)二進(jìn)制文件,其內(nèi)容自然無法看懂(如下圖),通常文件名為.dtb或者.dtbo。
評(píng)論