請問學習嵌入式開發,有什麼可以參考學習的優秀程式碼案例嗎,可以推薦一下嗎?玉石俱木木火2020-03-28 08:59:30

ucos lwip等

請問學習嵌入式開發,有什麼可以參考學習的優秀程式碼案例嗎,可以推薦一下嗎?知乎使用者2020-03-29 11:53:48

實時作業系統:ucos freertos

難度更大的:Linux系統,原始碼很難看。

可以看看網上搜索一些經典的小專案。嵌入式的話,優秀程式碼是一個方面,還有其他的設計,嵌入式不只是程式碼。

請問學習嵌入式開發,有什麼可以參考學習的優秀程式碼案例嗎,可以推薦一下嗎?老司機帶我飛2020-04-01 10:38:21

如果覺得回答對你有幫助,麻煩雙擊螢幕點贊+關注,後面陸續為職場新人和在校同學提供更多學習和工作經驗,大家的支援就是我對我寫作的最大動力!

首先在回答這個問題之前,我可能會反問你幾個問題,如下:

1。

對嵌入式瞭解多少?

2。

你的專業是什麼?自身專業水平如何

3。

學習嵌入式開發的目的?

如果你能很好的回答這三個問題,我想大多數人能給你滿意和明確的答案。但如果你在提問之前,自己沒去思考這些問題,你可能會白問,因為你會收到一大堆的答案,而你不知道哪個是你要選擇的,因為你沒認真思考自己的需求和要達成的目的。現在的同學,很少會自己獨立思考問題,動不動就各種百度、提問。這對自己以後的學習和工作發展是很不利的。不管是學習還是工作也好,

建議大家養成這麼一個習慣,先知大概,再知細節,從多個角度看待問題

,就好比

蘇軾《題西林壁》:

橫看成嶺側成峰,遠近高低各不同。不識廬山真面目,只緣身在此山中。

不管學習還是做事,一點要了解前因後果,自己的需求是什麼?自己手裡具備和掌握多少?目的是什麼?瞭解這些後,就像破案一樣,疑點會一一浮出水面,問題也會逐步迎刃而解!

OK,回到正題,針對上面三個問題,我適當舉例給你一些建議:

1。

對嵌入式的瞭解

。嵌入式是一個很大的概念,

從定義上來說,分軟體和硬體

,因為跟底層計算機軟硬體打交道嘛。

從方向上來分的話有嵌入式軟體和硬體工程師

,具體崗位的話就多了,有做微控制器開發的(典型的STM32),Anroid驅動和應用開發,Linux驅動和應用開發,Qt介面開發等等。ok,你這裡提到優秀的程式碼,那麼想必會偏向於軟體方面,上面提到的跟軟體開發相關的,會聯絡到下一個問題。

2。

專業方向和水平掌握

。如果你是學電信和自動化、計算機的同學,專業會偏向於電控、通訊等方面,肯定會跟嵌入式軟硬體打交道,如果你是其它專業的,回到第一個問題的答案,你需要去了解這些知識。嵌入式軟體,C語言是必備的工具,彙編也要能看懂,請問你C語言知識掌握多少?當然你說我可以邊看程式碼邊掌握,如果你基礎過關,當我沒問,如果基礎沒過關,回頭好好補習一下C語言吧。嵌入式作業系統的話有μC/OS-II、FreeRTOS、VxWorks、Windows Embedded、Linux,你需要拿一本計算機作業系統原理的書籍看看了。

3。

學習嵌入式的目的

。如果是在校學生,說明你可能是自動化或計算機、電信專業的同學,

想提前接觸和了解未來可能會面對的行業

。如果是剛畢業的或想轉行跳槽的社會工作者,想往這方面發展,

為了快速上手提升自己專業技能

。針對這兩種情況,回答可能會不一樣。在校大學生或高職專科生也好,學習這些東西之前可以參考我另外一個問題的回答

大二自動化專業想學嵌入式,目前在學STM32開發版,該從何下手?

