#define OS_MUTEX_ACCEPT_EN 1 /*是否允许使用OSMutexAccept()*/ #define OS_MUTEX_DEL_EN 1 /*是否允许使用OSMutexDel()*/ #define OS_MUTEX_QUERY_EN 1 /*是否允许使用OSMutexQuery()*/
#define OS_Q_EN 0 /*是否允许使用队列功能*/
#define OS_SEM_EN 1 /*是否允许使用信号量功能*/ #define OS_SEM_ACCEPT_EN 1 /*是否允许使用OSSemAccept()*/ #define OS_SEM_DEL_EN 1 /*是否允许使用 OSSemDel() */ #define OS_SEM_QUERY_EN 1 /*是否允许使用 OSSemQuery()*/
#define OS_TASK_CHANGE_PRIO_EN 1 /*是否允许使用 OSTaskChangePrio()*/ #define OS_TASK_CREATE_EN 1 /*是否允许使用OSTaskCreate()*/ #define OS_TASK_CREATE_EXT_EN 1 /*是否允许使用OSTaskCreateExt()*/ #define OS_TASK_DEL_EN 1 /*是否允许使用OSTaskDel()*/
#define OS_TASK_SUSPEND_EN 1 /*是否允许使用OSTaskSuspend() and OSTaskResume()*/ #define OS_TASK_QUERY_EN 1 /*是否允许使用OSTaskQuery()*/
#define OS_TIME_DLY_HMSM_EN 1 /*是否允许使用OSTimeDlyHMSM()*/ #define OS_TIME_DLY_RESUME_EN 1 /*是否允许使用OSTimeDlyResume()*/ #define OS_TIME_GET_SET_EN 1 /*是否允许使用OSTimeGet() 和 OSTimeSet()*/ #define OS_SCHED_LOCK_EN 1 /*是否允许使用OSSchedLock()和OSSchedUnlock()*/ #define OS_TICKS_PER_SEC 200 /*设置每秒之内的时钟节拍数目*/
2.3 源程序说明
首先,在main()函数中创建一个二值信号量:
mutex=OSSemCreate(1);
然后,在main()函数中创建TaskStart任务。 TaskStart任务
在TaskStart任务中创建并启动所有的应用任务TA0, TA1,TA2。 static void TaskStartCreateTasks (void)
{
INT8U i;
for (i = 0; i 21 TaskData[i] = i; } /* Each task will pass its own id */ OSTaskCreate(Task0, (void *)&TaskData[0], &TaskStk[0][TASK_STK_SIZE - 1], 5); OSTaskCreate(Task1, (void *)&TaskData[1], &TaskStk[1][TASK_STK_SIZE - 1], 6); OSTaskCreate(Task2, (void *)&TaskData[2], &TaskStk[2][TASK_STK_SIZE - 1], 7); } 任务TA0的优先级最高,它需要使用信号量mutex: void Task0 (void *pdata) { INT8U err; INT8U id; INT16U value; id=*(int *)pdata; for (;;) { printk(\ OSTimeDly(200); /* Delay 200 clock tick printk(\ printk(\ OSSemPend(mutex,0,&err); /* Acquire mutex */ switch(err) { case OS_NO_ERR: printk(\ printk(\ break; default: printk(\ printk(\ } OSTimeDly(200); /* Delay 200 clock tick printk(\ OSSemPost(mutex); /* Release mutex } } 任务TA1具有中等优先级,它不使用信号量: void Task1 (void *pdata) { INT8U err; */ */ */ 22 INT8U id; int i; id=*(int *)pdata; for (;;) { printk(\ OSTimeDly(100); /* Delay 100 clock tick */ printk(\ OSTimeDly(100); } } 任务TA2的优先级最低,和高优先级任务TA0共用信号量mutex: void Task2 (void *pdata) { INT8U err; INT8U id; INT16U value; id=*(int *)pdata; int i; for (;;) { printk(\ OSSemPend(mutex,0,&err); /* Acquire mutex */ switch(err) { case OS_NO_ERR: { printk(\ printk(\ printk(\ OSTimeDly(200); /* Delay 100 clock tick break; } default : { printk(\ is failed to get mutex.\\n\ */ 23 printk(\ OSTimeDly(200); /* Delay 100 clock tick */ break; } } printk(\ printk(\ OSSemPost(mutex); /* Release mutex */ } } 3 运行及观察应用输出信息 4 本实验中所用到的μC/OS-II相关函数 4.1 OSSemCreate() 该函数建立并初始化一个信号量,信号量的作用如下: 24
相关推荐: