我给共享资源区(share_resource[30])创建了一个信号量(sem_share_resource)供两个任务(task1_task、task2_task)轮流申请,申请到信号量的任务向串口打印共享区的数据,但是为什么这样还会出现抢先打印的情况啊???!!!(源码如下:)
//task1任务 #define TASK1_TASK_PRIO 8 //设置任务优先级 #define TASK1_STK_SIZE 128 //设置任务堆栈大小 OS_STK TASK1_TASK_STK[TASK1_STK_SIZE]; //任务堆栈 void task1_task(void *pdata); //任务函数
//task2任务 #define TASK2_TASK_PRIO 9 //设置任务优先级 #define TASK2_STK_SIZE 128 //设置任务堆栈大小 OS_STK TASK2_TASK_STK[TASK2_STK_SIZE]; //任务堆栈
void task2_task(void *pdata); //任务函数
void start_task(void *pdata) { OS_CPU_SR cpu_sr=0; pdata=pdata; OSStatInit(); //开启统计任务
OS_ENTER_CRITICAL(); //进入临界区(关闭中断) OSSemCreate(1); //信号量的值为1 OSTaskCreate(task1_task, (void * )0, (OS_STK * )&TASK1_TASK_STK[TASK1_STK_SIZE-1], TASK1_TASK_PRIO); //创建task1任务 OSTaskCreate(task2_task, (void * )0, (OS_STK * )&TASK2_TASK_STK[TASK2_STK_SIZE-1], TASK2_TASK_PRIO); //创建task2任务 OS_EXIT_CRITICAL(); //退出临界区(开中断)
//OSTaskSuspend(START_TASK_PRIO); //挂起开始任务 OSTaskDel(START_TASK_PRIO); //删除开始任务
}
void task1_task(void *pdata) { INT8U perr; u8 task1_str[] = "first task running!";
while (1) { OSSemPend(&sem_share_resource, 0, &perr); //申请信号量 printf("\r\n任务1:\r\n"); memcpy(share_resource, task1_str, sizeof(task1_str)); //向共享资源区拷贝数据 delay_ms(300); printf("%s\r\n", share_resource); //串口输出共享资源的数据 OSSemPost(&sem_share_resource); //释放信号量
OSTimeDlyHMSM(0, 0, 1, 0); } }
void task2_task(void * pdata) { INT8U perr; u8 task2_str[] = "second task running!";
while (1) { OSSemPend(&sem_share_resource, 0, &perr); printf("\r\n任务2:\r\n"); memcpy(share_resource, task2_str, sizeof(task2_str)); delay_ms(300); printf("%s\r\n", share_resource); OSSemPost(&sem_share_resource);
OSTimeDlyHMSM(0, 0, 1, 0); }
}
|