原程式:
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個指令需要23個Clock執行時間,現在12個指令只要19個Clock執行時間。
用示波器實測,Skip 1000次需時5.02ms,原先為6.80ms,確實加速執行時間。
不過Cortex M3用暫存器變數直接使用int會比short及char來得有效率。中間會少了正負號擴張指令,所以速度會更快。
沒有留言:
張貼留言