共2条
1/1 1 跳转至页
zlgarm,uc,os 向zlgarm请教uc/os信号量删除函数的使用
问
OSSemDel()这个函数是用来删除信号量的,可是我成功删除该信号量后,依赖于这个信号量的两个任务居然还能运行,这是为什么?
#include "config.h"
#include "stdlib.h"
#define TaskStkLengh 64 // 定义用户任务0的堆栈长度
OS_STK Root_TaskStk [TaskStkLengh];
OS_STK Task0Stk [TaskStkLengh]; // 定义用户任务0的堆栈
OS_STK Task1Stk [TaskStkLengh]; // 定义Task1的堆栈
OS_STK Task2Stk [TaskStkLengh]; // 定义Task2的堆栈
void Root_Task(void *pdata);
void Task0(void *pdata); // Task0 任务0
void Task1(void *pdata); // Task1 任务1
void Task2(void *pdata);
OS_EVENT *DispSem;
/*
**********************************************************************************************************
** 函数名称 :main()
** 函数功能 :uC/OS-II主函数,启动多任务环境。
**********************************************************************************************************
*/
int main (void)
{
OSInit ();
DispSem = OSSemCreate(1);
OSTaskCreate (Root_Task,(void *)0, &Root_TaskStk[TaskStkLengh - 1], 1);
OSStart ();
return 0;
}
void Root_Task (void *pdata)
{
pdata = pdata;
TargetInit ();
OSStatInit();
OSTimeDlyHMSM(0,0,2,0);
OSTaskCreate (Task0,(void *)0, &Task0Stk[TaskStkLengh - 1], 2);
OSTaskCreate (Task1,(void *)0, &Task1Stk[TaskStkLengh - 1], 3);
OSTaskCreate (Task2,(void *)0, &Task2Stk[TaskStkLengh - 1], 4);
while (1)
{
OSTimeDlyHMSM(10,0,0,0);
}
}
/*********************************************************************************************************
** Task0 任务0
** 目标板初始化,创建Task1,向串口0发送字符串“I AM TASK A.”
********************************************************************************************************/
void Task0 (void *pdata)
{
uint8 err;
char str1[]="I AM TASK A.\t";
uint8 a=99,b=99;
pdata = pdata;
while (1)
{
OSSemPend(DispSem, 0, & err); // 等待信号量
PC_DispStr(0, 0, str1 , 0);
OSSemPost(DispSem); // 发送信号量
OSTimeDlyHMSM(0,0,0,20);
}
}
/*********************************************************************************************************
** Task1 任务1
** 向串口0发送字符串“i am task b.”
********************************************************************************************************/
void Task1 (void *pdata)
{
uint8 err;
char str1[]="i am task b.\t";
pdata = pdata;
while (1)
{
OSSemPend(DispSem, 0, & err); // 等待信号量
PC_DispStr(0, 0, str1, 0);
OSSemPost(DispSem); // 发送信号量
OSTimeDlyHMSM(0,0,0,20);
}
}
void Task2(void *pdata)
{
char str0[20];
static char i=0;
INT8U err=0;
pdata = pdata;
while(1)
{
if(i==0)
{
OSSemDel(DispSem,OS_DEL_ALWAYS,&err );
sprintf(str0, "删除的结果%d\t",(uint8)err);
PC_DispStr(0, 0, str0, 0);
}
i++;
OSTimeDlyHMSM(0,0,4,0);
}
}
/*********************************************************************************************************
** End Of File
********************************************************************************************************/
运行结果:
I AM TASK A. i am task b. 删除的结果0 I AM TASK A. i am task b. I AM TASK A. i am task b. I AM TASK A. i am task b. I AM TASK A. i am task b. I AM TASK A. i am task b. I AM TASK A. i am task b. I AM TASK A. i am task b.。。。。。。。。。。。。。。。。。。。
。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
答 1: re检查OSSemPend返回的err!
#include "config.h"
#include "stdlib.h"
#define TaskStkLengh 64 // 定义用户任务0的堆栈长度
OS_STK Root_TaskStk [TaskStkLengh];
OS_STK Task0Stk [TaskStkLengh]; // 定义用户任务0的堆栈
OS_STK Task1Stk [TaskStkLengh]; // 定义Task1的堆栈
OS_STK Task2Stk [TaskStkLengh]; // 定义Task2的堆栈
void Root_Task(void *pdata);
void Task0(void *pdata); // Task0 任务0
void Task1(void *pdata); // Task1 任务1
void Task2(void *pdata);
OS_EVENT *DispSem;
/*
**********************************************************************************************************
** 函数名称 :main()
** 函数功能 :uC/OS-II主函数,启动多任务环境。
**********************************************************************************************************
*/
int main (void)
{
OSInit ();
DispSem = OSSemCreate(1);
OSTaskCreate (Root_Task,(void *)0, &Root_TaskStk[TaskStkLengh - 1], 1);
OSStart ();
return 0;
}
void Root_Task (void *pdata)
{
pdata = pdata;
TargetInit ();
OSStatInit();
OSTimeDlyHMSM(0,0,2,0);
OSTaskCreate (Task0,(void *)0, &Task0Stk[TaskStkLengh - 1], 2);
OSTaskCreate (Task1,(void *)0, &Task1Stk[TaskStkLengh - 1], 3);
OSTaskCreate (Task2,(void *)0, &Task2Stk[TaskStkLengh - 1], 4);
while (1)
{
OSTimeDlyHMSM(10,0,0,0);
}
}
/*********************************************************************************************************
** Task0 任务0
** 目标板初始化,创建Task1,向串口0发送字符串“I AM TASK A.”
********************************************************************************************************/
void Task0 (void *pdata)
{
uint8 err;
char str1[]="I AM TASK A.\t";
uint8 a=99,b=99;
pdata = pdata;
while (1)
{
OSSemPend(DispSem, 0, & err); // 等待信号量
PC_DispStr(0, 0, str1 , 0);
OSSemPost(DispSem); // 发送信号量
OSTimeDlyHMSM(0,0,0,20);
}
}
/*********************************************************************************************************
** Task1 任务1
** 向串口0发送字符串“i am task b.”
********************************************************************************************************/
void Task1 (void *pdata)
{
uint8 err;
char str1[]="i am task b.\t";
pdata = pdata;
while (1)
{
OSSemPend(DispSem, 0, & err); // 等待信号量
PC_DispStr(0, 0, str1, 0);
OSSemPost(DispSem); // 发送信号量
OSTimeDlyHMSM(0,0,0,20);
}
}
void Task2(void *pdata)
{
char str0[20];
static char i=0;
INT8U err=0;
pdata = pdata;
while(1)
{
if(i==0)
{
OSSemDel(DispSem,OS_DEL_ALWAYS,&err );
sprintf(str0, "删除的结果%d\t",(uint8)err);
PC_DispStr(0, 0, str0, 0);
}
i++;
OSTimeDlyHMSM(0,0,4,0);
}
}
/*********************************************************************************************************
** End Of File
********************************************************************************************************/
运行结果:
I AM TASK A. i am task b. 删除的结果0 I AM TASK A. i am task b. I AM TASK A. i am task b. I AM TASK A. i am task b. I AM TASK A. i am task b. I AM TASK A. i am task b. I AM TASK A. i am task b. I AM TASK A. i am task b.。。。。。。。。。。。。。。。。。。。
。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
答 1: re检查OSSemPend返回的err!
共2条
1/1 1 跳转至页
回复
有奖活动 | |
---|---|
【有奖活动】分享技术经验,兑换京东卡 | |
话不多说,快进群! | |
请大声喊出:我要开发板! | |
【有奖活动】EEPW网站征稿正在进行时,欢迎踊跃投稿啦 | |
奖!发布技术笔记,技术评测贴换取您心仪的礼品 | |
打赏了!打赏了!打赏了! |
打赏帖 | |
---|---|
与电子爱好者谈读图四被打赏50分 | |
与电子爱好者谈读图二被打赏50分 | |
【FRDM-MCXN947评测】Core1适配运行FreeRtos被打赏50分 | |
【FRDM-MCXN947评测】双核调试被打赏50分 | |
【CPKCORRA8D1B评测】---移植CoreMark被打赏50分 | |
【CPKCORRA8D1B评测】---打开硬件定时器被打赏50分 | |
【FRDM-MCXA156评测】4、CAN loopback模式测试被打赏50分 | |
【CPKcorRA8D1评测】--搭建初始环境被打赏50分 | |
【FRDM-MCXA156评测】3、使用FlexIO模拟UART被打赏50分 | |
【FRDM-MCXA156评测】2、rt-thread MCXA156 BSP制作被打赏50分 |