實現自己的小的OS

1. 介紹:

實現了一款在MCU(LPC1768)中運行的OS,此OS實現了硬實時和軟實時。

硬實時:當tick到時時立即執行,此任務一定要是短小的,運行時間不能超過tick間隔時間。

軟實時:當tick到時時把可以執行的標誌設置,程序什麼時候執行,在主循環中決定,主循環中會做一些其他的事情。

 

2. 實現概要:

1)基本結構

定義一個 任務結構體

typedef struct {
    void* (*pTask)(void* para);  //任務函數
    void* para;
    unsigned int Delay;            //延時多長時間執行 [ Delay參數是決定之不執行任務的關鍵,當Delay=0時,任務執行 ]
    unsigned int Period;           //執行週期
    unsigned char RunMe;           //是否立即執行
}sTask;

 

同時定義硬實時和軟實時倉庫

static sTask sch_tasks[SCH_MAX_TASKS];						        //任務數組
static sTask sch_hard_tasks[SCH_MAX_HARD_TASKS];       			//硬實時任務數組

 

 

2)初始化

在初始化函數中初始化一個tick,選用 timer0,定時週期10ms

void sch_init(void)
{
    // 初始化sch_tasks和sch_hard_tasks
    // 初始化定時器0,定時週期10ms,設置定時器的執行函數
}

 

定時器執行函數邏輯如下:

1. 輪訓硬實時數組,當 Delay == 0,則執行任務,並且Delay = Period,當 Delay != 0,則 Delay -= 1

2. 輪訓軟實時數組,當 Delay == 0,則設置RunMe = 1,並且Delay = Period,當 Delay != 0,則 Delay -= 1

 

3)線程創建

線程結構體:

typedef struct __st_THREAD_
{
    ///線程句柄
    pthread_t     handle;
    ///線程函數
    THREAD_METHOD function;
    ///線程函數的參數
    void*         para;
}* PTHREAD, THREAD;

 

創建函數:

int PTHREAD_CREATE(pthread_t* tidp,const pthread_attr_t *restrict_attr,void*(*start_rtn)(void*),void * arg, const int PERIOD)

線程創建的時候,根據PERIOD的正負決定是硬實時還是軟實時,負數標識硬實時

if(PERIOD >= 0)

{

        return sch_add_task(start_rtn, arg, 0, PERIOD);

}

else

{

        return sch_add_hard_task(start_rtn, arg, 0, -PERIOD);

}

 

硬實時和軟實時只是任務數量的不同,

創建的核心思路就是把任務要執行的函數,函數中的參數,函數執行的週期等信息傳遞給結構體。

 

4)主函數中進行軟實時函數的執行

main() {
__main_LOOP:

    //線程執行
    PTHREAD_RUN();
    //.......

    goto __main_LOOP;
}

PTHREAD_RUN 函數中實現軟實時的函數的調用,RunMe標識要調用多少次。

unsigned char index;

for(index = 0; index < SCH_MAX_TASKS; index++){
    if((sch_tasks[index].RunMe > 0) && (sch_tasks[index].pTask != 0x0000)){
        (*sch_tasks[index].pTask)(sch_tasks[index].para);
        sch_tasks[index].RunMe-=1;
        if(sch_tasks[index].Period == 0) {
            sch_delete_task(index);
        }
    }
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章