2013年3月19日 星期二

CPU市場鐵律:量變引發質變

之前看了對於ARM及X86之爭的評論。有一句話我非常認同:量變引發質變。
意思是當某種型式CPU在市場上佔有數量優勢時,就會形成絶對性優勢。
這和CPU本身品質無關,只因硬體相容性可以讓軟體好好發展。
而要佔有數量,價格不用說一定要夠低,另一種是開放性,非獨家生產。
PC市場因壟斷較看不出來,但MCU卻是很明顯。
8051是8位元MCU的霸主,因為大家都可以做硬體。
16位元來不及有霸主就直接進入32位元MCU時代。
而32位元MCU的霸主正在形成。
硬體統一完畢,再來會變成軟體開始統一。
結果也會有類似的現象,會有統一的軟體架構出現。
又走"量變引發質變"這條路,軟體架構的品質不是重點,而是使用量。

不管軟硬體,使用者習慣才是主導,而市場往使用者多的方向走。


2013年3月16日 星期六

Cortex M4推展不如預期

雖然各廠商將推展主力移往CM4,但在推展上並不是如此順利。
主因是,要浮點運算做什麼?
往8位元MCU轉來的工程師,對於能在32位元上開發程式已是很開心,要玩的一堆,還沒有意識到浮點運算要如何用,那又何必多花錢。
而從PC轉來的工程師對於CM4的執行效能根本看不上眼,去玩Cortex-A8還比較實在,因為Cortex-A8也不貴。
這樣的局面造成CM4不上不下的樣子。
還有各廠商自行發展的32位元處理器,其實Bee也不太看好。

現在市場已經轉成由軟體來主導,要換MCU談何容易。連軟體工具都要換新,那來那個時間。
至少CM3還可以降為CM0或升級為CM4,光是這樣就可以吃很久,那還有機會看別的MCU。
萬一有什麼大的應用,轉到Cortex-A8也是不差的選擇。

MCU現在只是一個骨架系統,再來需求會轉往拼裝系統的速度。
再來就要看工程師如何快速拼裝系統,拼裝快硬體價格低才是重點。


2013年3月14日 星期四

簡單多工於Cortex-M3上最佳化

原程式:


void main(void)


{


    InitSystem();


    INIT_DEVICE();


    while (1)


    {


        switch (Task_State[FuncID])


        {


        case TASK_RUNNING :


            TaskFunc[FuncID]();


            break;


        case TASK_SKIP :


            if ( Task_Delay_Count[FuncID] )


            {


                Task_Delay_Count[FuncID]--;


                if (! Task_Delay_Count[FuncID]) WakeUp(FuncID);


            }


            break;


        default:


            break;


        }


        if ( ++FuncID >= TASK_NUM ) FuncID = 0;


    }


}


 


新程式:


void main(void)


{


    InitSystem();


    INIT_DEVICE();


    while (1)


    {


        register unsigned int   temp_id;


        register unsigned int   temp_delay;


 


        temp_id = FuncID;


        switch (Task_State[temp_id])


        {


        case TASK_RUNNING :


            TaskFunc[temp_id]();


            break;


        case TASK_SKIP :


            temp_delay = Task_Delay_Count[temp_id];


            if ( temp_delay )


            {


                temp_delay--;


                Task_Delay_Count[temp_id] = temp_delay;


                if (! temp_delay) WakeUp(temp_id);


            }


            break;


        default:


            break;


        }


        if ( ++temp_id >= TASK_NUM ) temp_id = 0;


        FuncID = temp_id;


    }


}


因核心程式執行未檢討有無可以改善空間,因此段程式決定各工作間的掃描率,若是可以改善將增加工作效率。


分析原本的程式,發現有多一些記憶體存取動作。


於是將記憶體動作簡化,中間使用暫存器的方式應可以加速。


先將FuncID這個變數用暫存器變數取出,編出來的程式少了一個指令。


又將Task_Delay_Count[]也用暫存器變數,有少一點組合語言指令。


主要廻圈原需要16個指令,現在只剩下12個指令,少了四個指令。


16個指令需要23Clock執行時間,現在12個指令只要19Clock執行時間。


用示波器實測,Skip 1000次需時5.02ms,原先為6.80ms,確實加速執行時間。


 


不過Cortex M3用暫存器變數直接使用int會比shortchar來得有效率。中間會少了正負號擴張指令,所以速度會更快。


 


2013年3月6日 星期三

Cortex-M4開啟新MCU戰場

CM3因為ST已是獨大,所以各廠商就將重心移往CM4


直到最近TI推展CM4時,才發現價格已經壓到US$3以下。


有浮點運算器的MCU是這樣的價格,等於ADC/DAC不用什麼錢。


其他可以用於浮點運算的應用可以普及。


這樣的轉變,離上次Bee認為32位元MCU變革,只過了剛好一年。


32位元浮點運算,已不是8位元MCU可以做的事。


再下來會大量使用的演算法如:


矩陣運算、傅利葉轉換等等,都會變成非常容易達成。


這樣子MCU程式和PC程式之間差異就更小了。


看來只剩作業系統相容度的問題了。


另一個是使用浮點運算時,可能有效能不足需稍長的時間。


使用作業系統將長時間運算程式做為低優先權的運算,這樣的應用會增多。


RTOSCM4的出現將會推展的更快。