#include "includes.h"
OS_STK task_stack[10][100]; // 任务栈
INT32U system_time; // 系统时钟
OS_TCB my_task_state; // 任务状态
OS_EVENT *semaphore; // 信号量
OS_EVENT *mailbox; // 邮箱
OS_EVENT *msg; // 消息队列
void *msg_queue[10];
OS_EVENT *tsk1; // 信号量1
OS_EVENT *tsk2; // 信号量2
OS_EVENT *tsk3; // 信号量3
void my_task1(void *pdata);
void my_task2(void *pdata);
void my_task3(void *pdata);
void my_task4(void *pdata);
void main(void)
{
OSInit();
// 用户程序中不能使用优先级0,1,2,3以及最低的四个优先级
OSTaskCreate(my_task1, (void *)0, &task_stack[0][100 - 1], 7);
OSTaskCreate(my_task2, (void *)0, &task_stack[1][100 - 1], 8);
OSTaskCreate(my_task3, (void *)0, &task_stack[2][100 - 1], 9);
// OSTaskCreate(my_task4, (void *)0, &task_stack[3][100 - 1], 9);
// 任务的通信机制
// 先建立相应的ECB,才能使用信号量,邮箱或者消息队列
// 建立信号量,初始化为0,表示事件的发生
// 如果大于0,则表示对共享资源的访问
tsk1 = OSSemCreate(0); // task1 <==> task3
tsk2 = OSSemCreate(3); // task1 <==> task2
tsk3 = OSSemCreate(0); // task2 <==> task3
// mailbox = OSMboxCreate((void *)0); // 建立邮箱
// msg = OSQCreate(&msg_queue[0], 10); // 建立消息队列
OSStart();
}
void my_task1(void *pdata)
{
INT32U i, j;
INT8U err;
pdata = pdata;
start_os_time(); // 启动系统时钟
OSSemPost(tsk1); // 向task1发送信号量
while(1){
// 等待一个信号量
// 如果信号量大于0,将信号量减1,置OS_NO_ERR,然后返回
// 如果信号量为0,将该任务挂起到信号量的等待任务列表中,然后任务调度
OSSemPend(tsk1, 0, &err);
if(err == OS_NO_ERR){
for(j = 0; j < 6; j++){
i = 6000000;
while(i--);
LED_Monitor1 ^= 1;
}
// 发送一个信号量,表示一个事件发生了
// 当信号量 >= 0时,将信号量加1
// 如果有任务等待该信号量,优先级最高的任务进入就绪态,然后任务调度
OSSemPost(tsk2);
}
}
}
void my_task2(void *pdata)
{
INT32U i, j;
INT8U err;
pdata = pdata;
while(1){
// 等待来自task1的信号量
OSSemPend(tsk2, 0, &err);
if(err == OS_NO_ERR){
for(j = 0; j < 6; j++){
i = 6000000;
while(i--);
LED_Monitor2 ^= 1;
}
// 发送一个信号量,切换到task1
// task1从OSSemPend()里面的某处继续执行
OSSemPost(tsk3);
}
}
}
void my_task3(void *pdata)
{
INT8U err;
INT32U i, j;
pdata = pdata;
while(1){
// 等待来自task2的信号量
OSSemPend(tsk3, 0, &err);
if(err == OS_NO_ERR){
for(j = 0; j < 6; j++){
i = 6000000;
while(i--);
LED_Monitor3 ^= 1;
}
OSSemPost(tsk1);
}
}
}
文章评论(0条评论)
登录后参与讨论