• 正文
  • 推薦器件
  • 相關(guān)推薦
申請入駐 產(chǎn)業(yè)圖譜

芯片原廠驅(qū)動開發(fā)工程師:初學(xué)到精通,如何快速成長?

2024/05/29
4909
加入交流群
掃碼加入
獲取工程師必備禮包
參與熱點(diǎn)資訊討論

01 、前言

大家好,我是XX,來自湖南XX學(xué)院,電子信息18級,也曾在創(chuàng)新基地控制組學(xué)習(xí)過兩三年,畢業(yè)后就職于一家芯片原廠的解決方案部,擔(dān)任驅(qū)動工程師的職位,算上實(shí)習(xí)期,我的工作時長已有兩年。在此我想將這兩年期間學(xué)習(xí)與積累到的一些經(jīng)驗(yàn)輸出出來,與大家一同分享。

知識面有限,只能簡單介紹一些驅(qū)動開發(fā)方向的一些經(jīng)驗(yàn),且由于經(jīng)驗(yàn)尚淺,文中難免會有一些疏漏和錯誤之處,還請大家積極地批評指正。

02 、Intro

工作之后我也時長回憶起在基地學(xué)習(xí)的時光,那時主要還是學(xué)習(xí)MCU相關(guān),使用的是ST和TI家族的芯片,移植庫函數(shù)或者自行編寫驅(qū)動庫,燒錄到片內(nèi)flash上,驅(qū)動不同的外設(shè),搭載一些如PID,卡爾曼濾波等算法,加入一些邏輯上的業(yè)務(wù)代碼,即可做出一些不錯的“小產(chǎn)品”出來。

今天來看,這樣的開發(fā)歷程更像是“全棧式”的開發(fā),因?yàn)檫@個過程不僅覆蓋了驅(qū)動部分的移植,也包括了功能,也即應(yīng)用部分的開發(fā),這種開發(fā)路子常見于個人開發(fā)者,或是規(guī)模非常小的公司。一般情況下,工程量到達(dá)一定規(guī)模時,就會將二者分離到不同的崗位上來,各司其職。

然而,當(dāng)前大部分公司依然不會保留太多單純的驅(qū)動開發(fā)崗位,更多得還是BSP和應(yīng)用部分,大多數(shù)驅(qū)動開發(fā)崗位還是存在與供應(yīng)關(guān)系的上游,也即芯片原廠,不管是MCU還是其他高端的SoC,芯片驅(qū)動多數(shù)都被原廠包圓了,下游的廠商多數(shù)都是在做BSP級別的開發(fā),以及應(yīng)用開發(fā)(甚至有些小公司連BSP都沒有,例如我司的一些客戶...,都讓原廠負(fù)責(zé)了)也就是說,過去我是Consumer,而現(xiàn)在,我是Provider,負(fù)責(zé)為我司設(shè)計出品的芯片提供所有的Firmware,驅(qū)動代碼,以及SDK等。

總的來說,驅(qū)動這個崗位所要負(fù)責(zé)的內(nèi)容以及工作難度,在不同的企業(yè)類型,呈現(xiàn)這樣的一個關(guān)系:芯片原廠 > 方案廠 > 模組廠 > 板卡廠 > ?其他應(yīng)用廠商。

03 、嘗試下細(xì)說原廠的驅(qū)動開發(fā)

為了更加具體的體現(xiàn)出芯片原廠的驅(qū)動開發(fā)在做些什么,下面我將逐步帶大家過一遍一顆芯片從設(shè)計到Bringup,再到交付完整的SDK包到客戶手中,到底經(jīng)歷了哪些環(huán)節(jié)。驅(qū)動開發(fā)者,在其中又做了哪些努力。

一般性的芯片開發(fā)流程:

芯片定義:指定芯片的規(guī)格(芯片spec)

芯片設(shè)計硅片設(shè)計和封裝設(shè)計(主要關(guān)注硅片設(shè)計)

