嵌入式C進階路線指南

嵌入式是工科,工科講究實踐。說的再多、懂得再多,不能做出實際的東西,是沒有意義的。學習嵌入式的核心原則之一就是多動手寫代碼。另外還有一個原則就是:從淺到深學習。接下來的內容將貫徹這兩個原則。最后強調一點,各個方面的技術是齊頭并進的學習,而不是某一個方面學的非常好才去學習下一個方面。實際開發中,用到的技術會很多,我們只需要做好其中一部分就行了。

1 C語言

C語言是嵌入式開發必備的基本技能之一,對它的學習沒有盡頭,需要大家認真學習C語言。熟練使用C語言開發,這是嵌入式工程師的基本要求。

1.1 開發環境

學習C語言本身,可以使用各種工具鏈,這里博主比較推薦微軟的VS開發工具,在win下學習C語言。作為小白而言,簡單、好用的工具更重要,VS提供了開發C語言需要用到的各種工具。對于個人學習而言,社區版本完全夠用,可以在微軟官網下載到VS軟件。我使用的是VS 2019版本,也可以用其他的版本。

1.2 C語言入門

C語言的視頻B站很多,大體上沒有太大的差距吧(指內容),我自己也只是看過一些郝斌的C語言視頻,這個可以看看,我學習的時候更喜歡看書,主要是看書信息接受效率高。這里推薦一本C語言入門級別書籍:《C程序設計語言》,作者是布萊恩·克尼漢,丹尼斯·里奇。C語言創始人寫的一本書,非常經典,在世界上都享有盛名。大名鼎鼎的Hello world程序就是這本書提出來的。

這本書的經典程度網上一搜就有,這里就不在多贅述了,用它作為C語言入門書籍完全沒問題。書里面的代碼風格也是值得借鑒學習的,非常建議讀一讀該書。

1.3 C語言提高

對C語言基本的語法使用有一定理解之后,就需要對C語言進行提高了。提高階段,我推薦如下三本書:《C與指針》、《C專家編程》、《C陷阱與缺陷》。

這三本書應該讀哪個?

這三本書,我都研究過。三本書的內容有不少重復的地方,看完一本之后,另外兩本看的也挺快的。如果有時間的話,建議三本都看看,時間不夠的話,就只看《C與指針》這一本也行,這本書內容詳實,有入門有提高,從淺到深,也可以拿來入門C語言。至于其他的書籍,因為沒有過多研究,就不推薦了。

以上C語言的資料學習完成之后,基本上對于C語言有了較深入的理解了,應付平常開發應該沒有太大的問題。

2 stm32

stm32是目前市面上資料較多的ARM芯片(指Cortex-M系列芯片,這里不在贅述)了,用的人非常多,資料很全,遇到的各種問題在網上都可以找到解決辦法。有些問題真找不到的話,那就涉及到比較深入的領域了,也不是初學者該遇到的和能解決的。因此,建議以stm32為切入點,學習ARM 32位處理器的使用。stm32芯片有非常多的系列,每個系列又有很多芯片,這里推薦stm32f407的芯片(大部分人也是用這個芯片學習的),兼顧成本、性能、學到的知識,性價比高。下面談談該如何學習這款芯片(其他的芯片類似)。

2.1 stm32基礎

stm32芯片里面的內容其實非常多,但作為初學者,并不需要關心特別高深的內容。我們只需要掌握stm32常用的開發以及基本的知識點。根據自身的開發經驗和經歷,總結了如下常用的外設:GPIO、UART(串口)、中斷、TIMER(定時器)、AD、DA、SPI、I2C、PWM、DMA。這些外設都是非常常見的,基本上所有的ARM芯片都會有。上述外設的學習可以不分先后,但還是推薦按照上面的順序進行。

除此之外,還要學會使用一款開發工具鏈(推薦Keil,畢竟是ARM公司的)。能夠掌握基本的Keil使用方法就行了。比如多文件編譯、調試仿真、常見配置等。

學習完基本的外設之后,就可以動手寫一些簡單的項目,鞏固所學知識。后面我也會出一些文章,講解項目的思路,供大家學習。

2.2 stm32進階

