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來得有效率。中間會少了正負號擴張指令,所以速度會更快。


 


沒有留言:

張貼留言