芯片制造:設(shè)計好之后,就要送到foundry(代工廠)加工制造,(晶圓

芯片測封:先對晶圓進(jìn)行中測,然后進(jìn)行劃片封裝,最后對封裝后的芯片進(jìn)行成測。確保不會由生產(chǎn)環(huán)節(jié)引入錯誤。

芯片驗(yàn)證:將芯片焊接到預(yù)先設(shè)計好的電路板上,裝配成機(jī)器并加載軟件,然后開始驗(yàn)證。

其中,我們十分關(guān)注芯片設(shè)計與芯片驗(yàn)證環(huán)節(jié)。芯片設(shè)計的周期通常來說會非常漫長,這個時間段是IC設(shè)計工程師大展拳腳的時候,他們也像軟件工程師一樣,需要對設(shè)計出的成果作調(diào)試,驗(yàn)證。隨著大規(guī)模集成電路設(shè)計復(fù)雜性的逐漸提升,芯片驗(yàn)證面臨的資金與時間的挑戰(zhàn)也變的越來越大,芯片的驗(yàn)證階段占據(jù)了整個芯片開發(fā)的大部分時間。從芯片需求定義、功能設(shè)計開發(fā)到物理實(shí)現(xiàn)制造,每個環(huán)節(jié)都需要進(jìn)行大量的驗(yàn)證。早期開發(fā)者想驗(yàn)證芯片的設(shè)計是否符合預(yù)設(shè),只有等待漫長的模擬結(jié)果,或是等待流片成果。時間成本和經(jīng)濟(jì)成本都較高。

現(xiàn)如今驗(yàn)證方法也越來越多,例如:邏輯仿真(功能驗(yàn)證),形式驗(yàn)證,原型驗(yàn)證。功能驗(yàn)證基于軟件,驗(yàn)證成本較低,驗(yàn)證環(huán)境方便,但性能較差;形式驗(yàn)證為靜態(tài)驗(yàn)證方式,但不可仿真DUT的一些動態(tài)行為。其中,大多公司都會選擇先在SoC驗(yàn)證部門,進(jìn)行邏輯仿真驗(yàn)證,然后再交由基礎(chǔ)軟件開發(fā)部門,使用FPGA原型驗(yàn)證的手段,對其進(jìn)行二次驗(yàn)證覆蓋。

FPGA原型驗(yàn)證是一種成熟的技術(shù),用于通過將RTL移植到現(xiàn)場可編程門陣列(FPGA)來驗(yàn)證專門應(yīng)用的集成電路(ASIC),專用標(biāo)準(zhǔn)產(chǎn)品(ASSP)和片上系統(tǒng)(SoC)的功能和性能。FPGA和ASIC前端代碼都是基于 Verilog HDL 開發(fā)的,所以ASIC代碼理論上是可以在FPGA平臺上跑起來的,在流片之前,盡可能的去確定芯片功能的正確性的一種驗(yàn)證方式。

在我司,F(xiàn)PGA原型驗(yàn)證的任務(wù),交由驅(qū)動部門執(zhí)行,通常芯片設(shè)計部門的小伙伴會給我們出攜帶各種IP功能的”bit文件“,F(xiàn)PGA平臺(HAPS 80)有一個附帶的燒錄軟件,為了讓FPGA平臺變成目標(biāo)SoC的”樣子“,需要使用這個燒錄軟件將bit文件燒錄到FPGA上。

SoC形成之后,我們會使用Arm的DS-5 IDE構(gòu)建一個Bare Metal(裸機(jī),不帶操作系統(tǒng))工程,編寫當(dāng)前驗(yàn)證SoC的初始化代碼,各個IP的驅(qū)動代碼,各個IP的測試demo,以及多個IP之間共同工作時的方案性的demo。主要目的是覆蓋測試SoC在實(shí)際運(yùn)行時可能遇到的情況。

完成SoC本身的驗(yàn)證之后,還會進(jìn)行Bootrom的開發(fā),同樣也是在FPGA環(huán)境上進(jìn)行驗(yàn)證,這個環(huán)節(jié)非常關(guān)鍵,bootrom是芯片開始運(yùn)行的起點(diǎn),后期bringup是否可以成功,芯片的所用功能,性能,是否能夠有機(jī)會綻放出來,都得看bootrom的表現(xiàn)。有些企業(yè)會自己設(shè)計Bootrom的代碼,也有些企業(yè)則會基于安全啟動的考慮,會去使用Arm推出的解決方案 -- ATF。

ARM TrustZone是ARM公司推出的SoC及CPU系統(tǒng)范圍的安全解決方案,具有基于硬件的安全功能。它通過對原有硬件架構(gòu)進(jìn)行修改,在處理器層次引入了兩個不同權(quán)限的保護(hù)域——安全世界和普通世界,任何時刻處理器僅在其中的一個環(huán)境內(nèi)運(yùn)行。

同時這兩個世界完全是硬件隔離的,并具有不同的權(quán)限,正常世界中運(yùn)行的應(yīng)用程序或操作系統(tǒng)訪問安全世界的資源受到嚴(yán)格的限制,反過來安全世界中運(yùn)行的程序可以正常訪問正常世界中的資源。ATF將啟動過程分為三個階段:

Boot Loader stage 1 (BL1) AP Trusted ROM: 用于實(shí)現(xiàn)bootrom

Boot Loader stage 2 (BL2) Trusted Boot Firmware,二級loader

Boot Loader stage 3-1 (BL31) EL3 Runtime Software, 提供PSCI(電源管理等)、secure和nosecure切換等運(yùn)行時服務(wù)

Boot Loader stage 3-2 (BL32) Secure-EL1 Payload (optional), 第三方的secure OS,如TEE等

Boot Loader stage 3-3 (BL33) Non-trusted Firmware,一般是uboot

其中,二級loader中常常會執(zhí)行DDR的初始化,將該階段獨(dú)立出來是非常有必要的,因?yàn)橐活wSoC使用的DDR顆粒并不是永久一致的,如果將DDR初始化部分的代碼整合進(jìn)BOOT階段,那么這顆SoC就不能使用其他的DDR。

