embeddev_1 发表于 2014-9-15 11:08:06

osii事件小于最小ticks怎么办?

   假如osii最小ticks是1ms,我想100us就执行一次,有什么办法没有?

不知道下面这种方式是否可行?

在task里面挂起,

flg = OSFlagPend(Flag,
                   FLG_Timer,
                   OS_FLAG_WAIT_SET_ANY,
                   0,   //
                   &err);
      if (err == OS_NO_ERR)
      {

      }

开一个100us定时器,每100us的时候发送标志位,这样是否可行呢?

还是说即使100us发送标志位,但实际也是最小1ms任务才得到执行? {:biggrin:}

embeddev_1 发表于 2014-9-15 11:26:42

沉的好快~{:dizzy:}

aozima 发表于 2014-9-15 11:51:54

使用硬件定时器,要多少时间都可以随意设置。

embeddev_1 发表于 2014-9-15 13:28:08

aozima 发表于 2014-9-15 11:51
使用硬件定时器,要多少时间都可以随意设置。

请看清题意~{:biggrin:}

bsz84 发表于 2014-9-15 13:40:59

直接100us中断执行

embeddev_1 发表于 2014-9-15 13:42:29

bsz84 发表于 2014-9-15 13:40
直接100us中断执行

需要在任务里面执行的~不能占中断很长时间~

steaven2000 发表于 2014-9-15 13:51:06

难道你不知道有异步事件?

embeddev_1 发表于 2014-9-15 13:53:48

steaven2000 发表于 2014-9-15 13:51
难道你不知道有异步事件?

能举个简单例子解释下吗?比如楼主位的例子~{:biggrin:}

kebaojun305 发表于 2014-9-15 14:23:07

楼主你不是已经说出来了吗! 在100us的定时器中发送事件或信号量,任务中等待这个时间或者信号量。

embeddev_1 发表于 2014-9-15 14:30:12

kebaojun305 发表于 2014-9-15 14:23
楼主你不是已经说出来了吗! 在100us的定时器中发送事件或信号量,任务中等待这个时间或者信号量。 ...

呵呵~关键是我不确定这种方法是否可行,所以才来问的~{:biggrin:}

任务切换的最小ticks是1ms,如果我想在100us就干某件事并且不霸占中断,那么在100us时钟中断里面发信号量或者标志位等等~在任务里面挂起等待信号量或者标志位,理想很好,不知道能不能达到?

kebaojun305 发表于 2014-9-15 14:37:33

embeddev_1 发表于 2014-9-15 14:30
呵呵~关键是我不确定这种方法是否可行,所以才来问的~

任务切换的最小ticks是1ms,如果 ...

肯定可以啊要不中断怎么处理。1ms才响应中断 那黄花菜都凉了。

4058665 发表于 2014-9-15 14:38:46

本帖最后由 4058665 于 2014-9-15 14:42 编辑

中断里执行处理的动作要快       如果标志的话    会等待调度周期 还是要花时间的,当然无ostimedly的死任务除外

steaven2000 发表于 2014-9-15 14:40:20

embeddev_1 发表于 2014-9-15 13:53
能举个简单例子解释下吗?比如楼主位的例子~

你不觉得自己对OS的理解有问题吗?
ticks是1ms任务就最短1ms切换?假设只有2个任务,每个任务只需要执行1us的时间,那剩下的时间哪去了?

embeddev_1 发表于 2014-9-15 14:44:51

steaven2000 发表于 2014-9-15 14:40
你不觉得自己对OS的理解有问题吗?
ticks是1ms任务就最短1ms切换?假设只有2个任务,每个任务只需要执行1 ...

嗯!~应该是我理解有问题!
可否请教下假如在100us中断里面发出信号量,到任务执行这个时间需要多少呢?{:biggrin:}

embeddev_1 发表于 2014-9-15 14:56:56

kebaojun305 发表于 2014-9-15 14:37
肯定可以啊要不中断怎么处理。1ms才响应中断 那黄花菜都凉了。

和14楼同样问题,在100us中断里面发信号量,到在任务中挂起的信号量执行需要多少时间呢?如果是小于100us的,那满足楼主位的要求,如果超过100us,例如1ms以后任务才得到执行,那肯定不行的!
我这块不是很清楚~{:biggrin:}

xjjiang 发表于 2014-9-15 15:00:55

可以设计1个ticks = 10次中断,每次中断调用一个你想执行一次的函数

kebaojun305 发表于 2014-9-15 15:02:37

embeddev_1 发表于 2014-9-15 14:56
和14楼同样问题,在100us中断里面发信号量,到在任务中挂起的信号量执行需要多少时间呢?如果是小于100u ...

你这个接收的任务设置最高优先级, 那么切换时间就是任务的切换时间。

embeddev_1 发表于 2014-9-15 15:09:01

kebaojun305 发表于 2014-9-15 15:02
你这个接收的任务设置最高优先级, 那么切换时间就是任务的切换时间。 ...

任务切换时间不是tick最小时间1ms吗?怎么知道任务切换时间呢?

cs128815 发表于 2014-9-15 15:09:31

中断里执行处理的动作要快

embeddev_1 发表于 2014-9-15 15:11:52

cs128815 发表于 2014-9-15 15:09
中断里执行处理的动作要快

不看题意,打屁股~{:biggrin:}

