總網頁瀏覽量

顯示具有 微處理機 標籤的文章。 顯示所有文章
顯示具有 微處理機 標籤的文章。 顯示所有文章

2022年8月23日 星期二

又有產業界的RD工程師,因為需要用到8051 MCU做產品開發,來洽談上課輔導合作。很歡迎!

近期,又有一間設備商使用到8051 MCU在做設備產品開發,該司之中有機械(電機電子/機構/控制) 和 資訊工程背景 的幾位工程師來洽談上課輔導合作,

主要希望奠定MCU/嵌入式系統軟韌硬體(從MCU架構、軟韌體 到 介面電子電路)的相關基礎,以及針對現在的產品開發現況進行諮詢。

很歡迎~! 🙏🎉

-----

個人簡歷: https://sites.google.com/view/wenliangsun/


‼本園區開設之技術課程進一步詳情請參見下方blog網頁的課程介紹👇:
本學習區之Facebook粉絲頁如下:

--------------------------

孫文良 (阿良的嵌入式系統技術學習區)

【若需要嵌入式系統技術輔導課程 可來信洽談合作方式: iws6645@gmail.com,亦可先點擊參考這篇介紹文章

2022年3月31日 星期四

以訛傳訛 是很常見的情況!

即便你只要隨便看一下 維基百科(Wikipedia)上面有關8051 MCU的介紹,就會馬上看到:

The Intel MCS-51 (commonly termed 8051, typically pronounced eight-oh-five-one) is a single chip microcontroller (MCU) series developed by Intel in 1980 for use in embedded systems [1]. 

或者隨便查一下嵌入式系統(embedded systems)的介紹,同時也會知道MCU(微控制器)與傳統所稱「微處理機」(ordinary/general microprocessors)的差異: 

Modern embedded systems are often based on microcontrollers (i.e. microprocessors with integrated memory and peripheral interfaces), but ordinary microprocessors (using external chips for memory and peripheral interface circuits) are also common, especially in more complex systems[2]. 

即便上述資料是如此的詳細且易於查詢,但還是會有許多人會誤以為有跑Linux之類的OS的系統才算是嵌入式系統(embedded systems)、誤以為許多跑Non-OS firmware的MCU based的系統就不是嵌入式系統;還有很多大專院校的電機電子資訊相關系所教授和許多業界主管/老闆們還是一天到晚「微處理機」、「微處理機」的去稱呼MCU。這些就是所謂的以訛傳訛,而這些以訛傳訛呢,可能幾十年來皆存在於許多學生、大學教授、業界工程師、業界高階主管之間。

很多人就是不喜歡去把一些基本的工程名詞定義給查清楚,看來...稍微用心思考+查一下資料真的是太難了。

Ref:

[1] Intel 8051, Wikipedia, https://en.wikipedia.org/wiki/Intel_8051

[2] Embedded system,  Wikipedia, https://en.wikipedia.org/wiki/Embedded_system


-----

個人簡歷: https://sites.google.com/view/wenliangsun/


‼本園區開設之技術課程進一步詳情請參見下方blog網頁的課程介紹👇:


本學習區之Facebook粉絲頁如下:

--------------------------

孫文良 (阿良的嵌入式系統技術學習區)

【若需要嵌入式系統技術輔導課程 可來信洽談合作方式: iws6645@gmail.com,亦可先點擊參考這篇介紹文章


2021年11月20日 星期六

【從事嵌入式系統軟韌體開發,絕對不能只有看到表層的應用功能,而是要能掌握「電腦」系統】

【從事嵌入式系統軟韌體開發,絕對不能只有看到表層的應用功能,而是要能掌握「電腦」系統】

Joseph Yiu這位作者的The Definitive Guide to ARM® CORTEX®-M3 and CORTEX®-M4 Processors (Third Edition), 2014部分內容有被放在ScienceDirect網頁上(知名學術期刊出版商Elsevier的書籍線上收錄網站),例如關於ARM Cortex-M0/M3/M4 CPU的Exception Return Mechanism的這部份(如該網頁內容): https://www.sciencedirect.com/topics/engineering/exception-return-mechanism?fbclid=IwAR3A4jgqY7IzOIe1vH4iE9qn1cSe0sNHsG_ab4EPyTU-X2R605APd8zYPYg

或者像是Interrupt Vector Table這個部份 (包含數位作者的著作部份內容):https://www.sciencedirect.com/topics/engineering/interrupt-vector-table


你會發現,相較於8051,其實ARM Cortex-M CPU的硬體豐富些、複雜些, 但想要達成的目的(基本原理)是一樣的,或者說是延伸發展而來的。相較於8051內的CPU,ARM是用更豐富的硬體(相對的也變複雜)來達成一些機制目的,算是一些優化的行為。

所以本園區的嵌入式系統基礎課程使用8051 MCU這種小而美、架構相對較簡易(講原理而非只是表層應用的話,對初學者來說已經夠難了)來闡述這些電腦基本的知識原理理論、並搭配實驗/實作驗證基礎原理,如function/subroutine、ISR的branch及return的原理,包含堆疊(stack)的觀念,

很多人可能不知道萬一堆疊(stack)的內容被踩掛了(值被蓋掉),當你呼叫一個函數,在函數執行結束之後就回不來原本的流程了,這就是所謂的bug,不要以為你用高階語言(C語言)就不可能發生,因為編譯器在你Build code時不一定都有噴warning、而就算有噴warning你也不一定會去注意。

這樣才不會淪於「只會」做很表層的應用 、只知道抽象流程、而沒有實際了解處理器在實體層面到底是如何「實現/完成這些流程轉換」 。這也是許多工程師常有的問題、也是很多大學師生對於這方面的技術視野極度侷限的問題  (只想要拿現成的軟硬體模組去湊出功能、以為這樣就很厲害了)。

在學校甚至某些企業內部,甚至常有那種常把重點放在功能是否創新創意打嘴砲、或者著重上層應用演算法以包裝論文的風氣文化,不是說這些部份不好,而是如果只有這些部份,從技術基礎與深度的角度來看,就太過於偏廢,而且事情的發展往往很容易走到這方面來。畢竟拿現成的東西來兜出功能最快了,就人性面的角度來說,多數人(外行人當然多於內行)都只想看到功能,或是只想看到有漂亮應用數學式子的論文,而不管東西是怎麼開發設計的、不管開發者是否理解其架構原理。

千萬不要以為這些重要的理論基礎沒用 (以為和做出表面的應用功能 沒直接相關),事實上,在做產品開發時,當遇到一定困難度的bug時,就會與這些基礎觀念的累積有很大的關係。

我常建議我的學員工程師們,從事嵌入式系統軟韌體開發,絕對不能只有看到表層的應用 (程度只到只會拿現成的函數來兜出應用功能)。工程師們如果希望有比較好的軟韌體職涯出路,需要有一定的技術視野和深度,而不能只會call API(現成函數)做應用,當遇到有難度的bug時或者希望優化增進效能或降低運算功耗時,會發現自己啥都不懂。

畢竟嵌入式系統就是具備特定功能的「電腦系統」,你還是必須要對「電腦」內部組織原理有所掌握,以及對於周邊的電子電路有所理解,電腦晶片內外部的軟硬體基礎知識都需要兼備,這樣才是完整具備 系統設計規劃、系統設計觀 的研發工程師,如果不知道這些部份的存在和重要性,那都不算「完整」的系統設計能力。