驅(qū)動工程師在此的工作有許多,其中一部分為:

為基礎(chǔ)的部件,如GPIO,Pinctrl,Clock,Reset等模塊編寫驅(qū)動。

將ATF的IO存儲抽象層中的存儲介質(zhì)相關(guān)的接口,適配為自家SoC上存儲介質(zhì)的驅(qū)動。啟動方式有很多,如耳熟能詳?shù)?,spi-nor,spi-nand,uart?;蛘遝mmc,sd card,xip啟動等,通過Boot select的撥碼開關(guān)去選擇不同的啟動方式。

適配DDR。

實(shí)現(xiàn)熱啟動warm reset(直接從ATF階段跳轉(zhuǎn)到內(nèi)核運(yùn)行),各家SoC的warm reset實(shí)現(xiàn)手段不同,依托的硬件機(jī)制不同。

實(shí)現(xiàn)多分區(qū)啟動等容災(zāi)手段

基于ATF提供的工具,實(shí)現(xiàn)安全啟動,對rom的鏡像進(jìn)行加密。

and soon...

這個階段的工作十分精密,需付出很多精力在FPGA平臺上,仔細(xì)驗(yàn)證啟動功能,定時發(fā)送新的bootrom版本給到SoC驗(yàn)證部門,在他們的環(huán)境上進(jìn)行邏輯時序的仿真,SoC的驗(yàn)證更加精細(xì),在時序?qū)用嫔峡梢苑治龀鯟程序?qū)C(jī)器的每次操作,甚至是一次寄存器的讀寫,都可以進(jìn)行捕捉。

SoC驗(yàn)證也會對我們給出的bootrom程序進(jìn)行性能上的分析,建立benchmark。兩個部門的交互在此階段非常頻繁(所以一定要和SoC部門的人打好關(guān)系,在他們的層面上去理解硬件,對于我們的幫助會更大)

在Bootrom的驗(yàn)證成功之后,就會將文件發(fā)到代工廠進(jìn)行流片。利用流片的這個時間空隙,驅(qū)動部門會進(jìn)行SDK的回片前的預(yù)開發(fā)。