簡單點可以買塊STM32開發板上手,程式碼自然配套,C語言、MCU軟硬體控制、嵌入式ucoss作業系統夠你學得了

可以上github查詢相關的學習資料,看看別人是怎麼coding的,學習影片可以上B站

。如果是已經出來工作的,多多少少有點C語言和對嵌入式軟硬體的瞭解,

學習優秀程式碼是為了看看別人是怎麼寫的,學習借鑑,算是一個很好的思路

除了github上很多開源的demo可以借鑑學習,也可以向公司的一些大佬指點迷津。

下面給大家推薦點乾貨,學習嵌入式需要的書籍列表:

Linux基礎

1、《Linux與Unix Shell 程式設計指南》

2、《嵌入式Linux應用程式開發詳解》

C語言基礎

1。 The C programming language 《C程式設計語言》

2。 Pointers on C 《C和指標》

3。 C traps and pitfalls 《C陷阱與缺陷》

4。 Expert C Lanuage 《專家C程式設計》

5、《高質量程式設計指南:C++/C語言(第3版)》

Linux方向

1、《深入理解Linux核心》(第三版)

2、《Linux核心原始碼情景分析》毛德操 胡希明著

1、《UNIX Network Programming》(UNP)

2、《TCP/IP詳解》

3、《Linux核心程式設計》

4、《Linux裝置驅動開發》(LDD)

MCU方向

1、嵌入式實時作業系統μc/os-iii

2、正點原子和野火出品的影片和STM32書籍教程

Qt和Anroid開發

1、《Qt5開發及例項》

2、《Android Studio應用開發實戰詳解》

理論基礎

1、《演算法導論》

2、《資料結構(C語言版)》

3、《計算機組織與體系結構?效能分析》

4、《深入理解計算機系統》【美】Randal E。 Bryant David O‘Hallaron著

5、《作業系統:精髓與設計原理》

6、《編譯原理》

請問學習嵌入式開發,有什麼可以參考學習的優秀程式碼案例嗎,可以推薦一下嗎?

請問學習嵌入式開發,有什麼可以參考學習的優秀程式碼案例嗎,可以推薦一下嗎?

請問學習嵌入式開發,有什麼可以參考學習的優秀程式碼案例嗎,可以推薦一下嗎?

請問學習嵌入式開發,有什麼可以參考學習的優秀程式碼案例嗎,可以推薦一下嗎?

請問學習嵌入式開發,有什麼可以參考學習的優秀程式碼案例嗎,可以推薦一下嗎?

請問學習嵌入式開發,有什麼可以參考學習的優秀程式碼案例嗎,可以推薦一下嗎?

請問學習嵌入式開發,有什麼可以參考學習的優秀程式碼案例嗎,可以推薦一下嗎?

請問學習嵌入式開發,有什麼可以參考學習的優秀程式碼案例嗎,可以推薦一下嗎?

請問學習嵌入式開發,有什麼可以參考學習的優秀程式碼案例嗎,可以推薦一下嗎?

請問學習嵌入式開發,有什麼可以參考學習的優秀程式碼案例嗎,可以推薦一下嗎?0xFFFF2020-04-12 00:10:24

語言基礎, 計算機基礎要學的書籍, 看高讚的吧

如果是學習 MCU 開發的話, 相對與高贊推薦的STM32 上手, 我更推薦使用 nordic 家的 nRF51/52 系列作為上手的MCU。

nRF51/52 系列是 BLE SOC, M0/M4 核的, 部分型號還同時支援Zigbee, Thread, Bluethooth Mesh 等協議。 詳情看官網

https://www。

nordicsemi。com/Products

。 由於有無線功能, 該系列的應用範圍, 有趣程度是比STM32要高的。 當然, 外設資源還是STM32 賽高。

nRF51/52 的 sdk 相當優秀, 可以概括為 api 簡單, 文件詳實豐富, 例程豐富且完成度很高。 此外, 配套的手機APP, PC 端工具也很全很實用

