OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 4392|回复: 2

ucosII信号量实验:我创建了一个信号量供两个任务申请,可还是会出现抢先输出的情况

[复制链接]

1

主题

5

帖子

0

精华

新手上路

积分
36
金钱
36
注册时间
2019-1-1
在线时间
5 小时
发表于 2019-3-21 10:15:55 | 显示全部楼层 |阅读模式
我给共享资源区(share_resource[30])创建了一个信号量(sem_share_resource)供两个任务(task1_tasktask2_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);
        }

}

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

18

主题

154

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3865
金钱
3865
注册时间
2016-7-8
在线时间
814 小时
发表于 2019-3-27 10:36:01 | 显示全部楼层
能否把你的整理文件夹上传,我在我开发板上测试一下
回复 支持 反对

使用道具 举报

0

主题

295

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
335
金钱
335
注册时间
2019-3-26
在线时间
9 小时
发表于 2019-4-4 09:01:10 | 显示全部楼层
谢谢老司机分享!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-2 08:21

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表