原廠給出的SDK通常包括uboot,kernel,prebuilts,libs,apps以及build。其中驅(qū)動部門所要負(fù)責(zé)的是uboot,build,prebuilts,以及最重要的kernel。(應(yīng)用開發(fā)部門主要負(fù)責(zé)libs以及apps,驅(qū)動開發(fā)也會涉及一些libs目錄的責(zé)任,比如一些不對外開放的驅(qū)動源碼,會放在libs目錄,編譯后就會刪除)

build目錄主要是一些編譯腳本,SDK支持的開發(fā)板非常多,支持一鍵切換編譯出不同的開發(fā)板的鏡像,構(gòu)建根文件系統(tǒng),lib,并進(jìn)行打包。

由于一些歷史原因,uboot中各個層次之間組織架構(gòu),和linux ?kernel的組織非常類似,都是board—>machine—>arch—>cpu這樣的框架:

為了移植性,更容易地跨平臺運(yùn)行,它倆的架構(gòu)逐漸變成了上圖這個樣子。這張圖(來自蝸窩科技)揭示了uboot和kernel對于多種CPU,多種體系結(jié)構(gòu),多種機(jī)器類型,以及多種板級的抽象層次。我粗淺地認(rèn)為,做嵌入式很難的一部分也正是在此(除開算法部分):

軟件工程中的抽象和封裝,力求以最簡潔、最高效的方式,實(shí)現(xiàn)盡可能多的功能,通過軟件抽象來掩蓋硬件的差異。這一點(diǎn)上,uboot和kernel的結(jié)構(gòu)做得非常優(yōu)雅。

SDK的回片前的預(yù)開發(fā)也就是在這里CPU,Arch,Mach,Board四層次移植,適配目標(biāo)SoC的代碼以及配置,各個模塊的驅(qū)動移植與開發(fā)(uboot也是需要開發(fā)驅(qū)動的),以uboot為例:

CPU層次,如ARMv8的初始化代碼,在ARM體系結(jié)構(gòu)這個層次上對SoC進(jìn)行初始化,比如MMU的配置,Cache的配置,大小端,異常等級的設(shè)置,通用定時器配置等

Arch層次,如arm的公共代碼,為后期執(zhí)行板級的配置(board_init_f/r),初始化執(zhí)行環(huán)境。

Machine層次,實(shí)則是一個通用的庫

Board層次,板級的特殊代碼,著名的board_init_f和board_init_r就會在此處實(shí)現(xiàn)。

如我前面所言,這個階段屬于預(yù)開發(fā)階段,所有的操作都在FPGA上運(yùn)行,等到芯片實(shí)際流片回來,Bringup成功,就會將這段時間里的成果,遷移到實(shí)際的Evaluation board上去,以快速給到客戶實(shí)際的產(chǎn)品。

最后就來到SLT(system level test)了,這是芯片量產(chǎn)前的最后一個測試,可能也會由驅(qū)動部門負(fù)責(zé),這一塊我了解的不多,驅(qū)動這邊主要在為每個驅(qū)動模塊編寫自動化測試軟件。SLT所用的測試板會做的非常的龐大,因?yàn)樾枰獙λ心K進(jìn)行統(tǒng)一的測試,通常需要上位機(jī)的支持,給測試板下達(dá)測試指令,以自動化地測試芯片各個模塊是否正常。SLT是一種純粹通過運(yùn)行和使用來完成的測試。

到此處為止,還都是硅前階段,即行業(yè)黑話Pre-silicon,指硅片實(shí)際流片出之前的所有步驟,原則上驗(yàn)證人員需要將所有的Bug攔截在硅前階段。這個階段漫長且如履薄冰,必須小心翼翼,規(guī)格嚴(yán)格,功夫到家。相比而言,驅(qū)動工程師在這段時間內(nèi)也一般來說不會很繁忙。

第二個階段是硅后驗(yàn)證階段(Post-Silicon),指的是在產(chǎn)品流片、發(fā)布以后查缺補(bǔ)漏的階段,這個階段對設(shè)計缺陷的修復(fù)成本將會變得非常高。

硅后階段,驅(qū)動部門所需負(fù)責(zé)的工作:

對流片后的芯片進(jìn)行BringUp