而選擇用8051做為課程實驗平台的另一方面原因是,8051比較不會像是ARM CPU based MCU的細節這麼多而複雜 (難以讓初學者吸收理解),就像還不會騎腳踏車的人(還沒掌握基本平衡感),並不該在一開始就去騎多功能的機車(很容易雷殘而導致放棄學習騎車),這是一樣的道理。

如果你平常(長年來)在寫所謂的軟韌體,如果都只有 呼叫(複製、貼上、改參數)現成的函數(API function)在作純應用,那你可能會聽不懂我在講什麼,你會以為你呼叫現成的函數就代表你「懂ARM」了,事實上這是差十萬八千里,就像你在個人電腦(PC)上面用DEV C++ IDE軟體去撰寫一隻呼叫printf標準API去印出"hello world"字串在螢幕上的C語言程式(.c),但你可能完全講不出這台複雜的電腦系統的任何原理一樣。

另外,關於MCU/SoC應用所牽涉的周邊裝置驅動以及基礎介面電子電路的方面的原理和實作實驗,本園區的課程也都會涵蓋。

所以,外行人才會以為8051太老舊、xx平台太老舊,事實上事物的本質是看你怎麼去了解和應用,許多數十年前的演算法也會被用來設計現代的產品 (例子太多講不完,例如Dynamic Time Warping algorithm),很多技術都沒有什麼老舊/不老舊的問題,而是看你怎麼去用它。

很多人常會說xx平台、xx技術太老舊過時,沒用了,

拜託,很多人可能根本不知道,Python的問世時間是1991年 (距今30年前),怎麼不說Python太老舊? 

類神經網路(Neural Network,NN)的計算模型大約是在1943年被創造發展,怎麼不去說Neural Network太老舊?   

所有技術和平台不都是幾十年前開始問世、累積過來的? 難道會空中樓閣、直接空降?

現代微積分是在17世紀被研究發展起來的,都幾百年前的東西了,怎麼不去跟學校要求拿掉微積分必修??

從頭到尾就是人的問題,而不是什麼技術老舊與否的問題。

-----------

‼課程進一步詳情請參見下方blog網頁的課程介紹👇:

 

2021年10月18日 星期一

正常的高職電資科系的專業科目理論教育,其實很紮實, 而且內容太多了

延續之前寫的2篇文章:

「名校學歷」真的值得迷信和過度崇拜嗎? 分享一下我個人的實際經驗和看法

每次在書局翻到高職參考書,都有感覺,

高職專業科目課綱(至少我讀過的電子科系) 的理論課程基礎真的很多、很紮實,而且我甚至認為內容太多了 (對那年紀的學生而言)。

(學太多,很多內容考完試如果沒常用,就會就逐漸淡忘。但是,這個問題,其實在普通高中體系更嚴重,大多只是為了考試而學)

以最近在書局看到的高職「微處理機」科目的幾本參考書內容為例,包含 CPU組織架構(以x86和Z80為例)、指令集/組合語言、各式記憶體種類(DRAM、SRAM、NAND/NOR  Flash、EEPROM等等)、各式週邊(GPIO、Timer、UART/RS232、I2C、SPI、ADC、DAC等等)、isolated-I/O、memory-map I/O、中斷、RISC/CISC、堆疊、Cache觀念,甚至連多核心架構都有介紹!也有8051 MCU內容。

計算機概論的內容也不錯,而關於上層軟體的實作相關方面有VB程式語言(以這階段來說我認為蠻適合)。

在屬於類比電路方面的基本電學和電子學的內容,幾乎全部都是電學對應的數學計算,也沒比大學的電子學簡單  (我在讀科技大學的時候的電子學課本是名校大學也都在用的smith電子學的第五版,這本是電子學其中一本bible),基本上教學的重點內容是幾乎和高職時期的這些科目相同的,而數位邏輯電路也是一樣(讀科技大學時期是用morris mano的digital design,這本也是該領域bible課本)。但是大學的授課時數相對少(每周三小時、扣掉期中考期末考和一些國定假日,大學實際授課時數會很多嗎? 其實不會比高職紮實的,但高職那時年紀較小是真的,但是厲害的學生還是有,學習看個人)

其實很多高職課本和參考書裡面的專業知識,許多人讀到名校碩士甚至博士畢業,當了業界工程師或大學教授,都未必清楚,甚至有些人對這些基礎沒聽過(很多人在大學修課就像沾醬油,早忘光了),

很多讀到名校碩博士畢業的人可以捫心自問,自己真的熟悉這些基礎觀念嗎?

技職教育在台灣被歧視和忽視,對台灣社會是極大損失。

誰說高職沒有理論基礎?

(附上近期在書局看到的其中幾本參考書照片,而照片中有兩本書的作者是自己當年就讀的高職電子科的老師)





許多台灣人很喜歡說 讀高職沒理論基礎、讀普通高中才有學術理論基礎

其實我們可以看看 (如圖)

高職升學的 電機與電子群資電類 和 電機與電子群電機類的 統測題目內的專業科目(基本電學、電子學、數位邏輯、計算機概論、電工機械 等) 

是否大部分的題目和內容,台清交成等校電機資工系的電機電子博士教授都會?

一定會有人說曾經學過,但久沒用就忘記了。沒錯啊,大家都這樣,可以理解,那所以普通高中的考試就沒這問題? 難道技職教育就是比較該被歧視嗎?

我親眼看過許多教授(電機博士 或 資工博士)根本不太知道這些基礎的阿,那所以技職該被歧視? 請不要忘了 這是高職生的題目。

歷屆四技二專統一入學測驗(統測)試題 (考古題):

下面是110學年度四技二專統測 電機與電子群 資電類 和 電機類的部分試題截圖:
 

          



    

          

 




再舉個例子

其實如果以台灣社會一般對於考試成績分數的傳統觀念來說, 

成大某些工程系所(電資相關系組)碩士班,過去收了蠻多大學時期讀樹德科大的學生(碩士班推甄,可能是因為有些教授之間相互認識推薦),我會有這個印象是因為我看過許多位。

其實統測滿分700分,在我考統測的那幾年,以電機電子群電子類來說(電子類 就是現在的 資電類) ,樹德科大 只要250分左右就會錄取,後來應該更低。

而當時隨便一間本島的國立科大,其實最少都要530分以上(登記分發),跟250分差很遠。

但是很多成大教授因為根本不清楚科技大學的分數排名或者入學狀況,所以反而可能對這些相對高分的本島國立科大的印象較差,

上述這情況這是有所矛盾的,

但是其實許多大學時期讀樹德科大的學生,後來在成大碩士班依然都會順利畢業,而且表現可能還不錯,也看過碩士畢業就去聯發科當工程師的。

這些現象反映出了蠻多的事實,可以讓大家反思,技職體系真的有比較差嗎?? 該受到台灣社會的歧視嗎? 

Ref:

2021年8月23日 星期一

【好書介紹】電腦技術並不是只有軟體! 介紹一本介紹Intel 80x86為核心的IBM電腦系統軟硬體的好書

歡迎透過合法的方式分享此文內容,若要轉載/轉貼,請明確貼出此原始連結並標示作者基本資訊請勿抄襲及非法轉貼(例如擷取內文但並未註明出處)

因為搞不清楚狀況的人很多(執著表面的年份、新舊),先介紹一款Intel 在2016年所推出的基於x86(1993年推出的Pentium) ISA Compatible CPU 的Inte lQuark系列 微控制器(MCU): D2000

