怎麼才算是應用層開發和底層開發,調用系統API算是應用層開發嗎?
最近找了個公司,我之前是做電子工程師,會用一些C語言,和幾款單片機,完了那家公司說是調用系統API來寫程序我就不知道應用層和底層代碼編寫差別在哪裡?
謝邀。
看從哪個角度。
某個角度上說,所有編程都是面向 API 編程,都是寫應用,包括寫驅動寫寄存器也是,都是在某個層次上調用下一個層次的介面,你能做什麼、應該怎麼做,都是下層介面規定好的。之所以這樣說,是希望從戰略上明白,你能搞定低層 API,就能搞定高層 API。
不過一般意義上,底層指的是驅動和系統,應用就是上層應用,尤其在 Linux 之類分內核態和用戶態的操作系統上,意義就更具體了。
聯繫到你之前的單片機工作經歷,以及那家公司說 「調用系統API」 ,很有可能是在更高級的系統上基於系統調用寫純應用了。單片機上一般都不用操作系統,驅動和應用實現方式都比較簡單。為了適應新工作,除了要學習系統API,如果是uC/OS 這類系統,應該還有必要了解多線程、線程通信這些。如果是linux 系統,實模式和保護模式,MMU,內核態和用戶態,什麼是系統調用,多進程和通信,這些也是要了解的。
我相信,只要花時間,沒有什麼是學不會的。君子曰:學不可以已。加油吧。
應用層:不考慮硬體限制和條件,只考慮應用的實現和演算法。
底層: 需要清楚所運行的硬體條件及其限制。比如我用STM32的庫函數,也是調用API。如果我要對一個IO口進行操作,雖然我調用了GPIO_SetBits函數,但實際上我還需要知道這個IO口是哪個Port中的第幾個引腳,比如GPIO_SetBits(GPIOB, GPIO_Pin_6)。而且寫之前,也需要明白這個GPB6是否已經被配置輸出,其他復用功能是否已經關閉。實際上還是底層的操作。謝邀來答一下吧。
我說說我自己的理解。
底層和應用層應該是一個相對的概念,尤其是在廣義的層面上,我覺得。底層的思路比較靠近機器,而應用層更靠近人類自然的思路,更加抽象,和具體實現更遠。舉個栗子。比方說啊,就那你熟悉的單片機來說。我不知道你的單片機跑不跑操作系統,假設不跑好了…然後你要操作幾個外設,比方說有GPIO,你想用其中一個GPIO來模擬i2c。
然後你寫了個i2c的init方法,read方法,和write方法,這init方法里有配置GPIO的電平,管腳方向等。read里有i2c的時序模擬,write里也一樣。然後,設備啟動了,main調用了一下init,嘩嘩嘩又讀寫了一大堆數。完成了某個特定的功能。這裡邊,init read write就是底層,main就是應用層,其實就是業務代碼。底層是非常基礎的東西,io,調度,分配資源等等,也就是基礎設施,類似於公路。應用層就是利用這個基礎設施,完成一件有意義的工作。比方說,你利用公路,溜達了一圈,這個溜達,就是應用層。分層可以讓問題更加明確,層與層之間更少的互相影響。比方說路有問題,我修路即可,不需要為了讓你能正常溜達把你的腳也改了,這就是一個好的分層設計。
具體到你面試的那個,公司所說的調用系統API做應用層,主要還是指調用操作系統提供的例如file io,socket,等等。或者再往上一點,調用某個庫(C++ STL,boost,或者是資料庫的方法等等)來做你的業務,或者是應用。以我個人理解,應用層開發結果供普通用戶,底層開發供專業人員使用
根據寫程序要不要考慮到硬體的差異來分我覺得比較合理。如果你寫程序需要根據你的底層變化和變化的可以稱為底層軟體開發,反之就是應用層開發。打個比方吧:比如一個51的程序設計,控制管腳或者中斷的操作就是最典型的底層設計。對於一些演算法,比如在屏幕上劃線的演算法,無論在哪個硬體上只是操作的管腳有差異,把操作管腳這部分除外其實劃線演算法沒有改變這就是應用層設計。一個習慣較好的程序是會把底層操作屏蔽掉,以方便跨平台時程序的兼容性,其實跨平台跨過去的都是應用層部分。所以這個不是用不用人家API的問題。講得不算太嚴謹,將就著看看就好了。要是有不同意見歡迎提出來。
樓上說的很好。簡單粗暴點吧…兩者難道不是服務關係嘛。
本科生會單片機沒啥問題,如果工作了還只會單片機就可能會很尷尬了,底層應該指的是嵌入式系統的 linux 驅動層,或者是其他應用軟體的底層支撐軟體。
底層是相對於應用層來說的,只要你寫的東西不針對特定的應用,但是可能有很好的重用性,可以應用於很多應用系統中。就可以稱為底層開發。寫操作系統算不算底層?算了吧,但是實際上呢,好多地方還是調用更底層的介面 。比如寫bootloader,人inter的開發手冊都給你寫好的,通電時初始化哪個寄存器,從哪個位置讀數據,哪個命令控制什麼,都相當於調用介面。熟練掌握這些介面,就是一種能力啊。
推薦閱讀:
※如何搭建可靠的嵌入式arm+linux開發環境?
※FPGA與GPU在將來嵌入式應用中誰能更勝一籌?
※一個人,竭盡全力的去做一件事情,結果失敗了,改怎麼辦?
※依照目前的形勢,嵌入式開發與 web 開發哪個更順應未來的趨勢?
※嵌入式學習指南??