遷移FPGA上預(yù)開發(fā)版本的各個庫到EVB版本,并在EVB板上實(shí)際調(diào)通

各個模塊的驅(qū)動調(diào)通并驗(yàn)證,做性能測試

給每個驅(qū)動寫測試Demo

支持客戶的疑難雜癥,支持應(yīng)用部門的疑問和需求,維護(hù)驅(qū)動等

相比硅前而言,硅后的工作節(jié)奏會變得非???,壓力也會更大,Bringup失敗怎么辦,如何避免ECO?后期發(fā)現(xiàn)有一些非必現(xiàn)的BUG又怎么辦?特別是第5點(diǎn),這是一個長期的過程,對于每個原廠的驅(qū)動開發(fā)者而言,這是一條永遠(yuǎn)存在的副本,每個人管理自己所負(fù)責(zé)的那些驅(qū)動(有些比較復(fù)雜的驅(qū)動,如ISP,VPE等,則單獨(dú)交給某幾個人去負(fù)責(zé))。

客戶的問題會被相應(yīng)地路由到各自的Task List上來。內(nèi)核部分的異常屬于公共任務(wù),由leader判定哪些開發(fā)者來解決(驅(qū)動開發(fā)者也需要非常理解linux內(nèi)核的工作機(jī)制)。一些大公司會有單獨(dú)的內(nèi)核部門解決內(nèi)核異常(如華為)。一般來說初創(chuàng)公司的SDK都會有很多問題。

比方說,有一次客戶反饋,我們的linux內(nèi)核,換了一個解壓算法后,性能表現(xiàn)特別差,約莫45s才能進(jìn)到內(nèi)核初始化部分。經(jīng)過我進(jìn)兩個月的定位與查找,發(fā)現(xiàn)是我們的uboot內(nèi)核中,沒有打開一個Errata項,Arm Core中有一個寄存器中的一個bit沒有配置上,該bit管理著Cache的表現(xiàn),如果這個bit不打開,即使Cache已經(jīng)使能了,也不會生效。后來我在海思的Patch列表中,也看到了這一點(diǎn),看來各個IC公司都是一步步摸過來的。

04 、思考我們需要哪些?

上面簡單地敘述了一下一個驅(qū)動開發(fā)者在培育一顆芯片的過程中所付出的努力??偟膩碚f,原廠的驅(qū)動開發(fā)者,特別是小廠的開發(fā)者,確實(shí)需要負(fù)責(zé)很多事務(wù)。

但我想說,透過現(xiàn)象看本質(zhì),在這個開發(fā)鏈條中,無論是Bare Metal,Uboot,Kernel,都是在配置寄存器,驅(qū)動工程師也被戲稱為寄存器配置工程師,這一點(diǎn)也沒錯,驅(qū)動開發(fā)就是在看手冊,看懂手冊后去寫配置代碼,讓硬件按想要的方式運(yùn)行。這個過程也就是Bare Metal級別的開發(fā)邏輯,MCU開發(fā)者或許很熟悉ST的標(biāo)準(zhǔn)庫,HAL庫,LL庫,這些也就是在配置寄存器的基礎(chǔ)上套了一層框架,方便開發(fā)者對于驅(qū)動代碼的使用。

對于Uboot和Kernel部分的驅(qū)動開發(fā),底層邏輯依然是如此,只不過uboot與kernel為了統(tǒng)一開發(fā)者的行為,方便開發(fā)者將驅(qū)動加入他們的代碼,制定了一系列規(guī)則與框架,只需看懂他們的規(guī)則,了解他們的框架是如何運(yùn)行,即可將驅(qū)動插入到其中。

所以對于”驅(qū)動怎么學(xué)習(xí)“這個命題來說,我想先往底層去討論,向底層,即探索硬件的運(yùn)行機(jī)制,最標(biāo)準(zhǔn),不走彎路的做法就是去啃芯片手冊,這個過程初入手也許非常痛苦,茫茫手冊,動輒百千頁,如何去看?

無他,唯手熟爾。

有些同學(xué)可能過于依賴庫函數(shù)編程或者類似Cube IDE圖形化配置的這類模式,遇到一顆新的SoC就會覺得頭大。

