1. POSIX 淵源
可移植操作系統接口,POSIX 標準定義了操作系統(很多時候針對的是類 Unix 操作系統)應該為應用程序提供的接口標準,從而保證了應用程序在源碼層次的可移植性,如今主流的 Linux 系統都做到了兼容 POSIX 標準。由此可見,可移植性是 POSIX 的一大特性,如果一個操作系統擬合了POSIX系統,就將可以將自己的 POSIX 應用輕松遷移到其他同樣符合POSIX標準的系統平臺,并且可以獲得大量的 POSIX 應用,豐富自己系統的應用生態。
POSIX為了提供不同層級的RTOS能力,劃定了PSE51,PSE52,PSE53,PSE54共四個級別;分別對應了四種操作系統。
1、Minimal Real-time System Profile IEEE Std 1003.13 PSE51,基礎 RTOS
2、Real-time Controller Profile IEEE Std 1003.13 PSE52,帶有簡單的文件系統…等
3、Dedicated Real-time Profile IEEE Std 1003.13 PSE53,擁有網絡功能…等
4、Multi-Purpose Real-time Profile IEEE Std 1003.13 PSE54,完整的文件系統,帶有 Shell 組件…等
由于標準的制定是隨著時間發展而不斷更新的,PSE51, 52, 53, 54 的標準也隨著 MCU,MPU 芯片產業的發展,不斷增強的芯片功能和性能使得這些標準所對應的四種操作系統的界限而越顯模糊。在 RT-Thread 中也依靠自身的組件內容,提供了多種標準的部分內容,為不同的 POSIX 應用提供可供在 RTOS 系統上使用的軟件。
2. POSIX 在 RT-Thread 中支持情況
RT-Thread 針對 PSE51 的標準規定的頭文件及對應接口,提供了大部分接口。除此之外,我們還提供了更加完整的文件系統的接口,以及基于我們 SAL 組件的網絡接口。這為 POSIX 的應用遷移打下了基礎,可以使得較復雜的 POSIX 應用也可以經過小部分修改就可以在 RT-Thread 上運行。
-
POSIX FILE 相關接口,包含了文件系統的內容,接口比較豐富;標準 I/O 接口,Poll / Select 等較復雜的功能也已經支持
-
Delay 相關接口
-
Clock 相關接口,對擁有 RTC 硬件,或者沒有使用 RTC 硬件的設備都有對應的功能實現
-
Timer 相關接口,已經對接到 RT-Thread 的定時器接口,實現對應的函數
-
Dynamic 動態模塊
-
POSIX 的 標準 IPC 接口 :pipe ,message,semaphore 等函數
通過上面靈活的配置項,開發者可以啟用對應的功能來添加該類函數的支持;這對與同樣使用功能宏來標識一些函數功能的 POSIX 接口來說十分類似,在該界面可以配置對應的 POSIX 函數支持。
3. POSIX 的實現簡介
由于 RT-Thread 作為一個可以兼容多種開發方式的操作系統,針對 ARMCC,ARMCLANG,IARCC,GCC 現階段占比比較多的開發工具鏈都做了對應的適配。所以,簡單描述一下RT-Thread 在做適配時,針對不同的編譯平臺所做得操作,以及對應的關系圖。
由于在不同的平臺開發所使用的編譯工具鏈不一致;所以在實現時,RT-Thread 區分了三個概念:廣義的 POSIX,狹隘的 POSIX,編譯器配平層;下面結合關系圖,描述一下對應的概念:
-
廣義的 POSIX ,即 POSIX 接口;這里面包含了一些關于 pthread, signal, IPC 等函數以及 C 庫的相關內容;
-
狹隘的 POSIX,即不是 C 庫標準提供以外的 POSIX 函數,例如 pthread 這些內容;
-
編譯器配平層,由 C 庫相關提供的函數。由于不同編譯平臺對該內容的實現參差不齊,因此需要針對不同的編譯平臺增補這些函數。這也就是 “ 配平 ” 的由來。這塊內容較多,且不同的編譯工具鏈所支持的操作不一,因此在 POSIX 代碼遷移時需要修改這里來解決對應的編譯錯誤。
4. POSIX 在 RT-Thread 中使用方法
4.1 Pthread 接口
1、在 menuconfig 中打開 pthread ,設定支持得最大 pthread 數目
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
就可以使用標準 Socket 進行編程
4.4 Filesystem 接口
1、在 menuconfig 中打開Enable POSIX file system and I/O
配置具體的 POSIX 函數接口
2、按照需求打開需要的功能,例如 設備I/O,AIO,MMAN 之類的功能
4.5 其他接口
其他接口也是一樣,開打對應的 menuconfig 選項,即可使用對應頭文件,及提供的函數來編程。整個過程不需要 rt-thread 的頭文件參與,使編譯出的代碼運行在 RT-Thread 操作系統之上。
5. 注意事項
5.1 不同編譯平臺的兼容
在上一節,編譯器配平層的存在解決了多組編譯工具鏈不一致造成的問題;同時,也引入了一些在編寫代碼時需要注意的事項。這些注意事項是為了解決對應的編譯錯誤。因為編譯工具鏈有的允許頭文件替換,有的不支持這些問題。RT-Thread 提供了一個相對輕便的解決辦法:
為保證跨不同編譯器、不同工具鏈的兼容性,建議用戶應用層代碼:
-
使用
代替 -
使用
代替 -
使用
代替
有使用
5.2 Net 接口
啟用網絡功能后,并不是所有的 BSD Socket 接口都支持,在 RT-Thread 中只實現了一部分函數。因此如果對應函數缺失,需要按照代碼邏輯替換為基礎的 Socket 接口來兼容原邏輯。完整的 BSD Socket 功能將持續優化以解決這個問題。
-
操作系統
+關注
關注
37文章
6738瀏覽量
123190 -
Posix
+關注
關注
0文章
36瀏覽量
9487 -
RT-Thread
+關注
關注
31文章
1272瀏覽量
39924
原文標題:RT-Thread 4.1.0 特性解析之LIBC與POSIX
文章出處:【微信號:RTThread,微信公眾號:RTThread物聯網操作系統】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論