姓名:李萌怡? 學號:19020100103? 學院:電子工程學院
轉自:https://blog.csdn.net/thisway_diy/article/details/106101091
【嵌牛導讀】:對于嵌入式Linux學習的初學者,往往習慣將嵌入式Linux與自己所熟悉的東西聯(lián)系起來。單片機就是其中一個例子导而。本文對單片機與Linux做以區(qū)別歹篓。
【嵌牛鼻子】:單片機? Linux
【嵌牛提問】:單片機與Linux的區(qū)別有哪些牧牢?
【嵌牛正文】
1.1 有哪些產(chǎn)品使用單片機或Linux
所有的電子產(chǎn)品,所用技術都可以認為要么是單片機,要么是Linux;GUI方面主要是QT/Android聪轿,它們都是運行于Linux之上的。
也許你不服猾浦!不是還有ucos陆错、vxwork、wince金赦、IOS嗎音瓷?
我們說的單片機不使用操作系統(tǒng)。但是使用單片機設備肯定遠遠超過Linux素邪。很多人也是先學習單片機外莲,從單片機進入電子工程師行業(yè)
我們設計一個產(chǎn)品時猪半,是使用單片機還是Linux兔朦,取決于成本:硬件成本、軟件成本磨确、維護成本沽甥、升級成本。而不應該根據(jù)個人偏好來選擇:我喜歡單片機乏奥,所以就排斥使用Linux摆舟;我喜歡Linux,就排斥使用單片機邓了。為了有更多的選擇恨诱,我們需要既懂單片機,又懂Linux骗炉。
1.2 在硬件操作上單片機和Linux是類似的
以點燈為例照宝,
無論是單片機還是Linux,我們要做的事情都一樣:
1.看原理圖句葵,確定引腳是哪一個厕鹃,確定它輸出什么電平才可以
2.看芯片手冊兢仰,確定要怎么操作寄存器
3.寫程序
但是,怎么編寫程序剂碴,單片機和Linux有很大不同把将。
1.3 在單片機中點燈、使用LCD
LED程序里面的init_led忆矛、led_on察蹲、led_off函數(shù)是你一個人寫的,愛取什么名就取什么名催训,愛怎么寫就怎么寫递览。
LCD程序里的函數(shù)也是你寫的,完全是自由發(fā)揮瞳腌。
很多單片機項目不是很復雜绞铃,2、3個人從上到下統(tǒng)統(tǒng)搞定嫂侍,里面的函數(shù)大多時間是直接去讀寫寄存器儿捧。
很多單片機項目嚴重依賴于硬件,換一個芯片后怎么辦挑宠?重寫一套代碼唄菲盾。
在單片機程序里,沒有應用程序各淀、驅動程序的概念懒鉴,很可能一個人包攬了硬件設計、模塊調試(或稱之為驅動)碎浇、功能開發(fā)(或稱之為應用)的全部活临谱。
1.4 在Linux中點燈、使用LCD
在Linux中奴璃,不允許應用開發(fā)人員直接去操作硬件悉默,比如你想點個燈,不好意思苟穆,你無法直接訪問寄存器抄课;你需要通過驅動程序來訪問寄存器。
為什么雳旅?有幾大原因:
1.Linux系統(tǒng)中運行著眾多程序跟磨,必須保證質量差的程序無法破壞系統(tǒng):
假設你寫的程序比較爛,那我不能讓你去隨便訪問寄存器攒盈,把系統(tǒng)搞崩潰了怎么辦抵拘?你本意是去點燈,但是你看錯了寄存器沦童,你把電源關了怎么辦仑濒?
所以這些操作硬件的活叹话,還是交給信得過的人來做吧:交給驅動工程師,他既懂硬件又懂軟件墩瞳。
2.保證程序的可移植性:
編寫應用程序時驼壶,大家都使用統(tǒng)一的函數(shù),以后換一個芯片時喉酌,應用程序不用變热凹;只需要根據(jù)這個接口提供驅動程序就可以了。
3.團隊協(xié)作:
使用Linux系統(tǒng)的項目一般比較大泪电,術業(yè)有專攻般妙,一個人不太可能從上到下都全部掌握。比如做人臉識別項目相速,有擅長做圖像處理的碟渺,他可不管你要用多少種攝像頭,有圖像給他就可以突诬。而多種攝像頭的硬件操作方法各有不同苫拍,這些交給驅動程序工程師。
所以旺隙,在Linux中應用程序和驅動程序是分開的绒极。
也許你已經(jīng)大概猜出來了,應用程序怎么調用驅動程序蔬捷?通過標準的接口:
open:
打開驅動程序垄提。
read/write:
讀、寫數(shù)據(jù)周拐。
ioctl:
傳入各種參數(shù)铡俐,獲得各種參數(shù)。
mmap:
內(nèi)存映射速妖,比如映射之后高蜂,應用程序可以直接讀寫LCD的顯存。
你看罕容!從這些接口里,我們根本看不到寄存器的操作稿饰。底層的程序驅動會根據(jù)這些調用锦秒,去設置寄存器、操作硬件喉镰。
所以旅择,我高大上的應用工程師,干嘛苦哈哈地去看原理圖侣姆、看在片手冊生真、讀寫寄存器沉噩,搞不好還要去調試硬件BUG。這些臟活柱蟀、累活就交給驅動工程師吧川蒙。客戶的需求千變?nèi)f化长已,我996時間都不夠用了畜眨。
我上懂軟件、下懂硬件的驅動工程師术瓮,肯定不能把這么重要的活交給你去做了康聂,把我的系統(tǒng)搞崩潰了怎么辦。
開玩笑胞四、開玩笑恬汁、開玩笑的,有應用工程師辜伟、驅動工程師的優(yōu)劣之分蕊连,大家都是為了做出產(chǎn)品。現(xiàn)在有一個趨勢游昼,一個任務從上到下你都需要懂甘苍,這就是所謂的全棧工程師。
在Linux中烘豌,“一切皆文件”载庭,要訪問某個硬件,也是要打開文件廊佩、讀寫文件囚聚。應用程序要根據(jù)標準的文件接口:open/read/write/ioctl/mmap等來訪問驅動程序。
既然如此标锄,怎么寫驅動程序呢顽铸?最簡單的方法就是:APP要調用open來打開驅動程序,那驅動‘程序里就提供一個xxx_open函數(shù)來初始化硬件料皇;APP要調用write來寫數(shù)據(jù)谓松,驅動程序里就提供一個xxx_write函數(shù)來接收數(shù)據(jù)并操作硬件。
用xxx_open践剂、xxx_write來構成一個驅動程序鬼譬,這就是驅動框架。
怎么實現(xiàn)這些xxx_open逊脯、xxx_write函數(shù)优质?我們要做的事情跟單片機是類似的,一樣要去看電路圖、看芯片手冊巩螃,然后在這些函數(shù)里讀寫寄存器:這稱為硬件操作演怎。
所以,Linux驅動程序= 驅動框架 + 硬件操作避乏。
有單片機基礎的人爷耀,對硬件操作比較熟悉了,把重點放在驅動框架上就可以淑际。
高能預警:驅動框架可不簡單畏纲,對于LED來說是簡單,但是還有更復雜的驅動程序春缕,它要考慮“通用”盗胀,這很要命。
————————————————
版權聲明:本文為CSDN博主「韋東山」的原創(chuàng)文章锄贼,遵循CC 4.0 BY-SA版權協(xié)議票灰,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/thisway_diy/article/details/106101091