其實(shí)手冊看多了也就習(xí)慣了,看著頁數(shù)很多,一大部分都是對寄存器的description,這部分當(dāng)作字典查就好了,重要的是手冊頭部到中間那些東西。關(guān)于如何去看一份手冊,在宋寶華的《Linux設(shè)備驅(qū)動開發(fā)詳解》中有一些描述,可以作為參考:

寫好單一的模塊驅(qū)動,也許并不難,但如果將它與其他的模塊交互,與CPU的體系結(jié)構(gòu)有一些關(guān)系呢?

在OSPI控制器的INDAC (Indirect Access Controller)模式下訪問時數(shù)據(jù)由SRAM中轉(zhuǎn),Master通過AHB訪問讀寫SRAM中的數(shù)據(jù),這里SRAM的中轉(zhuǎn)地址的內(nèi)存屬性是否能夠隨意設(shè)置呢?

諸如這些問題也暗示驅(qū)動開發(fā)不能只見樹木,不見森林,需要適當(dāng)?shù)厝W(xué)習(xí)整體的體系結(jié)構(gòu)的知識,學(xué)習(xí)SoC各個部分的關(guān)系。這種需求在做電源域以及低功耗設(shè)計,ATF的BL31,uboot和kernel的啟動等部分時,都會有深刻的感覺。如果有機(jī)會去做虛擬化,安全加解密部分的工作,相信這種體驗(yàn)會更加深刻。

向上探索,首先遇到的問題應(yīng)該是“框架”,這是一個比較大的話題,對于uboot來說就是它的DM模型,對于Kernel或者RTOS來說,就是整個操作系統(tǒng)的原理和設(shè)備驅(qū)動程序機(jī)制這種驅(qū)動開發(fā)必須面對的問題,這一塊沒辦法展開多講,以書籍和視頻資源為輔,多看源碼,多調(diào)試,多去寫一些針對性的測試demo。

針對操作系統(tǒng),最近兩年我個人看得比較多的是南京大學(xué)的操作系統(tǒng)課程(所用教材是operating system-three easy pieces)以及MIT 6.S081(RISC-V架構(gòu))(我們電氣學(xué)院幾乎沒有開設(shè)針對OS的課程,如果想做Linux或者FreeBSD這類操作系統(tǒng)下的開發(fā),還是有必要學(xué)習(xí)一下的)。

這兩門課主要講解操作系統(tǒng)的理論知識,但其精髓還是在實(shí)驗(yàn)課上,如果能夠吃透這兩門課的實(shí)驗(yàn)課,進(jìn)行魔改,寫到簡歷上也是個不錯的項目經(jīng)驗(yàn)。

面對現(xiàn)代Linux這樣的操作系統(tǒng),直接去看它的源碼其實(shí)是非常吃力的,它在漫長的發(fā)展長河中進(jìn)化出了很多”額外“的特性,如支持了一些調(diào)試手段,還有一些面對編譯器優(yōu)化的特性(如likely和unlikely),直接去看源碼會迷失在這些細(xì)節(jié)當(dāng)中??梢韵葟腞TOS或者RVOS,LMOS,Xv6這樣的小型OS來入手研究。

在我看來,學(xué)習(xí)操作系統(tǒng)要面對的困難主要是兩點(diǎn):

體系結(jié)構(gòu)部分。這部分對于大多數(shù)驅(qū)動開發(fā)這里來說非常陌生,特別是只做BSP層以上的開發(fā)者(可以跳過對體系結(jié)構(gòu)的理解)。操作系統(tǒng)是建立在硬件上的,其多數(shù)重要的機(jī)制都依賴于體系結(jié)構(gòu)提供的支持。

對于同一功能如進(jìn)程管理,主流的體系結(jié)構(gòu)都是類似的。相對而言,RISC-V的難度比Arm的難度小很多,可以從RISC-V的手冊開始看,但是畢竟當(dāng)前崗位數(shù)量上還是ARM多,我們也可以功利一些,直接入手ARM,舊版本如ARMv7可以看杜春雷的ARM體系結(jié)構(gòu)與編程,MCU級別的可以看Cortex系列的權(quán)威指南,高版本如ARMv8以上可以看笨叔的《ARM64體系結(jié)構(gòu)與編程》。

