2010年2月18日 星期四

8051簡單多工5:使用上的調整及範例

編譯環境差異:
目前在Keil c及SDCC下編譯皆有過。但Bee沒有使用SDCC實際去執行過。不過SDCC編出來的組合語言看來沒有問題,應是可以用的。

核心加速:
在看編出來的組合語言,可以發現Bee使用除餘(%)來做FuncID調整會動用到除法,使執行效率下降。
比較好的寫法是將FuncID整個展開,這樣也不用去計算它。
以使用三個Task為例,將while改寫為:
    while (1)
    {
        TaskID = 0;
        EA = 0;
        Current_Func = TaskFunc[TaskID];
        EA = 1;
        Current_Func();
        TaskID++;
        EA = 0;
        Current_Func = TaskFunc[TaskID];
        EA = 1;
        Current_Func();
        TaskID++;
        EA = 0;
        Current_Func = TaskFunc[TaskID];
        EA = 1;
        Current_Func();
    }
這樣執行起來更有效率。

另一個例子:
這是Key Scan範例
// Key Scan function
#define KEY_SCAN_DELAY        1  // 1ms
void key_scan2(void);
void key_scan3(void);
void key_scan4(void);
void key_Encode(void);
unsigned char KeyScan[5]; // unknow why KeyScan[0] can't be used? just skip

void key_scan1(void)
{
    KeyScan[4] = P1;
    P1 = ~(1<<0)<<4 | 0x0F;
    Task_Delay_Next(key_scan2);
    Task_Delay_Ms(KEY_SCAN_DELAY);
}

void key_scan2(void)
{
    KeyScan[1] = P1;
    P1 = ~(1<<1)<<4 | 0x0F;
    Task_Delay_Next(key_scan3);
    Task_Delay_Ms(KEY_SCAN_DELAY);
}

void key_scan3(void)
{
    KeyScan[2] = P1;
    P1 = ~(1<<2)<<4 | 0x0F;
    Task_Delay_Next(key_scan4);
    Task_Delay_Ms(KEY_SCAN_DELAY);
}

void key_scan4(void)
{
    KeyScan[3] = P1;
    P1 = ~(1<<3)<<4 | 0x0F;
    Task_Set_Next(key_Encode);
}

// Encode Key code
void key_Encode(void)
{
    // do some thing here
    Task_Delay_Next(key_scan1);
    Task_Delay_Ms(KEY_SCAN_DELAY);
}
// Key Scan function end

比較一下使用uCOS的寫法
void key_scan(void)
{
    while(1)
    {
        KeyScan[4] = P1;
        P1 = ~(1<<0)<<4 | 0x0F;
        OSTimeDly(10);
        KeyScan[1] = P1;
        P1 = ~(1<<1)<<4 | 0x0F;
        OSTimeDly(10);
        KeyScan[2] = P1;
        P1 = ~(1<<2)<<4 | 0x0F;
        OSTimeDly(10);
        KeyScan[3] = P1;
        P1 = ~(1<<3)<<4 | 0x0F;
        // do something here
        OSTimeDly(10);
    }
}

可以發現這個簡單多工是以狀態機的方式下去寫,就是以一個狀態的函式再跳到另一個狀態的函式的寫法。
而uCOS在執行OSTimeDly()之後可以再從它的下一行執行下去。這個是比較容易理解的寫法。
不過8051的資源不多,Bee才會自創多工核心。


沒有留言:

張貼留言