您好, 登錄| 注冊|
論壇導航
您好, 登錄| 注冊|
子站:
論壇首頁    電源技術綜合區
  •  發帖
  • 收藏

【工程師6】+理論類+RTT進階應用之道。。。
閱讀: 1525 |  回復: 33 樓層直達

2019/09/02 10:01:06
1
s453208
電源幣:564 | 積分:104 主題帖:48 | 回復帖:164
LV7
旅長

QQ截圖20160321155901  【參與就有獎】曬出你的十一動態 讓電源網論壇分享你的心情

QQ截圖20160321155901   【第六屆】我是工程師技術原創大賽 數萬元獎品等您來



你能走多遠?取決你的才智?取決于你的努力?我想大部分人都不是。。。

躺贏是一種大眾化鄙視的進階之路,但同樣也是大部分人走向成功(達成自己的目標)的必經之路。。。

你能走多遠,取決于:選擇。。。。選擇。。。。選擇。。。(雖然努力固然很重要,但并不是我想說的取決于。。。)

作為一名單片機軟件工程師。。。你的出路在哪里,假如你堅定了選擇了這個職業,那么你的進階之路在哪里?

RTOS是唯一。。。RTT并不是必要的選擇。。。

這條職業道路最核心的課題是:技術應用而非研發。。。應用他人成熟的技術,借助更加開放的平臺,才會促使你更快的成長。

研發型的工程師并不是沒有,而是假如你離開了這個行業,離開了這款產品,你的競爭力還會在哪里?

選擇RTT是因為行業的需要,應用的特點,因為它更像Linux,但并不代表它是最適合你的。

RTT的核心還是一款RTOS,外面加了一層類似Linux的驅動方案,應用開放化平臺的理念,讓工程師可以開發各種各種的軟件包,提供平臺共享

這才是最棒的地方,這也就是告訴你:你并不是一個人在戰斗,你需要飛機、大炮、坦克的時候,自己造并不是唯一選擇, 你的身后有成千上萬的隊友在無私的給你提供著你需要的資源。

為什么要選擇RTOS?萬年課題這里不想討論他有多么好,接下來給你出幾個思考題,假如你想明白了,你就自行選擇吧 。

2019/09/02 10:33:16
2
s453208
電源幣:564 | 積分:104 主題帖:48 | 回復帖:164
LV7
旅長

課題1:先來個干貨,也就是你認為嵌入式軟件設計的時候,最復雜的部分處在哪里?

先來講講構架的問題,大部分裸奔的工程只有一種選擇,那就是前后臺的設計方式:

對于程序的設計有時候很難會做驅動與應用程序的區分,大家都混在一起所以當有需求需要更改的時候

改會變成一件很痛苦的事情,大部分的更改來自于邏輯部分,也就是應用部分,假如把一個單片機干的活

不計成本的用十個單片機來實現,可能還有倆單片機在玩,啥也不干,這樣的分解后程序設計會是怎樣呢?

其實RTOS的核心目的就是為了讓一個單片機用出十個甚至上百個單片機存在的效果而存在的。

他的目的并不是復雜化我們的設計,相反是為了減輕我們設計的復雜度。

2019/09/02 11:03:25
3
s453208
電源幣:564 | 積分:104 主題帖:48 | 回復帖:164
LV7
旅長

課題2:驅動程序的設計及驗證是單片機設計的第二大課題。

單片機軟件是需要直接和底層的很多硬件直接打交道,例如時鐘芯片,存儲芯片,通信芯片,傳感器芯片等等,設計驅動程序在很大一部分程度上還是相當復雜的尤其是踏入一個新的領域的應用時,傳統的一些驅動芯片的程序,都是在其他驅動程序的基礎上, 進行修修改改就OK了,可以用了,一旦涉及到驅動程序的編寫,也將是一部分很大的工作,其中有的涉及的MCU的內部外設,有的涉及到外部的通信接口的協議定制,有沒有想過有人把很多標準的驅動固化到了RTOS的一部分,這樣子來縮短開發周期呢,

2019/09/02 11:21:40
4
s453208
電源幣:564 | 積分:104 主題帖:48 | 回復帖:164
LV7
旅長

課題3:正視C語言:面向對象 or 面向過程 ?

面向對象和面向過程是針對軟件工程來講的,與C語言無關,大部分時間我們應用C語言都是應用面向過程進行程序設計,雖然軟件復雜度的上升,面向對象是一個更好的選擇,像RTOS就是選擇面向對象作為設計的核心,除了少量匯編代碼的工作,大部分全部采用C語言進行設計的,也就是你也可以采用面向對象的設計思想應用C語言來設計程序。面向對象的支持C++更加全面一些。