算法。如內(nèi)存管理方面的算法,SLAB,Buddy。進(jìn)程調(diào)度方面的算法,CFS等。如果就業(yè)目標(biāo)并不是專精內(nèi)核的方向,這一塊無需做多深入,將更多的精力放在設(shè)備驅(qū)動和體系結(jié)構(gòu)上會更有性價比。

再向上走,可能就是一些”形而上學(xué)“的東西:軟件架構(gòu)。這一點(diǎn)在上面談到linux ?kernel的組織時已經(jīng)談過一些。Linux kernel雖然是以C這樣的面向過程的語言去編寫,但也處處使用著面向?qū)ο蟮乃枷?,了解一些軟件架?gòu)上的做法,如解耦,開閉,接口隔離等,有助于理解kernel中各個組件的代碼。

最后我想說,做嵌入式驅(qū)動,畢竟不是搞科研,而是工程學(xué),切莫只研究理論而丟失實(shí)際操作,學(xué)習(xí)一些調(diào)試手段,多去調(diào)試幾個工程是必要的。(但其實(shí)我也不會多少調(diào)試手段,當(dāng)然了,printk應(yīng)該算是玩的很6...,GDB在調(diào)試內(nèi)核時用的并不多,這是一個非常強(qiáng)大的工具但是我沒有heavliy地用過,倒是仿真器用得不少)

05 、閑談,一些淺薄的經(jīng)驗(yàn)

這兩年常有許多朋友向我吐槽當(dāng)前的就業(yè)環(huán)境,如果將剛畢業(yè)的我放在這個環(huán)境下,我應(yīng)該也沒有多少把握去拿到一個滿意的offer,所以我在此篇文章中所給出的建議只能說是我主觀上覺得有用,有意義的建議。

如果讓我回到基地再重新經(jīng)歷一遍,我還是會去參加各類比賽,利用課余時間多做一些自己感興趣的小玩意兒,本科階段畢竟不是在工程或科研上廝殺的時候,但環(huán)境總會逼著我們不斷前進(jìn)。

嵌入式,不管是驅(qū)動還是應(yīng)用開發(fā),不管是做MCU還是ARM Linux,不管身處哪個方向:芯片,醫(yī)療,電機(jī)控制運(yùn)動控制,AI,協(xié)議?;蚴巧衔粰C(jī),都是需要不斷學(xué)習(xí),不斷專研,才能做得長久的。這需要我們擁有一些對行業(yè)的熱愛以及一些敢想敢做的極客精神。

當(dāng)然,在前行的過程中,應(yīng)該時刻記得最重要的,還是自己身心的健康愉悅。我的leader也曾這樣和我說過:能做好這一行的,無非就是兩種人。

第一種,天生就適合干這一行,我們組有個小哥,當(dāng)時芯片回來要做HDMI,全公司沒有人做過,交給他兩天后就將屏幕點(diǎn)亮了,這種可能就是骨骼驚奇。第二種,就是能夠坐得住的,不斷摸索,肯花時間。

最后我再將上面的一些tips羅列一下:

基礎(chǔ)知識(計算機(jī)四大件)一定要學(xué)好,計組,OS這些在原理層面上的基礎(chǔ)要打牢,網(wǎng)絡(luò)不做相關(guān)方向的工作的話可以放一放以后再學(xué)。

做驅(qū)動的朋友,芯片手冊要認(rèn)真研究,遇到問題先找手冊。比如IIC延展這些問題其實(shí)在芯片手冊里也會提到,DMA的S-G模式在圖像數(shù)據(jù)搬運(yùn)時的應(yīng)用,諸如此類的很多知識在芯片手冊上都有,當(dāng)然ARM的核心手冊(TRM)也得好好專研。

學(xué)會調(diào)試,多動手。

在項目中鍛煉自己通常是最快的。

兩句真言:Read The F**king Source Code/Read the Friendly Manual

06 、推薦學(xué)習(xí)資源

視頻:

韋東山的教程,不必多說了,祖師爺.

