22747|11

7

帖子

0

TA的资源

一粒金砂(中级)

楼主
 

uC/OS-II的时钟频率的设置问题,os_ticks_per_sec多大? [复制链接]

 

这几天把uC/OS-II移植到了CM3处理器上,同时也大概的了解了一下其内核,以及其运作原理。其他便不多说,我能看到的大家都能看到,这里说一下我的一个不理解的地方。

       举个例子,Task1运行100us完成电流闭环的调节,且300us后再运行该任务,Task2运行100us完成高压闭环的调节,且200us后再运行该任务,问题是,我要怎么让两个任务在500us之内运行完,前提是将uC/OS-II系统移植到ARM处理器中,那么,系统定时节拍应该设为多少时间中断一次呢,即,OS_TICKS_PER_SEC = ?

 

       我在一个群里面问过几位高手,高手的回答是说这个问题很简单,指责我想的太过复杂,有一位高手给我的回答是1000,然后列举出一大堆的其他操作系统的取值。哎,我要的不是经验,是情景分析,说经验,当年我玩linux的时候你还不知道在干嘛呢。

 

       他给我的答案是正确的,一般的ARM处理器移植uC/OS-II后,其OS_TICKS_PER_SEC = 1000,即节拍定时器每1s/1000=1ms定时一次。问题来了,那么,我要怎么完成我的任务呢?

 

       其实这个问题确实很简单,想清楚了就真的很简单,答案是,ARM系统根本就做不到那么快,可是可以,我们可以将OS_TICKS_PER_SEC的值设置为我们需要的值,但这增加了系统的额外开销,我相信这是不允许的。

 

       下班后与许工讨论了一下这个问题,首先来说以下OSTimeDly(Ticks)这个函数,这个函数你可以说他是起到一个延时的作用,但是他其实真正的内涵是将CPU让给其他的任务,将自身的任务延时Ticks1ms(比如OS_TICKS_PER_SEC=1000),在OSTimeDlyTicks)中调用OS_Sched()函数找出任务就绪列表中优先级最高的任务并将当前CPU切换到该任务。

 

最新回复

很好,学习了  详情 回复 发表于 2017-6-14 11:26
点赞 关注
 

回复
举报

104

帖子

0

TA的资源

一粒金砂(高级)

推荐
 

回复 楼主 w729891 的帖子

哥们是新手吧,这个问题很简单啊,如果你对时间要求特别精确,就走定时器吧,做定时器中断。ucos系统的时间精确度是1/OS_TICKS_PER_SEC 级别的。还有,如果协调2个任务可以做互斥或者信号量。对于任务切换的时间,一般都是忽略的,想你这种要求精确时间的,还是不要用ucos系统的延时,这是不精确的。

希望对你有帮助
 
 
 

回复

7

帖子

0

TA的资源

一粒金砂(中级)

沙发
 

现我将Task1这个任务编写成如下代码,其优先级为3

void Task1 (void *pvData)

{

    pvData = pvData;

  

  

while (1) {

       ……

       200us

       ……

        OSTimeDly(1);

    }

}

 

比如说这个时候我将CPU分配给该任务,然后CPU做完处理需要的时间是200us,之后调用OSTimeDly(1)让出CPU,那么这个时候系统会将该任务从TCB中删除,并将1OSTimeDly(1)的参数)赋给TCB中的OSTCBDly参数,再调用OS_Sched()任务调度器将CPU让给其他的任务,即Task2

 
 
 

回复

7

帖子

0

TA的资源

一粒金砂(中级)

板凳
 

       现我将Task2这个任务编写成如下代码,其优先级为4

void Task2 (void *pvData)

{

    pvData = pvData;

  

  

while (1) {

       ……

       100us

       ……

        OSTimeDly(2);

    }

}

假如这个时候Task2已经就绪,那么CPU肯定是调用这个任务来运行。那么,CPU做完处理需要的时间是100us,之后调用OSTimeDly(2)让出CPU,那么这个时候系统会将该任务从TCB中删除,并将2OSTimeDly(2)的参数)赋给TCB中的OSTCBDly参数,再调用OS_Sched()任务调度器将CPU让给其他的任务。问题来了,这个时候系统会调用Task1来运行吗?

 

       我在群里的问题是,系统肯定是延时1ms之后再来调用Task2的,某些高手说,OSTimeDly(2)的参数是随便取的,我们不用管他。是,他说的是对的,只是他没有明白我说的意思,我要求任务在300us之后再调用Task1Task2

 

按照这样的话,系统并不能完成我的要求?????? 请高手指点啊!

 
 
 

回复

7

帖子

0

TA的资源

一粒金砂(中级)

4
 

接着分析。

 

       系统从Task1让出CPU之后运行Task2中的代码100usTask2再将CPU让给其他的任务,假设我系统中只有两个任务,那么系统在这个时候就只能调用空闲任务:OSTaskIdle()任务。前面说过,系统节拍定时器是1ms中断一次,系统节拍定时器调用OSTimeTick()函数遍历所有TCB块并更新TCB块中的OSTCBDly参数,若某个TCB中的OSTCBDly参数为0,则将该任务放入任务就绪列表,标志该任务延时结束并处于就绪状态。也就是说,这个时候离Task1就绪还有900us,而我要求300us之后再次调用该任务,很明显,ARM处理器在OS_TICKS_PER_SEC = 1000的情况下是做不到的,那么怎么办呢,将该值加大,那么无非会增加系统的额外开销,这样做允许吗?系统能够正常运行吗?这个问题有待进一步探讨。

 

       那么,像我目前这个项目,uC/OS-II很明显满足不了我的需求了??????

 
 
 

回复

7

帖子

0

TA的资源

一粒金砂(中级)

6
 

回复 5楼 zzhere2007 的帖子

首先感谢你的回答,但是假如不用ucos系统的延时,那么一个任务获取CPU,运行完后会自动放弃CPU吗?能否给个QQ啊,讨论下,谢谢!我的QQ:724887638
 
 
 

回复

112

帖子

0

TA的资源

一粒金砂(高级)

7
 
OSTimeDly(1)是极端不准确的
 
 
 

回复

7

帖子

0

TA的资源

一粒金砂(中级)

8
 

回复 7楼 llpanda 的帖子

这我知道啊!假如不用这个系统自带的延时函数,采用自己写的软件延时程序,任务只能等待延时完毕后,才会进行任务切换,这样岂不是浪费CPU,好像也会使得OSCPUUsage利用率提高,系统很容易崩溃,会跑飞的!
 
 
 

回复

9

帖子

0

TA的资源

一粒金砂(中级)

9
 
用定时器.

时间要求那么精确且很短,uCOS肯定是无法完成的。
 
 
 

回复

104

帖子

0

TA的资源

一粒金砂(高级)

10
 

回复 4楼 w729891 的帖子

呵呵,好久没上,加我飞信吧 756918879
 
 
 

回复

7

帖子

0

TA的资源

一粒金砂(中级)

11
 

回复 10楼 zzhere2007 的帖子

请问下,我已经加你了,麻烦同意允许!
 
 
 

回复

7

帖子

0

TA的资源

一粒金砂(初级)

12
 
很好,学习了
 
 
 

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

查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/8 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表