2019/09/03 15:16:37
5
s453208
電源幣:564 | 積分:104 主題帖:48 | 回復帖:164
LV7
旅長

課題4:RTT是如何采用面向對象的方式實現I/O設備模型框架的(這是一個實戰的案例)

用面向對象的方式實現I/O設備模型框架的實現方式和之前我們做軟件設計驅動的方式有很大的普通,具體要說優勢在哪里,說實話還是講不太出來,但是實現方式還是能夠理解的,先來看看他的設計框架模型:

傳統設計驅動程序,很少涉及到注冊的概念,我們會涉及到層的概念,通過函數調用的方式,從最上層找到最底層的應用。

而面向對象的設計是將每一層的設計全部都固化的本身,不會顯式的調用底層的東西,這樣做了很好的隔離,無論底層如何變動,都與上層無關。

而如果找到最底層的正確的驅動呢,是通過注冊的行為,將每一層之間用對象連接起來,實際上每一層操作的是同一個對象。

2019/09/03 16:42:01
6
s453208
電源幣:564 | 積分:104 主題帖:48 | 回復帖:164
LV7
旅長

面向對象,最核心的部分就是繼承,繼承可以單繼承或者多層繼承,在應用面向對象將層進行連接時,最主要的手段就是通過繼承,你可以使用在繼承線路上的任何一個對象,以此為切入點而找到其父親,爺爺,上上一背,就像是大家都姓王,你說爺爺(類型),大家知道是指王大錘,父親,大家知道是指王二錘,兒子,大家知道是王小錘。同一對象以王小錘作為入口,對于三層構架,底層設備,驅動層,I/O管理層,通過注冊函數,讓每一層都找到自己對應的類型,從而做自己該處理的事情。這就是核心。

下面看一看,三錘構架,大錘:rt_object,二錘:rt_device,小錘:rt_serial_device

二錘的內部構造(類型定義):

2019/09/04 08:53:04
10
s453208
電源幣:564 | 積分:104 主題帖:48 | 回復帖:164
LV7
旅長
接下來我們講解下層的構造,其實層本身是一個抽象的概念,無法實例化的理論是最難的理解的,這里將層映射到實際的文件,每一層在我看來就是一個.C文件,這樣講解不一定準確,但是卻很好理解:

APP層:uart_sample.c

I/O設備管理層:device.c位于kernel域中,屬于os核心組成部分。

串口設備驅動框架層:serial.c (屬于os組件部分)

串口驅動程序:drv_usart.c

2019/09/04 09:39:23
12
s453208
電源幣:564 | 積分:104 主題帖:48 | 回復帖:164
LV7
旅長

既然是進階之道,還是對核心代碼做一些分析:

drv_usart.c中主要對stm32的串口外設進行驅動設計,其代碼中,關于中斷部分就不做深入解析了,看一下,串口要想正常工作底層必備的幾個函數:

串口的基本操作都在這里,配置,更改模式,發送,接收,在配合中斷就可以實現串口最底層基本功能;

2019/09/04 09:50:24
13
s453208
電源幣:564 | 積分:104 主題帖:48 | 回復帖:164
LV7
旅長

不論何種外設,在使用之前初始化是必不可少的,底層驅動除了完成初始化功能以外,同時將設備驅動程序注冊了整個系統的構架中,類似于Windows某些軟件想要使用的時候,需要注冊一樣,將層與層之間連接起來,register來自于設備管理層,而非驅動層。

2019/09/04 10:13:24
14
s453208
電源幣:564 | 積分:104 主題帖:48 | 回復帖:164
LV7
旅長

到這里還沒有提過很難理解的用法,其實是有的,而且實現非常美,這一步部分不理解并不影響你的應用,rt_hw_usart_init并非顯式的調用,而是被事先安排到了會按順序執行的內存中,等待算法列表的調用,全局搜索時發現,

INIT_BOARD_EXPORT這是一個宏,具體實現如下:

這是涉及C 編譯器  內存的一種綜合用法,如果感興趣的同學可以從網上找資料學習一下。這種變成方式,像是已經為函數留好了入口,而實現者不需要關心在哪里調用的問題,僅需要通過宏將函數連接入入口對應的內存就好。

2019/09/04 10:22:49
15
s453208
電源幣:564 | 積分:104 主題帖:48 | 回復帖:164
LV7
旅長

設備驅動層實現對于串口的通用用法的實現及封裝,在講串口應用的問題,其實最復雜的部分來自于接收,發送的邏輯實現其實并不復雜,這一層不想展開太細的講:這里是根據目前通用的串口接收及發送的應用,進行軟件設計。

