uC OS II原始碼分析(二)

2021-09-20 15:15:19 字數 4586 閱讀 7569

在真正開始分析源**前,先來看使用uc/os-ii的三個例子

1)使用訊號量

#define  task_stk_size                 512       /* 每個任務堆疊的大小(以字計算)*/

#define  n_tasks                        10       /* 任務數*/

os_stk        taskstk[n_tasks][task_stk_size];        /*任務堆疊*/

os_stk        taskstartstk[task_stk_size];            //開始任務的堆疊    

char          taskdata[n_tasks];                      /*傳給每個任務的資料*/

os_event     *randomsem;                            //互斥型訊號量

void  main (void)

void  taskstart (void *pdata)

}

osctxswctr = 0;                                    /* 切換次數計數器清零*/

ostimedlyhmsm(0, 0, 1, 0);                         /*掛起秒,讓給其他任務執行*/}}

static  void  taskstartcreatetasks (void)

}

void  task (void *pdata)

} 2)使用訊息郵箱

#define          task_stk_size     512               

#define          task_start_id       0                /* 任務id*/

#define          task_clk_id         1

#define          task_1_id           2

#define          task_2_id           3

#define          task_3_id           4

#define          task_4_id           5

#define          task_5_id           6

#define          task_start_prio    10                /* 任務優先順序*/

#define          task_clk_prio      11

#define          task_1_prio        12

#define          task_2_prio        13

#define          task_3_prio        14

#define          task_4_prio        15

#define          task_5_prio        16

os_stk        taskstartstk[task_stk_size];            

os_stk        taskclkstk[task_stk_size];             

os_stk        task1stk[task_stk_size];                

os_stk        task2stk[task_stk_size];                

os_stk        task3stk[task_stk_size];               

os_stk        task4stk[task_stk_size];              

os_stk        task5stk[task_stk_size];               

os_event     *ackmbox;                                /* 任務和使用的訊息郵箱*/

os_event     *txmbox;

void main (void)

void  taskstart (void *pdata)

}

osctxswctr = 0;                                    

ostimedly(os_ticks_per_sec);                      }}

void  task1 (void *pdata)

}

ostimedlyhmsm(0, 0, 0, 100);                       /* 掛起ms*/}}

void  task4 (void *data)

}

}

void  task5 (void *data)

} 執行結果:

3)使用訊息佇列

#define          task_stk_size     512               

#define          task_start_id       0               

#define          task_clk_id         1

#define          task_1_id           2

#define          task_2_id           3

#define          task_3_id           4

#define          task_4_id           5

#define          task_5_id           6

#define          task_start_prio    10               

#define          task_clk_prio      11

#define          task_1_prio        12

#define          task_2_prio        13

#define          task_3_prio        14

#define          task_4_prio        15

#define          task_5_prio        16

#define          msg_queue_size     20                /* 訊息佇列大小*/

typedef struct  task_user_data;

os_stk          taskstartstk[task_stk_size];         

os_stk          taskclkstk[task_stk_size];            

os_stk          task1stk[task_stk_size];              

os_stk          task2stk[task_stk_size];            

os_stk          task3stk[task_stk_size];             

os_stk          task4stk[task_stk_size];            

os_stk          task5stk[task_stk_size];             

task_user_data  taskuserdata[7];

os_event       *msgqueue;                             /*訊息佇列指標*/

void           *msgqueuetbl[20];                      /*訊息儲存*/

void  main (void)

void  taskstart (void *pdata)

}

osctxswctr = 0;                                   

ostimedly(os_ticks_per_sec);                      }}

void  task1 (void *pdata)

}

void  task2 (void *pdata)

}

void  task3 (void *pdata)

}

void  task4 (void *pdata)

}

void  ostaskstathook (void)

if (total > 0) 

}if (total > 1000000000l) }}

void  ostaskswhook (void)

}

執行結果:

出處:本部落格遵從

creative commons attribution 3.0 license

uC OS II原始碼分析(二)

在真正開始分析源 前,先來看使用uc os ii的三個例子 1 使用訊號量 define task stk size 512 每個任務堆疊的大小 以字計算 define n tasks 10 任務數 os stk taskstk n tasks task stk size 任務堆疊 os stk t...

uC OS II原始碼分析(四)

核心結構 1,臨界區,os enter critical 和os exit critical 為了處理臨界區 必須關中斷,等處理完畢後,再開中斷。關中斷可以避免其他任務或中斷進入臨界區 uc os ii 定義了這兩個巨集來實現,但注意一條 呼叫 uc os ii 功能函式時,中斷應該總是開著的。1 ...

uC OS II原始碼分析(六)

c os 總是執行進入就緒態任務中優先順序最高的那乙個。確定哪個任務優先順序最高,下面該哪個任務執行了的工作是由排程器 scheduler 完成的。任務級的排程是由函式 ossched 完成的。中斷級的排程是由另乙個函式osintext 完成的,這個函式將在以後描 述。ossched 的 如下 vo...