嵌入式相關概念雜談

1、背景說明

之前在互聯網幹活,主要講的是4A、集羣這些偏應用層的概念;如今轉入物聯網行業,主要講的變成了串口、驅動這些偏硬件的概念。html

以前沒怎麼注意,但這兩天看着身旁的開發板,忽然想到本身對硬件的不少概念都只知其一;不知其二,有必要探究明確一番。ios

 

2、各類問題和名詞

2.1 分時操做系統和實時操做系統的區別?

咱們在網上常看到的定義以下:編程

分時操做系統指將CPU時間分紅多個時間片斷,以輪轉方式供不一樣進程使用,常見於桌面系統。特徵是可多用戶同時登陸(多用戶必然致使多進程)、可同時運行多個程序。windows

實時操做系統指在規定時間內必須完成給定任務的系統,常見於嵌入式設備。api

應該說分時操做系統定義沒有什麼問題,但實時操做系統的定義就讓人看不懂。「規定時間內必須完成給定任務」?那我是否是讓你一秒運行億億億次也能夠?那咱們還研究什麼超級計算機,你們寫個實時操做系統就完事了,想跑多快跑多快----顯然這是瞎扯淡,巧婦難爲無米之炊到哪都同樣,我不太明白爲何還處處是這種定義且沒人糾正。緩存

按我的理解,分時操做系統的關鍵點是時間分片、時間輪轉、進程優先級;實時操做系統應該也是這幾個點,惟一的區別應該是在進程優先級上。分時操做系統中高優先級任務到來時,任務被分配到下一時間片,須要等待當前任務用完當前時間片;而在實時操做系統中,當高優先級任務到來時,無論當前CPU在執行什麼任務執行到什麼狀態都必須立刻停止,轉而執行到來的高優先級任務,至於何時完成或者完不完得成都得看硬件。架構

再回頭看,咱們爲何要使用實時操做系統並且尤爲是嵌入式設備裏面使用實時操做系統?緣由是原先的嵌入式設備計算能力有限,好比咱們但願1秒內處理完某件事情原來計算能力弱只能一來就處理才能知足需求,因爲摩爾定律的做用如今計算能力很強了即使是分時也徹底能夠知足需求,反卻是運行實時操做系統不斷切換上下文顯得浪費CPU資源。事實上好比咱們常據說的航空航天上經常使用的vxWorks,其市場已經萎縮其,開發者Wind River不得不開發基於Linux的分時操做系統Wind River Linux。固然通常工業界通常沒什麼門戶之見而是無論黑貓白貓抓到老鼠就是好貓,若是真有時間要求嚴苛或須要佔用大量計算資源的任務,如今的架構上通常是設計一個專門的芯片去處理,CPU只管任務分配和獲取結果無論計算過程。最典型的就如手機上加個AI芯片之類的。編碼

 

2.2 CPU是怎麼計算的?能說的通俗一點嗎?

說電路又想起我《數字電路》只有可憐的七十來分,和高數大概並列最慘的兩門課,也只能說得通俗一點技術一點是不太行的。操作系統

從微觀到宏觀角度:.net

數字電路中最基礎的是與、或、非三種門電路。

使用這三種門電路進行必定的並串聯組合能夠獲得有必定意義的組合電路,如8-3編碼器、3-8譯碼器等。對於CPU須要的是這些門組合成一種微指令譯碼器,就是接收到某條微指令就會打開某些門關門某些門獲得某些輸出。全部微指令的集合叫微指令集。

多條微指令構成一個微程序,亦即一條機器指令;或者說,機器指令是微指令集的排列組合。

多條機器指令構成一行高級語言代碼;或者說,代碼是機器指令的排列組合。若是是精簡指令集(RISC,reduced instruction set computing)那麼機器指令數量通常是百來條,若是是複雜指令集(CISC,complex instruction set computer)那麼機器指令數量通常兩百條以上。

多行代碼構成了最終的程序;或者說,程序是代碼的排列組合。

從宏觀到微觀角度:

程序由代碼構成,代碼由指令構成,指令由微指令構成,而微指令執行者是與或非門構成的譯碼器;簡而言之,無論你程序如保變幻無窮最終就是一套固定的微指令集的排列組合,即對CPU而言就只是那幾個固定的電路開開關關操做;(一如變幻無窮的字其實也就是橫豎撇捺折的排列組合,變幻無窮的音樂也就哆來咪發唆拉西的排列組合。)

 

2.3 驅動是什麼?

坐旁邊的就是驅動開發部,上週忽然想到我仍是回答不上來長久以來沒搞清楚的一個問題:驅動是什麼?

這問題最先起源應該是每次給電腦插上U盤等硬件時一開始都提示「正在安裝驅動」,加劇於重裝系統時上不了網窒友說須要先離線安裝網卡驅動。