其實對于設備來講,無論是串口 還是IIC 或者其他設備,統一入口在device層,真正應用的時候你不需要之道底層,中間層到底是如何實現的,只要關注device層的規則進行軟件就可以實現相關的功能:

2019/09/05 09:09:28
18
s453208
電源幣:564 | 積分:104 主題帖:48 | 回復帖:164
LV7
旅長

課題5:你以為的真的是你以為的嗎?這一課題或許是本篇進階之道最重要的課題,也是廢話最多實戰最少的課題,但我卻認為是最重要的課題。

          你以為的真的是你以為的嗎?你能在這條路上走多遠,取決于你以為的盡頭在哪里。工作多年,前進的時間能有多少,大部分時間都在原地打轉,一度懷疑是否是自己的能力和智商有極限,只能走到這里了。

           我們真正缺的并不是能力和智力,假如你能看到這里,我們缺的是一種叫做逆向思維的東西。

           什么是逆向思維,我覺得很難用文字解釋,當你每一次突破人生或自我的瓶頸,你就在運用逆向思維的利器。

           

        

2019/09/05 09:11:12
19
s453208
電源幣:564 | 積分:104 主題帖:48 | 回復帖:164
LV7
旅長

   以軟件為例,我覺得這條路真的是越來越難走,因為要學要會要通的東西實在是太多,精力有限,這么走下去,真的是越來越慢,其實問題并不是這條路越來越難走,問題是你是否覺得軟件是一個人的工作,還是一項原本就是需要很多人協作的工作,假如是后者,那么你是否應該選擇信任相互協作的人,就像是造一輛車子,有人做好了發動機,你是直接拿過來用,還是拿過來拆開先看看內部設計是否合理,是否有問題,這是否真的有必要?哪怕你特別想知道它內部是如何工作的?現在的問題是造一臺車子出來重要,還是先把所有零部件解剖一遍重要?        

  以前我以為,只要是工程中引用的軟件就必須搞懂搞通這樣才能確保軟件質量及穩定運行,在需求快速增長的現在,無論是軟件的哪一部分讀起來都并不那么容易,這些軟件的生產者也沒有你想象的那樣粗制濫造,雖然bug不可避免。

            現在我以為,哪怕這臺車子真的有問題,那也要讓他先跑起來,在慢慢調教看看問題出在設計上,還是我的裝配上。假如沒有問題,那么我會去研究其他的車型,而不是把這臺車子打散重新研究一遍。            你以為的也許并不是正確的,真的能夠在遇到瓶頸時候學會反思,你才能突破現在的自己,重新上路。

2019/09/05 10:30:33
20
s453208
電源幣:564 | 積分:104 主題帖:48 | 回復帖:164
LV7
旅長

課題6:下一層AT組件應用:(AT組件主要應用在各種各樣的通信模組上,本例基于esp8266WiFi模組應用)

            通信模組采用ESP8266-01S開發模組,底板采用正點原子戰艦mini開發板。

            

2019/09/05 10:38:18
21
s453208
電源幣:564 | 積分:104 主題帖:48 | 回復帖:164
LV7
旅長

AT組件建立在device層的基礎上, 也就是I/O管理的框架基礎之上。

2019/09/05 15:07:20
22
s453208
電源幣:564 | 積分:104 主題帖:48 | 回復帖:164
LV7
旅長

2019/09/06 15:43:34
28
s453208
電源幣:564 | 積分:104 主題帖:48 | 回復帖:164
LV7
旅長

基于AT組件,RTT擴展出軟件包,供大家選擇和使用,這里的組件層和內核(本篇帖子沒講)說實話這篇帖子想接著講的內容還有很多,但考慮到核心進階的內容已經講到,帖子太長,就不展開繼續了,到這里看一下如何添加AT_DEVICE軟件包以及注意事項:

這里用的是樂鑫的ESP8266WiFi模組,注意固件的版本,推薦使用V2.1.0,這里夠用了,當然不同的應用場景可以自行選擇需要的版本:

2019/09/06 15:48:03
29
s453208
電源幣:564 | 積分:104 主題帖:48 | 回復帖:164
LV7
旅長

 利用env變異生成工程后,燒錄到目標板中,利用finsh組件可以交互使用相應的功能了

測試一下經常用到的網絡測試命令,確認at設備正常工作:

2019/09/06 15:59:24
30
s453208
電源幣:564 | 積分:104 主題帖:48 | 回復帖:164
LV7
旅長