以目前的招聘需求而言,學完基本的stm32內容已經無法滿足了(太卷了)。因此,需要開始往較深入的內容學習。這里我將進階路線分為如下兩條主線:軟件主線、硬件主線。

2.2.1 軟件主線

1. C語言:繼續往精通方向學習C語言,比如,C語言的高級用法,C語言是如何實現面向對象思想的,C語言代碼是如何控制硬件的,C語言代碼是如何使用內存的、代碼是如何在內存中布局的,C語言代碼是如何在芯片中執行的,這些問題都是需要深入研究的。除此之外,也應該學習下常見的數據結構,如鏈表、樹等。至于圖這種數據結構,太復雜的,別為難自己。

2. RTOS:除此之外,還要學習RTOS(推薦FreeRTOS,背靠亞馬遜,用的人多,資料也多,市場廣闊),并且應該往深入的地方學習RTOS,而不應該僅僅浮于表面。知道使用FreeRTOS怎么創建任務、信號量、互斥量、隊列等,這些只是表面,內部實現的原理和機制才是面試要考察的(畢竟所有的RTOS都類似,掌握了原理才能很快上手其他的RTOS)。而且這些原理性的知識是通用的,也是一個嵌入式工程師的內功,面試考察的就是內功。我們還可以借鑒一下FreeRTOS源碼中優秀的設計思想,用到我們的代碼中,一舉多得。

3. 中間件:有精力的話,可以學習一些常見中間件的使用,如emwin(寫GUI界面用到,或者LVGL也可)、Fatfs(文件系統,管理數據用的到)、Lwip(網絡協議棧,以太網通信用的到),這些中間件以會用為學習目的和標準,不需要深入研究,除非以后做這方面的工作。

2.2.2 硬件主線

stm32芯片的基本外設學完之后,我們還需要學習復雜的外設和芯片內部的一些內容。下面的圖,建議大家背下來,這是在學習的過程中畫的stm32芯片內部功能邏輯圖,具有普遍意義(針對Cortex-M系列芯片)

添加圖片注釋,不超過 140 字(可選)

我們學習的常見外設,只是掛載到總線(AHB、APB總線)上的一個個獨立的功能單元,CPU(圖中Cortex-M3就是芯片內部的CPU)如何與外設進行交互、芯片的調試系統、中斷系統、總線系統等等,還有非常多的內容需要我們學習。

在學習stm32的時候,我們會遇到一些比較復雜的外設,這里面時鐘系統(RCC)還是要學習的,RCC就相當于芯片的動力系統,連接著芯片內部的各個功能部件。除此之外,RTC(實時時鐘)、CRC(循環冗余校驗)、CRYP(加密處理器)、RNG(隨機數發生器)、HASH(散列處理器)等外設看心情學習。但比較復雜的,如USB、以太網、FSMC(靈活的靜態存儲控制器)、SDIO(安全數字輸入/輸出接口)、DCMI(數字攝像頭接口)這些復雜的外設,就不太建議學習了,可以了解下,不需要進行深入研究(學習成本高,真正用到了,學的那點也不夠,導致性價比太低)。如果以后想專精某一個方面,可以去學習。CAN總線用于汽車領域,如果不打算從事汽車領域工作的話,可以不用學習。stm32f407芯片的外設就這么多,都在上面講述了,各位同學根據自己的需求進行學習。

除了外設之外,M4內核還支持DSP指令集,這個用于對數學運算、控制運算、信號處理、數據處理等方面,也可以學習下如何使用。對DSP指令集的學習,只需要學習該如何使用DSP庫即可,庫里面的算法都是使用DSP指令集進行加速過的,我們只需要會用就行。

學習完上面的內容之后,也可以研究下CPU部分,如常見的堆、棧、流水線、寄存器、CPU現場等相關內容,這些在學習FreeRTOS時用得到,也是面試中常問的內容。

在軟件主線、硬件主線之間,還有一個就是工具鏈,主要是編譯器在鏈接期間的部分知識。這部分內容,也是我們經常用到的一些技能,如進行IAP開發、OTA開發等,還有一些特殊用途,也需要對鏈接階段進行改動,以滿足應用需求。