該MCU內的CPU的類型是1993年推出的Pentium(本來是要被命名為80586) ISA Compatible的CPU,在這款2016年推出的MCU的Intel官方Datasheet內的介紹可見下圖紅框圈起處

- 其內部CPU info :

32 MHz, 32 bit, single core, single thread, Pentium ISA compatible (如果看不懂這是x86的人,請自己google一下,做點功課,或見下圖的Intel官方手冊內容)

https://static6.arrow.com/aropdfconversion/3675d6354c6d8ac364213bdd827aacc81c93c43d/119736798394079quark-d2000-datasheet.pdf


- 其內部I/O :

SPI, I2C, GPIO, SPI, Comparators, ADC, PWM, DMA, UART

- Wikipedia的Intel Quark系列介紹: 

Intel Quark is a line of 32-bit x86 SoCs and microcontrollers by Intel, designed for small size and low power consumption, and targeted at new markets including wearable devices. The line was introduced at Intel Developer Forum in 2013.

...... However, in 2016 Arduino released the Arduino 101 board[3] that includes an Intel Quark SoC.

https://en.wikipedia.org/wiki/Intel_Quark

- Datasheet

https://static6.arrow.com/aropdfconversion/3675d6354c6d8ac364213bdd827aacc81c93c43d/119736798394079quark-d2000-datasheet.pdf

- Wikipedia的Pentium系列內容介紹: 

https://en.wikipedia.org/wiki/Pentium

------------

執著技術和平台的表面年份數字、或者人云亦云沒有必要重點在於是否合適

很多事情,尤其是電腦技術領域,真的不見得是越舊的年代的東西就代表完全過時無用,事實上有許多技術概念真的都是通用的,而去了解80x86和其相關系統設計的觀念,也是一樣的。

真實的專業研究之所以有價值,原因也在於此,技術不限於年份數字的這種表象,只要是適用、可解決或改善問題的idea觀念,都極有可能再拿出來被使用。

例如8051已經是40年的老MCU IP,但從台灣一線的IC設計公司公告的職缺內容可看出,至今仍有著需要了解8051的能力的工程師職缺,可參見我的下方PO文 (點選 查看更多)


------------

先聲明,這篇不是工商服務廣告,單純介紹過去讀過的電腦技術類的好書

這本80x86 IBM PC and Compatible Computers Assembly Language, Design, and Interfacing Volumes I & II , 2002年出版,作者是Muhammad Ali Mazidi和Janice Gillispie Mazidi,出版社為Prentice Hall(Pearson)。

https://www.amazon.com/80X86-IBM-Compatible-Computers-Interfacing/dp/013061775X

中譯版書名為: IBM PC and Compatible Computers Design, and Interfacing - IBM PC系統設計與介面技術(第四版),東華書局出版,譯者為 方志鵬。 

這本書涵蓋了很多電腦系統的軟韌硬體基礎觀念內容,在當年(十幾年前,大約19歲的時候)給了我不少啟發。

和 計算機組織/結構課本(科目)的一個不同之處在於,這本書或這類的科目會實際介紹8086/8088/80286/.../Pentium等微處理器IC及一些組合語言程式之外,也會介紹一些關於 介面電子電路 以及許多周邊IC與硬體(如8288 bus controller、8284 clock generator、記憶體介接電路、Programmable I/O的8255、LM34/35溫度Sensor、ADC0848、DAC808、8259中斷控制器、8253 Timer、LCD驅動、步進馬達驅動、 DMA 8237、UART 8250、UART轉RS232電壓位準轉換器、硬碟、鍵盤、印表機、數學運算coprocessor、視訊、以及其它許多IC,包含與微處理器IC之間的各種實際訊號狀態)的內容。

雖然這本書介紹的許多IC的型號比較舊,但是許多基礎原理觀念至今仍是共通的(畢竟電腦技術就是這幾十年來持續演化)。

另外還包含一些支援OS的微處理器的特性基礎,如80386的user/supervisor mode、virtual memory、page table、TLB等觀念,到了高速記憶體介面與存取章節也有各種記憶體的介紹(DRAM、SDRAM、cache memory的存取機制、write through、write back、cache coherence等觀念。後續談到80486時也會介紹到Pipeline;Pentium章節會提到superpipeline、supersclar、Harvard architecture、pipeline hazard、compiler的instruction scheduling、RISC/CISC的特性比較、out-of-order execution、branch prediction;MS-DOS的結構、記憶體管理;PCI、USB bus;BIOS;MS DOS和BIOS的ISR (INT _ _H對應的ISR),涵蓋內容相當廣泛。

許多讀資訊工程系的朋友可能會不太清楚,這門課的名稱通常叫作微處理機與介面設計、微算機原理、介面設計,但現在在學校關於這種科目通常都是拿MCU(微控制器)的開發板來讓學生實驗,而不是像早期真的用微處理機(微處理器,如8086、Z80等)搭配一堆IC的兜成介面的方式來教了。另外,嚴格來說,這門課的範圍比計算機組織的範疇還廣(包含一部分計算機組織的內容),但通常學校只會教到這本書的內容的一小部分。外國的書像是現在介紹的這本比蠻有名,而台灣比較常見的書是台灣科大電子系林銘波老師所出版的一系列微算機原理書籍。

這是一門在本質上很偏向實務和基礎理論觀念並重的課程,許多大學在這方面的教學都很輕忽。此外,這科也並不是研究所指定考科,所以常被忽略,研究所考科通常是計算機組織結構,但是性質和內容仍有不小的差異。

而關於介面硬體電路的方面,是近年來許多國內大學的電資工程系所普遍比較不重視的一環,畢竟現成的硬體用慣了,就容易忽視其存在與重要性。

但其實電腦系統技術絕對不是只有純軟體,若沒有紮實的硬體系統(包含類比式與數位式硬體),軟體哪來的用處呢?就算現在的SoC和MCU的集成度很高,很多週邊硬體都整進去了,但是基礎觀念和介面電路還是少不了啊!



註1: 這裡講的微處理器(微處理機)就真的是傳統所指的 "微處理器"(Microprocessor),例如8086/80286/80386/80486/Pentium IC裏頭就是CPU單元, 而不是微控制器(MCU, Microcontroller)!   並且也不是在指SoC或MCU被稱作的嵌入式微處理器(Embedded Microprocessor)的狀況。

順帶一提,這本書在談到鍵盤的章節,也會介紹到標準IBM PC內的鍵盤內都會有一顆微控制器(MCU),該微控制器內含一顆微處理機(微處理器)、RAM、ROM以及幾個I/O Port,這裡很清楚就可以釐清微處理機和微控制器的差異!

註2: 這本書後續還有續作: The x86 PC: Assembly Language, Design, and Interfacing, 5/e,2009年出版, 作者: Muhammad Ali Mazidi, Janice G. Mazidi, Danny Causey)

https://www.tenlong.com.tw/products/9780135026489




--------------------

孫文良 (阿良的嵌入式系統技術學習區)

個人簡介: https://sites.google.com/view/wenliangsun/

【若需要嵌入式系統技術輔導課程 可來信洽談合作方式: iws6645@gmail.com,亦可先參考 課程招生網頁連結

2021年7月25日 星期日

學習8051 MCU會太老舊過時嗎? 告訴你更老舊的6502 CPU/MPU的實際狀況!

很多人都會迷信於 平台或技術的 新舊 這種表面來主觀判斷其好壞,而不知其實際客觀的狀況。

除了Intel在1981年出產的8051 MCU的同族加強版至今依然有許多產品在用,

