OpenEdv-开源电子网

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

uCOSII的实验,两个LED是怎么实现一起工作的啊!明明就是有两个while循环,不理解……

[复制链接]

21

主题

50

帖子

0

精华

初级会员

Rank: 2

积分
156
金钱
156
注册时间
2013-1-20
在线时间
0 小时
发表于 2013-1-29 16:36:59 | 显示全部楼层 |阅读模式
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-1-29 17:48:22 | 显示全部楼层
ucosii调度了2个任务,才会出现2个灯一起工作的现象...
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

15

主题

23

帖子

0

精华

初级会员

Rank: 2

积分
103
金钱
103
注册时间
2011-9-15
在线时间
0 小时
发表于 2013-1-29 20:39:41 | 显示全部楼层
你那两个while循环里边肯定有延时函数,当程序进入延时,也就同时开始了任务的调度,内核会根据当前的任务优先级和就绪状态等因素发生任务调度,也就是跳转到另一个LED_TASK里边去,这个task里边也有延时,同样的,进入延时就进入了内核调度,就这样跳来跳去,当然,里边还涉及到了systic中断(也就是系统固定的中断)的问题,你可以先这样理解,然后看看邵贝贝教授的书,了解下内核工作原理基本上就明白了



回复 支持 反对

使用道具 举报

96

主题

762

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1228
金钱
1228
注册时间
2012-10-19
在线时间
15 小时
发表于 2013-1-30 08:47:55 | 显示全部楼层
操作系统嘛,要的就是多任务一起运行,哈哈
回复 支持 反对

使用道具 举报

24

主题

60

帖子

0

精华

初级会员

Rank: 2

积分
186
金钱
186
注册时间
2012-12-19
在线时间
3 小时
发表于 2013-1-30 17:36:01 | 显示全部楼层
void led1_task(void *pdata)
{
while(1)
{
LED0=0;
delay_ms(80);
LED0=1;
delay_ms(920);
};
}

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


