基於syslink的雙核通信實例

OMAPL138基於SYSLINK的雙核通信LED實例(圖文)

1  實例編譯

光盤中demo/syslink/ex10_led實例實現了利用MCSDK的SYSLINK組件在ARM端控制DSP端來操作開發板外設LED執行跑馬燈程序。本實例是基於ex03_notify增加DSP控制LED功能。

先按照廣州創龍OMAPL138開發板的用戶手冊《基於OMAPL138的多核軟件開發組件–MCSDK開發教程.pdf》安裝MCSDK,配置、編譯和安裝SYSLINK。然後將ex10_led文件夾拷貝到虛擬機/home/tl/ti/syslink_2_21_01_05/examples目錄下(該路徑不可隨意放置,否者無法包含到SYSLINK裏面的頭文件),然後進入ex10_led目錄,如下圖所示:

圖一

圖1

執行“sudo make clean”清除編譯生成文件,執行“sudo make”命令重新編譯該例程,如下圖所示:

圖2

圖2

圖三

圖3

在該目錄的dsp/bin/debug/目錄下生成.xe674格式文件server_dsp.xe674,如下圖所示:

圖4

圖4

在該目錄的host/bin/debug/目錄下生成Linux端可執行程序app_host,如下圖所示:

圖五圖5

2  實例演示

執行此實例雙核通信需要4個文件,syslink.ko、slaveloader、server_dsp.xe674和app_host。按照《基於OMAPL138的多核軟件開發組件–MCSDK開發教程.pdf》教程完成SYSLINK編譯和安裝後,syslink.ko和slaveloader將位於開發板文件系統如下位置:

syslink.ko/lib/modules/3.3.0/kernel/drivers/dsp/syslink.ko

slaveloader開發板任意example的debug目錄中,如/ex03_notify/debug/slaveloader。

以下爲各個文件的作用:

syslink.ko雙核通信驅動。

slaveloader用於ARM端啓動DSP並加載.xe674格式的SYS/BIOS文件,例如server_dsp.xe674。

server_dsp.xe674DSP端應用程序。在此實例中,增加的DSP端控制LED流水燈功能的代碼鏡像就是server_dsp.xe674。

app_hostARM端應用程序。

將以上編譯出來的slaveloader、server_dsp.xe674、app_host和ex10_led中的run.sh拷貝到開發板同一個目錄下,例如開發板的根目錄:

圖六

圖6

進入開發板的Linux文件系統後,執行如下命令安裝雙核通信驅動:

Targert#      insmod/lib/modules/3.3.0/kernel/drivers/dsp/syslink.koTRACE=1TRACEFAILURE=1

 圖7

圖7

然後執行“./run.sh”命令,觀察發現LED會先閃爍兩次,再依次點亮所有LED,接着依次熄滅所有LED。

Target#        ./run.sh

圖八

圖8

使用“cat run.sh”命令可以查看到run.sh腳本中的內容是:

圖九

圖9

以下爲腳本內容的解釋:

./slaveloader startup DSP server_dsp.xe674加載SYS/BIOS應用程序和啓動DSP核。

./app_host DSP啓動ARM端Linux應用程序。

./slaveloader shutdown DSP關閉DSP核。

3 實例解析

3.1   實例程序結構解析

在ex10_led目錄中運行“tree -L 3”命令,可以看到實例程序目錄的結構如下圖所示:

圖10

圖10

dspSYS/BIOS源代碼。

hostARM端Linux應用程序。

sharedARM和DSP內存共享相關。

products.makmakefile調用的配置文件,用於識別編譯的頭文件和庫文件路徑。

3.2   實例SYS/BIOS應用程序解析

dsp/main_dsp.c中創建了smain任務,smain任務會先執行Server_init(),如下圖所示:

圖11

圖11

Server_init()在dsp/Server.c中定義,Server.c是最常修改的SYS/BIOS文件。此實例在Server.c中增加了LED控制函數led_init(),如下圖所示:

圖12

圖12

dsp/Server.c中的led_init()函數實現了LED對應的GPIO的基本配置。在初始化配置時讓4個LED連續閃爍2次,如下圖所示:

圖13

圖13

LED對應的GPIO相關寄存器定義如下圖所示:

圖14

圖14

SYS/BIOS的smain任務完成後會執行dsp/Server.c中的Server_create()函數。如下圖所示:

圖15

圖15

Server_create()函數在dsp/Server.c中定義,代碼如下圖所示:

圖16

圖16

Server_create()函數會註冊notify事件。當ARM端notify事件註冊時,DSP會觸發Server_notifyCB函數,接着執行dsp/Server.c中的Server_exec()函數。如下圖所示:

圖17

圖17

Server_exec()函數在dsp/Server.c中定義,該函數輪詢等待ARM端發來的命令,其中Server_waitForEvent()是一種信號量等待方式,當ARM端有命令傳送過來時會解除等待,然後解析ARM端傳入的命令,解析命令代碼如下圖所示:

圖18

圖18

從上圖可以看出,ARM傳到DSP並解析出來的是num和event兩個變量。APP_CMD_ON_PAYLOAD將在下一章節解釋。

3.3   實例Linux應用程序解析

host/main_host.c功能和dsp/main_dsp.c類似,它初始化SYSLINK,然後執行host/App.c中的App_create()函數註冊notify事件,等待DSP端創建notify事件後,接着執行host/App.c中App_exec()函數。ARM端在App_exec()函數中向DSP發送控制LED的命令,代碼如下:

圖18

圖19

可以看出ARM端發送給DSP的命令有8個,分別是依次點亮4個LED,再依次熄滅4個LED。APP_CMD_ON_PAYLOAD和APP_CMD_OFF_PAYLOAD分別表示控制LED亮和滅,x分別爲4個LED編號。控制狀態和編號需要DSP端解析。所以APP_CMD_ON_PAYLOAD和APP_CMD_OFF_PAYLOAD是共享數據,其宏定義存放在shared/AppCommon.h中,如下圖所示:

圖20

圖20

APP_CMD_ON_PAYLOAD和APP_CMD_OFF_PAYLOAD宏是用戶根據實際情況在shared/AppCommon.h中修改或者添加的,ARM端和DSP端都會使用到

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章