事實上,就連MOS公司在1975年出的6502 Microprocessor系列,現在也還是有不少產品使用。

幾年前有和一間IC設計公司主管討論到這方面;而最近一位即將任職韌體工程師的學員的公司也會用到6502,主要以 組合語言(Assembly Language) 進行其韌體程式開發。

其實,無論平台新舊,有許多基礎原理都是直接相關甚至共通的。如果舊的(架構較簡易的)都還不會,以為直接碰新的平台就能學的紮實? 這是許多學校老師的天大誤會  (當然也有業界人因為看得不夠多,也有可能會有類似的觀念與迷思)。


嵌入式系統相關觀念教學文:

1.   許多人對於8051 MCU的常見錯誤觀念闢除

2.   Arduino到底是什麼? MCU又是什麼?

3.   現代計算機系統核心硬體常見平台的分類與簡介概述


--------------------


孫文良 (阿良的嵌入式系統技術學習區)

個人簡介: https://sites.google.com/view/wenliangsun/

【若需要嵌入式系統技術輔導課程 可來信洽談合作方式: iws6645@gmail.com,亦可先參考這篇介紹文章

2021年7月14日 星期三

【阿良的韌體科普系列】「韌體」到底是什麼? 和軟體有什麼不同? 【下篇】

【若需要嵌入式系統技術輔導課程 可來信洽談合作方式: iws6645@gmail.com,亦可先點擊參考這篇介紹文章

歡迎透過合法的方式分享此文內容,若要轉載/轉貼,請明確貼出此原始連結並標示作者基本資訊請勿抄襲及非法轉貼(例如擷取內文但並未註明出處)

承接中篇文章,下篇的內容如下: 

另外有些人可能會認為,被燒錄到裝置產品內的軟體都能叫做韌體,我甚至看過有人認為開發Android 裝置的上層軟體也是在做嵌入式系統韌體開發,對於這種觀念我個人是不同意的。因為畢竟只要是能執行軟體的產品 (有電腦系統在內),有什麼不是裝置呢? 即便個人電腦PC也是裝置的一種。其實或許應該以軟體的所在層次(Level)去區分,會較客觀一些。

無論硬體平台是SoC或者MCU;無論產品類型是小體積的裝置還是PC或家電;無論主要系統軟體是屬於有無OS的類型、無論軟體單元/種類是Linux kernel、BIOS、bootloader等等,只要是位於底層層次的軟體(存取CPU、周邊暫存器記憶體的層次的軟體,我認為即可稱為韌體),撰寫韌體是需要考量到硬體狀況 (如果是控制I/O周邊用的韌體,時常還要考量及整合電腦晶片外部的電子電路設計)。

當然也有因為硬體架構較單純所以將應用程式和韌體混和撰寫的狀況,例如早期標準(至今仍可用於嵌入式基礎教學)的8051 MCU晶片的程式開發即是這種狀況(較早期的MCU硬體架構單純、資源較有限,不一定適合去將其軟體區分出太多高低階層次)。

  • 註: 電腦並非只有指個人電腦(PC),而是在許多人們於日常生活中所會使用到的產品裡面都有電腦(執行軟韌體程式以驅動各式硬體),例如手機、平板電腦、家電(數位電視、電視機上盒、洗衣機、冷氣...) 等等。

-----



嵌入式系統相關觀念教學文:

1.   現代計算機系統核心硬體常見平台的分類與簡介概述

2.   Arduino到底是什麼? MCU又是什麼?

3.   許多人對於8051 MCU的常見錯誤觀念闢除


--------------------


孫文良 (阿良的嵌入式系統技術學習區)

個人簡介: https://sites.google.com/view/wenliangsun/

【若需要嵌入式系統技術輔導課程 可來信洽談合作方式: iws6645@gmail.com,亦可先點擊參考這篇介紹文章

【阿良的韌體科普系列】「韌體」到底是什麼? 和軟體有什麼不同? 【中篇】

【若需要嵌入式系統技術輔導課程 可來信洽談合作方式: iws6645@gmail.com,亦可先點擊參考這篇介紹文章

歡迎透過合法的方式分享此文內容,若要轉載/轉貼,請明確貼出此原始連結並標示作者基本資訊請勿抄襲及非法轉貼(例如擷取內文但並未註明出處)

承接上篇文章,中篇的內容如下: 

所以,若要精確一點來說(說好的初學者科普呢),個人認為何到底謂韌體、何謂軟體,其實應該以該軟體所在的層次來區分,而不是以平台來區分。

以許多 初學者 或 學生 時常撰寫non-OS類型的Arduino軟體為例,當要驅動GPIO所對應的某支腳位輸出高電位時,如果使用的方式是是直接在Arduino IDE中去呼叫digitalWrite(Pin_Number, HIGH); 若以嚴格&精確一些的標準來說,呼叫函數的本身的這層程式碼的範疇,算是應用軟體層面(屬於 只負責下參數給這個現成的函數來應用這個函數,但看不到這個函數的內容是如何、實際上是如何接觸操作了什麼硬體暫存器 的層次)。 而 真正去實現digitalWrite這個函數的內容程式碼(對GPIO的暫存器作操作存取)的部分才是意義上較精確的韌體開發。

