在真正開始分析源**前,先來看使用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...