南京大學(xué)操作系統(tǒng):[操作系統(tǒng)概述 (為什么要學(xué)操作系統(tǒng)) 南京大學(xué)2022操作系統(tǒng)-蔣炎巖-P1]嗶哩嗶哩bilibili

MIT 6.S081:【操作系統(tǒng)工程】精譯【MIT 公開課 MIT6.S081】嗶哩嗶哩bilibili

計算機(jī)基礎(chǔ)課:南京大學(xué) - 計算機(jī)系統(tǒng)基礎(chǔ) 袁春風(fēng)(一)- 程序的表示、轉(zhuǎn)換與鏈接嗶哩嗶哩bilibili

一生一芯:[“一生一芯”概述 第六期“一生一芯”計劃 - P1]嗶哩嗶哩bilibili

中科大RVOS:https://www.bilibili.com/video/BV1Q5411w7z5/?spm_id_from=333.337.search-card.all.click

書籍:

C語言功底:

C prime Plus

C專家編程

C接口與實(shí)現(xiàn)

多看源碼,多動手寫代碼,多抄優(yōu)質(zhì)的代碼

計算機(jī)體系結(jié)構(gòu):

計算機(jī)組成與設(shè)計-硬件軟件接口

深入理解計算機(jī)系統(tǒng)(CSAPP)

笨叔的《ARM64體系結(jié)構(gòu)與編程》

操作系統(tǒng)部分

操作系統(tǒng)導(dǎo)論 operating system-three easy pieces

深度探索嵌入式操作系統(tǒng)(LMOS)

《Understanding the linux kernel 3edt》

《linux設(shè)計與實(shí)現(xiàn)》

編譯原理部分:程序員的自我修養(yǎng) - 編譯 裝載 鏈接

博客:

蝸窩科技的博客Linux內(nèi)核分析 - 蝸窩科技 (wowotech.net)

面向Linux驅(qū)動開發(fā):

linux設(shè)備驅(qū)動程序內(nèi)核機(jī)制 -- 陳學(xué)松

linux設(shè)備驅(qū)動開發(fā)詳解 -- 宋寶華

Mastering Linux Kernel Development -- ?Robert Love

面向?qū)崙?zhàn):

韋東山的一些項目還挺不錯的

蝸窩科技的博客上有一個X-project項目,很貼近實(shí)際企業(yè)的開發(fā)模式與開發(fā)內(nèi)容

07 、最后

對于選擇參加工作的同學(xué),找工作前可以利用寒暑假找一份實(shí)習(xí)。拿到offer后最好仔細(xì)甄別,做好背調(diào)。例如,對于那些面試難度與薪酬待遇不成正比的公司應(yīng)保持謹(jǐn)慎。信息收集可以通過脈脈,看準(zhǔn),知乎這類軟件,也可以詢問身邊的學(xué)長學(xué)姐。

希望大家都能找到滿意的工作,身體健康,工作順利,學(xué)業(yè)進(jìn)步。

最后,最近在做嵌入式就業(yè)零基礎(chǔ)入門手把手教學(xué),有興趣的朋友加vx聊:

推薦器件

更多器件
器件型號 數(shù)量 器件廠商 器件描述 數(shù)據(jù)手冊 ECAD模型 風(fēng)險等級 參考價格 更多信息
104M66QV39 1 Cornell Dubilier Electronics Inc RC Network
暫無數(shù)據(jù) 查看
BSC014N06NSATMA1 1 Infineon Technologies AG Power Field-Effect Transistor, 30A I(D), 60V, 0.00145ohm, 1-Element, N-Channel, Silicon, Metal-oxide Semiconductor FET, GREEN, PLASTIC, TDSON-8FL, 8 PIN

ECAD模型

下載ECAD模型
$4.11 查看
GRM32ER60J107ME20L 1 Murata Manufacturing Co Ltd Ceramic Capacitor, Multilayer, Ceramic, 6.3V, 20% +Tol, 20% -Tol, X5R, 15% TC, 100uF, Surface Mount, 1210, CHIP

ECAD模型

下載ECAD模型
$0.22 查看

相關(guān)推薦