這時有些人可能會混淆,認為上述Arduino例子的digitalWrite(Pin_Number, HIGH)既然會直接驅動硬體(會讓Arduino板子輸出數位邏輯系統的高電位5V或3.3V(視MCU款式而定)訊號,那呼叫digitalWrite的層次的軟體怎麼會不屬於韌體呢?  

如果有這個疑問的朋友,可以自己想想,有什麼APP的最終功能目的不是驅動硬體動作呢? 例如你使用LINE APP發送文字訊息給朋友,此時手機畫面的硬體、手機通訊相關硬體其實都有做事(work),但難道LINE APP是韌體類的程式嗎?  既然世界上所有的軟體本來就都是為了驅動電腦硬體做事(以達到我們人類所指定的功能),那又何必區分獨立出韌體這個名詞呢?  所以,韌體應該必須是有其特定意義的。

當然了,上述講述的Arduino函數的這例子的說明內容,是比較精確嚴謹的韌體名詞作釐清,但如果將韌體這個名詞的定義放寬、放得更廣泛一些,那通常MCU的軟體等都會被統稱韌體。

又例如許多消費性電子產品(如機上盒、路由器)內的軟體升級,這時的軟體也常被泛稱為韌體,所以使用者會看到的名詞是韌體更新(算是一種泛稱),但是實際上確切到底是更新了哪些部分的軟體、更新的到底是屬於底層還是屬於上層的軟體,其實當然只有原廠負責相關工作的工程師才知道

以及 如果是在科技產業/企業公司的職缺名稱方面,即便是呼叫digitalWrite函數來應用以控制MCU(進而驅動其它硬體)的相關軟體工作(是否接觸更底層的真實定義上的韌體,就看工作性質而定),這些工作職缺通常也都被企業在人力銀行網站上 統稱為 韌體工程師 (畢竟是驅動MCU晶片功能的軟體,直覺上想起來仍是很直接會驅動硬體的軟體工作),

所以各位朋友會發現,有時候人們在這些名詞的使用上是會有混用情況的  (情況有點類似 微控制器Microcontroller 也常被稱作 微處理器Microprocessor,若要探究這兩者的差異細節,則可參考我之前撰寫的這篇文章去了解該兩者的詳細的定義和區別)。





其餘的內容會放在 下篇 繼續介紹(可直接點連結連入關看)。



嵌入式系統相關觀念教學文:

1.   現代計算機系統核心硬體常見平台的分類與簡介概述

2.   Arduino到底是什麼? MCU又是什麼?

3.   許多人對於8051 MCU的常見錯誤觀念闢除


--------------------


孫文良 (阿良的嵌入式系統技術學習區)

個人簡介: https://sites.google.com/view/wenliangsun/

【若需要嵌入式系統技術輔導課程 可來信洽談合作方式: iws6645@gmail.com,亦可先點擊參考這篇介紹文章

【阿良的韌體科普系列】「韌體」到底是什麼? 和軟體有什麼不同? 【上篇】

【若需要嵌入式系統技術輔導課程 可來信洽談合作方式: iws6645@gmail.com,亦可先參考這篇介紹文章

歡迎透過合法的方式分享此文內容,若要轉載/轉貼,請明確貼出此原始連結並標示作者基本資訊請勿抄襲及非法轉貼(例如擷取內文但並未註明出處)

說明: 

撰寫此系列文章的目的,主要是希望能讓初學者(甚至非本科系的朋友)能了解一些關於韌體的基本觀念,所以不會使用太艱澀的方式來描述 (盡量)。

(但是後來發現這些內容對有些初學者而言可能還是會有點艱澀,所以順便廣告一下,對於許多初學者來說,有些內容或許真的需要來上課才比較容易更清楚和容易吸收,若需要課程請洽最下方的email)。

某些人對於這些專業名詞的定義和觀念或許有些差異,在這文章中,我將以個人長期以來對於MCU(微控制器,也就是單晶片微電腦) 與 SoC(系統晶片)的 軟韌體程式開發經驗(包含non-OS無作業系統類型 和 OS based有作業系統類型)來進行分析和說明。

字有點多,請見諒,也請發揮耐心擁抱文字。

------


韌體(Firmware),既不是硬體,也不是開發性質較偏向純「軟」、較高階(註1)的那些 應用軟體 (廣泛來說,例如在執行於作業系統之上的APP、網頁、資料庫應用 等層面,都算應用軟體)。此外,韌體也並不是開發數位IC的時候所使用的硬體描述語言所撰寫的程式。

韌體 也是一種 軟體。在開發過程的最後階段,最終都是在經由編譯或組譯之後,經處理(例如燒錄)被放置在記憶儲存單元之中,等待讓CPU提取(fetch) 及 執行(execute) 的 數位碼 (也就是所謂的 機械碼,是二進制碼,由0和1所組成)


然而,既然 韌體(firmware) 也是一種 軟體(software),那為何又會有 韌體 這個名詞的存在呢?

簡單來說,韌體 是 屬於比較「硬」的 軟體,這是什麼意思呢?  有些朋友可能會有疑問,即便是上層的應用軟體(例如APP),其存在的目的,不也都是為了要驅動硬體來完成功能的嗎?  那麼,上層應用軟體 和 韌體 之間的 差異 又是什麼呢?

以我個人的經驗來說,韌體 就是: 「較貼近、較直接存取電腦硬體單元的軟體」


而「貼近電腦硬體」又是什麼意思呢?  

就是位於底層(越接近電腦硬體)、直接對硬體(CPU 及 各式周邊裝置的暫存器)進行操作和存取的軟體所在層次(或者說類型)。而不像是較上層的應用軟體那樣、中間經過很多層的軟體轉換及對應之後才能間接存取硬體資源。

而為何說是「貼近硬體呢? 所謂的」貼近硬體, 是有多貼近呢?

現代因為某些系統的軟韌體的層次多樣,一個規模較大的電腦系統的軟韌體可能會被分很多層次去分工進行開發,有時候其實際狀況也不是那麼容易就可輕易劃分。但簡單來說,越直接對硬體進行存取操作的層次就越是偏向接近韌體的範疇,包含到存取暫存器內容值的相關內容。


  • 註1: 在這邊先解釋一下在電腦系統內的一些用語,越上層越高階是指是越貼近人類(開發者)的技術範疇,越底層越低階指的是越接近電腦硬體(硬體包含: 處理器、周邊裝置、記憶單元 及 周邊相關的電子電路等等)。

所以請注意(再次強調),這裡指的 高階/低階 或者 上層/底,並不是指技術的難度高低,而是指 該技術層次 是否位於 較靠近人類的習慣和直覺(越高階或者說越上層) 還是 比較靠近電腦系統硬體(越低階或者說越底層,離人類習慣直覺認知越遠)。 

通常對於非硬體背景出身的人來說,底層技術的入門通常可能會較需要時間去體驗和學習 (包含要了解一些硬體觀念),如果是由具有實際開發經驗的人指導、幫助學習、給予方向,可大幅提觀念上的理解和學習速度 (這也是我開課的目的)。 


為了避免文章內容太多會導致大家看不下去,剩下的內容會放在 中篇下篇 ,歡迎點入連結繼續觀看下去。



嵌入式系統相關觀念教學文:

1.   現代計算機系統核心硬體常見平台的分類與簡介概述

2.   Arduino到底是什麼? MCU又是什麼?

3.   許多人對於8051 MCU的常見錯誤觀念闢除


--------------------


孫文良 (阿良的嵌入式系統技術學習區)

個人簡介: https://sites.google.com/view/wenliangsun/

【若需要嵌入式系統技術輔導課程 可來信洽談合作方式: iws6645@gmail.com,亦可先參考這篇介紹文章

2021年1月19日 星期二

【8051 MCU】關於外部中斷旗標(IEx)被觸發的條件探討──Intel MCS-51官方手冊、Bible原文書與AT89S51/AT89S52實際狀況之差異

歡迎透過合法的方式分享此文內容,若要轉載/轉貼,請明確貼出此原始連結並標示作者基本資訊請勿抄襲及非法轉貼(例如擷取內文但並未註明出處)

不論是Intel早期的MCS-51 PROGRAMMER'S GUIDE AND INSTRUCTION SET(如下圖),或者8051界的Bible原文書: The 8051 Microcontroller and Embedded Systems (2nd Edition)原文課本(作者為Mazidi, Muhammad Ali, Mazidi, Janice G., McKinlay, Rolin D.)內容中的P.326的Figure 11-4.及P.329的Figure 11-6.內文敘述都表示外部中斷旗標(flag)也就是IEx(x是0或1)是在偵測到外部輸入falling edge signal trigger 的時候才被set(設為1)。

(註: x為0或1)

Intel的MCS-51 PROGRAMMER'S GUIDE AND INSTRUCTION SET之對應內容


也就是如下圖狀況所示(按其原意並自行繪製):

Intel MCS-51手冊與8051原文書所述之中斷旗標觸發方式/機制


但是,從近代實際在課堂上常使用的8051 MCU款式AT89S51/AT89S52的Atmel AT89S51/AT89S52 datasheet裡面可看到,無論是選擇falling edge trigger或者low level trigger(藉由對ITx暫存器位元的寫入設定值來選擇)觸發,當這兩種條件之中的任一種條件達成時,都會使得外部中斷旗標(Flag)也就是IEx(x是0或1)被set(設為1),如下圖(圖片來源為Atmel AT89S51/AT89S52 datasheet)。


AT89S51/AT89S52的Atmel AT89S51/AT89S52 datasheet之對應內容


(註: 當然了,這幾年在許多大學的MCU或名稱為微處理機系統及介面技術的相關課程上,其教材都被改為Arduino的淺層使用,但是卻沒深入MCU的細節原理了,故相對沒辦法太紮實)


由上述內容可看出差異,或許是後來的8051(AT89S51/AT89S52等款式)被改良了。因為如果按照早期那樣的方式/機制(官方手冊與原文書所示),在希望使用low level trigger方式的情況下就只能使用中斷而無法藉由去輪詢(polling)旗標狀態的方式去偵測外部輸入到INTx腳位的low level signal,在開發使用上相對就沒有那麼的自由。


--------------------------

孫文良 (阿良的嵌入式系統技術學習區)

【若需要嵌入式系統技術輔導課程 可來信洽談合作方式: iws6645@gmail.com,亦可先點擊參考這篇介紹文章

2020年12月11日 星期五

【STM32】【ARM 】ARM Cortex-M3 CPU bit-banding功能機制講解,以STM32F103之GPIO範例程式為例

【若需要嵌入式系統技術輔導課程 可來信洽談合作方式: iws6645@gmail.com,亦可先點擊參考這篇介紹文章

歡迎透過合法的方式分享此文內容,若要轉載/轉貼,請明確貼出此原始連結並標示作者基本資訊請勿抄襲及非法轉貼(例如擷取內文但並未註明出處)

< 簡介 >

這篇文章以市面上很流行的俗稱STM32F103C8T6 MCU最小系統開發板隨附的簡易GPIO驅動範例程式為例,因為這是一個淺顯的應用範例,所以適合寫成文章分享。相信許多初學者都曾以此範例來測試板子以及開發環境,但是許多人可能對於內容細節的方面沒有較深入的探討及了解,這邊會針對一些重點部分的細節做些說明

(註: ARM Cortex-M3 CPU2004年就被推出了。而本文所講的ARM Cortex-M3 CPU basedSTM32F103這款MCU2007年推出,但至今現在市場上似乎還是供不應求)

STM32F103C8T6 MCU最小系統開發板

這個板子隨附的應用範例是個以MDK-ARM(KEILC)為開發環境的範例專案,我們這邊主要以編輯器將程式碼開起來並搭配官方硬體手冊資料來trace其流程和重點細節。專案裡面的主程式流程是屬於non-OS類的程式(沒有跑作業系統)

觀察main.c的main function不難看出其主要應用流程(目的/功能),該流程是要驅動/控制STM32 MCUGPIO,以驅動開發板上面的LED,達到一般肉眼可見的亮/滅閃爍的功能。

程式碼的註解是我加上去方便讀者觀看


雖然它這個範例main function的回傳值型態寫int,然後其實沒有return,這方面不太標準

這篇文章主要針對PCout()的內容原理進行詳細的追蹤與分析探討


< 主要內容探討 >

PCout()從表面上看起來是一支函式(function),但其實是個macro(巨集),內容在GPIOLIKE51.h這支檔案裡面,其主要內容為BIT_ADDR(GPIOC_ODR_Addr,n)


(: C語言之中,巨集和一般函式各有其特性,須看場合挑選合適的方式來應用。若以相同使用量的狀況下來比較兩者,則簡單來說,前者相對較省執行時間但是較耗費儲存空間;而後者相對較省儲存空間但較耗費執行時間。使用量越多則各自的特性所帶來的結果和差異也越顯著)

#define BIT_ADDR(addr, bitnum) MEM_ADDR(BITBAND(addr, bitnum))

#define MEM_ADDR(addr)  *((volatile unsigned long  *)(addr))

#define BITBAND(addr, bitnum) ((addr & 0xF0000000)+0x2000000+((addr &0xFFFFF)<<5)+(bitnum<<2))

(volatile unsigned long  *)(addr)是將addr整數數值轉型為位址(address),以利存取(定址)記憶體空間或周邊裝置的暫存器(這屬於memory-map IO的方式去存取周邊,後面會說明)。而PCout()的狀況來說,addr就是會被代入GPIOC的暫存器(register)address(位址)數值,也就是0x4001100C

--------------------------

補充: 關於volatile關鍵字

C語言中的volatile關鍵字用來提醒編譯器,避免編譯器過度最佳化的狀況在所修飾的變數上發生

我們用GPIO input應用當例子來說明,如果GPIO外接一個按鈕,這個按鈕被按下的時機是由user按壓按鈕的狀況而定。所以,如果我們上面談到的這指標((volatile unsigned long  *)(addr))指向放置GPIO input digital signal的暫存器的位址,也就是將addr這個欄位代入正確對應的暫存器的位址,而該暫存器的內容()會隨user對按鈕的按壓狀況而改變(從單一bit來看就是10,下面再進一步解釋),所以這指標((volatile unsigned long  *)(addr))須使用volatile關鍵字修飾

user對按鈕的按壓狀況而改變的狀況,以下面這個電路為例(截取自範例中的部分電路來說明),按鈕按下就是0(low level),沒按的就是1(high level)。當然可能有些按鈕的機械彈跳狀況須要透過軟體或硬體的方式去避免(debounce,因為不是這篇文章的重點,所以這部分就不在此贅述)

按鈕電路

再額外補充一個指標指向I/O周邊時可能會使用到volatile關鍵字的例子,特別是在嵌入式系統上面常見到的狀況。

ADC(Analog to Digital Converter)轉換由感測器輸出的類比訊號進而轉換為數位訊號(數位值)之後,依照現在許多ADC的設計,這個數位值通常會被硬體自動放置在某個暫存器(舉個別款MCU的例子,例如Arduino uno/nano/mini/fio等板子上面的Atmega328這顆同樣有內含ADCMCU的狀況,這個數位值就會被放在ADC Result Registers,因為是轉成10bits的數位值,所以因為一個byte長度的暫存器放不下,所以就放在兩個暫存器內,ADCH的和ADCL),而這個暫存器內的數位值就會因為感測器感測的環境變化而跟著改變),現在為了方便說明,我們假設這個暫存器只有一個,而我們宣告一個指標變數指向這個暫存器,那這個指標變數在宣告時通常也須要加上volatile關鍵字以防止編譯器做了過度的最佳化導致非預期的後果(告知編譯器,在程式裡面指定要讀取的時候就真的是須要從ADCregister(暫存器)去讀值,不可因優化而簡化掉)

