==============================================================================
因為程式碼貼在自己網頁上,縮排會通通不見,GitHub又太難不會用,所以就貼在 pastebin 這個網站
正確的話,按下 Blue SW(PA0) 會使 紅綠 LED 交替切換
因為高階單晶片功能和保留的彈性都非常多,寫個簡單的跑馬燈就要做一大堆初始化和環境設定,入門門檻有點高,現在總算終於把環境建起來了,接來就是要搞懂 ARM Cortex 的架構和 CMSIS==(Cortex標準函式庫)
==============================================================================
這讓我想到當初學OpenCV的時候,不像8051一樣有很多解說詳細的入門中文書,OpenCV資料很多,但是都在網路上很零散,2個星期才成功跑出第一個show圖程式(還包含清明假期,回家掃墓前後都是在做這件事)用了很長的時間才建立對OpenCV的知識體系。後來發現資工系在教程式設計都會講點編譯、連結、function library 在 IDE 中設定的東西,原來自己搞半天的東西,別人在上課就有教了,明明什麼都沒做,挫折卻一下子又大了一點。
現在學ARM,一開始發現我連 linux 入門的硬體都有問題,因為PC上的CPU不支援VT技術。有人跟我說「學會linux最快的方法就是裝起來,逼自己每天用」,可是我要做的事情實在太多了,加上這學期每門課都是寫程式作業的,電腦又只有一台,暫時冒不起把穩定開發環境砍掉重建的風險,所以現階段只好把Cortex-M4 當作大顆8051來學,先做一些不需要作業系統的周邊操作。
先抓 ST 官方範例(STM32F4xx_DSP_StdPeriph_Lib_V1.3.0)來改,找一個純秀圖最簡單的範例,燒一兩次進去發現都沒反應,然後就翻進 source code來看,疑似 pin map 不對,查一下果然是!原來這些官方範例不是寫給 STM32F429I-DISCO 用的,然後就自己改阿改,改好了又發現還是不行?只好再去看出廠就有的Demo 程式原始碼,因為這是真的在同一塊板子上 run 過保證可以動的 code,發現疑似用了 FreeRTOS ,LCD 初始化的地方和上一個不會動的官方範例有些地方很像,有些地方又不一樣。這又跟當初學 OpenCV 時一樣,每一份資料都有同中有異,異中有同,明明就只是在學別人做好的工具而已,怎麼比做研究更像做研究,還是說,其實我從來就沒做過研究?
==============================================================================
雖然說在 STM32 上面有現成官方 RTOS 範例可以看,但要看懂這些之前,我還得先搞清楚整個 Cortex-M4\M3 的整個硬體架構和周邊操作方式,這樣實作會跟不上作業系統的理論課進度,達不到我原先讓兩者相輔相成的目的。所以先退求其次,搞懂8051上的作業系統,因為這畢竟還是我最熟悉的硬體架構,其中以RTX51中文資料最多,ARM Keil 官網上面寫的資料也蠻清楚的,所以大概會先把STM32放在抽屜一陣子,等我透過8051練功,更了解作業系統原理之後再回來。
雖然以前修過作業系統,但是是60分混過的,為了 embeddem linux 我就再到資工系去上一次。我發現不管是老師或教科書,都以一種「電腦天生就有作業系統」的角度在講課,對我這種習慣寫 8bit 單晶片,都用人工設定 ISR 或其他技巧管理所有運算資源的人來說,非常~非常~不能適應這種觀點。如果 Process1 被 Process2 中斷了,那一定是 Process2 的 priority 比較高,一定是 Process2 做完才會輪到 Process1 從中斷處繼續完成;但是初階入門的作業系統,竟然教我們 Process1 與 Process2 在結束前可以多次交替切換,看似平行的執行。除非在編譯期就將兩者程式碼交錯,否則我實在想不出來這樣的程式要怎麼寫?也想不出來為什麼要這樣寫?幸好在 Keil 官網發現這個網頁 http://www.keil.com/rl-arm/rtx_rtosadv.asp ,雖然還是沒有完全解答,但至少有種「我的疑惑不會沒人懂」的感覺。
==============================================================================
弄好久終於把一些要備份的程式碼上傳到 Github,不過當我要上傳8051Project 的時候很容易回報錯誤或直接當掉,成功機率很低,看來這個社群對8051開發者不太友善啊~
==============================================================================
最近這陣子常跑 3dWoo,發現雖然很多大陸的8051書籍都有講到 RTX,不過只要講到 RTX 的地方幾乎都一樣,感覺都是不知道從哪個地方抄來的。回來照著做之後,發現大家都抄錯(或可能是太老舊,Keil 已經把RTX改版了?),還是原廠網站(http://www.keil.com/support/man/docs/tr51/tr51_using.htm)寫的正確。
沒有main( ),_task_0 優先被執行,_task_0 會用API(或system call??) create 出 _task_1~3,最後 _task_0 把自己 delete 掉,整個系統就讓 _task_1~3 去跑。每個 task 就是一個以前寫成中斷的 function,但是這次不再寫中斷,讓 OS 自己去安排順序和時間,第一次把恐龍書中的理論實作出來,好有成就感啊~
==============================================================================
因為昨天安裝的 RTX51-Tiny 不支援多優先等級,對重要的任務無法保證 real-time,有支援的 RTX51-FULL 又已經被 Keil 下架,網路上沒什麼學習資源可用,就算好不容易載到檔案了也裝不起來,所以只好另尋當下流行的 uC/OS-II。
繼 RTX51-FULL 的失敗後,又弄了一整天,靠著這位(www.mcu001.com)對岸教授寫的書和移植到 STC 上的 uVision 專案範例,我又成功安裝另一個 RTOS 在 8051 上了,看來離 ARM embedded OS 又更近一點了。
==============================================================================
九個月過去了,這段時間忙於好多事情,學C#、教8051、做了兩個Pattern Recognition專題、參加CVGIP、參加盛群盃,什麼都有,就是沒有碰Embedded OS。加上這段時間,手上多了盛群&新唐的Cortex-M實驗版,而且盛群的版子還附彩色LCD,所以我把stm32f429 discovery賣掉了。