應用編程概念
應用編程(也可稱為系統編程)與驅動編程、裸機編程有何不同?
-
系統調用;
-
何為庫函數;
-
應用程序的 main()函數;
-
應用程序開發環境的介紹;
系統調用
定義
-
系統調用(system call)是 Linux 內核給應用層的應用編程接口(API),是 Linux 應用層到內核的入口;
-
系統調用是內核直接向應用層提供的應用編程接口,譬如 open、write、read、close 等
功能
通過系統調用,通過系統調用 API,應用層可以實現與內核的交互;
Linux 應用程序可以請求內核以自己的名義執行某些事情,譬如打開磁盤中的文件、讀寫文件、關閉文件以及控制其它硬件外設;
-
操作系統下有兩種不同的狀態:內核態和用戶態;
-
應用程序運行在用戶態、而內核則運行在內核態。
應用編程與裸機編程、驅動編程區別
裸機編程:無操作系統支持的編程環境稱為裸機編程環境,例:單片機編程開發,直接在硬件運行程序,無操作系統支持;
Linux 驅動編程:是基于內核驅動框架開發驅動程序,驅動開發工程師通過調用 Linux 內核提供的接口完成設備驅動的注冊,驅動程序負責底層硬件操作相關邏輯;
Linux 應用編程(系統編程):基于 Linux 操作系統的應用編程,在應用程序中通過調用系統調用 API 完成應用程序的功能和邏輯,應用程序運行于操作系統之上;
總結
-
LED 應用程序與 LED 驅動程序是分隔、分離的,它們單獨編譯,它們并不是整合在一起的;
-
應用程序運行在操作系統之上,有操作系統支持,應用程序處于用戶態,而驅動程序處于內核態,與純粹的裸機程序存在著質的區別;
-
Linux 應用開發與驅動開發是兩個不同的方向;
庫函數
會分辨調用的函數是系統調用還是庫函數即可
發展歷程
-
系統調用使用起來并不是很方便,提供比底層系統調用更為方便、更為好用、且更具有可移植性的調用接口;
-
C 庫是應用層使用的一套函數庫,Linux 下,常以動態(.so)庫文件的形式提供,存放在根文件系統/lib 目錄;
-
C 語言庫函數構建于系統調用之上,庫函數絕大部分由系統調用封裝而來;
庫函數和系統調用區別
-
編寫應用程序除使用系統調用API接口,如 open、write、read、close之外,還使用庫函數(C語言庫函數);
-
有些庫函數不調用任何系統調用,譬如一些字符串處理函數 strlen()、strcat()、memcpy()、memset();
-
有些庫函數則會使用系統調用來完成實際操作,譬如庫函數 fopen 內部調用了系統調用 open()來幫它打開文件、庫函數 fread()利用系統調用 read()來完成讀文件操作、fwrite()就利用了系統調用 write()來完成寫文件操作;
實現者的角度來看,系統調用與庫函數之間有根本的區別;
在實際應用編程中,直接把它們當做是 C 函數即可,知道調用的函數是系統調用還是庫函數即可;
標準 C 語言函數庫
Linux系統使用的C語言庫為GNU C 語言函數庫,作為標準 C 語言函數庫;
( 也 叫 作 glibc , 其 網 址 為http://www.gnu.org/software/libc/)
glibc 版本
main 函數
Linux 應用程序中,main 函數也是作為應用程序的入口函數存在,main 函數的形參一般會有兩種寫法:
//示例代碼 1.4.1 main 函數寫法之無傳參
int main(void)
{/* 代碼 */
}
//示例代碼 1.4.2 main 函數寫法之有傳參
int main(int argc, char **argv)
{/* 代碼 */
}
argc 形參表示傳入參數的個數,包括應用程序自身路徑和程序名;
例:運行當前目錄下的 hello 可執行文件,并且傳入參數,如下所示:
./hello 112233
那么此時參數個數為 2,并且這些參數都是作為字符串的形式傳遞給 main 函數:
argv[0]等于"./hello"
argv[1]等于"112233"
有傳參時 main 函數的寫法并不只有這一種
開發環境推薦
我們的重點是學習應用編程!而不是學習 IDE 怎么用
Eclipse
vscode+ARM gcc(交叉編譯工具)
個人:nodepid++、gcc
剛剛下了vscode,很煩這個弄幾次了前期配置,之前也是;
c文件運行到底具體咋整好麻煩,幸好只是當編輯工具,后期再學一學吧;
我記得我成功過,好像改兩個地方就行(前提是插件裝好);
入門篇
Makefile
提高篇
進階篇
cmake+vscode