關於驅動最多見的說法是,操做系統須要經過驅動來操做硬件。應該說這種說法是沒什麼問題的,但從編程角度說仍是不是很使人滿意,由於仍是不能讓人明白驅動是哪部分的代碼。

一個驅動就是一組內核態的API。具體到Linux上就是一個ko文件,安裝驅動就是把驅動ko經過insmod安裝到內核裏;windows也差很少,安裝驅動就是把驅動api安裝到內核裏。

操做系統已經爲通用硬件設備(如USB)準備了驅動,須要時直接安裝上去就能夠了。若是非通用設備那就須要設備廠商提供驅動,設備廠商提供的驅動api操做系統認不認識是不重要的,由於最終操做這些非通用設備的不是操做系統而是設備廠商提供的應用軟件,只要這些應用軟件知道怎麼傳參和處理返回結果就能夠了。

咱們能夠看到硬件廠商中一般會有「應用開發部」和「驅動開發部」,應用開發部就是開發操做硬件的應用軟件,而驅動開發部的就是響應應用開發部的需求整合提供相應的內核態接口。

總而言之,對最終用戶而言,驅動就是一套內核態api;對企業內部內言,驅動更側重於該套api的分析、實現、維護的整個過程。

參考:https://docs.microsoft.com/en-us/windows-hardware/drivers/gettingstarted/what-is-a-driver-

 

2.4 硬件接口一定要麼是串口要麼是並口嗎?

串口(Serial Port),串行接口,又稱COM(Communication)口。一個獨立信道數據收發各一根線,數據一位一位(bit)地傳(或者叫一時鐘一數據)。

並口(Parallel Port),並行接口,又稱LPT(Line Printer Terminal)口。一個獨立信道數據收發各有多根線,數據一次傳送多位(或者叫一時鐘多數據),一般是8位。

數據傳輸要麼是串行的要麼是並行的(應該沒有人設計成一下串行一下並行這麼吃力不討好的事),從這個概念出發全部硬件接口確實要麼是串口要麼是並口。

理論上,一時鐘多數據的並口速度快於一時鐘一數據的串口,但在電路上線路間距很小並行數據之間容易相互干擾,沒法辯別時還要重傳因此並口在處理很差的狀態下並不比串口快。當下只有打印機、掃描儀等少數接口使用並口。

也就是說除了打印機、掃描儀的接口外均可以叫串口,但通常地,串口只指RS232和RS485(二者的驅別隻是後者使用的電壓範圍較寬可傳輸的距離更遠)等URAT(Universal Asynchronous Receiver/Transmitter)口。由於USB、HDMI、網口等接口是「一個獨立信道數據收發各一根線」,但他們同時有多個獨立信道,並不是傳統上嚴格的串口。或者叫原理上是串行的但效果上是並行的。

咱們也很難從外觀上判斷一個接口是並口仍是串口,由於多根線徹底能夠作得像一根同樣,並且串口也不必定只有收、發、電源這幾根線。

參考:https://www.zhihu.com/question/27815296

 

2.5 電腦上的bios和硬盤對應到手機上是什麼?

在電腦上概念仍是很明確的:

CPU能直接尋址訪問的存儲器叫內部存儲器,簡稱內存;不能直接尋址訪問的存儲器叫外部存儲器,簡稱外存。

內存包括高速緩存Cache、RAM(主要就是內存條)和ROM(主要就是安裝BIOS的CMOS);外存包括硬盤、移動硬盤、U盤、SD卡等。

硬盤屬於外存而不是內存,因此很顯然硬盤既不是RAM也不是ROM。

但到智能手機普及後概念就有點混亂了:

內存直接被用來指存文件的FLASH,在手機內存只有512M的年代就被叫作內存有8G、16G;後來修正了一些,弄了運行內存和機身內存兩個名詞。

這種外行糊弄倒還能理解,真讓認知陷入危機的緣由是回答不上如下幾個問題:ROM真的是隻能讀不能寫的嗎?若是FLASH是外存至關於電腦的硬盤,那麼至關於電腦BIOS的BootLoader裝到哪裏去了?若是BootLoader在FLASH上,那FLASH是否是確實能夠叫內存?

ROM(Read-Only Memory),最開始是如其名只能讀不能寫的,但發展到EPROM開始就已經可讀寫了。因此如今的ROM其實也是可讀寫的,只是由於其承載原先ROM的功能因此還叫ROM(所謂功能主要是存放BIOS)。如今純正的ROM基本都被淘汰了,所謂的ROM基本都是存放BIOS的FLASH。

