做嵌入式系統(tǒng)開發(fā)伊诵,經(jīng)常要接觸硬件哀墓。做嵌入式開發(fā)對數(shù)字電路和模擬電路要有一定的了解嘱能。
這樣才能深入的研究下去激况。下面我們簡單的介紹嵌入式開發(fā)中的一些硬件相關(guān)的概念投储。
總線(Bus)
在嵌入式系統(tǒng)中一定會有一塊處理器芯片拱她,此外炸茧,還有其它的芯片作為外部設(shè)備(后面簡稱外設(shè))瑞妇,這些芯片與處理器協(xié)作實現(xiàn)產(chǎn)品的功能。復(fù)雜的產(chǎn)品往往是由大量的芯片組成的梭冠。那么不可避免的是我們需要將所有的外設(shè)與處理器進行相連踪宠,最為簡單的是將所有的外設(shè)都采用獨立(注意是獨立)的信號線連接至處理器,這樣的好處是容易理解妈嘹,但問題是:不可行柳琢。
因為處理器芯片需要引出太多的線了,從芯片的生產(chǎn)和產(chǎn)品的生產(chǎn)角度來看都不實際润脸。加之柬脸,處理器(在此我們假設(shè)處理器是單核的,而不是多核的)處理事務(wù)在微觀上是串行的毙驯,也就是說在某一時刻如果要對外設(shè)進行讀寫操作倒堕,那只可能是對大量外設(shè)中的一個進行,即多個外設(shè)不可能在微觀上被處理器同時訪問爆价。
需要注意的是垦巴,這里提出了微觀這一概念,這是為了區(qū)別于宏觀铭段。從宏觀上來講骤宣,一個處理器中可以有多個任務(wù)同時運行,但這些任務(wù)在微觀上卻是一個一個運行的(后面會用串行來描述這里所說的“一個一個”)序愚,多任務(wù)的串行運行實現(xiàn)是由操作系統(tǒng)扮演著重要的角色來實現(xiàn)的憔披。
回到我們的話題,即然將每個外設(shè)采用獨立的信號線連到處理器不可行,且處理器在單一時間內(nèi)只會對一個外設(shè)進行訪問芬膝,那我們能不能采用共享的信號線將所有的芯片連在一起呢望门?這就是總線概念的由來。通俗的說锰霜,如果我們周圍有十個家庭筹误,為了讓這十個家庭每兩個之間都能往來,我們并不需要為每兩個家庭修一條單獨(注意是單獨)的路(如果這樣癣缅,要修45條路)厨剪,而是可以修一條大路,然后所灸,每個家都與大路相連丽惶。
對于總線,我們往往說總線是處理器的爬立,而其它的外設(shè)是掛在總線上的钾唬。那有一個問題,我們每一時間只能訪問掛在總線上的一個外設(shè)侠驯,那如何區(qū)分這些外設(shè)呢抡秆?和我們的路一樣,我們需要用地址來區(qū)分每一個家庭吟策,在總線上儒士,也是采用地址來進行區(qū)分的。
這樣檩坚,總線就根據(jù)其功能分為兩類了着撩。一類是地址總線,這一總線上的數(shù)據(jù)只會是從處理器向外設(shè)“流”匾委,是單向的拖叙。另一類則是數(shù)據(jù)總線,用來將數(shù)據(jù)從處理器傳送到外設(shè)(從處理器的角度來說是寫操作)或者是將數(shù)據(jù)從外設(shè)傳送到處理器(從處理器的角度來說是讀操作)赂乐,顯然薯鳍,數(shù)據(jù)總線是雙向的。也就是說挨措,在我們的嵌入式系統(tǒng)中同時存在地址總線和數(shù)據(jù)總線將所有需要與處理器進行通訊的芯片連在一起的挖滤。
總線是有寬度的,正如我們的路分為“三車道”或是“四車道”浅役,我們說32位處理器斩松,是指其數(shù)據(jù)總線寬度是32位,也就是“有32輛車能同時跑”担租,顯然砸民,寬度越是寬我們的處理器速度就越是快,因為我們從外設(shè)芯片存取數(shù)據(jù)的速度會更快奋救,這就是為什么我們的計算機向64位發(fā)展的原因岭参。同樣的,地址總線也是有寬度的尝艘,對于32位處理器其最大寬度也就是32位演侯。
總線的概念有了,那接下來的一個問題是背亥,即使是每一個外設(shè)都有一個地址秒际,那這一地址記在哪里呢?是放在外設(shè)芯片上嗎狡汉?如果這樣的話娄徊,那就有一個問題,每一類外設(shè)的地址必須是不能重疊的盾戴,而當(dāng)一個產(chǎn)品中需要兩塊一樣的芯片的話寄锐,兩塊芯片的地址就無法區(qū)分了,看來這樣操作存在問題尖啡。還有橄仆,如果這樣的話每一個外設(shè)也得與(比如,32根)數(shù)據(jù)總線完全相連衅斩,并監(jiān)聽數(shù)據(jù)線以了解處理器是不是在“叫”自己盆顾,這樣很是復(fù)雜。
此外畏梆,地址也有可能因為外設(shè)種類的增多而用光您宪。總的來說地址不能存放在外設(shè)芯片奠涌,那如何讓外設(shè)知道宪巨,此時它是被處理器招換從而需要進行讀寫訪問的呢?答案就是芯片的片選(CS铣猩,chip select)信號揖铜,或者又號使能(ENable)信號。
片選(CS或EN)
片選信號對于外設(shè)芯片來講达皿,就是一個(也是一根)通知信號天吓,告訴芯片“嘿,請開門峦椰,我要放些東西進來龄寞,或是拿些東西走”,這里的東西只能是數(shù)據(jù)汤功,不可能是玉米棒什么的物邑。那有個問題,這個信號源從哪里來呢?顯然色解,只能從處理器來茂嗓。那是不是也是像總線那樣,每一個芯片都共用一根線連在一起呢科阎?
如果這樣述吸,可能處理器“一叫開門”所有的芯片都將“門”打開了。如果是處理器寫數(shù)據(jù)锣笨,那可能所有的芯片都被寫入同樣的數(shù)據(jù)蝌矛。而取數(shù)據(jù)時,每個外設(shè)芯片都向外“扔”數(shù)據(jù)错英,這一定會造成數(shù)據(jù)總線沖突入撒,因為有的芯片向總線上“扔”1,有的則“扔”0椭岩,這種情況下處理器一定會“發(fā)瘋”的茅逮,因為它不知道應(yīng)當(dāng)?shù)玫?還是0。
即然這樣簿煌,那顯然不能將所有的片選信號連在一起了氮唯,只能是各芯片的片選信號獨立。前面提到了地址總線姨伟,我們是采用一根地址線連一個外設(shè)芯片呢惩琉?還是采用其它的方法。如果采用一根地址線連一個外設(shè)芯片夺荒,那可能最多只能掛接32個芯片了瞒渠,這顯然不行。
其實技扼,在現(xiàn)實中伍玖,是采用32位的數(shù)字來表示一個外設(shè)芯片的地址的,比如1可以表示芯片A剿吻,而6534可以表示另外一個芯片B窍箍,等等。由此看來丽旅,理論上我們可以表示2的32次方(4294967296)個設(shè)備椰棘,之所以說理論上,是因為有的設(shè)備要占用大量的地址榄笙。即然這樣邪狞,那還有一個問題,如果將32位的地址總線轉(zhuǎn)換成芯片的一根片選信號呢茅撞?這需要引入譯碼(器)的概念帆卓。
譯碼(器)
譯碼器將一個數(shù)據(jù)轉(zhuǎn)換成一根信號線上的信號巨朦,比如3/8譯碼器,可以將一個位寬是3位的數(shù)據(jù)轉(zhuǎn)換成8根(2的3次方)完全獨立的信號線剑令,當(dāng)向數(shù)據(jù)側(cè)寫入二進制的011時糊啡,對應(yīng)的是8根線的第3根,當(dāng)輸入二進制的111時尚洽,對應(yīng)的是8根線中的最后一根悔橄。有了譯碼器靶累,處理器的地址線就簡化了腺毫,只要32根地址線加上外面的譯碼器,就可以訪問大量的外設(shè)芯片了挣柬。外部設(shè)備的選擇問題潮酒,我們已經(jīng)解決了,現(xiàn)在還得回頭看一看數(shù)據(jù)總線邪蛔。
在嵌入式系統(tǒng)中急黎,所有芯片的數(shù)據(jù)總線可以理解成是直接相連的。之所以用了“可以理解”一詞侧到,是因為為了提高總線的負載能力勃教,其中會加入總線驅(qū)動器。為了理解匠抗,我們看一看我們生活中的自來水故源,比如,在北京理論上可能所有的水管是連在一起的汞贸,但中間可能為了提高水壓绳军,存在很多小的水站用來增加供水壓力,而不可能全北京所有的自來水自接來自一個水廠矢腻。
即然所有的數(shù)據(jù)總線是連在一起的门驾,那就可能會有問題。當(dāng)向外部設(shè)備寫數(shù)據(jù)時多柑,處理器先向地址總線輸送目標外設(shè)的地址奶是,地址譯碼器將其轉(zhuǎn)換成一根信號的片選信號送到了目標外設(shè),目標外設(shè)收到這一信號后竣灌,將“門”打開聂沙。接下來處理器將要傳送到外設(shè)的數(shù)據(jù)往數(shù)據(jù)總線上一放,由于只有目標外設(shè)芯片打開了“門”帐偎,所以數(shù)據(jù)只會進入到目標外設(shè)逐纬,而其它的外設(shè)什么也不會收到。很好!處理器向外寫數(shù)據(jù)應(yīng)當(dāng)沒有問題削樊,我們接下來看一看讀豁生。
讀的話兔毒,由于數(shù)據(jù)是從外設(shè)輸送到處理器的,盡管我們采用和寫一樣的方法打開目標外設(shè)的“門”甸箱,但此時育叁,其它的外設(shè)也在數(shù)據(jù)總線上,它們有可能處于1也可能處于0芍殖,是不是會影響處理器讀取目標外設(shè)的數(shù)據(jù)呢豪嗽?結(jié)果當(dāng)然不會,但我們得引入另一個概念:高阻態(tài)豌骏。
高阻態(tài)
很顯然龟梦,當(dāng)處理器從目標外設(shè)讀數(shù)據(jù)時,我們希望其它沒有被選上的芯片的數(shù)據(jù)總線不會對目標外設(shè)所要傳送的數(shù)據(jù)有影響窃躲,那怎么辦呢计贰?實際上,當(dāng)芯片沒有被選中時蒂窒,其數(shù)據(jù)總線都處于高阻態(tài)躁倒。
所謂的高阻態(tài),我們可以理解成這一管腳在外設(shè)芯片內(nèi)部是斷開的洒琢,如此一來秧秉,顯然不會對處理器從目標外設(shè)讀取數(shù)據(jù)造成任何的影響了。我們說當(dāng)一個芯片沒有被選中或是沒有被使能時衰抑,其數(shù)據(jù)總線一定是處于高阻態(tài)的象迎。前面用了“門”的開和關(guān)來打比方,那“門”是指什么呢停士?是指外設(shè)的數(shù)據(jù)總線挖帘,片選信號的作用就是控制將外設(shè)的數(shù)據(jù)總線與處理器的數(shù)據(jù)總線相連或是斷開。
驅(qū)動
總線上的數(shù)據(jù)是誰放上去的我們就說誰是那一時刻的驅(qū)動者恋技。也就是說拇舀,當(dāng)處理器向外設(shè)寫數(shù)據(jù)時,它是在驅(qū)動數(shù)據(jù)總線的蜻底,而當(dāng)處理器從目標外設(shè)讀取數(shù)據(jù)時骄崩,目標外設(shè)是在驅(qū)動數(shù)據(jù)總線的。對于地址總線薄辅,因為只可能從處理器向目標外設(shè)寫要拂,所以地址總線永遠是由處理器驅(qū)動的。當(dāng)一個芯片沒有被選中時站楚,我們說它并不驅(qū)動數(shù)據(jù)總線脱惰。
三態(tài)門
前面我們說到外設(shè)芯片的數(shù)據(jù)總線在沒有被選中時其處于高阻態(tài),當(dāng)被選中時窿春,其電平可能是高(1)或是低(0)拉一。如此一來采盒,我們說外設(shè)的數(shù)據(jù)總線其芯片管腳是屬于三態(tài)門的,即存在高電平蔚润、低電平和高阻態(tài)磅氨,三個狀態(tài)。
電平的有效性
前面我們了解了什么是片選信號嫡纠,也講到了三態(tài)門烦租,需要指出的是片選信號通常不是三態(tài)門,其只存在兩個狀態(tài)除盏,即高電平或是低電平叉橱。前面我們也說了,片選信號是用來“開門”的痴颊,而片選信號又有高和低電平赏迟,那到底是高電平表示“開門”呢?還是低電平蠢棱?
對于這一問題,我們稱如果一個電平對于一個片選信號表示“開門”那么它就是這一信號的有效電平甩栈。比如泻仙,對于一個片選信號,如果低電平表示“開門”量没,那么我們說這個片選信號是低電平有效的玉转。雖然,在這里我們用片選信號來解釋電平的有效性殴蹄,但是很多信號都存在有效性的問題究抓,比如,后面我們將要談的讀信號和寫信號都存在有效性問題袭灯。
時序
在前面我們說到當(dāng)處理器要向外設(shè)芯片寫數(shù)據(jù)時刺下,需要先將所需訪問的外設(shè)的地址放在地址總線上,然后稽荧,由譯碼器將地址總線上的數(shù)據(jù)轉(zhuǎn)換成片選信號橘茉,片選信號則使能目標外設(shè)芯片,接下來處理器寫數(shù)據(jù)到數(shù)據(jù)總線上姨丈,從而完成一個寫操作畅卓。顯然,在處理器將數(shù)據(jù)寫到數(shù)據(jù)總線之前地址線上的數(shù)據(jù)必須一直保留一段時間蟋恬,否則的話譯碼器不能長時間的使片選信號有效翁潘。
當(dāng)完成了數(shù)據(jù)的寫操作后,處理器就不需要保證地址總線上的地址有效了歼争。我們可以看出拜马,這一系列的操作都有一定嚴格的時間順序的箱歧,這稱之為時序。時序描述了處理器與外部設(shè)備的交互信號 “規(guī)程”一膨,大家只有按照這一“規(guī)程”來操作呀邢,才能保證處理器與外部設(shè)備之間能正常的通訊。這好比豹绪,我們的道路上的紅綠燈价淌,如果我們行人和車輛不按照其指示來通行的話,就會出現(xiàn)事故瞒津。通常蝉衣,采用時序圖來描述芯片之間通訊的信號“規(guī)程”。
ADDRESS是表示地址總線的巷蚪,DQ是表示數(shù)據(jù)總線的,CE是片選信號病毡,且是低電平有效,其寬度要保證在進行讀操作時總是有效的屁柏。學(xué)會看時序圖對于做嵌入式系統(tǒng)開發(fā)非常有幫助啦膜,因為我們不可避免的要與芯片打交道。
在時序圖中淌喻,通常會標識很多的時間需求信息僧家。在寫啟動代碼時需要初始化各地址空間的片選地址寄存器和讀寫時序,時序的配置依據(jù)就是來自于外設(shè)芯片的時間需求裸删,這是芯片手冊很重要的一部分內(nèi)容八拱。當(dāng)一個地址空間中存在多個外設(shè)芯片時,我們需要考慮到其中最慢的外設(shè)芯片的時間需求涯塔,否則的話有的芯片就不能正常工作肌稻。
讀信號
當(dāng)處理器需要從外設(shè)芯片讀取信號時,除了需要產(chǎn)生片選信號外匕荸,還需要告訴外設(shè)芯片這是一個讀操作爹谭,而不是一個寫操作,這是通過讀信號來實現(xiàn)的每聪。
寫信號
前面講了讀信號旦棉,我想對于寫信號也就不難理解了,這個信號用于告訴外設(shè)芯片药薯,這是一個向外設(shè)芯片寫數(shù)據(jù)的操作绑洛。
前面提到了外設(shè)(芯片),現(xiàn)在是對外設(shè)進行分類的時候了童本。大體上外設(shè)分為兩類真屯,一類是存儲器外設(shè),而另一類是非存儲器外設(shè)穷娱,后者常被稱之為I/O設(shè)備,這里的I/O是Input/Output的簡寫,即輸入掘而、輸出⌒恚可見,I/O外設(shè)是一個非常寬泛的概念篓叶。對于存儲器外設(shè)烈掠,其特點是,它所占用的空間是連續(xù)的一片缸托。比如左敌,SDRAM內(nèi)存就是屬于存儲器外設(shè),如果其容量是8M字節(jié)俐镐,那么其占用的地址空間也會是8M的矫限。
與存儲器外設(shè)所不同的是,I/O外設(shè)所點用的地址一般都很少佩抹。比如一個I/O外設(shè)可能存在多個控制寄存器叼风,這些控制寄存器從處理器來看就是多個I/O端口(地址),向這個地址寫數(shù)據(jù)就是向外設(shè)所對應(yīng)的寄存器寫數(shù)據(jù)匹摇,反之咬扇,也可以是讀。比如廊勃,一個串口芯片可能存在多個寄存器,一個用來查詢芯片的狀態(tài)经窖,一個用來設(shè)置芯片的功能坡垫,另一個用來讀取芯片從串口線所收到的數(shù)據(jù),最后画侣,還有一個用來向芯片寫數(shù)據(jù)以向串口線上發(fā)送數(shù)據(jù)冰悠。對于這一串口芯片的寄存器,從處理器的角度來看配乱,都是獨立的I/O端口溉卓。
I/O端口存在讀、寫性問題搬泥,有的端口是只讀的桑寨,有的端口是只寫的,還有的端口是即可讀也可寫忿檩,其讀寫性是由外設(shè)芯片的寄存器所決定的尉尾,在芯片的數(shù)據(jù)手冊中能找到。需要指出的是燥透,有些存儲器外設(shè)也存在I/O端口沙咏,以對其進行一定的控制辨图。從I/O端口這一名字來看,對于處理器來說肢藐,就是對從外面讀入數(shù)據(jù)或是向外面輸出數(shù)據(jù)的一個接口總稱故河。
中斷
中斷從硬件的角度來看就是一個能產(chǎn)生高、低電平的一根信號線吆豹,但理解它需要從處理器的角度出發(fā)鱼的。我們說過了,處理器從微觀上看瞻讽,所做的工作是按順序進行的鸳吸,其對程序的處理只能是一條指令一條指令的執(zhí)行。如果存在需要對外設(shè)芯片進行訪問速勇,而有可能從處理器發(fā)出讀晌砾、寫命令后,由于外設(shè)通常比處理器慢很多烦磁,所以外設(shè)芯片需要一些時間來準備好所需的數(shù)據(jù)养匈。在這種情況下,如果處理器一直等外設(shè)芯片的返回數(shù)據(jù)再執(zhí)行后續(xù)的指令的話都伪,將耗費寶貴的時間呕乎,這些時間完全可以用來做其它的工作。
別忘了陨晶,從宏觀上看來處理器常常是多任務(wù)的猬仁,任務(wù)是指操作系統(tǒng)所提供的調(diào)度單位。當(dāng)一個任務(wù)因為等待外設(shè)芯片的數(shù)據(jù)而阻塞時先誉,我們可以切換到另外的任務(wù)湿刽,從而提高處理效率。這就有一個問題褐耳,當(dāng)處理器去處理另一個任務(wù)時诈闺,如果外設(shè)芯片的數(shù)據(jù)好了的話,如果告訴處理器呢铃芦?就是通過中斷信號雅镊。中斷信號的高、低電平可以用來表示是否有中斷需要處理器注意以處理特定的事件(比如刃滓,外設(shè)數(shù)據(jù)準備好了的事件)仁烹。
由此看來,中斷的引入能大大的提高處理器的運用效率注盈。為了使用處理器上的中斷晃危,一開始我們需要初始化好處理器的中斷控制器,比如安裝好所需的中斷服務(wù)程序或稱之為ISR(Interrupt Service Routine),然后僚饭,打開中斷屏蔽位震叮。中斷服務(wù)程序中需要做如下的操作:
1. 從外設(shè)讀入或向外設(shè)寫數(shù)據(jù)。讀還是寫通常需要讀取外設(shè)的中斷狀態(tài)寄存器來決定鳍鸵。
2. 清除外設(shè)的中斷信號苇瓣。我們知道,中斷信號是由外設(shè)芯片驅(qū)動的偿乖,為了告訴外設(shè)芯片击罪,處理器已經(jīng)處理完了所需做的工作,那么處理器需要通過一定的方式通知外設(shè)芯片贪薪。這種方式就是向外設(shè)芯片的寄存器中的某一位寫入一個數(shù)據(jù)媳禁,比如,可能是寫入1表示清中斷画切,也可能是寫入0表示清中斷竣稽,這通常在外設(shè)的數(shù)據(jù)手冊中能查到。當(dāng)外設(shè)收到了處理器的清中斷請求后霍弹,其就會驅(qū)動中斷線使其無效毫别。比如,一個外設(shè)的中斷線是當(dāng)其為低電平表示有中斷典格,將其從低電平變?yōu)楦唠娖骄褪球?qū)動為無效岛宦。
3. 清除處理器的中斷信號標識。處理器中往往也會保存外部中斷信號是否發(fā)生過耍缴,當(dāng)我們處理完了外設(shè)芯片的中斷時砾肺,我們也需要清除處理器上的標識,從而為下一次中斷做準備防嗡。需要注意的是债沮,清外設(shè)的中斷必須發(fā)生在請?zhí)幚砥髦袛鄻俗R之前。
中斷還存在一個觸發(fā)方式問題本鸣。有兩種觸發(fā)方式 ,一種是電平觸發(fā)硅蹦,另一種是沿觸發(fā)荣德。電平觸發(fā)是指電平的高低表示外設(shè)是否有中斷,而沿觸發(fā)則是能過中斷線上的電平的升或降來表示的童芹,顯然涮瞻,存在兩種沿觸發(fā)方式。一種是中斷線從低電平變?yōu)楦唠娖郊偻剩覀兎Q之為上升沿觸發(fā)署咽,另一處是中斷線從高電平轉(zhuǎn)換為低電平,我們稱之為下降沿觸發(fā)∧瘢總的來說中斷的觸發(fā)方式有電平觸發(fā)窒升、上升沿觸發(fā)和下降沿觸發(fā)。電平觸發(fā)方式中處理中中斷設(shè)置很重要的一個步驟慕匠。
萬用表通常是用來查看電平的高低饱须、電阻的大小等的,是常用且必不可少的工具之一台谊。在嵌入式系統(tǒng)開發(fā)中蓉媳,我們常用的是數(shù)字萬用表。
電平(Level)
在數(shù)字電路中锅铅,分為高電平和低電平酪呻,分別用1和0表示。一個數(shù)字電路的管腳盐须,總是存在一個電平的玩荠,要么高要么低,或者說要么1要到0(其實丰歌,還有另一種狀態(tài))姨蟋。
在嵌入式系統(tǒng)開發(fā)中,我們不可避免的要與外設(shè)芯片打交道立帖。調(diào)試驅(qū)動程序時眼溶,除了需要完全看明白芯片的數(shù)據(jù)手冊,且在軟件高度的過程中晓勇,還需要看我們所期望的信號電平是否發(fā)生在芯片上堂飞。比如,我們在寫驅(qū)動程序時绑咱,需要通過寫I/O端口來對外設(shè)芯片進行操作绰筛,當(dāng)寫相應(yīng)的I/O端口時,我們知道所對應(yīng)芯片的片選信號應(yīng)當(dāng)有效描融,有時铝噩,我們需要驗證是否按預(yù)期發(fā)生了,這就需要用到示波器窿克。一般的示波器是能同時觀測兩個信號線的信號狀態(tài)的骏庸。
示波器都提供一定的功能,比如設(shè)置信號撲捉的方式等等年叮。示波器很重要的一個參數(shù)據(jù)是其采集頻率具被,根據(jù)Nyquist采集定理,如果我們想用示波器查看頻率是100M赫茲的信號只损,那么其采樣頻率必須至少是其兩倍一姿,即200M赫茲。有人可能會問:為什么不用萬用表來看呢?因為萬用表的采集頻率很底,無法采集到很快的信號變化叮叹。
邏輯分析儀
簡單的說邏輯分析器就是具有很多信號通道的示波器艾栋。通過邏輯分析儀,我們可以看到地址總線和數(shù)據(jù)總線上的數(shù)據(jù)衬横。邏輯分析儀都提供一定的編程能力裹粤,用于編程什么時候開始對總線上的數(shù)據(jù)進行采集。信盈達科技12年來堅持"技術(shù)領(lǐng)先蜂林、服務(wù)領(lǐng)先"的理念遥诉,以雄厚的實力和專業(yè)的品質(zhì)成為國內(nèi)唯一有實力從產(chǎn)品最底層研發(fā)到系統(tǒng)層開發(fā)的嵌入式實訓(xùn)、產(chǎn)品解決方案提供商噪叙。
摘自? 知乎“雪碧加可樂”