這里推薦幾本書:《Cortex-M3權威指南》、《STM32F4xx參考手冊》配合起來一起學習。

2.3 學習順序(重要,小白跟著做即可)

  1. 入門:首先要有C語言的基礎(能用基本的語法編寫程序即可),接著開始學習stm32的基本外設(常見的外設,上文中有提到)。這個時候可以做一些簡單的項目,鞏固下學習效果,學習stm32的核心原則之一就是多動手寫代碼。這里推薦江科大的視頻(B站有),市面上少有的精品、免費視頻了。收費的基礎課,我覺得都很難與其進行比較,看得出來,江科大的視頻是用心做的,強烈安利~。

  2. 提高:這個時候需要提高C語言(推薦的書都去看看,研讀一遍),先把C語言水平提上來,否則后續學習會因為缺少C語言基礎而非常痛苦。之后,再去學習FreeRTOS,或者也可以先去學習stm內核部分,這兩個先后順序其實無所謂的(反正對新手來說都是新知識,都不簡單^^),二者有些東西也是相輔相成的。

  3. 這個時候應該做一些有難度的項目,將自己學習的內容、技術體現在項目中,用于找工作。

學習到這里的話,基本上找工作已經沒啥太大問題了。

2.4 stm32深入

這部分內容屬于較深入的技術了,適合對技術(工資)有追求的同學,需要靜下心來,慢慢研究的技術。這些技術都是較深入的,如果連上面的內容(指入門、提高部分)都學不會的話,這些內容還是算了,別為難自己,即學不懂,學了也沒啥用(水平不夠,用不到)。這里只放一下學習大綱,有興趣的自己學習。

C語言

添加圖片注釋,不超過 140 字(可選)

芯片內核

添加圖片注釋,不超過 140 字(可選)

Keil提高

添加圖片注釋,不超過 140 字(可選)

FreeRTOS

添加圖片注釋,不超過 140 字(可選)

2.5學習路線思維導圖

在最后,放一個學習路線思維導圖,拿著這個,按照上面的知識點,一點點學習,肯定可以成為大佬(30K+)。

添加圖片注釋,不超過 140 字(可選)

03 淺談學習方法

學習stm32已經7、8年了,對stm32的學習也有一點心得,這里淺談下學習方法,僅供參考。

3.1. 挑選一個合適的開發板

作為一個初學者而言,開發板并不是越高端越好,能夠有基本的功能、滿足自身學習即可(土豪當我沒說)。我在第一次學習stm32時,就只買了一個核心板、一個TFT屏幕、一個J-Link下載器就開始學習了(大學的時候真是一個窮學生)。后續的學習過程中,缺什么就買什么,不重要的東西,基本上都沒去接觸(如can總線、以太網等)。

添加圖片注釋,不超過 140 字(可選)

添加圖片注釋,不超過 140 字(可選)

添加圖片注釋,不超過 140 字(可選)

