前言
在CP ?Autosar開發(fā)中,客戶使用的接口以及這個接口的行為,雖然可以通過RTE定義清楚,但是RTE接口本身需要供應商和客戶雙方約定好。
然而,到了SoC端開發(fā)AP Autosar,情況就變得不一樣了。很多名詞我們經常會提到,這個代碼是跨平臺的,這個代碼符合POSIX標準,這個代碼能在Like-Unix系統上正常運行,這個代碼可以兼容安卓內核。
我們不經疑惑,在汽車電子中,AP該如何去寫代碼?在ADAS控制器領域,真正去使用的操作系統有打過RT patch的Linux系統和商業(yè)版本的QNX系統。安卓和mac更多的應用在車機系統。
對于QNX系統和Linux系統的內核差異,我們拋開宏內核、微內核之類的爭議不談。單純從開發(fā)應用的角度而言,QNX和Linux系統的差異到底有多大,在開發(fā)的時候需要注意哪些細節(jié)問題?本文將嘗試盤點接口/應用層級的差異。
作者前前后后花了幾個月時間嘗試去研究QNX系統下的編程與調試,在這邊做個總結,也給大家做個匯報。
QNX與Linux基礎差異對比
QNX是微內核、Linux是宏內核
QNX是硬實時操作系統、Linux是軟實時操作系統
QNX和Linux均是類Unix操作系統
QNX支持POSIX PSE54標準,Linux支持POSIX標準,但不一定支持PSE54標準。
就調度策略而言,Linux支持Fifo,RR,other,deadline,batch策略。而QNX支持Sporadic、RR、FIFO策略。兩者有差異。
就IPC通訊機制(Socket、Signal、MessageQueue、Pipe、Shared Memory、信號量)而言,Linux支持POSIX相關標準之外,還額外支持System V相關接口。QNX支持POSIX標準,也有獨有的Message Passing機制??偟膩碚f,從功能角度來講,大差不差。
就性能優(yōu)化而言,各有各的特點,如果做到性能的極致,同時還要兼顧跨平臺,需要對Linux、QNX做一些抽象。
文件系統兩者不一樣。
QNX與Linux應用差異對比
根目錄下的差異
QNX和Linux在根目錄這個層級上是有差異的,在Linux系統根目錄有如下差異:
bin、dev、home、lib、opt、sbin、sys、usr、data、etc、lib、proc、tmp、var等文件夾。重要的命令行程序存放于bin目錄下,庫文件存放于lib目錄下,系統庫的索引環(huán)境變量為lib和usr/lib。tmp目錄每次重啟均會清零,etc目錄會存放配置文件。proc目錄存放程序運行的相關信息。dev目錄會將內核相關的設備以文件的形式映射出來。
QNX系統根目錄下有debug、dev、etc、lib、opt、proc、bin、sbin、tmp、usr、var目錄。命令行相關程序存放于debug文件夾內,同時相關庫也會存放在debug文件夾中。QNX系統中的proc文件夾內容與Linux系統中的內容相差較大,QNX內容更少,如果有軟件是基于proc目錄做策略的話,需要特別注意。QNX系統其他目錄對比Linux系統,相差不大。
命令行的差異
在嵌入式系統中,我們會裁剪QNX和Linux系統,因此很多命令不一定會全部支持。對于我們經常需要用到的命令,例如ls,top等等,是否會有區(qū)別呢?就系統而言,兩邊到底有多大差距呢?這個問題值得我們去思考。我們從文件操作、性能調試、網絡分析三個角度來對比兩個系統的差異。
文件/文件系統操作命令:
ls,pwd,cd,cp,rm并無多大區(qū)別。
df -h查看文件分區(qū)情況兩者并無區(qū)別。
mount/umount命令有區(qū)別,在QNX系統中,采用mount /dev/xxx ?/yyy的形式掛載文件系統。umount ?-f ?xxx取消掛載。
性能分析相關的命令:
top命令可以查看程序的狀態(tài),然后展示的內容有些許區(qū)別,命令的使用也有蠻大的區(qū)別。
QNX系統專有的hogs,pidin、ps命令對程序進行分析。
QNX系統無法使用strace命令來獲取程序的系統調用,但是有tracelogger、traceprinter工具抓取相關信息,當然也可以抓取kernel event trace,而Linux系統可以直接使用strace、perf工具實現更多的功能。
QNX系統可以使用Valgrind進行內存相關的分析,而Linux系統需要額外按照這個命令。
QNX系統可以使用類似gdb的方式進行遠程調試,也可以生成coredump文件,這個機制與Linux系統上有差異,但是功能上類似的。QNX系統還支持優(yōu)先級反轉的檢測,Linux系統上沒遇見過相關的成熟方案。
代碼覆蓋率相關的功能,應用的方式感覺大差不差,需要額外確認gtest是不是支持QNX系統,以便于完成工具鏈的閉環(huán)。
網絡分析:
首先,QNX系統沒有tcpdump工具(文檔中是有的,實際在環(huán)境中并沒有),真是非常可惜,Linux系統支持tcpdump,支持libpcap庫所提供的相關特性。Linux系統常用的網絡工具:tcpdump、iperf,ss,netstat、ifconfig、ping、ip、lsof、arp等等。一般網路工具需要覆蓋1.網卡診斷查看相關功能 2.網卡性能檢測 3.網絡抓包 4.端口查看 5.網絡連接查看 6.流量分析等等。
QNX系統上網絡分析工具比較缺乏。Ifconfig、ping功能是類似的,sockstat是list所有socket信息含UDS相關的socket。netstat命令可以查看網絡狀態(tài),可以看到丟包相關的數據。iperf3工具也可以正常使用。arp命令可以正常查看路由表。
就工具而言,QNX系統有一點讓我無法容忍,響應一個命令需要半天、半天、半天、重要的事情說三遍?。。。。?!
系統編程的差異
本節(jié)從創(chuàng)建進程、創(chuàng)建線程、鎖、共享內存、網絡編程、定時器、信號幾個角度來確認兩者的差異。
創(chuàng)建進程:
Linux系統常用fork+execv函數族,QNX系統 不支持fork,須采用posix_spawn函數族,Linux系統也支持這個posix_spawn函數族,但是很多代碼并不會調用這個函數。
創(chuàng)建線程:
QNX系統和Linux系統均采用pthread_xxx函數族,但是有一點必須特別注意,親測QNX系統中pthread_setname_np接口并不起作用,但是程序可以正常運行,Linux系統中這個接口調用是正常的,也可能是我對QNX系統理解的不到位。
鎖創(chuàng)建:
sem_xxx POSIX標準的函數族,QNX系統和Linux系統均支持,System V接口在QNX系統中不支持。
共享內存創(chuàng)建:
Shm_xxx函數族POSIX標準的函數族,QNX系統和Linux系統均支持。但是這兩者還是有差異的,QNX系統會在/dev/shmem目錄下生成相關的共享內存文件,而Linux系統會在/dev/shm目錄下生成相關的文件。此外,親測當設置文件名時,文件名帶不帶路徑,例如“a/shm1.shm”在兩個系統中的實際效果不一致,但是程序會正常運行。
網絡編程:
Linux支持很多特殊的特性:bpf、libpcap、netfilter機制等等。QNX系統沒有bpf、沒有l(wèi)ibpcap、沒有netfilter。Linux可以對socket本身設置優(yōu)先級,QNX系統不支持。因此像開源時間同步代碼linuxptp大概率在QNX系統上無法正常編譯(沒試過,但是用了linuxptp用了一些bpf的機制)。如果是普通的UDP、TCP開發(fā),接口還是兼容的,但是對raw socket開發(fā)或者需要利用kernel機制的一些優(yōu)化,則無法兼容。
總的來說,網絡編程這塊,QNX系統和Linux系統還是蠻大的,雖然POSIX接口是統一的,但是很多特殊的操作系統設計特性真是不兼容。尤其是用到setsockopt這個接口時,需要特殊特別特意的關注?。。。。?!
定時器創(chuàng)建:
Linux系統的定時器有很多方式:alarm、timer_create/ timer_settime函數族、setitimer接口等等。QNX系統的教程說是支持這幾個接口,并沒有實際應用過,暫定兼容的。
信號的創(chuàng)建:
signal接口兩者是兼容的,更高級的用法沒試過。
編譯的差異對比
對Linux系統交叉編譯時,不需要顯示的指定glibc庫,也不需要顯示的初始化編譯器的環(huán)境。
而對QNX系統交叉編譯時,首先需要調用qnxxxx_env腳本初始化環(huán)境,必須要顯示的用-l c指定c庫的鏈接,同時需要指定std的語言,同時QNX系統支持qcc和gcc兩套編譯器,親測均可生成在QNX系統上運行的可執(zhí)行文件。C++程序需要指定std變量并使用-lc++鏈接c++庫。QNX系統若需要支持gnu特性,需要顯示的指明gnu++11標準。對于socket編程,需要使用-lsocket指令顯示鏈接相關庫。
總而言之,qnx系統的交叉編譯還是有很多注意點的。
審核編輯:發(fā)貨
?
評論
查看更多