OpenEdv-开源电子网

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

UCOS_III可剥夺内核验证问题

[复制链接]

5

主题

20

帖子

0

精华

初级会员

Rank: 2

积分
60
金钱
60
注册时间
2014-11-26
在线时间
0 小时
发表于 2014-12-29 21:56:52 | 显示全部楼层 |阅读模式
5金钱
验证一下内核是否是可剥夺的穿件两个任务
void led1_task(void *pdata)
{  
while(1)
{
LED0=0;
OSTimeDlyHMSM ( 0, 0, 0, 50 , OS_OPT_TIME_HMSM_STRICT, &err );


};
}

//LED2任务
void led2_task(void *pdata)
{   
while(1)
{
LED1=1;
while(1);
};
}

以上两个简单的任务led1_task任务高于led2_task任务,UCOS_III是可剥夺的内核为什么led1_task任务只运行一次后来一只死循环在led2_task任务里,为什么高优先级的任务不能运行?

最佳答案

查看完整内容[请看2#楼]

额额额额!你在led2_task任务函数中直接就用了一个while(1),这样肯定会死到这里面的,因为根本就没有任务切换函数调用啊。我们一般在任务里面要加延时函数OSTimeDlyHMSM的主要原因是这个函数里面调用了任务切换函数OSSched(),只有调用了任务切换函数才会进行任务调度的。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

88

主题

7377

帖子

5

精华

资深版主

Rank: 8Rank: 8

积分
14980
金钱
14980
注册时间
2013-11-13
在线时间
1823 小时
发表于 2014-12-29 21:56:53 | 显示全部楼层
额额额额!你在led2_task任务函数中直接就用了一个while(1),这样肯定会死到这里面的,因为根本就没有任务切换函数调用啊。我们一般在任务里面要加延时函数OSTimeDlyHMSM的主要原因是这个函数里面调用了任务切换函数OSSched(),只有调用了任务切换函数才会进行任务调度的。
开往春天的手扶拖拉机
回复

使用道具 举报

88

主题

7377

帖子

5

精华

资深版主

Rank: 8Rank: 8

积分
14980
金钱
14980
注册时间
2013-11-13
在线时间
1823 小时
发表于 2014-12-29 21:56:53 | 显示全部楼层
回复【5楼】lxp89:
---------------------------------
高优先级就绪后,会剥夺低优先级的CPU使用权,这句话是没错的。但是这句话说的是任务调度器,也就是说,当你调用OSSched()函数,也就是发起了一次任务调度,那么这个时候系统就会切换到处于就绪状态的最高优先级任务上。并不是说只要你的任务一就绪就会切换,这样不就全部乱套了,你不调用OSSched()函数发起任务切换,那么任务就永远也不会切换的。
开往春天的手扶拖拉机
回复

使用道具 举报

34

主题

805

帖子

4

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1865
金钱
1865
注册时间
2011-3-29
在线时间
140 小时
发表于 2014-12-29 22:47:47 | 显示全部楼层
怎么看得出led1_task任务只运行一次?
业余程序玩家。
回复

使用道具 举报

28

主题

288

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1213
金钱
1213
注册时间
2011-4-9
在线时间
97 小时
发表于 2014-12-30 08:16:05 | 显示全部楼层
每个任务必须调用延时函数、信号量、互斥信号量等,不能用死循环,每个任务只运行一次,然后等待下次运行的条件。
回复

使用道具 举报

5

主题

20

帖子

0

精华

初级会员

Rank: 2

积分
60
金钱
60
注册时间
2014-11-26
在线时间
0 小时
 楼主| 发表于 2014-12-30 09:05:03 | 显示全部楼层
回复【3楼】zuozhongkai:
---------------------------------
我看书上写的高优先级任务就绪后,就会剥夺低优先级任务,此话意思应该不需要释放CPU就能能切换到高优先级任务,OSTimeDlyHMSM是释放CPU,这个是我自己理解,哪里理解错了?请指点!
回复

使用道具 举报

5

主题

20

帖子

0

精华

初级会员

Rank: 2

积分
60
金钱
60
注册时间
2014-11-26
在线时间
0 小时
 楼主| 发表于 2014-12-30 09:33:53 | 显示全部楼层
回复【6楼】zuozhongkai:
---------------------------------
哦!好像明白了多谢哦!
回复

使用道具 举报

5

主题

16

帖子

0

精华

初级会员

Rank: 2

积分
56
金钱
56
注册时间
2014-9-19
在线时间
0 小时
发表于 2015-1-26 17:20:25 | 显示全部楼层
回复【2楼】ofourme:
---------------------------------
你好,想问一下。你做过在IAR平台下 STM32F103移植UCOSIII吗。
回复

使用道具 举报

34

主题

805

帖子

4

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1865
金钱
1865
注册时间
2011-3-29
在线时间
140 小时
发表于 2015-1-26 17:24:13 | 显示全部楼层
回复【8楼】1572842594:
---------------------------------
没有。
业余程序玩家。
回复

使用道具 举报

5

主题

16

帖子

0

精华

初级会员

Rank: 2

积分
56
金钱
56
注册时间
2014-9-19
在线时间
0 小时
发表于 2015-1-26 17:31:57 | 显示全部楼层
回复【9楼】ofourme:
---------------------------------
好吧。我郁闷死了。搞了三天都没搞出来,IAR平台移植UCOSIII。公司用IAR开发,哎。。。。
回复

使用道具 举报

34

主题

805

帖子

4

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1865
金钱
1865
注册时间
2011-3-29
在线时间
140 小时
发表于 2015-1-26 18:53:10 | 显示全部楼层
回复【10楼】1572842594:
---------------------------------
网上应该有例子,你找一找,应该不难的。
业余程序玩家。
回复

使用道具 举报

5

主题

20

帖子

0

精华

初级会员

Rank: 2

积分
60
金钱
60
注册时间
2014-11-26
在线时间
0 小时
 楼主| 发表于 2015-1-28 15:52:15 | 显示全部楼层
回复【10楼】1572842594:
---------------------------------
是的,我使用是ucosiii
回复

使用道具 举报

5

主题

16

帖子

0

精华

初级会员

Rank: 2

积分
56
金钱
56
注册时间
2014-9-19
在线时间
0 小时
发表于 2015-1-28 17:07:25 | 显示全部楼层
回复【12楼】lxp89:
---------------------------------
我终于移植成功了
回复

使用道具 举报

0

主题

133

帖子

0

精华

初级会员

Rank: 2

积分
169
金钱
169
注册时间
2014-12-21
在线时间
1 小时
发表于 2015-1-29 12:15:11 | 显示全部楼层
你这个验证程序在外部表现上有问题。除非你打断点在程序里仿真。
灯亮了(LED0),就会一直亮着,灯灭的(LED1),也会一直灭着,从现象上看不出来。
流过汗水才能代表自己真的学会了如何不流汗。
回复

使用道具 举报

5

主题

20

帖子

0

精华

初级会员

Rank: 2

积分
60
金钱
60
注册时间
2014-11-26
在线时间
0 小时
 楼主| 发表于 2015-1-29 16:27:17 | 显示全部楼层
回复【13楼】1572842594:
---------------------------------
移植好就好了
回复

使用道具 举报

5

主题

20

帖子

0

精华

初级会员

Rank: 2

积分
60
金钱
60
注册时间
2014-11-26
在线时间
0 小时
 楼主| 发表于 2015-1-29 16:28:44 | 显示全部楼层
回复【14楼】花戒:
---------------------------------
原因我已经找到了是因为系统时钟任务优先级比较低,改成高优先级就可以了
回复

使用道具 举报

0

主题

133

帖子

0

精华

初级会员

Rank: 2

积分
169
金钱
169
注册时间
2014-12-21
在线时间
1 小时
发表于 2015-1-29 19:53:02 | 显示全部楼层
我刚验证了,是剥夺型。任务代码如下:

u8 LED_test =0;

void led0_task(void *pdata)
{
       //低优先级7
    while(1)
    {
         if(LED_test&0x04)
               LED0 = !LED0;
     };
}

void led1_task(void *pdata)
{
       //高优先级6
    while(1)
    {
         LED_test++;
         delay_ms(100);
     };
}

当高优先级抢占成功,则LED_test自加,LED亮一段时间,灭一段时间。如果抢占失败,LED会是一个给定值(test无法整除8),或者一直闪烁的值(test刚好整除8)。

实际现象是,LED灭--微亮--亮--微亮--灭。说明抢占成功。
流过汗水才能代表自己真的学会了如何不流汗。
回复

使用道具 举报

5

主题

20

帖子

0

精华

初级会员

Rank: 2

积分
60
金钱
60
注册时间
2014-11-26
在线时间
0 小时
 楼主| 发表于 2015-1-30 09:01:12 | 显示全部楼层
回复【17楼】花戒:
---------------------------------
恩,对的
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-26 07:14

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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