操作系统中led1的优先级高于led2的优先级,高优先级的任务可以剥夺低优先级任务对cpu的控制(ucosii是可剥夺型内核),而低优先级任务不能剥夺高优先级任务对cpu的控制,因此在任务函数里面都会有延时函数delay_ms(); 仔细研究一下delay_ms()就会发现里面包括一个重要的函数OSTimdly(); 该函数里面有几句话
y            =  OSTCBCur->OSTCBY;        /* Delay current task                                 */
        OSRdyTbl[y] &= (OS_PRIO)~OSTCBCur->OSTCBBitX;
        if (OSRdyTbl[y] == 0u) {
            OSRdyGrp &= (OS_PRIO)~OSTCBCur->OSTCBBitY;
        }
        OSTCBCur->OSTCBDly = ticks;              /* Load ticks in TCB         
这几句话实现的是在任务就续表里面置0,也就是在任务就续表里面删除本任务,并且在OSTCBCur中写入ticks的数目,表示延时的事件。
延时的同时实现了放弃cpu的控制权。

接下来还有OS_Sched()函数
该函数里面最重要的有两句话
            OS_SchedNew();
            OSTCBHighRdy = OSTCBPrioTbl[OSPrioHighRdy]; 
            OS_TASK_SW();  

OS_SchedNew(); 函数里面最重要的功能就是
    y             = OSUnMapTbl[OSRdyGrp];
    OSPrioHighRdy = (INT8U)((y << 3u) + OSUnMapTbl[OSRdyTbl[y]]);
这两句话的作用是通过OSUnMapTbl找出任务就续表里面优先级最高的任务优先级是多少 

OSTCBHighRdy = OSTCBPrioTbl[OSPrioHighRdy];函数的作用是把 OSTCBHighRdy 指针指向优先级最高的任务

OS_TASK_SW();  的作用是触发pendsv异常,也就是pendsv中断,pendsv中断的作用是把当前任务的r4-r11压入堆栈,并且把 OSTCBCur 指针放入栈中




因此延时函数不简单是延时函数。更重要的作用是让任务暂时放弃cpu的控制权。cpu执行led0=0可能只需要几us,因此led=0;执行以后马上另外一个任务就会获得cpu控制权从而能够执行led1=0;











                   












回复 支持 反对

使用道具 举报

24

主题

60

帖子

0

精华

初级会员

Rank: 2

积分
186
金钱
186
注册时间
2012-12-19
在线时间
3 小时
发表于 2013-1-30 17:39:59 | 显示全部楼层
学ucosii一定要先理解OSTimeDly 和汇编代码
回复 支持 反对

使用道具 举报

108

主题

1433

帖子

2

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
2234
金钱
2234
注册时间
2012-4-30
在线时间
7 小时
发表于 2013-1-30 20:24:53 | 显示全部楼层
这是操作系统的精华啊~
回复 支持 反对

使用道具 举报

3

主题

47

帖子

0

精华

初级会员

Rank: 2

积分
90
金钱
90
注册时间
2012-5-17
在线时间
3 小时
发表于 2013-1-31 12:41:20 | 显示全部楼层
我发现灯的延时时间不能做到100ms以下,即便在设置为50ms但灯闪烁很长的时间.怎么能解决这个事呢
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-1-31 17:56:21 | 显示全部楼层
回复【8楼】mvip:
---------------------------------
你的系统时钟节拍设置是多少?
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

21

主题

50

帖子

0

精华

初级会员

Rank: 2

积分
156
金钱
156
注册时间
2013-1-20
在线时间
0 小时
 楼主| 发表于 2013-2-1 01:37:10 | 显示全部楼层
回复【5楼】zjtzlqr:
---------------------------------
非常谢谢你
啥也不懂就是想跟大家学习
回复 支持 反对

使用道具 举报

24

主题

60

帖子

0

精华

初级会员

Rank: 2

积分
186
金钱
186
注册时间
2012-12-19
在线时间
3 小时
发表于 2013-2-1 08:50:15 | 显示全部楼层
这个东西我看了好几天,你自己多总结总结。这块代码看得透彻一点。
回复 支持 反对

使用道具 举报

3

主题

32

帖子

0

精华

初级会员

Rank: 2

积分
83
金钱
83
注册时间
2011-5-10
在线时间
5 小时
发表于 2013-4-18 13:02:53 | 显示全部楼层
学习了
回复 支持 反对

使用道具 举报

0

主题

9

帖子

0

精华

新手上路

积分
29
金钱
29
注册时间
2013-1-16
在线时间
0 小时
发表于 2013-4-18 15:56:19 | 显示全部楼层
过来看看
回复 支持 反对

使用道具 举报

0

主题

7

帖子

0

精华

初级会员

Rank: 2

积分
110
金钱
110
注册时间
2015-1-16
在线时间
24 小时
发表于 2015-1-16 10:47:42 | 显示全部楼层
回复【5楼】zjtzlqr:
---------------------------
既然只执行了几个us,那为什么led1和led0能亮那么久,不是放弃CPU的控制权了吗
回复 支持 反对

使用道具 举报

0

主题

7

帖子

0

精华

初级会员

Rank: 2

积分
110
金钱
110
注册时间
2015-1-16
在线时间
24 小时
发表于 2015-1-16 10:51:01 | 显示全部楼层
回复【5楼】zjtzlqr:
---------------------------------
一直搞不懂啊,这一块
回复 支持 反对

使用道具 举报

0

主题

7

帖子

0

精华

初级会员

Rank: 2

积分
110
金钱
110
注册时间
2015-1-16
在线时间
24 小时
发表于 2015-1-16 11:21:44 | 显示全部楼层
难道是两个任务同时在us级的执行切换吗
回复 支持 反对

使用道具 举报

10

主题

68

帖子

0

精华

高级会员

Rank: 4

积分
500
金钱
500
注册时间
2014-9-1
在线时间
77 小时
发表于 2015-9-16 10:53:48 | 显示全部楼层
回复【14楼】kakafu:
---------------------------------
回复【14楼】kakafu:
---------------------------------
一旦IO置位或者复位不就一直保持了  楼主迷糊了吧
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-7-19 18:03

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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