FLASH又分Nor Flash和NAND Flash兩種,Nor Flash和RAM同樣可按字節讀取、速度較快、成本較高;NAND Flash和硬盤同樣按塊讀取(一般是512字節)、速度較慢、成本較低。如今一般的作法是「小塊Nor Flash+NAND Flash」的組合。BootLoader安裝在NAND Flash上,手機啓動時自動將NAND Flash中的前4K BootLoader加載到Nor Flash上完成必要硬件和寄存器的初始化及將BootLoader剩餘部分複製到RAM的操做。也就是說嵌入式設備中,至關於BIOS的BootLoader確實是存放在FLASH上,至於說爲何刷機沒有破壞BootLoader那是由於BootLoader在專門的一塊地址空間,升級系統時無權限寫該地址。

系統固件被稱爲ROM是由於Flash被稱爲ROM,而Flash被稱爲ROM是由於其上裝載着至關於BIOS的BootLoader,這是一種從功能傳呈角度出發得出的結果。但從嚴格的定義出發是內存仍是外存取決於CPU可否尋址,從以上分析能夠看到,在當前嵌入式設備中設計整體而言CPU是不能直接對Flash進行尋址的,因此Flash不能算內存。

另外,桌面Linux中最多見的bootloader是grub,嵌入式中最多見的bootloader是uboot;高通處理器bootloader通常是高通本身開發的lk(little kernel),固然不少手機廠商也會改寫或編寫bootloader。

參考:

http://www.javashuo.com/article/p-zcdwkmac-cr.html

https://blog.csdn.net/liangkaiyang/article/details/5955653

https://www.zhihu.com/question/24645885

 

2.6 固態硬盤爲何比機械硬盤快?

機械硬盤慢的主要緣由是須要費不少時間將讀寫磁頭從當前位置移動到目標位置上(具體計算公式記不清了)。

咱們前面說硬態硬盤是一種FLASH----更具體一些是NAND Flash----FLASH對全部空間是編好地址而後使用電子方式讀寫的,能夠認爲尋址是瞬間完成的。

FLASH以固態硬盤形式展示時,模擬的是機械硬盤,操做系統讓它去尋址時它就直接回已就緒。尋址這個大頭被去掉了讀寫速度天然就快了。

關於SLC、MLC、TLC和QLC:

SLC----Single-Level Cell,單階存儲單元。一個存儲單元存儲一比特(1 bit)信息。

MLC----Multi-Level Cell,多階存儲單元,現通常用來指雙階存儲單元。一個存儲單元存儲兩比特(2 bit)信息。

TLC----Triple-Level Cell,三階存儲單元,也叫3-bit MLC。一個存儲單元存儲三比特(3 bit)信息。

QLC----Quad-Level Cell,四階存儲單元。一個存儲單元存儲四比特(4 bit)信息。

一般咱們說低電平(壓)表示0高電平(壓)表示1----這也是SLC的實現----那1個存儲單元怎麼實現存儲多比特信息呢?答案是經過細分更多的電平區間,以下圖所示。

對一塊固態硬盤的一次完整讀寫,對於SLC物理上也是一次讀寫,而對於MLC是兩次對於TLC是三次對於QLC是四次,這也正是總說越多LC越容易壞的緣由所在。

參考:https://zh.wikipedia.org/wiki/%E9%97%AA%E5%AD%98#SLC

 

2.7 兩張網卡兩個網口,只有一個網口接線,爲何從別的主機也能ping通未接線網口對應的IP?

首先,當兩個網口共用一個協議棧時,操做系統並不區分當前詢口的是存活網口的IP仍是未存活網口的IP,只要是該協議棧的IP的數據包操做系統都會響應。

其次,在一般狀況下操做系統會選擇一個網口做爲默認路由網口,當該網口down掉時,又會自動選擇一個存活的網口做爲其默認路由網口。因此(在沒有本身配置相應靜態路由前提下)響應數據包總會根據自身的路由表能從存活的網口出去。

由此,在網口共用協議棧狀況下,其餘主機上總能訪問到未接網線的網口的IP。

 

2.8 QoS是什麼?

QoS,Quality of Service,服務質量。

當到來的數據超出了交換機或路由器的處理能力時,交換機和路由器將會丟棄部分數據包只轉發部分數據包(此所謂盡最大能力交付)。給交換機和路由器指出數據包重要程度以供其參考要轉發哪些數據包丟棄哪些數據包的功能就是QoS。

更具體點說說就是Eth頭和IP頭上各有一個表示該數據包重要程度(或者叫優先級)的字段,數值越大表示越重要,在交換機和路由器的轉發優先級就應越高丟棄優先級就應越低。

交換機還好說,只拆Eth頭因此優先級就按Eth頭的QoS字段排就行了。但到路由器,是即拆Eth頭也拆IP頭的,若是Eth頭和IP頭上QoS字段的值不一致(應該說大機率是不同的由於二者的長度不同)甚至相左時,優先級應當以哪一個爲準呢?這個不必定,看路由器代碼開發者決定。

相關文章
相關標籤/搜索