所以addr被轉型為unsigned long的address(為了對硬體做存取),也須用volatile關鍵字修飾,以避免非預期的狀況發生

--------------------------

補充: 關於memory-map I/O port-mapped I/O

STM32F103 MCU內的ARM Cortex-M3 CPU是使用memory-map I/O的方式[4][5],簡單來說也就是CPU透過nativeload/store指令去存取記憶體(SRAM空間)與周邊裝置(GPIOUARTI2CSPIADC…等等,更嚴格精確來說就是存取這些周邊裝置的控制或讀取相關功能的暫存器),如同將這些周邊裝置的暫存器當成記憶體空間來存取。至今ARM Cortex-M系列CPU應該都是屬於使用memory-map I/O的方式去存取周邊(有沒有特殊的例外不清楚)

另一種出現在其它平台(x86)的方式為port-mapped I/O,可以讓I/O周邊和記憶體空間獨立區分開來,也就是表面上同一個address號碼,可以是存取記憶體空間的address,也可以是存取周邊裝置暫存器的address,雖然表面上是同一個address位址數字號碼,但是在兩邊是獨立不同的實體硬體空間。而既然要獨立區分兩種空間這種port-mapped I/O方式要使用特定的CPU指令去存取I/O周邊(而不是一般的load/store指令),而以CPU架構設計的角度,設計這些特定的CPU指令就要耗費相對的電晶體資源。