我們來看一下官方 sdk11(最新版本是sdk16, 隨著sdk 的迭代, api, 例程, 元件也慢慢變得複雜。 用舊版的sdk 更加易於上手)。

請問學習嵌入式開發,有什麼可以參考學習的優秀程式碼案例嗎,可以推薦一下嗎?

個人推薦的上手辦法, 就是買官方開發板, 直接上來學習例程, 改例程, 打日誌。 而不要去啃暫存器。 先熟練用起來再說, 學習nRF51/52的開發, 前期也不用去看暫存器, 例程就是最好的老師。 等到真遇到問題解決不了, 再去啃也來得及。

開發板推薦 PCA10040, 板載nRF52832。 某寶上大概 300 左右。 自帶正版 jlink ob, 燒寫除錯比較方便。

先來看一個點 led 的 例程 blinky。 整個例程就這麼一點程式碼。

#include

#include

#include

“nrf_delay。h”

#include

“nrf_gpio。h”

#include

“boards。h”

const

uint8_t

leds_list

LEDS_NUMBER

=

LEDS_LIST

/**

* @brief Function for application main entry。

*/

int

main

void

{

// Configure LED-pins as outputs。

LEDS_CONFIGURE

LEDS_MASK

);

// Toggle LEDs。

while

true

{

for

int

i

=

0

i

<

LEDS_NUMBER

i

++

{

LEDS_INVERT

1

<<

leds_list

i

]);

nrf_delay_ms

500

);

}

}

}

再來看下 STM32的hal 庫版的 gpio toggle 的例程, 我們只看main函式吧, 完整的main。c 稍微有點佔篇幅

int

main

void

{

/* This sample code shows how to use GPIO HAL API to toggle LED2 IO

in an infinite loop。 */

/* STM32F103xB HAL library initialization:

- Configure the Flash prefetch

- Systick timer is configured by default as source of time base, but user

can eventually implement his proper time base source (a general purpose

timer for example or other time source), keeping in mind that Time base

duration should be kept 1ms since PPP_TIMEOUT_VALUEs are defined and

handled in milliseconds basis。

- Set NVIC Group Priority to 4

- Low Level Initialization

*/

HAL_Init

();

/* Configure the system clock to 64 MHz */

SystemClock_Config

();

/* -1- Enable GPIO Clock (to be able to program the configuration registers) */

LED2_GPIO_CLK_ENABLE

();

/* -2- Configure IO in output push-pull mode to drive external LEDs */

GPIO_InitStruct

Mode

=

GPIO_MODE_OUTPUT_PP

GPIO_InitStruct

Pull

=

GPIO_PULLUP

GPIO_InitStruct

Speed

=

GPIO_SPEED_FREQ_HIGH

GPIO_InitStruct

Pin

=

LED2_PIN

HAL_GPIO_Init

LED2_GPIO_PORT

&

GPIO_InitStruct

);

/* -3- Toggle IO in an infinite loop */

while

1

{

HAL_GPIO_TogglePin

LED2_GPIO_PORT

LED2_PIN

);

/* Insert delay 100 ms */

HAL_Delay

100

);

}

}

從學習的角度來說, STM32 的例程的複雜度還是比nRF5x 要高的, 起碼產生心理壓力會大一點。

不過, nordic 的這個點燈例程, 說實話對初學者來說還是有點不友好的, 宏函式 和 LED_MASK 宏, 都略複雜。 我貼這個例子, 都有點尷尬。。。。。 我按gpio toggle 的方式改造一下, 看起來會易學得多

#include

#include

#include

“nrf_delay。h”

#include

“nrf_gpio。h”

#define LED_PIN 21

/**

* @brief Function for application main entry。

*/

int

main

void

{

nrf_gpio_cfg_output

LED_PIN

// Toggle LED。

while

true

{

nrf_gpio_pin_toggle

LED_PIN

nrf_delay_ms

500

);

}

}

除了led, 其他外設如 uart, spi 的例程, sdk 裡也都有。

