好吧...要做就要作徹底一點---直接用組合語言改寫此一一階濾波副程式。
至於實際真正的找一個應用結果,改天再寫吧!
用組合語言寫?大概就剩下我們這些LKK 的人會去想寫了吧,
人家年輕人就是高級的菁英份子,他們都很會算,"幹嘛去浪費這種時間?!"
"我還不如利用這個時間去結交一些『有力人士』...或找好關係,請大陸人寫就好了!"
"真笨~浪費這種精神,怎麼可以賺到大錢呢?!"
是啊...您真的就比較聰明,我們不是菁英份子,我們就比較笨?!
您們只要動動嘴吧就好了...是不是您們在家裡也是像工作上一樣:動動嘴吧就好了?!
只要動動嘴吧~小孩子就會乖乖聽話?!您老婆就會把您服侍的服服貼貼的呢?!
道理是一樣的啦...所以,過去有些人就跟我說過:如果一個人他在工作上的表現如何?!
大概我們也可以推論到他的家庭生活也是大概什麼態度?!您自己想一想~是不是有點道理?!
----
好吧,我們就來看將程式改寫成組合語言之後的結果吧!
圖一
從圖上我們可以發現改用組合語言改寫後...順便把此一副程式直接獨立出來成一單一函數庫,
(左邊那個LAGFILTER.A51...喔?!怎麼把程式改寫成組語?還有怎麼在Keil C 裡套用組語?!
您也不用留言來問我了...因為我以前也沒問過人,我也是自己反覆做實驗Try 出來的!)
我們可以發現:副程式函數只剩下 33H ( 51 Bytes)...
這樣子,會更容易的整合到許多小容量的MCU 應用中了。
也不一定是8051 啊!只要您原理懂,懂得推導數學運算原理的話,移植到任何一種MCU 都可以的。
要不然原來呼叫組譯器的程式庫的話。動不動就得要 1.5 KBytes 的函數庫當然就得買大容量的MCU。
有誰會受得了...重要的是:這個函數也只不過只作一件運算式而已,何必要浪費這麼多程式容量呢?!
但是又很討厭,這一類的副程式又是常常會用到,尤其是有帶那一種A/D 的MCU。
這一類的MCU 也常常支援2K ~4K ...頂多8 K 的程式容量而已,您光一個副程式就佔去這麼多?
有誰受得了...也不要說您是那一種號稱多核心的FxxA 也沒啥用...寫韌體程式就是如此!
搞大容量MCU 賣就不一定比較好賣...但搞小容量的,您最好還是找到功力好一點的工程師吧!
(PS:像是FxxA 或Microchip 的PIC...都是那種所謂14 或16 bit 指令集MCU,
那應該對於這種程式容量的限制是更斤斤計較了吧!...)
好吧...我們再來看改過之後的程式效能:
(圖二)
程式一開始的時間點是一樣的:0.10714555 Sec
(圖三)
程式運算後的時間點為:0.10714816 Sec ...從原來的 4.25 uSec~再縮短為 2.61 uSec。
為原來呼叫程式庫作法的30.9 uSec 之 11.84 倍了----已經整整相差一個Order 了。
我們再來看程式執行結果:這回我們就反過來看負的方向 :新讀入值為 20
(圖四)
我們當然可以發現他是往 20 Volts 方向遞減的。
(圖五)
兩者之間都是相差 10 Volts 的方式套用此一副程式,所以跟上回那個 40 Volts 的結果是一樣的。
一樣在 150 與170 次迭代之後,就可以求得近似值了。驗證完畢!
程式不管是對於新值增加或減少情況,都可以套用的。--自己寫副程式就得考慮這一個因素!
-----------------------------------
當然啊...對於越有名的組譯器,他所能支援的函數庫就越多啊。
所以像這一種自然對數的運算式,Keil C 當然也有支援啊,
那我們來看如果我們直接套用這一組數學函數庫的話,他的結果如何?!
下圖是 Keil C 使用說明書的範例:(您是不是一開始就想到這一種作法?!)
(圖六)
您看,也是多簡單啊...那事實上真的有那麼簡單嗎?!...
我們加入程式組譯後的結果如何?
(圖七)
我們發現:他本來就是一種浮點運算的數學函數啊,所以程式變成浮點運算也不意外。
(圖八)
只是很好笑的是:他不但增加了基本副程式庫之外,他還多掛了一組exp() 函數庫:
程式容量還不小耶:9AH....剛好可以讓我們多寫三套副程式!哈~哈~
再加上原來從 106H -->682 H (57CH) ----剛好多增加近 1.6KBytes...
如果您是用那種2K Bytes MCU ...剛好Initialize 之後,呼叫此函數之後,程式就爆了!
難怪大家就只有使用那一種讀十次,然後除以十的平均作法作法!...程式好像小一點吧!
下回我Show 那個應用時,我原本也是用這種方法,但就是有發生一些問題現象,
等下回再說明吧!
(PS:因為FxxA 或是Microchip PIC 那種長指令的MCU 來說,他們就比較不會賣大容量的MCU ,
因為指令長度的關係...程式容量越大,他們與這種8051 一樣的容量的MCU的價差就越大了!
因為程式容量面積比人家大(他們的程式容量是用Word 計算的!...
至少也會大1.5倍吧!所以他們主力產品都是8K以下的!越大的容量與8051 的相差值就越大了<
當然啊...這一種MCU 的特色也沒辦法直接支援大容量的---他們是要切BANK 的啊!
還有一點就是:因為這些長指令的MCU (RISC)也比較少支援乘法或是複雜指令,
所以,如果套副程式的函數庫來說:他們可能比KEIL C這一種程式庫還要長很多!)
--------------------------
說實在的...如果您寫韌體程式,喜歡套用組譯器的函數庫,沒有說您的作法不對。
您高興就好,如果您老闆更爽的話,那更好。皆大歡喜!
但我要說的是:不只是社會的貧富差距趨勢是往兩極化走,連科技界也是的。
尤其是單晶片MCU 這個系統應用產品,我們可以看到:您要嘛就用那種 32 bits MCU ,
大大的容量讓您好好的塞個Embedded System ,讓您的程式寫到爆肝。
要不然,您就得乖乖買那一種程式容量小小的只有幾K 的那一種MCU 。
尤其是國內那些MCU IC 設計公司最喜歡搞的...(其實,開這個頭是 microchip 的PIC)。
好了啊...現在問題來了啊...我們寫一些小程式又不能老是寫那一種純I/O ,
跑個左右跑的LED 跑馬燈...現在要做的東西,也得要講究一下所謂機電整合啊,
或是比較有水準的東西,尤其是現在許多學術論文都跟您講那麼多理論了,
結果:您還是要用十根手指頭硬去寫這個東西...老闆又擺明了只能用那個小小的MCU 。
那您說該怎麼辦?! ...這下好了,滿街都是一大堆會寫韌體程式的人,不管是念那個科系的,
職訓局上一上就出來寫程式了,用C語言寫,就拼命的套用函數程式庫...
大家都會說印度人很會寫程式,...我們也知道印度人的數學很好。
但總覺得這兩者之間到底有什麼關係?!
老闆不懂...連政府官員也不懂,那您說我們國內如何發展軟體工業呢?!
有些學校老師在教工程數學時,也沒有要求學生,或是懂得這些之間的道理!
那只好們大家就是一樣的喜歡用十根手指頭...1.2.3.4....一上機一路往下寫。
容量不夠?!要嘛就再做大容量的MCU ,不好賣?!(成本貴)...那乾脆自己寫應用產品算了。
(前兩天有位朋友送我一台MP3 播放器,號稱是新竹某IC 設計公司自己作的,
自己做了五萬台出來賣...賣到現在賣了四萬台,...模具回本了,但又不好作~就又收了!
但純賣IC 又很難作~太多人搞了,大家又殺價,您知道嗎~現在一棵MP3 IC 剩下多少錢?!
答案是 :4.5 RMB ...折合台幣不到 20 元 ,如果套上面的那個五萬台...哈~哈~剛好一百萬元
還不夠付光罩費。....您也不要意外,連現在大M也都有作完整系統應用產品的計畫..)
所以,大家不要笑...我們都會笑說:只有傳統產業才有所謂的中小企業,那一種小小幾個人的小公司。
如果,照這種趨勢往下走的話,不用幾年,這種搞IC 設計或是所謂高科技業,也要準備轉型成這一種
小小幾個人的中小企業了。否則,您要怎麼玩?! ...
所以啦...如果您已經不得已,非得要用這種小小的容量的MCU 時,您還是多在數學基礎多下點功夫。
因為程式要長大很容易,但是要縮小是很難、很艱鉅的工作。
只要您能把您常用的副程式或函數寫得很小~很有效率----這一點是永遠不會錯的道理!
-----------------------------
PS :順便補充一下:您覺得我在提這一件所謂數學推導延伸的觀念只是單純的系統應用觀念嗎?!
您想一想:現在IC 設計的 EDA Tools 這麼方便了 ....您說:一樣的一個應用函數庫,
您用了 1.5 K Bytes 搞了一個副程式,而人家是用 50 Bytes !
您說:當這一個功能要轉換成IC 硬體回路時,您覺得哪一韌體程式比較有機會轉成為硬體加速器呢?!
那您覺得呢?!到底是系統應用引導IC 設計觀念呢?!還是彼此之間還是有一些某種關係存在呢?!
一樣的道理...如果您是搞IC 設計的,也是用那個VHDL 或是Verilog 寫程式,也是一樣,
用十根手指頭設計IC 的話...講難聽一點,您也沒比較厲害,還比我們搞系統應用的還可憐,
因為我們可以買大一點容量的MCU...但您的IC 可能大到貴得沒人願意買了!是不是?!
所以,不管您是做哪一種設計?!只要是學理工科的~人家學校都教您工程數學是沒有錯的!
您說:對不對啊?!
( Eric 老師,您說呢?!)
--------------