--------------------------


回到主題,多了一個'*'字號的 *((volatile unsigned long  *)(addr)) 的意思就是這個指標所指向的位址的硬體(記憶體或暫存器)的內容值(以這邊的例子來說就是GPIO暫存器的內容值)。多嘮叨補充一下,這內容值以實際硬體的角度來看,其實就是數位訊號。

所以綜上所述,如果有仔細理解上述內容的讀者應該可以得知為何我們在main function之中去寫PCout(13)=1就得以直接驅動GPIO輸出high level(邏輯1)的數位訊號。因為在上述巨集的實作方面,就已經讓PCout(13)=1直接對應存取GPIO之對應暫存器的內容值

#define BITBAND(addr, bitnum) ((addr & 0xF0000000)+0x2000000+((addr &0xFFFFF)<<5)+(bitnum<<2))這個BITBAND(addr, bitnum)這個macro的功能/目的就是要將addr和bitnum轉化對應到正確的暫存器位址並且可以atomic operation完成對暫存器的存取(後續會說明),可先參考這支GPIOLIKE51.h:

#define GPIOC_ODR_Addr    (GPIOC_BASE+12) //0x4001100C

我們可以從STSTM32F103x8 Datasheet[1]memory map以及RM0008 Reference manual[2]GPIO registers的說明內容得知,0x4001100C是這顆STM32 MCUGPIOCODR(Output Data Register)暫存器的位址,並且可在STM32F10x_StdPeriph_Driver之中的stm32f10x.h裡看到對應的GPIOC_BASEAPB2PERIPH_BASE#define值。

Ref:[1]

Ref:[2]

而一大串的((addr & 0xF0000000)+0x2000000+((addr &0xFFFFF)<<5)+(bitnum<<2))主要是為了能正確存取Bit-banding功能方面的alias region的位址,這邊先針對Bit-banding功能機制作些說明。

Bit-bandingSTM32F103 MCU內的ARM Cortex-M3 CPU的一種功能特性(ARM Cortex-M系列的其他款式CPU應該也有,詳情請參照對應的ARM官方手冊確認),當CPU(執行我們寫的程式碼)alias region之中的word做存取(STM32word長度是32bits),就會對應存取到bit-band regionSRAM記憶體空間 周邊裝置暫存器的某個對應的bit,如下ARM Cortex-M3 Technical Reference Manual官方手冊[3]的圖所示(這個圖是以存取SRAM空間為例)。而在這個STM32F103C8小板子的範例程式之中就是要存取GPIOC_ODR暫存器的bit13


Ref:[3]

STM32F103 MCU的規劃(搭配ARM Cortex-M3功能特性),在SRAMPeripheral的方面都有這種Bit-banding機制/功能各有1MBbit-band region範圍,如下方的ARM Cortex-M3 Technical Reference Manual[3]的System address map圖。而因為alias region的一個word對應bit-band region1bit,一個word長度是32bits,所以對應的存取設定區域也就是的alias region的長度範圍為32MB(SRAMPeripheral各有32MBalias region對應各自的1MBbit-band region)

(提醒:前述已有提到ARM Cortex-M系列CPU basedSTM32 MCU是以memory-map I/O式的方式去存取Peripheral周邊裝置)

Ref:[3]


在寫入的方面,對
alias regionword寫入0x01或者0xff(其實就是必須針對對應的wordbit0寫入1)都會讓bit-band region的對應bitset1,另外這個寫的過程其實會被轉換成atomic(操作過程不會被打斷)
read-modify-write operation
;而在讀取的方面,將會從alias region所讀到的wordbit0讀回所要讀取的bit-band regionbitstatus(1 or 0)

Bit-Banding機制/功能的優點就是讓CPU能透過使用一般的Load/Store指令即可完成bit的讀/寫,這和過往只能先透過執行read(load相關指令)、modify(通常是邏輯運算相關指令)、write(store相關指令)流程的一連串相關獨立指令來完成bit讀/寫的傳統方式不同。所以Bit-Banding機制/功能也有助於節省code size

另外官方手冊[2]也有提到CPU在進行bit-band operations時,除了特殊狀況之外,基本上是不會停頓(stall)

對於BITBAND這個macroARM官方的Cortex-M3 Technical Reference Manual[3]有直接給出公式如下,本文的後續內容也會針對這些公式內容的由來進行詳細解說

Ref:[3](紅色框起的是我認為命名不直覺的部分)

回頭來看我們範例程式內的macro,前面內容提過addr0x4001100C

關於#define BITBAND(addr, bitnum) ((addr & 0xF0000000)+0x2000000+((addr &0xFFFFF)<<5)+(bitnum<<2))之中的(addr & 0xF0000000):

0x4001100C(addr)0xF0000000AND運算的目的是為了取出/取得結果為0x40000000也就是peripheral的起始位址或稱peripheral base address(由上面官方手冊內的Ref:[1]memory map圖可得知)

接下來的+0x2000000(加上0x2000000)之目的就是為了得到我們peripheralalias regionstarting address,也就是公式中的bit_band_base(Cortex-M3 Technical Reference Manual官方手冊[3]裡面的內容: bit_band_base is the starting address of the alias region.),也就是0x42000000

ARM Cortex-M3官方手冊[3]這個公式裡面的bit_band_base我認為在命名的方面有些不直覺的問題(因為會讓人導致誤解以為是bit-band regionstarting address,但其實是alias regionstarting address)。所以我認為應該要將公式內的此項目名稱改叫作bit_band_alias_base或者alias_base才對,畢竟是alias regionstarting address!才剛想完,我就上網google搜尋了一下,在加拿大有間大學Ryerson University的電機與電腦工程系2019年開設的Embedded System Design課程[7]Lab 2: Exploring Cortex-M3 Features for Performance Efficiency講義內容[6]就真的在他們的講義內將bit_band_base改以Bit Band Alias Base Address表示,如下圖:

Ref:[6]


:其實0x2000000就是十進制的33,554,432,也就是32M(32*1024*1024)alias region的起始位址就是bit-band region起始位址加上32M之後的address

((addr &0xFFFFF)<<5)+(bitnum<<2)也就是bit_word_offset也就是(byte_offset x 32) + (bit_number × 4)。其中(addr &0xFFFFF)取出0x0001100C0x1100CGPIOC_ODR暫存器的offset位址偏移量,左移5位等於乘以32(公式中的*32),等於0x220180

(如果不想了解上面公式原理的讀者可直接參照公式,跳過這個註解): 為何要左移5(等同乘以32)?細心的讀者如果搭配上面內容的Ref:[3]的官方例圖來觀察就應該可以發現,因為每一個word32 bits也就是4bytes也就是會占掉4address號碼(每一個byte的資料會對應存放於一個address,這是電腦的基本rulebyte-addressable。暫存器和其位址的對應也是一樣),而alias region的一個word是對應到bit-band region的一個bit,換句話說,在bit-band region差了1bit就等同在alias region差了4address號碼的距離(1word)的位址距離。而如果是在bit-band region差了1byte(8bits)的位址距離,就等同在alias region差了32address號碼(8word)的位址距離(8*4=32),但這只能知道這個長度為32bitsGPIOC_ODR暫存器的位址(bit-band region)對應到alias region的一段空間的32word的開頭的位址(對應暫存器的32個位元,一個位元對應一個word)

