1. POSIX 淵源
可移植操作系統(tǒng)接口,POSIX 標(biāo)準(zhǔn)定義了操作系統(tǒng)(很多時(shí)候針對(duì)的是類 Unix 操作系統(tǒng))應(yīng)該為應(yīng)用程序提供的接口標(biāo)準(zhǔn),從而保證了應(yīng)用程序在源碼層次的可移植性,如今主流的 Linux 系統(tǒng)都做到了兼容 POSIX 標(biāo)準(zhǔn)。由此可見,可移植性是 POSIX 的一大特性,如果一個(gè)操作系統(tǒng)擬合了POSIX系統(tǒng),就將可以將自己的 POSIX 應(yīng)用輕松遷移到其他同樣符合POSIX標(biāo)準(zhǔn)的系統(tǒng)平臺(tái),并且可以獲得大量的 POSIX 應(yīng)用,豐富自己系統(tǒng)的應(yīng)用生態(tài)。
POSIX為了提供不同層級(jí)的RTOS能力,劃定了PSE51,PSE52,PSE53,PSE54共四個(gè)級(jí)別;分別對(duì)應(yīng)了四種操作系統(tǒng)。
1、Minimal Real-time System Profile IEEE Std 1003.13 PSE51,基礎(chǔ) RTOS
2、Real-time Controller Profile IEEE Std 1003.13 PSE52,帶有簡(jiǎn)單的文件系統(tǒng)…等
3、Dedicated Real-time Profile IEEE Std 1003.13 PSE53,擁有網(wǎng)絡(luò)功能…等
4、Multi-Purpose Real-time Profile IEEE Std 1003.13 PSE54,完整的文件系統(tǒng),帶有 Shell 組件…等
由于標(biāo)準(zhǔn)的制定是隨著時(shí)間發(fā)展而不斷更新的,PSE51, 52, 53, 54 的標(biāo)準(zhǔn)也隨著 MCU,MPU 芯片產(chǎn)業(yè)的發(fā)展,不斷增強(qiáng)的芯片功能和性能使得這些標(biāo)準(zhǔn)所對(duì)應(yīng)的四種操作系統(tǒng)的界限而越顯模糊。在 RT-Thread 中也依靠自身的組件內(nèi)容,提供了多種標(biāo)準(zhǔn)的部分內(nèi)容,為不同的 POSIX 應(yīng)用提供可供在 RTOS 系統(tǒng)上使用的軟件。
2. POSIX 在 RT-Thread 中支持情況
RT-Thread 針對(duì) PSE51 的標(biāo)準(zhǔn)規(guī)定的頭文件及對(duì)應(yīng)接口,提供了大部分接口。除此之外,我們還提供了更加完整的文件系統(tǒng)的接口,以及基于我們 SAL 組件的網(wǎng)絡(luò)接口。這為 POSIX 的應(yīng)用遷移打下了基礎(chǔ),可以使得較復(fù)雜的 POSIX 應(yīng)用也可以經(jīng)過小部分修改就可以在 RT-Thread 上運(yùn)行。
-
POSIX FILE 相關(guān)接口,包含了文件系統(tǒng)的內(nèi)容,接口比較豐富;標(biāo)準(zhǔn) I/O 接口,Poll / Select 等較復(fù)雜的功能也已經(jīng)支持
-
Delay 相關(guān)接口
-
Clock 相關(guān)接口,對(duì)擁有 RTC 硬件,或者沒有使用 RTC 硬件的設(shè)備都有對(duì)應(yīng)的功能實(shí)現(xiàn)
-
Timer 相關(guān)接口,已經(jīng)對(duì)接到 RT-Thread 的定時(shí)器接口,實(shí)現(xiàn)對(duì)應(yīng)的函數(shù)
-
Dynamic 動(dòng)態(tài)模塊
-
POSIX 的 標(biāo)準(zhǔn) IPC 接口 :pipe ,message,semaphore 等函數(shù)
通過上面靈活的配置項(xiàng),開發(fā)者可以啟用對(duì)應(yīng)的功能來添加該類函數(shù)的支持;這對(duì)與同樣使用功能宏來標(biāo)識(shí)一些函數(shù)功能的 POSIX 接口來說十分類似,在該界面可以配置對(duì)應(yīng)的 POSIX 函數(shù)支持。
3. POSIX 的實(shí)現(xiàn)簡(jiǎn)介
由于 RT-Thread 作為一個(gè)可以兼容多種開發(fā)方式的操作系統(tǒng),針對(duì) ARMCC,ARMCLANG,IARCC,GCC 現(xiàn)階段占比比較多的開發(fā)工具鏈都做了對(duì)應(yīng)的適配。所以,簡(jiǎn)單描述一下RT-Thread 在做適配時(shí),針對(duì)不同的編譯平臺(tái)所做得操作,以及對(duì)應(yīng)的關(guān)系圖。
由于在不同的平臺(tái)開發(fā)所使用的編譯工具鏈不一致;所以在實(shí)現(xiàn)時(shí),RT-Thread 區(qū)分了三個(gè)概念:廣義的 POSIX,狹隘的 POSIX,編譯器配平層;下面結(jié)合關(guān)系圖,描述一下對(duì)應(yīng)的概念:
-
廣義的 POSIX ,即 POSIX 接口;這里面包含了一些關(guān)于 pthread, signal, IPC 等函數(shù)以及 C 庫的相關(guān)內(nèi)容;
-
狹隘的 POSIX,即不是 C 庫標(biāo)準(zhǔn)提供以外的 POSIX 函數(shù),例如 pthread 這些內(nèi)容;
-
編譯器配平層,由 C 庫相關(guān)提供的函數(shù)。由于不同編譯平臺(tái)對(duì)該內(nèi)容的實(shí)現(xiàn)參差不齊,因此需要針對(duì)不同的編譯平臺(tái)增補(bǔ)這些函數(shù)。這也就是 “ 配平 ” 的由來。這塊內(nèi)容較多,且不同的編譯工具鏈所支持的操作不一,因此在 POSIX 代碼遷移時(shí)需要修改這里來解決對(duì)應(yīng)的編譯錯(cuò)誤。
4. POSIX 在 RT-Thread 中使用方法
4.1 Pthread 接口
1、在 menuconfig 中打開 pthread ,設(shè)定支持得最大 pthread 數(shù)目
2、在用戶代碼中,即可使用 pthread.h, sche.h
這些 pthread 提供的頭文件來編程
1#include
2#include
3#include
4#include
5
6#defineNUM_THREADS5
7
8staticvoid*a_thread_func(void*num)
9{
10printf("arg=%li
",(long)num);
11returnnum;
12}
13
14intmain(void)
15{
16pthread_tnew_th;
17longi;
18void*res;
19intret;
20
21for(i=1;i1;i++){
22ret=pthread_create(&new_th,NULL,a_thread_func,(void*)i);
23
24if(ret){
25fprintf(stderr,"pthread_create():%s
",
26strerror(ret));
27return-1;
28}
29
30pthread_join(new_th,&res);
31
32if((long)res!=i){
33printf("TestFAILED:Returnedvaluedidnotmatch%li!=%li",
34(long)res,i);
35return-1;
36}
37}
38printf("TestPASSED
");
39return0;
40}
4.2 Timer 接口
1、在 menuconfig 中打開 timer 即可
2、在用戶代碼中,即可使用 這些 timer 提供的頭文件來編程
1#include
2#include
3
4intmain(void)
5{
6time_tsec;
7time_tret;
8time_ttimestamp=1609459200;
9ret=time(&sec);
10
11if(ret!=sec)
12{
13return-1;
14}
15if(ret!=timestamp)
16{
17return-1;
18}
19return0;
20}
4.3 Net 接口
1、在 menuconfig 中打開 Enable BSD Socket I/O
就可以使用標(biāo)準(zhǔn) Socket 進(jìn)行編程
4.4 Filesystem 接口
1、在 menuconfig 中打開Enable POSIX file system and I/O
配置具體的 POSIX 函數(shù)接口
2、按照需求打開需要的功能,例如 設(shè)備I/O,AIO,MMAN 之類的功能
4.5 其他接口
其他接口也是一樣,開打?qū)?yīng)的 menuconfig 選項(xiàng),即可使用對(duì)應(yīng)頭文件,及提供的函數(shù)來編程。整個(gè)過程不需要 rt-thread 的頭文件參與,使編譯出的代碼運(yùn)行在 RT-Thread 操作系統(tǒng)之上。
5. 注意事項(xiàng)
5.1 不同編譯平臺(tái)的兼容
在上一節(jié),編譯器配平層的存在解決了多組編譯工具鏈不一致造成的問題;同時(shí),也引入了一些在編寫代碼時(shí)需要注意的事項(xiàng)。這些注意事項(xiàng)是為了解決對(duì)應(yīng)的編譯錯(cuò)誤。因?yàn)榫幾g工具鏈有的允許頭文件替換,有的不支持這些問題。RT-Thread 提供了一個(gè)相對(duì)輕便的解決辦法:
為保證跨不同編譯器、不同工具鏈的兼容性,建議用戶應(yīng)用層代碼:
-
使用
代替 -
使用
代替 -
使用
代替
有使用
5.2 Net 接口
啟用網(wǎng)絡(luò)功能后,并不是所有的 BSD Socket 接口都支持,在 RT-Thread 中只實(shí)現(xiàn)了一部分函數(shù)。因此如果對(duì)應(yīng)函數(shù)缺失,需要按照代碼邏輯替換為基礎(chǔ)的 Socket 接口來兼容原邏輯。完整的 BSD Socket 功能將持續(xù)優(yōu)化以解決這個(gè)問題。
原文標(biāo)題:RT-Thread 4.1.0 特性解析之LIBC與POSIX
文章出處:【微信公眾號(hào):RTThread物聯(lián)網(wǎng)操作系統(tǒng)】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
-
操作系統(tǒng)
+關(guān)注
關(guān)注
37文章
6801瀏覽量
123283 -
Posix
+關(guān)注
關(guān)注
0文章
36瀏覽量
9496 -
RT-Thread
+關(guān)注
關(guān)注
31文章
1285瀏覽量
40081
原文標(biāo)題:RT-Thread 4.1.0 特性解析之LIBC與POSIX
文章出處:【微信號(hào):RTThread,微信公眾號(hào):RTThread物聯(lián)網(wǎng)操作系統(tǒng)】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論