OpenEdv-开源电子网

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

ucos的信号量 关于任务切换

[复制链接]

11

主题

31

帖子

0

精华

初级会员

Rank: 2

积分
120
金钱
120
注册时间
2015-10-12
在线时间
18 小时
发表于 2015-11-23 11:53:11 | 显示全部楼层 |阅读模式
5金钱
我在学习关于信号量的时候,其中,while(1)中第一句是OSSemPend(&MY_SEM,0,OS_OPT_PEND_BLOCKING,0,&err);没有信号量的话就无法执行下面的语句,一直等待,那么是如何切换到有按键扫描的任务中的呢?
这个函数中有void  OSSched (void);这个函数是可以进行上下文切换的,并且在OSSemPend中 OSSched是没有在if判断语句中的,也就是说,在这个函数就可以执行上下文切换,那怎么执行下一句的num++;啊
另外,我搜索最高优先级的话是除本任务外的最高优先级吧?

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

使用道具 举报

70

主题

6697

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
12691
金钱
12691
注册时间
2012-11-26
在线时间
3710 小时
发表于 2015-11-23 11:56:24 | 显示全部楼层
不知道你在讲什么


针对你说的几个点

UCOS   优先级的阿拉伯数字越小,优先级越高

任务等不到信号,就一直等着,别的该执行执行,UCOS,总是执行优先级最高的ready任务
学无止境
回复

使用道具 举报

88

主题

7377

帖子

5

精华

资深版主

Rank: 8Rank: 8

积分
14980
金钱
14980
注册时间
2013-11-13
在线时间
1823 小时
发表于 2015-11-23 12:30:10 | 显示全部楼层
调用函数OSSemPend()请求信号量的话如果没有等信号量的就会一直在这里死等,直到等到信号量!那么下面的程序肯定就不能执行!
开往春天的手扶拖拉机
回复

使用道具 举报

11

主题

31

帖子

0

精华

初级会员

Rank: 2

积分
120
金钱
120
注册时间
2015-10-12
在线时间
18 小时
 楼主| 发表于 2015-11-23 15:00:00 | 显示全部楼层
回复【2楼】jermy_z:
---------------------------------
任务1按键释放信号量
任务2 有信号量的话,输出一次
在没有按键没有释放信号的时候,在任务一中任务切换发生在这句OSTimeDlyHMSM(0,0,0,10,OS_OPT_TIME_HMSM_STRICT,&err); /
任务2 我之前不知道任务切换发生在哪里(如果没有接受到信号量的话)
   OSSemPend(&MY_SEM,0,OS_OPT_PEND_BLOCKING,0,&err);
  F12进去上面的函数是这个(部分)
  OS_CRITICAL_ENTER_CPU_CRITICAL_EXIT();                  /* Lock the scheduler/re-enable interrupts                */
    OS_Pend(&pend_data,                                     /* Block task pending on Semaphore                        */
            (OS_PEND_OBJ *)((void *)p_sem),
            OS_TASK_PEND_ON_SEM,
            timeout);
    OS_CRITICAL_EXIT_NO_SCHED();
    OSSched(); //我理解这个是进行任务切换的函数  点进去的英文注释是这么说的


我理解的两个任务的切换是,没有信号量释放的时候,先执行任务1,在延时的时候切换到任务2(因为只有两个任务除了任务一之外任务2的优先级最高)任务2 只能执行到信号量等待这一句话,然后就进行了任务切换,到任务1,继续循环

这样的话如果有信号量的话,也会在   OSSemPend(&MY_SEM,0,OS_OPT_PEND_BLOCKING,0,&err);的时候进行一次切换了吧

对任务切换不太明白谢谢
回复

使用道具 举报

11

主题

31

帖子

0

精华

初级会员

Rank: 2

积分
120
金钱
120
注册时间
2015-10-12
在线时间
18 小时
 楼主| 发表于 2015-11-23 15:08:35 | 显示全部楼层
回复【3楼】zuozhongkai:
---------------------------------
那么是不是在OSSemPend(&MY_SEM,0,OS_OPT_PEND_BLOCKING,0,&err);的时候能把任务切换回去呢,因为两个任务一定是轮流执行的啊
回复

使用道具 举报

70

主题

6697

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
12691
金钱
12691
注册时间
2012-11-26
在线时间
3710 小时
发表于 2015-11-23 15:26:48 | 显示全部楼层
回复【4楼】Tada:
---------------------------------
你该去了解下UCOS的节拍是什么东西
学无止境
回复

使用道具 举报

11

主题

31

帖子

0

精华

初级会员

Rank: 2

积分
120
金钱
120
注册时间
2015-10-12
在线时间
18 小时
 楼主| 发表于 2015-11-23 16:00:33 | 显示全部楼层
回复【6楼】jermy_z:
---------------------------------
您是说的延时用的滴答定时器
void SysTickHandler(void)
{
    OSIntEnter();
    OSTimeTick();    
    OSIntExit(); 
}
在OSIntExit(); 的时候完成上下文切换。。。但是任务2的话,不是由于没有收到信号量,就没办法执行到延时函数那里了么
回复

使用道具 举报

70

主题

6697

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
12691
金钱
12691
注册时间
2012-11-26
在线时间
3710 小时
发表于 2015-11-23 16:10:14 | 显示全部楼层
回复【7楼】Tada:
---------------------------------
呵呵
学无止境
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2024-11-23 17:01

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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