在AT_device的基礎之上可以添加通信協議與服務器建立連接,這里以通信貓為例,添加測試MQTT協議:

編譯整個工程后,燒錄到目標板中,通過finsh組件測試MQTT協議是否正常工作:

這是官方提供的一個demo,中間調試略有曲折,費點事一天搞定,如果感興趣的同學,在調試中遇到什么問題,可以交流溝通,吃過一次螃蟹,我就知道怎么教你怎么吃了,只要你請客。這篇帖子就到這結束吧,最后講一個很關鍵的東西:

RTT本質是生態的存在,也就是開發者和目前RTT開發團隊并行開發的結構,目的是為了構建生態,豐富應用層,這中間會有匹配的問題存在,也就是你使用的軟件包雖然是RTT提供的,但并不是RTT團隊制作并維護的,他的提供者和你我一樣,都是云云開發者,所以有時候會出現軟件包與RTT構架不匹配的問題,這時候可以多試幾個軟件包的版本,不一定是最新最好。

本篇進階之道到此結束吧,最后來一張硬件的特寫,線做的稍微有點亂,sayonara~!

2019/09/05 21:45:48
24
奮斗的青春
電源幣:621 | 積分:13 主題帖:90 | 回復帖:736
LV9
軍長
軟件的設計就需要架構合理,后續維護及升級都容易。盡可能的模塊化設計。
2019/09/06 15:26:33
27
s453208
電源幣:564 | 積分:104 主題帖:48 | 回復帖:164
LV7
旅長
的確是。
2019/09/08 20:25:12
32
gxg1122
電源幣:1500 | 積分:12 主題帖:167 | 回復帖:1617
LV10
司令
樓主的理論功底不錯。
2019/09/05 21:44:27
23
奮斗的青春
電源幣:621 | 積分:13 主題帖:90 | 回復帖:736
LV9
軍長
RT工作就是任務調度,需要注意優先級及嵌套層次。
2019/09/10 10:58:33
34
s453208
電源幣:564 | 積分:104 主題帖:48 | 回復帖:164
LV7
旅長
嵌入式RTOS  其實都差不多   從空間和效率上來講,不論FREE  UCOS RTX  RTT等等,RTT具有完全不同的組件層,可以體驗下。
2019/09/03 17:07:53
7
Kaidi3826
電源幣:0 | 積分:1 主題帖:0 | 回復帖:4
LV1
士兵
感覺技術很牛的,學習學習!
2019/09/04 08:15:32
8
s453208
電源幣:564 | 積分:104 主題帖:48 | 回復帖:164
LV7
旅長
共同學習
2019/09/04 08:31:51
9
lihui710884923
電源幣:476 | 積分:1 主題帖:153 | 回復帖:512
LV9
軍長
這個與STM32編程有啥直接關聯?
2019/09/04 09:04:21
11
s453208
電源幣:564 | 積分:104 主題帖:48 | 回復帖:164
LV7
旅長

stm32只是眾多硬件平臺中的一個,RTT是平臺解決方案的存在,支持基本市面上你能看到的幾乎所有的硬件平臺,簡單來講就是后面你可以不再過多考慮硬件底層的編程,專注于應用層,底層她幫你解決,不需要自己去設計各種外設的驅動,只需要適配和調試。

2019/09/05 08:05:45
16
chaochao1545
電源幣:148 | 積分:3 主題帖:0 | 回復帖:1
LV1
士兵
RTT應該是面向物聯網方向的吧?
2019/09/05 08:07:17
17
s453208
電源幣:564 | 積分:104 主題帖:48 | 回復帖:164
LV7
旅長
嗯,主要是面向物聯網的操作系統
2019/09/05 21:46:44
25
奮斗的青春
電源幣:621 | 積分:13 主題帖:90 | 回復帖:736
LV9
軍長
樓主是做什么物聯網的設計工作了?面向應用是哪個領域?
2019/09/06 09:00:57
26
s453208
電源幣:564 | 積分:104 主題帖:48 | 回復帖:164
LV7
旅長
主要是智能家居和共享領域
2019/09/07 13:47:12
31
其樂518
電源幣:444 | 積分:4 主題帖:2 | 回復帖:152
LV5
營長
搬凳來學習
2019/09/09 09:42:21
33
s453208
電源幣:564 | 積分:104 主題帖:48 | 回復帖:164
LV7
旅長
一起學習
客服熱線
服務時間:周一至周五9:00-18:00
微信關注
免費技術研討會
獲取一手干貨分享

互聯網違法不良信息舉報

Reporting Internet Illegal and Bad Information
[email protected]
400-003-2006
彩票大小单双计算公式