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);
}
}
}