這里給一個極致低價的stm32學習硬件:一個stm32核心板、一個st-link下載器、一個usb轉ttl(用于調試),這一套成本也就30左右(之前推薦過這一套方案,很適合窮學生(比如大學的時候),可以去某寶上找下。

一般而言,比較推薦用stm32f407入門stm32,這個芯片的性能較強、價格也夠低、性價比很高,除此之外,資料也很豐富,還可以用標準庫開發,某寶上一搜一堆。

3.2 動手實踐

嵌入式是工科,工科講究熟能生巧。在學習的時候一定不能偷懶,一定要多動手寫代碼。每學習一個外設都應該去動手寫代碼,將這部分功能的代碼調通。每學習一個知識點都應該寫代碼驗證自己的想法是否正確(到今天依然也是這樣學習,學習某個知識點之后,寫代碼驗證)。寫代碼寫多了,自然就能理解了。同時也要注意寫項目,鞏固已經學習的知識,順帶鍛煉自己項目整合的能力。

3.3 從淺入深

工科的任何知識學習都應該遵守從淺入深、從看得見摸得著的內容開始學習,逐漸過渡到看不見、摸不著的領域(這個時候只能靠自己的基礎,推理到這部分了,然后做實驗進行直接、間接驗證)。stm32的學習也是,從基本的外設開始,這些最容易看到(改個參數,就能看到現象),然后逐漸過渡到對內核的學習、對工具鏈、RTOS等一些比較深入領域內容的學習。

04 常見問題解答1

問:學stm32是用hal庫學習還是標準庫學習?

答:這里首先要明確一個概念,hal庫是st公司為自己家的stm32系列芯片開發的一套庫,一套庫兼容所有的stm32芯片,必然導致代碼臃腫(為了兼容性)。標準庫是st公司早期為stm32芯片研發的開發庫,目前只支持到stm32f429系列,再往后的stm32f7系列就只有hal庫了。hal配合cubemx開發,速度飛快,確實有多種優點。

但博主不推薦使用hal庫學習,理由如下:

1. hal庫是st的,只支持st的芯片,而我們以后開發芯片,不知道是哪家公司的,其他家芯片提供的開發庫更類似于標準庫(這里可以看出st真是有實力的巨頭)。

2. hal和標準庫差別不大,但hal學習起來成本更高(為了兼容性,使用了較復雜的軟件特性),而且會了標準庫,hal上手難度并不大,學習成本基本為0,過度平滑。

3. 最關鍵的,hal庫編譯太慢了,真的巨慢,比標準庫慢多了,博主當年的筆記本性能也是還可以的,也覺得編譯慢,無奈選擇標準庫開發(再吹一波cubemx,真的開發超快)。

我們從hal庫和標準庫本身出發,得到初學者更適合學習標準庫的結論。所以,作為初學者,別糾結了,無腦標準庫吧。當然要是實驗室的同學、或者老師、或者小伙伴都是hal庫學習,還是拿hal庫學習stm32吧,可以更好的交流。

問:學習stm32之前需要先學習51單片機嗎?

答:博主本人在剛上大一的時候,就開始玩51單片機了,博主確實是先學51單片機、再去學習stm32。所以我對這個問題還是有發言權的。結論是:沒有必要先學習51單片機。因為51和stm32差別太大了,我除了大一玩過51單片機,再也沒寫過51代碼,都已經忘了怎么寫了。stm32和51雖然同屬MCU,但就跟五菱和勞斯萊斯都屬于汽車一樣(沒別的意思,別亂想,僅僅比較價格而已),二者差別太大了。在51上面學習的內容除了外設原理在stm32上有用之外,基本沒啥太大用處了

但這些知識在stm32上同樣可以學習,所以大膽的學習stm32吧,現在招聘都要求會一款32位處理器。

05 常見問題解答2

在這一節中,我們簡單的聊一聊招聘市場的情況。經濟學里面有一個論斷:供需關系決定價格。對于我們工程師找工作而言,就是招聘市場上找工作的人與企業招聘人數,二者決定工程師的工資水平。我們工程師找工作靠的是技術水平(能做什么),技術水平的高低(準確的說是稀缺性)決定我們的工資水平。

  1. 3、5k薪資水平:這是絕大部分應屆生的水平。這些人大概會一些stm32外設的配置,使用這些外設,配合一些模塊(比如屏幕、藍牙、陀螺儀等等)做一些應用開發,做一些小項目。這種水平的同學,找工作其實比較難(因為大家都類似,企業憑什么要你),這是個很現實的問題。而且這種水平對應的工作也不會太好,一般就是3、5k的樣子,市面上一抓一大把。

  2. 7、8k的薪資水平:要想再進一步,就要學習更多的東西,比如RTOS。RTOS是一個非常好的技能點,它是和周圍同學、同事拉開差距的一個切點,也是關鍵點。能夠使用RTOS提供的功能,如任務管理、信號量、郵箱、互斥量等,可能還會配上其它的中間件,如LVGL,fatfs等,做一些項目,這種應屆生都是比較少的了。相比較前面那些同學,這種應屆生更容易找工作,但依然處于初級階段,依然還是做簡單的應用開發,并未涉及較深入的內容。

  3. 10k以上:若是想拿到這種水平的offer,就不能光局限在應用層面了。前面兩者都是在應用層打轉,并沒有涉及較深入的內容。我們需要了解RTOS內部的實現機制、實現算法,stm32內核(IAP是個好東西,非常適合作為深研stm32的切入點)。只有到這個時候,我們才算是開始真正具備走向一個技術大牛應該有的基礎。這個水平的嵌入式工程師,有了走向成為技術大牛的可能和基礎,已經在技術大牛的起點了。

  4. 20k以上:能在應屆生水平拿到20k以上offer的,都是有兩把刷子的。以博主本人為例,在2.4節提到的那些技術,博主都有所涉獵,不僅如此,我還在Linux驅動、嵌入式AI領域有所研究。2.4節提到的技術,可以說20K薪資只是起點了,以后30K、50K也可以理解為2.4節技術的深入研究了。

上面只是博主自己的理解,具體情況,各地可能都不一樣,不能進行統一比較,也可能說的并不對,僅供參考(希望大家也不要在這里較真,只是參考的數據)。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/82052.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/82052.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/82052.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

服務器上機用到的設備

服務器上機通常需要以下硬件設備: 服務器主機: CPU:選擇高性能的多核處理器,如英特爾至強(Xeon)系列或AMD EPYC系列,以滿足高并發和多任務處理需求。 內存(RAM)&#xf…

FreeCAD傻瓜教程-渦輪蝸桿的快速繪制FCGear工作臺的使用方法

起因:渦輪蝸軸的組合,是一種比較簡單且高效的傳動結構。可以實現減速、加速、轉動角度的放大、縮小等應用。 如何繪制呢?我搜索了不少教程,看起來都挺復雜的,對于小白來說有點像天書。這里介紹和記錄一下利用FreeCAD 的…

daplink開發_一次開發DAPLink的詳細開發流程及調試步驟

以下是針對第一次開發DAPLink的詳細開發流程及調試步驟,結合STM32平臺特性,分階段指導您完成從零到一的完整開發過程: 一、開發流程1. 硬件準備階段選型STM32芯片:推薦型號:STM32F103C8T6(成本低、資源足夠)、STM32F405RGT6(性能更強,支持更多外設)。關鍵外設需求:U…

給小白的AI Agent 基本技術點分析與講解

引言:重塑交互與自動化邊界的 AI Agent 在人工智能技術飛速發展的浪潮中,AI Agent(智能體)概念的興起標志著自動化和人機交互正邁向一個全新的階段。傳統的軟件系統通常被設計來執行精確預設的指令序列,它們強大且高效…

Mysql常用語句匯總

Mysql語句分類 DDL: 數據定義語言,用來定義數據庫對象(數據庫、表、字段)DML: 數據操作語言,用來對數據庫表中的數據進行增刪改DQL: 數據查詢語言,用來查詢數據庫中表的記錄DCL: 數據控制語言,用來創建數據…

【Python 模塊】

Python 中的模塊(Module)是組織代碼的核心方式,通過將相關函數、類和變量封裝到獨立文件中,實現代碼復用和結構化管理。以下是模塊的核心知識點: 一、基礎概念 1. 模塊定義 任何 .py 文件都是一個模塊模塊名即文件名…

黑電平校正(Black Level Correction, BLC)算法

黑電平校正(Black Level Correction, BLC)算法 黑電平校正(BLC)是圖像傳感器(如CMOS/CCD)信號處理中的一個重要步驟,主要用于消除傳感器暗電流(Dark Current)導致的基線…

處理PostgreSQL數據庫事務死鎖過程

查詢pg_locks表,獲取未得到滿足的鎖信息: select * from pg_locks where granted is false ; --查詢得不到鎖的,那就是兩個互相等待對方持有的鎖查詢活動的事務會話進程,和上一步的鎖的事務對應起來: select * from …

Android開發-文本顯示

在Android應用開發中,文本顯示是用戶界面設計中最基本也是最重要的部分之一。無論是展示歡迎信息、錯誤提示還是動態內容,合理地使用文本元素能夠極大地提升用戶體驗。本文將詳細介紹如何在Android應用中有效地顯示文本,包括使用TextView組件…

基于大模型的輸卵管妊娠全流程預測與治療方案研究報告

一、引言 1.1 研究背景與意義 輸卵管妊娠作為異位妊娠中最為常見的類型,嚴重威脅著女性的生殖健康和生命安全。受精卵在輸卵管內著床發育,隨著胚胎的生長,輸卵管無法提供足夠的空間和營養支持,極易引發輸卵管破裂、大出血等嚴重并發癥,若救治不及時,甚至會導致孕產婦死…

當向量數據庫與云計算相遇:AI應用全面提速

如果將AI比作一臺高速運轉的機器引擎,那么數據便是它的燃料。 然而,存儲數據的燃料庫--傳統數據庫,在AI時代的效率瓶頸愈發明顯,已經無法滿足AI對于數據的全新需求。 因此,向量數據庫近年來迅速崛起。向量數據庫通過…

Media3 中 Window 的時間相關屬性詳解

AndroidX Media3 的 Timeline.Window 類中,與時間相關的屬性描述了媒體播放窗口(window)在時間維度上的關鍵信息。這些屬性幫助開發者理解媒體的播放范圍、起始點、持續時間以及與設備時間或直播流的同步關系。 Timeline.Window 的時間相關屬…

【Python爬蟲電商數據采集+數據分析】采集電商平臺數據信息,并做可視化演示

前言 隨著電商平臺的興起,越來越多的人開始在網上購物。而對于電商平臺來說,商品信息、價格、評論等數據是非常重要的。因此,抓取電商平臺的商品信息、價格、評論等數據成為了一項非常有價值的工作。本文將介紹如何使用Python編寫爬蟲程序&a…

工業相機的芯片CRA角度與鏡頭選型的匹配關系

工業相機的芯片CRA角度與鏡頭選型的匹配關系 Baumer工業相機?工業相機的芯片CRA角度的技術背景?工業相機的芯片CRA的信息CRA相差過大的具體表現怎樣選擇工業相機sensor的CRABaumer工業相機sensor的CRA工業相機的芯片CRA角度與鏡頭匹配好的優點 Baumer工業相機 工業相機是常用…

深度學習中常見的矩陣變換函數匯總(持續更新...)

1. 轉置操作 (Transpose) 概念:將矩陣的行和列互換應用場景: 在卷積神經網絡中轉換特征圖維度矩陣乘法運算前的維度調整數據預處理過程中的特征重排 原始矩陣 A [[1, 2, 3], 轉置后 A^T [[1, 4],[4, 5, 6]] [2, 5],[3, 6]]代碼…

day 14 SHAP可視化

一、原理——合作博弈論 SHAP(SHapley Additive exPlanations)是一種用于解釋機器學習模型預測結果的方法,它基于合作博弈論中的 Shapley 值概念。Shapley 值最初用于解決合作博弈中的利益分配問題。假設有 n 個參與者共同合作完成一項任務并…

從0開始學習大模型--Day03--Agent規劃與記憶

規劃(planning) 規劃,可以為理解觀察和思考。如果用人類來類比,當我們接到一個任務,我們的思維模式可能會像下面這樣: 1、首先會思考怎么完成這個任務。 2、然后會審視手頭上所擁有的工具,以及如何使用這…

使用 Couchbase Analytics Service 的典型步驟

下面是使用 Couchbase Analytics Service 的典型步驟,包括部署、配置、創建數據集、運行查詢以及監控優化等環節。 首先,您需要安裝并啟用 Analytics 服務;然后將節點加入集群并重平衡;接著在 Analytics 中映射數據服務的集合&am…

從零開始學習人工智能(Python高級教程)Day6-Python3 正則表達式

一、Python3 正則表達式 正則表達式是一個特殊的字符序列,它能幫助你方便的檢查一個字符串是否與某種模式匹配。 在 Python 中,使用 re 模塊來處理正則表達式。 re 模塊提供了一組函數,允許你在字符串中進行模式匹配、搜索和替換操作。 r…

MATLAB導出和導入Excel文件表格數據并處理

20250507 1.MATLAB使用table函數和writetable函數將數據導出Excel表格文件 我們以高斯函數為例子,高斯函數在數學和工程領域有著廣泛的應用,它的一般形式為: 其中是均值,決定了函數的中心位置; 是標準差,決…