此外另說一點, nRF5x 的數字io 是可以任意對映到數字外設的。 也就是任何一個 gpio 都可以作為, uart, spi, i2c 等數字外設的管腳, 學習數字外設會很方便, 隨便挑 gpio 就行, 不用去查手冊。 對於硬體layout 也很方便, 這個gpio 不方便 lay 就換一個

來看一下文件方面。 nordic sdk 做得很好的一點, 就是標頭檔案裡, 每個api 的註釋都很規範, 詳實, 標頭檔案即文件。 幾乎不用去看額外的文件。

來看兩個 gpio 配置 api 的註釋。 函式說明, 引數範圍, 注意事項 都寫得很清楚

/**

* @brief Function for configuring the given GPIO pin number as output with given initial value set, hiding inner details。

* This function can be used to configure pin range as simple input with gate driving GPIO_PIN_CNF_DRIVE_S0S1 (normal cases)。

*

* @param pin_number specifies the pin number (allowed values 0-31)

*

* @note Sense capability on the pin is disabled, and input is disconnected from the buffer as the pins are configured as output。

*/

__STATIC_INLINE

void

nrf_gpio_cfg_output

uint32_t

pin_number

);

/**

* @brief Function for configuring the given GPIO pin number as input with given initial value set, hiding inner details。

* This function can be used to configure pin range as simple input with gate driving GPIO_PIN_CNF_DRIVE_S0S1 (normal cases)。

*

* @param pin_number Specifies the pin number (allowed values 0-30)。

* @param pull_config State of the pin range pull resistor (no pull, pulled down or pulled high)。

*

* @note Sense capability on the pin is disabled, and input is connected to buffer so that the GPIO->IN register is readable

*/

__STATIC_INLINE

void

nrf_gpio_cfg_input

uint32_t

pin_number

nrf_gpio_pin_pull_t

pull_config

);

學完了外設, 對晶片有了基本的認識, 就可以去擼 ble 的例程了。 sdk 裡的 ble 例程, 做到了改吧改吧就能在直接用到專案的程度。 個人推薦以 ble_app_uart 作為第一個學習的例程, 簡單且實用的ble 轉串列埠例程。 完成度為 改個 ble 名稱, 串列埠gpio 定義就可以拿去生產燒寫。

配套APP 為 nRF ToolBox, 建議用安卓, ios 系統有一些限制。 (額。。。對我的小米手機適配的不是特別好。。)。

請問學習嵌入式開發,有什麼可以參考學習的優秀程式碼案例嗎,可以推薦一下嗎?

另推薦 官方的另一個APP, nRF Connect, 是一個優秀的通用 BLE 工具

ble 例程的的程式碼我就不貼了。 個人建議的一點就是, 例程裡已經做好了printf 輸出到串列埠。 學習過程中應該儘可能多的打日誌, 配合app 操作, 透過日誌熟悉程式碼執行流程

最後說一下sdk 裡提供庫(路徑 components/libraries/)。 比如郵箱mailbox, 排程器 scheduler, 低功耗軟定時器 timer, 基礎庫util 等。 都是非常實用的庫, 可移植性也高, 複雜一些, 但是這些庫的實現方法思想, 都非常值得學習

把nordic 的 sdk 學好, 就可以去搞點真實的 ble 智慧裝置的專案。 比如自己給自己造需求, 或者仿一下某米智慧硬體, 帶幾個感測器, 溫溼度感測器, 六軸感測器 什麼的, 配合 app 輸入輸出控制。 多做幾個真實專案, 基本上可以算得上熟練的工程師了, 簡稱熟練工。

請問學習嵌入式開發,有什麼可以參考學習的優秀程式碼案例嗎,可以推薦一下嗎?mculover6662020-04-12 18:37:35

牆裂推薦我建立的知乎專欄:嵌入式開源專案精選專欄。

https://www。

zhihu。com/column/c_1225

408912687759360

目前已經有:multibutton,letter-shell,easylogger,每篇都是萬字長文,包括完整的裸機移植過程,設計思想解讀,就怕你看不下去,每週六更新哦~