共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电子工程师创研计划】技术变现通道已开启~ | |
发原创文章 【每月瓜分千元赏金 凭实力攒钱买好礼~】 | |
【EEPW在线】E起听工程师的声音! | |
“我踩过的那些坑”主题活动——第001期 | |
高校联络员开始招募啦!有惊喜!! | |
【工程师专属福利】每天30秒,积分轻松拿!EEPW宠粉打卡计划启动! | |
送您一块开发板,2025年“我要开发板活动”又开始了! | |
打赏了!打赏了!打赏了! |
打赏帖 | |
---|---|
电流检测模块MAX4080S被打赏10分 | |
【我踩过的那些坑】calloc和malloc错误使用导致跑飞问题排查被打赏50分 | |
多组DCTODC电源方案被打赏50分 | |
【我踩过的那些坑】STM32cubeMX软件的使用过程中的“坑”被打赏50分 | |
新手必看!C语言精华知识:表驱动法被打赏50分 | |
【我踩过的那些坑】杜绑线问题被打赏50分 | |
【我踩过的那些坑】STM32的硬件通讯调试过程的“坑”被打赏50分 | |
【我踩过的那些坑】晶振使用的问题被打赏100分 | |
【我踩过的那些坑】电感选型错误导致的处理器连接不上被打赏50分 | |
【我踩过的那些坑】工作那些年踩过的记忆深刻的坑被打赏10分 |