但實際上我們所希望存取的暫存器的bit,是哪個word(其位於alias region的位址到底是哪個),就還要加上bitnum*4也就是bitnum<<2 (左移兩位),例如如果我們想存取暫存器的bit00*4=0,代表的就是該word就是從上述alias region的一段空間的32word(包含128個位址)的開頭的位址(對應暫存器的32個位元)的開頭(+0)的這個word去存取;如果是想存取暫存器的bit11*4=4,代表的就是該word就是從上述alias region的一段空間的32word(對應暫存器的32個位元)的開頭的位址去加上4(+4)的這個位址(這個word)去存取,所以到此也已經說明為何macro內容的最後要加上(bitnum<<2)。而在我們這個範例的例子中就是bitnum13,故bitnum<<2(乘以4)的結果就是52(十六進制的0x34)

(2020/12/13更正,原先我誤將13<<2的結果看成24,其實是十進制的52,也就是十六進制的0x34)

所以最後我們將公式內的各項結果相加: 0x42000000 + 0x220180 + 0x34 = 0x422201B4

這個0x422201B4就是GPIOC_ODR暫存器的bit13alias region所對應的word的位址

上面關於bit-banding的這部分比較複雜,初學者可能要多花點耐心才比較能看懂。如果想進一步閱讀關於Bit-banding功能機制(alias regionbit-band region)的官方說明資料,可參考ARM官方的Cortex-M3 Technical Reference Manual[3]或者STRM0008 Reference manual[2]3.3.2章節。或者如果有對上述內容不清楚的朋友,我的課程內容(未來預計將會陸續開設STM32 MCU應用開發實務基礎的相關課程)會有相關的引導。

另外,我手上的範例程式中的stm32f10x.h中的某些巨集的註解將alias regionbit-band region給寫反了,看日期得知這應該是2010年code

範例程式專案中的stm32f10x.h有錯誤的部分


< 結語 >

雖然這篇文章是用一個淺顯的應用範例(控制GPIO以驅動LED閃爍)來作為說明對象,寫這篇文章的用意有二: 

(一) 為協助初學者與有興趣了解相關專業內容的人

(二) 希望讓一些習慣看技術表面的族群不要只看到表面,雖然這只是個LED閃爍的範例,但內容包含的學問可不少,光是看了上面的細節內容我想就可以讓更多人理解,工程實務不是簡單的事情,不要以為驅動GPIO沒什麼。如果覺得簡單,通常是有以下兩個原因

(1)只看到表面功能,只看到東西功能會動即滿足,但沒有去思考這背後要作多少事情及其原理,才會有眼下的這個應用功能

(2)因為用的是現成的東西,有人幫你做好太多事情,如果都要自己從頭來,恐怕沒幾個人有能力在短時間內做好,因為這絕對不是call現成的APIOK的事

何況這文章的內容這還只是這範例專案中一個部分而已,事實上如果要細說細節真的講不完,例如booting flow、進入main()之前還有一系列的初始流程(如將stack初始化)、clock init、GPIO init等等,只是太多東西都是廠家在事先所做好的(前人的累積)。

我想還是希望能藉由這類文章,讓一些比較少親自動手或長年來基本上沒從事過開發的族群,特別像是多數的資深專任大學老師或者已經很久沒動手的公司高層大咖們了解實際真實的工程實務的難度和重要性。


如果因為對於這些內容的本質不夠深入了解,可能會有些誤解,例如誤以為什麼這些範例程式的寫法過時了。而其實基本上根本就沒有這個問題,原因如下:

1. 除了本文所探討的bit-banding方式,以及傳統的直接對GPIO_ODR暫存器做讀(read)-(modify)-(write)的存取之外,STM32F103 MCU存取GPIO_ODR暫存器確實也其它方式。例如去設定GPIOx_BSRR對應GPIOx_ODRbit set/clear(而另一個暫存器GPIOx_BRR只能做clear),但是也是只能一次寫32bits也就是一個word(設定GPIO_BSRRGPIO_BRR)去對應控制GPIOx_ODR的狀態(按照[2]針對GPIOx_BSRR的說明所述的:These bits are write-only and can be accessed in Word mode only)

上述這使用GPIOx_BSRR的例子,和本文所探討的bit-banding是不同的方式,而且bit-banding機制不是只有針對周邊裝置,還可以針對SRAM空間做存取,SRAM有什麼BSRR可用嗎?何況bit-banding本來就也是一種ARM Cortex-M3 CPU所提供的方式/機制,讓開發者可以獨立去set/clear registerSRAM的單一bit。這機制有它合適的應用場合,只要不是被官方公開宣稱其功能必須被完全取代的狀況下,機制/方法的選擇沒有什麼絕對的優劣好壞之分,只有開發者自己會不會用的問題,而沒有什麼過時不過時的問題,畢竟這顆MCU的硬體特性/功能提供的選擇就是如此(就是有這些方式),既然這個功能特性仍存在,那就不會失去探討的意義

如前面提到的,ARM Cortex-M3 CPU2004年就被推出了。而本文所講的ARM Cortex-M3 CPU basedSTM32F103這款MCU是在2007年被推出的,但至今現在市場上似乎還是供不應求。

另外,bit-banding功能機制在ARM Cortex-M4 CPU是個optional feature [8]。

2. 有用的知識就是有用(有核心重點知識/觀念上的通用性和可延伸性),例如C語言就是C語言,C語言已經被用了好幾十年了,C語言的指標也被用了好幾十年了,暫存器的觀念也好幾十年了,所以這和過時不過時有何相關如前所述,只有開發者自己會不會用的問題,而沒有什麼過時不過時的問題。

 

< 參考資料 >

Ref:

[1] STM32F103x8 STM32F103xB Datasheet - production data, https://www.st.com/resource/en/datasheet/cd00161566.pdf

[2] ST RM0008 Reference manual - STM32F101xx, STM32F102xx, STM32F103xx, STM32F105xx and STM32F107xx advanced Arm®-based 32-bit MCUs, https://www.st.com/resource/en/reference_manual/cd00171190-stm32f101xx-stm32f102xx-stm32f103xx-stm32f105xx-and-stm32f107xx-advanced-arm-based-32-bit-mcus-stmicroelectronics.pdf

[3] ARM Cortex-M3 Technical Reference Manual, https://developer.arm.com/documentation/ddi0337/h/programmers-model/bit-banding?fbclid=IwAR1OuCvOHza3oUnJK68PiIX9ytKBJhsTwatgI6Jg_zF6D9GfMZVvTmesI5o

[4] Memory-mapped I/O, https://en.wikipedia.org/wiki/Memory-mapped_I/O

[5] Lecture 5: Memory Mapped I/O, https://www.youtube.com/watch?v=aT5XMOrid7Y

[6] Ryerson University Dept. of Electrical and Computer Engineering - Embedded System Design course - Lab 2: Exploring Cortex-M3 Features for Performance Efficiency, https://www.ee.ryerson.ca/~courses/coe718/labs/Lab2.pdf

[7] Ryerson University Dept. of Electrical and Computer Engineering - Embedded System Design course, https://www.ee.ryerson.ca/~courses/coe718/

[8] ARM Cortex-M4 Processor Technical Reference Manual, https://developer.arm.com/documentation/100166/0001


--------------------------

孫文良 (阿良的嵌入式系統技術學習區)

【若需要嵌入式系統技術輔導課程 可來信洽談合作方式: iws6645@gmail.com,亦可先點擊參考這篇介紹文章