kebaojun305 发表于 2014-9-15 15:16:50

本帖最后由 kebaojun305 于 2014-9-15 15:20 编辑

embeddev_1 发表于 2014-9-15 15:09
任务切换时间不是tick最小时间1ms吗?怎么知道任务切换时间呢?

你也不仔细看你说的1ms 是 OS的时基,OS内部是以1ms基准时间运行的切换时间都是us或者us以内的时间。你说的是任务切换的间隔时间是1ms(这中说法本身就不是太对,实际意思是OS内的时间单位必须是1ms的倍数)   不仔细看。


仔细看看OS的基本原理你就应该理解了。



当你发送消息时,这个消息已经通知了OS,然后OS会查询那个任务在等待这个消息如果查到了,那么等退出中断时,就会切换到那个等待这个消息的任务了(当然还有个任务的优先级在起作用的)。

myxiaonia 发表于 2014-9-15 15:22:34

embeddev_1 发表于 2014-9-15 14:56
和14楼同样问题,在100us中断里面发信号量,到在任务中挂起的信号量执行需要多少时间呢?如果是小于100u ...

那就要看看你的rtos的任务切换时间了

embeddev_1 发表于 2014-9-15 15:22:51

哪位知道如果系统ticks最小时间周期是1ms,也就是#define OS_TICKS_PER_SEC      1000u的时候

在主频是72mhz, 从100us时钟中断里面发信号量,到osii任务(最高优先级)执行挂起的信号量的时间是多少? 绕来绕去没有得到答案~{:biggrin:}

embeddev_1 发表于 2014-9-15 15:25:47

myxiaonia 发表于 2014-9-15 15:22
那就要看看你的rtos的任务切换时间了

怎么确定任务切换时间呢?现在问题就是在这里!
主频是72mhz,systick 1ms中断~最高优先级~从发出信号量,到任务得到执行,怎么确定需要多少时间?{:biggrin:}

size327948964 发表于 2014-9-15 15:28:15

可以用串口输出的方式 或者示波器测量

embeddev_1 发表于 2014-9-15 15:31:52

kebaojun305 发表于 2014-9-15 15:16
你也不仔细看你说的1ms 是 OS的时基,OS内部是以1ms基准时间运行的切换时间都是us或者us以内的时 ...

哥们,你说的这个没错,我也是这样认为的!但是没给出发出信号量到任务得到执行的时间啊,如果这个时间是立即执行或者小于100us,那没问题,如果大于了就失去意义了~

黄晨0410 发表于 2014-9-15 15:35:30

embeddev_1 发表于 2014-9-15 14:30
呵呵~关键是我不确定这种方法是否可行,所以才来问的~

任务切换的最小ticks是1ms,如果 ...

肯定不行的,这样会丢失很多事件,如你明明产生了10次中断,但你的OSII任务为1ms(最快)轮询一次,所以不可以第次100us产生事件都会快速被响应
这个问题只有中断中执行,

embeddev_1 发表于 2014-9-15 15:36:28

黄晨0410 发表于 2014-9-15 15:35
肯定不行的,这样会丢失很多事件,如你明明产生了10次中断,但你的OSII任务为1ms(最快)轮询一次,所以 ...

其他人都认为是可以的哦~{:titter:}

kebaojun305 发表于 2014-9-15 15:41:52

embeddev_1 发表于 2014-9-15 15:36
其他人都认为是可以的哦~

可以的前提是你这个任务处理的时间不能超过100us。任务的切换时间你就的查有多少条汇编了,可以用个IO口测量切换时间。72m的时钟切换时间应该最多几个us。至于实际值的你自己测试。

黄晨0410 发表于 2014-9-15 15:47:18

最快的方法是 100us周期产生一个中断,在中断给你要执行的任务发送消息使其切换到执行态。
但这有二个问题,1:被恢复的任务优先级要高,2:这个任务执行时间不超过100us

myxiaonia 发表于 2014-9-15 15:56:10

embeddev_1 发表于 2014-9-15 15:25
怎么确定任务切换时间呢?现在问题就是在这里!
主频是72mhz,systick 1ms中断~最高优先级~从发出信号量 ...

本坛有网友eric2013贴过各个rtos的任务切换时间比较,那个帖子暂时还没恢复过来
给你找到他的博客上的帖子RTX, uCOS-II, FreeRTOS embOS, uCOS-III的综合性能PK

migrant 发表于 2014-9-15 17:34:51

理论上是不行的,os只能1ms执行一次。
特例是你等待中断的任务是最高优先级,并且挂起状态,可能可以。
其实跟os的实现有关,也就是1m ticks,任务用了100us,剩下时间如何安排,不同的os处理不同,我也没有具体研究过。

tigerman520 发表于 2014-9-15 21:42:51

migrant 发表于 2014-9-15 17:34
理论上是不行的,os只能1ms执行一次。
特例是你等待中断的任务是最高优先级,并且挂起状态,可能可以。
其 ...

剩下的空闲时间执行空闲任务了呀。

tigerman520 发表于 2014-9-15 21:46:24

楼主,有两个办法,一个在空闲任务里添加一个函数,来判断标志并执行,中断发送标志。
另一个办法就是用消息队列看看。两种办法都不实时。

建议还是不跑系统了吧。
页: [1]
查看完整版本: osii事件小于最小ticks怎么办?