jrtplib在dm355和motavista linux上的移植

來源:互聯網
上載者:User
交叉編譯庫和例子

交叉編譯庫

./configure -prefix=/home/jrtp/ -host=arm-montavista-linux CC=/opt/mv_pro_4.0.1/montavista/pro/devkit/arm/v5t_le/bin/arm_v5t_le-gcc CXX=/opt/mv_pro_4.0.1/montavista/pro/devkit/arm/v5t_le/bin/arm_v5t_le-g++

Make

Make install

-prefix=/home/jrtp/為編譯完成後執行make install時庫和標頭檔要安裝到的路徑的東西

安裝jthread和jrtplib的configure的方法一樣

如果是在pc機上編譯 則是直接make make install 然後將產生的lib檔案拷貝到/lib裡去

交叉編譯例子

arm_v5t_le-g++ -o example ./example2.cpp -I/home/jrtp/include/jrtplib3 -I/home/jrtp/include/jthread -L/home/jrtp/lib -ljthread -ljrtp –lpthread

問題1

後來程式固化到ARM上以後,報得不到使用者名稱的錯誤(ERROR:Can't retrieve login name),因為固化的Linux核心自動運行取消了使用者的設定,應用程式在執行的時候有一個函數是得到使用者名稱。

解決方案

  板子上的檔案系統不需要使用者名稱就可以直接登入,而在JRTPLIB庫中的RTPSession中的

Create->InternalCreate->CreateCNAME中,有對使用者名稱進行一定操作,

其中的getlogin_r(),getlogin()和getenv()操作都會因為使用者名稱為空白,

而返回錯誤ERR_RTP_SESSION_CANTGETLOGINNAME。

  我們可以通過修改JRTPLIB庫(我所使用的版本號碼為3.7.1)的CreateCNAME原始碼來為系統預設設定一個使用者名稱。

在RTPSession.cpp的第1400行左右,找到:

if (!gotlogin)

{

char *logname = getenv("LOGNAME");

if (logname = = 0)

return ERR_RTP_SESSION_CANTGETLOGINNAME;

strncpy((char *)buffer,logname,*bufferlength);

}

將其修改為:

if (!gotlogin)

{

char *logname = getenv( "LOGNAME" );

if( 0 = = logname )

{

printf( "Can't getenv LOGNAME, we will use /"root/" instead/n" );

strncpy( ( char * )buffer, "root", *bufferlength );

}

else

{

strncpy( ( char * )buffer, logname, *bufferlength );

}

}

問題2大小端模式使ARM給PC機發數收不到 改一下一個宏就好了.

網上的一篇文章如下

有些人會遇到arm和pc無法互相接受資料包的問題,但是pc和pc,arm和arm就可以收到。我用sniffer抓了一下包發現確實是有資料包的,所以應該不是程式的問題。這個問題上網查了一下,也沒人說的明白,只有一個高人點了一下,可能是位元組序和位域的問題。自己又研究了一下,也是一知半解。

一般x86的pc機是用小端位元組序(little endian),而嵌入式平台一般是大端位元組序(big endian),可能是由於位元組序的不同,導致了明明存在資料包,卻認不出來的問題。其實,JRTPLIB的開發人員可能已經考慮到了這個問題(真牛),在rtpstructs.h中,有這樣的代碼定義:

struct RTPHeader

{

#ifdef RTP_BIG_ENDIAN

uint8_t version:2;

uint8_t padding:1;

uint8_t extension:1;

uint8_t csrccount:4;

uint8_t marker:1;

uint8_t payloadtype:7;

#else // little endian

uint8_t csrccount:4;

uint8_t extension:1;

uint8_t padding:1;

uint8_t version:2;

uint8_t payloadtype:7;

uint8_t marker:1;

#endif // RTP_BIG_ENDIAN

uint16_t sequencenumber;

uint32_t timestamp;

uint32_t ssrc;

};

這是一個位域結構體,明眼人一下子就看出來了,jrtplib庫使用哪種位元組序完全取決於RTP_BIG_ENDIAN的定義,這樣問題就簡單化了。

我看了一下我編譯arm下jrtplib庫的rtpconfig_unix.h這個檔案,裡面果然定義了一個RTP_BIG_ENDIAN,所以要和pc採用的小端位元組序一樣,將這個定義取消掉,重新編譯庫。

最後運行exmaple1例子,pc 和arm可以互相接受資料包拉!:)這樣會引起其他什麼問題我還不知道,明天就可以動手編寫自己的程式了,呵呵

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.