OpenEdv-开源电子网

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

信号量OS_OPT_POST_1 OS_OPT_POST_ALL

[复制链接]

3

主题

6

帖子

0

精华

初级会员

Rank: 2

积分
53
金钱
53
注册时间
2020-5-7
在线时间
23 小时
发表于 2020-11-21 15:25:12 | 显示全部楼层 |阅读模式
8金钱
void task1_task(void *p_arg)
{
        volatile OS_SEM_CTR sem_ctrl1;
        OS_ERR err;
        u8 task1_str[]="First task Running!";
        while(1)
        {
                printf("\r\n任务1:\r\n");
                LCD_Fill(0,110,239,319,CYAN);
                 sem_ctrl1=OSSemPend(&SEM1,0, OS_OPT_PEND_BLOCKING,0,&err);        //请求信号量
                memcpy(share_resource,task1_str,sizeof(task1_str)); //向共享资源区拷贝数据
                delay_ms(300);
                printf("%s\r\n",share_resource);        //串口输出共享资源区数据        
                        sem_ctrl1=OSSemPost(&SEM1,OS_OPT_POST_1,&err);//发送信号量
                LED0 = ~LED0;
                OSTimeDlyHMSM(0,0,0,400,OS_OPT_TIME_PERIODIC,&err);   //延时1s
        }
}

//任务2的任务函数
void task2_task(void *p_arg)
{        
        volatile OS_SEM_CTR sem_ctrl2;
        OS_ERR err;
        u8 task2_str[]="Second task Running!";
        while(1)
        {
                printf("\r\n任务2:\r\n");
                LCD_Fill(0,110,239,319,BROWN);
                sem_ctrl2=OSSemPend(&SEM1,0, OS_OPT_PEND_BLOCKING,0,&err);//请求信号量
                memcpy(share_resource,task2_str,sizeof(task2_str));        //向共享资源区拷贝数据
                delay_ms(300);
                printf("%s\r\n",share_resource);        //串口输出共享资源区数据               
                sem_ctrl2=OSSemPost(&SEM1,OS_OPT_POST_1,&err);        //发送信号量
                LED1 = ~LED1;
                OSTimeDlyHMSM(0,0,1,0,OS_OPT_TIME_PERIODIC,&err);   //延时1s
        }
}


void task3_task(void *p_arg)
{        
        volatile OS_SEM_CTR sem_ctrl2;
        OS_ERR err;
        u8 task3_str[]="thd task Running!";
        while(1)
        {
                printf("\r\n任务3:\r\n");
                LCD_Fill(0,110,239,319,BROWN);
                sem_ctrl2=OSSemPend(&SEM1,0, OS_OPT_PEND_BLOCKING,0,&err);//请求信号量
                memcpy(share_resource,task3_str,sizeof(task3_str));        //向共享资源区拷贝数据
                printf("%s\r\n",share_resource);        //串口输出共享资源区数据               
                sem_ctrl2=OSSemPost(&SEM1,OS_OPT_POST_1,&err);        //发送信号量
                LED1 = ~LED1;
                OSTimeDlyHMSM(0,0,0,500,OS_OPT_TIME_PERIODIC,&err);   //延时1s
        }
}
我就是在信号量共享资源的例程多加了个任务,就会进入hard fault中断,OS_OPT_POST_1改成OS_OPT_POST_ALL就行了
串口打印内容:
任务1:

任务2:

任务3:
First task Running!
Second task Running!
thd task Running!

任务1:
First task Running!

任务3:
thW task Running!

任务1:

任务2:

任务3:
First task Running!
Second task Running!

之后程序就死了


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

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165353
金钱
165353
注册时间
2010-12-1
在线时间
2108 小时
发表于 2020-11-22 01:15:25 | 显示全部楼层
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2024-11-25 11:55

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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