搜索
bottom↓
回复: 33

傻孩子老师,请教任务调度器

[复制链接]

出0入0汤圆

发表于 2012-9-26 11:25:25 | 显示全部楼层 |阅读模式
本帖最后由 qingaixww 于 2012-9-26 11:46 编辑

傻孩子老师,你好!
      这几天再看你在http://www.amobbs.com/thread-3757688-1-1.html发表的复杂任务调试器的程序,关于
struct Process
{
    PROC_FUNCTION       *fnProcess;            
    volatile PROC_STATE State;
    void                *pArgument;
    ES_FLASH uint8_t*   pKey;
};

里面的参数pArgument和pKey的意义和作用很不明白,还有,有没有关于掩码结构体的使用实例可以参考呢?对于这个概念还是不理解。还望赐教,谢谢!

出0入0汤圆

 楼主| 发表于 2012-9-26 23:10:12 | 显示全部楼层
哪位大侠有接触过,麻烦帮忙看一下,谢谢!

出0入296汤圆

发表于 2012-9-27 10:33:51 | 显示全部楼层
pArgument 用来带参数的,简单说状态机有两种,静态的和动态的,静态的状态机里会用到全局变量,所以
静态状态机是不可重入的;动态状态机一般把自己的变量都保存在一个结构体里面,这个结构体由外部提供,
所以动态状态机是彼此独立的,是可充入的。这个pArgument就是用来指向这个结构体的。结构体由状态机
自己定义,所以类型不定,用void *
pKey 是用来指向一个安全码的,这里的process实际上就是task的控制块,这个控制块是动态堆分配的,为了
防止动态的生成和销毁的过程中出现异常,所以加入一个key——当生成的时候给key一个值,当销毁的时候,
有key的才销毁,并把资源送回堆中,使用的时候也可以检测key,不对的就不处理。

出0入0汤圆

 楼主| 发表于 2012-9-27 14:16:10 | 显示全部楼层
有些明白了,但还要在使用中慢慢体会,谢谢傻孩子老师!关于掩码结构体,请问有没有掩码结构体的使用实例呢?因为对这个概念不是很明白,还望赐教!谢谢!

出0入296汤圆

发表于 2012-9-28 10:07:29 | 显示全部楼层
本帖最后由 Gorgon_Meducer 于 2012-9-28 10:15 编辑
qingaixww 发表于 2012-9-27 14:16
有些明白了,但还要在使用中慢慢体会,谢谢傻孩子老师!关于掩码结构体,请问有没有掩码结构体的使用实例呢 ...



xxxx.c

  1. typedef struct {
  2.     uint16_t hwID;
  3.     uint8_t   chName[20];
  4.     ...
  5. } example_t;
复制代码

xxxx.h

  1. typedef struct {
  2.     uint8_t chMask[sizeof(struct{            //!< you can comment this line to remove structure mask
  3.             uint16_t hwID;
  4.             uint8_t   chName[20];
  5.             ...
  6.     })];                                     //!< you can comment this line to remove structure mask
  7. } example_t;
复制代码

应用实例:类的封装

xxxx.c

  1. #define PRIVATE
  2. #define PUBLIC

  3. //! Macro for class definition
  4. #define CLASS(__NAME)    typedef struct __##NAME    __NAME;\
  5. struct __##NAME {
  6. #define END_CLASS            };

  7. //! Define a class example with public members and private members
  8. CLASS(Example)
  9. //! Public members
  10. PUBLIC
  11.     uint8_t     chID;
  12.     uint16_t    hwValueA;                
  13.     …
  14. //! Private members
  15. PRIVATE
  16.     uint8_t    chMemberA;
  17.     uint16_t   hwMemberB;
  18.     …
  19. END_CLASS
复制代码
xxxx.h

  1. //! Macro for extern class
  2. #define CLASS(__NAME)    \
  3. typedef struct __##NAME    __NAME;\
  4. struct __##NAME {


  5. #define PUBLIC_BEGIN
  6. #define PUBLIC_END
  7. #define PRIVATE_BEGIN    uint8_t chMask##__LINE__[sizeof(struct {
  8. #define PRIVATE_END        })];

  9. CLASS(Example)
  10. PUBLIC_BEGIN
  11.     uint8_t     chID;
  12.     uint16_t    hwValueA;                
  13.          …
  14. PUBLIC_END

  15. PRIVATE_BEGIN
  16.     uint8_t    chMemberA;
  17.     uint16_t   hwMemberB;
  18.     …
  19. PRIVATE_END
  20. END_CLASS

复制代码

出0入0汤圆

 楼主| 发表于 2012-9-28 16:41:35 | 显示全部楼层
要好好学习了,谢谢!

出0入0汤圆

发表于 2013-3-1 03:51:16 | 显示全部楼层
谢谢了

出0入0汤圆

发表于 2013-3-5 00:06:01 | 显示全部楼层
Gorgon_Meducer 发表于 2012-9-27 10:33
pArgument 用来带参数的,简单说状态机有两种,静态的和动态的,静态的状态机里会用到全局变量,所以
静态 ...

傻孩子,看了你的这个调度器,感觉就是状态机跟超级循环结合,跟普通的超级循环有哪些区别,实时性怎么样,为什么不像“基于时间触发设计模式”所讲的那种调度器那样子的?

出0入296汤圆

发表于 2013-3-5 00:48:43 | 显示全部楼层
NIC 发表于 2013-3-5 00:06
傻孩子,看了你的这个调度器,感觉就是状态机跟超级循环结合,跟普通的超级循环有哪些区别,实时性怎么样 ...

我这是普通的合作式调度器,而基于时间出发的嵌入式系统设计里面的是混合式调度器。
对合作式调度起来说,他本质上和超级循环没有太大区别,只是加入了一些辅助措施而已——相当于用代码固化了一些规则。
所有细节都是遵循超级循环的多任务规则的。

其实你的这个问题太大,我一两句话是讲不清楚的。不过如果你愿意从更细节的问题问起,我也许能提供更有信息量的回答。

出0入0汤圆

发表于 2013-3-5 08:25:44 | 显示全部楼层
Gorgon_Meducer 发表于 2013-3-5 00:48
我这是普通的合作式调度器,而基于时间出发的嵌入式系统设计里面的是混合式调度器。
对合作式调度起来说 ...

我指的就是这本书里面讲的合作式调度器,它就是采用时间片的方式来规定每个任务的准确的运行时刻,你这里的超级循环不是还是有超级循环结构固有的缺点吗,无法在准确时刻运行任务,比方一个1ms运行一次的任务能保证准确执行吗?

出0入0汤圆

发表于 2013-3-5 08:36:25 | 显示全部楼层
粉儿一个。

出0入296汤圆

发表于 2013-3-5 14:52:53 | 显示全部楼层
本帖最后由 Gorgon_Meducer 于 2013-3-5 14:59 编辑
NIC 发表于 2013-3-5 08:25
我指的就是这本书里面讲的合作式调度器,它就是采用时间片的方式来规定每个任务的准确的运行时刻,你这里 ...


状态机结构可以解决你说的准确执行的问题。在这种系统下,每一个任务都被拆分成细小的步骤——也就是一个一个
的状态代码——因此超级循环执行一圈的时间是极其短的。在纯合作式调度器模式下,任务都是以事件为纽带联系在
一起的。因此,在需要的情况下,我们可以通过定时器产生一个精确的时间事件——不一定是1ms,而是根据实际应
用来产生时间事件。而具体的任务则在主循环里面运行。

其实我觉得对你来说,有两个概念可能混淆了:实时性和即时性。
实时性强调的是在一定时间范围内一定要响应某一个事件。即时性强调的是尽可能迅速的响应某一个时间。这是两个
截然不同的策略。对实时性来说,如果允许的时间范围是10ms,那么在9ms的时候处理这个事件是完全允许的;但
对即时性来说,只要事件发生了,就要尽可能的迅速处理这个时间。
千万不要混淆二者。当我们谈论实时性的时候,通常只要考虑超级循环运行一圈所需的时间,只要这个时间比某个
目标事件的最大响应时间小,我们基本上就可以放心的宣称当前的系统是可以满足目标事件的实时性要求的。

其实即时性是一个模糊的概念,怎样算即时?这个很难说得清楚,这是一个难以定量说明的概念——因为你一旦定量
说明了,所谓的即时性就变成实时性要求了,因为你追加了一个时间信息——一定要在某一个时间范围内响应目标
事件。

也许你要说,追加定时器作为事件发生不就变成混合式调度器了么?我并不这么认为,混合式调度器的调度行为是
允许在定时器中断处理程序里面发生的,而合作式调度器要求调度必须发生在超级循环里面,并且把时间看成是
普通的事件资源。也许区分这个队实际应用并没有太多意义,但既然你想弄清楚,我还是要把该说清楚的说清楚。

另外,追加一点,对计算机科学来说,很多情况下遵循的是黑猫白猫抓到老鼠就是好猫的原则,至于概念,除了便于
交流和知识的传播,大部分情况下,是很主观的东西。计算机世界是一个相对唯心的世界……

出0入0汤圆

发表于 2013-3-5 15:43:00 | 显示全部楼层
本帖最后由 NIC 于 2013-3-5 15:47 编辑
Gorgon_Meducer 发表于 2013-3-5 14:52
状态机结构可以解决你说的准确执行的问题。在这种系统下,每一个任务都被拆分成细小的步骤——也就是一个 ...


你的意思是说状态机结构下因为超级循环执行一圈时间短,可以不用定时器进行时间片轮循模式,需要的情况下可以用,即你所说的时间事件?
关于合作式调度器和混合式调度器,我能够区分,我主要纠结在你的调度器与那本书讲的合作式调度器最主要区别就是你这个还是超级循环,而书上的是基于时间触发的,你说的状态机结构在书上也介绍到过,就是在长任务程序中要采取多状态任务的方式将长任务分解

出0入296汤圆

发表于 2013-3-5 17:04:47 | 显示全部楼层
NIC 发表于 2013-3-5 15:43
你的意思是说状态机结构下因为超级循环执行一圈时间短,可以不用定时器进行时间片轮循模式,需要的情况下 ...

看来我已经回答了你的问题?

出0入0汤圆

发表于 2013-3-5 17:23:34 | 显示全部楼层
Gorgon_Meducer 发表于 2013-3-5 17:04
看来我已经回答了你的问题?

??可我的疑问还没解决阿

出0入296汤圆

发表于 2013-3-5 18:18:26 | 显示全部楼层
NIC 发表于 2013-3-5 17:23
??可我的疑问还没解决阿

你的疑问能详细说一下么?举例说明会更好的帮助理解。

出0入0汤圆

发表于 2013-3-5 20:47:18 | 显示全部楼层
Gorgon_Meducer 发表于 2013-3-5 18:18
你的疑问能详细说一下么?举例说明会更好的帮助理解。

我的疑问还是觉得时间片与状态机结合时最好的,这样的话以后修改任务代码或增加任务,都不会影响到其它任务的运行?
还有你这个调度器中如串口、AD、IIC等这些资源应该可以采用中断方式的吧,而不像基于时间触发设计中所述,只能是有一个用来调度任务的定时中断,其它的度不用中断方式

出0入296汤圆

发表于 2013-3-5 21:13:15 | 显示全部楼层
NIC 发表于 2013-3-5 20:47
我的疑问还是觉得时间片与状态机结合时最好的,这样的话以后修改任务代码或增加任务,都不会影响到其它任 ...

无论何种方式,不影响是不可能的,因为单位时间内,系统的有效周期数是固定的。
外设资源用不用中断还要取决于应用对其的实时性需求。然而,你列举的例子恰恰
都是实时性要求较低的外设,那么答案就简单了,用状态查询模式通常是没有问题
的,但用中断也是OK的。

出0入0汤圆

发表于 2013-3-5 21:25:53 | 显示全部楼层
本帖最后由 NIC 于 2013-3-5 21:27 编辑
Gorgon_Meducer 发表于 2013-3-5 21:13
无论何种方式,不影响是不可能的,因为单位时间内,系统的有效周期数是固定的。
外设资源用不用中断还要 ...


“无论何种方式,不影响是不可能的,因为单位时间内,系统的有效周期数是固定的”,这句话怎么理解?
采用时间片的话应该尽量不用中断吧,不然会影响到定时中断的,和任务的执行时间,因为这些中断随时都有可能发生,而且也就不会发生中断嵌套的现象

出0入296汤圆

发表于 2013-3-6 02:58:10 | 显示全部楼层
本帖最后由 Gorgon_Meducer 于 2013-3-6 03:05 编辑
NIC 发表于 2013-3-5 21:25
“无论何种方式,不影响是不可能的,因为单位时间内,系统的有效周期数是固定的”,这句话怎么理解?
采 ...


“混合调度器模式下,用定时器来调度,同时尽可能不使用别的外设中断” 实际上和
“合作式调度器模式下,在超级循环里面应用状态机来查询,将定时器中断看作事件”
其实是没有本质区别的。

用定时器进行调度的时候,也是要求任务执行时间尽可能短,并进行拆分。用时间
事件驱动的合作式调度器本身也是要求任务的执行时间尽可能短。

你非要说不同点……我觉得混合式调度器还涉及到调度算法,那么这个调度的开销
相对合作式调度器的开销来说可能要大得多——因为合作式调度器可以干脆没有调
度……即便有调度,其实也只是一个函数指针的轮转,和混合式调度器的时间片计算
相比,开销要小得多。

至于相同点,我要说,不管你系统设计的再好,只要有一个任务不符合要求,系统的
可靠性都挂了——这就是两种调度方法的共同点。

另外一个我不喜欢混合调度器的原因是,并非所有任务都是基于时间触发的。当然
那本书本身介绍的前提就是“基于时间触发”——实际上基于时间触发的系统反而是少
数,真正常见的是基于事件触发,事件源很多的,比如通信资源,信号资源(外中
断),软件信号等等……往往是一个任务没有明确的触发事件时才用时间来作为触发
源——也就是所谓的每隔一段时间执行一下扫描这类任务。当然,也有一类任务本身
是完全基于时间触发的,比如基于严格时间的时序发生或者软件模拟的异步类通讯。

从以上的角度来说,我觉得选择合作式调度器+状态机就形成了一个非常灵活的轻量级
多任务系统,并能确保系统接近或者达到理论上才能实现的数据或者任务吞吐效率。

出0入0汤圆

发表于 2013-3-6 20:02:41 | 显示全部楼层
傻孩子的书怎么还没出来呢??

出0入0汤圆

发表于 2013-3-6 21:26:50 | 显示全部楼层
本帖最后由 NIC 于 2013-3-6 21:28 编辑
Gorgon_Meducer 发表于 2013-3-6 02:58
“混合调度器模式下,用定时器来调度,同时尽可能不使用别的外设中断” 实际上和
“合作式调度器模式下 ...


好像合作式调度器的概念还没搞清楚,可能是我搞错了,我说的也是合作式调度器阿,与混合式调度器都是用定时器来调度的,区别是合作式调度器在主循环中执行调度函数来执行任务,而混合式调度器是唯一一个的抢占式任务在定时器中断里被调度了;

讨论到现在发现还不知道你说的用时间事件驱动的合作式调度器,一直以为就是采用定时器的进行任务调度,能否用相关代码演示一下,不知道时间事件到底是驱动什么,因为我没看到你的调度器采用时间事件驱动;

你说的基于事件触发的在时间触发设计模式这本书上说了正是因为基于事件触发的缺点而采用时间触发设计,就是多个中断随机密集发生时的问题,具体不叙述了。
“实际上基于时间触发的系统反而是少数,真正常见的是基于事件触发”,通过事先时间上的安排好任务,保证实时性的前提下不就能很好的执行任务了,就比如说按键也是个事件触发,但通过一定周期的检测不是照样能完成任务吗?就像你上上个回复所说的“外设资源用不用中断还要取决于应用对其的实时性需求,实时性要求较低的外设,用状态查询模式通常是没有问题的,但用中断也是OK的。”,不知道我说的对不对,可能我水平不行,没能领会傻孩子意思,还望指正

出0入296汤圆

发表于 2013-3-6 23:24:06 | 显示全部楼层
NIC 发表于 2013-3-6 21:26
好像合作式调度器的概念还没搞清楚,可能是我搞错了,我说的也是合作式调度器阿,与混合式调度器都是用定 ...

理论上,只要查询的足够快,所有问题都可以转化为时间触发,因为这个世界所有的问题无非就是时间和空间的问题。
如果你都转化为查询,就会存在浪费——也就是查询的浪费,毕竟很多东西没有发生的时候,你去花费精力去查询它
的状态就是浪费,但这里你要清楚,我说不能都去查询并不是说用中断,其实中断是一种硬件事件,但还有很多软件
事件,软件事件可以通过调度器的方式来触发任务,而不需要任务本身一直去查询事件是否发生了。

简单举一个例子:你可以在定时器里面注册一个新任务——这个任务做完以后会自动结束并注销这个任务。那么,这
里,定时器注册任务可以看作是一种比较特殊的 事件事件的 例子。

其他的事件例子还有信号量——比如处理生产者消费者问题,当消费者去申请资源的时候,发现资源没有了,这个
任务就会被挂起——也就是从调度器里面删除了,但是加入到信号量的一个等待队列里面,当生产者生产了资源,
并且轮到这个任务(排队排到了),那么就把这个任务从信号量的等待队列里面删除,重新加入到调度器里面
——可见,这个过程中,目标任务并没有消耗处理器时间去查询他想要的资源到底有没有,而是等待事件触发它。

希望这两个例子能让你不再以 时间触发 作为思考的出发点。 时间触发只是事件的一种,而熟练运用事件,则是
提高效率的关键。

例子代码在我的ESSF 3.x的帖子里面。

出0入0汤圆

发表于 2013-3-7 23:16:13 | 显示全部楼层
Gorgon_Meducer 发表于 2013-3-6 23:24
理论上,只要查询的足够快,所有问题都可以转化为时间触发,因为这个世界所有的问题无非就是时间和空间的 ...


你的意思我大概明白了,就是基于事件的发生来触发任务,其中你所说的时间事件驱动就是在定时器中注册一个任务,这可以看成是一个特殊的事件,一些周期性的任务就可以采用这种方式来调度。

还有就是软件事件,这个也好理解,相当于一个任务触发了另一个任务

“如果你都转化为查询,就会存在浪费——也就是查询的浪费”,时间触发确实有这个缺点,但基于事件触发的话对于一系列的外设中断应该如何处理,即你提到的硬件事件?如果全采用中断的话,就会有我在上个回复说到的缺陷,或者是采用在时间事件里去触发查询各个外设中断的任务,这是我现在还没想明白的?

其实你这个调度器是不是可以这样理解:就是一个在超级循环中一直查询一个就绪任务的任务队列,通过各种事件的发生将任务添加到这个队列中,执行完后又将这个任务从中删除,而这个前提是各个任务都是基于状态机模式下的,要保证各个任务的每个状态和中断事件的处理时间都要很短,以实现并发多任务的机制

你的程序需要花不少精力去仔细解读阿

出0入296汤圆

发表于 2013-3-8 01:03:08 | 显示全部楼层
本帖最后由 Gorgon_Meducer 于 2013-3-8 01:04 编辑
NIC 发表于 2013-3-7 23:16
你的意思我大概明白了,就是基于事件的发生来触发任务,其中你所说的时间事件驱动就是在定时器中注册一个 ...


对于中断或者说硬件事件要从两个层面来考虑:
1、该事件的实时性要求
    如果一个外设产生的事件实时性要求不高,则可以注册一个周期性的查询任务去处理——感觉有点像时间触发,
然而这里的查询多半要比基于准确的时标的查询要频繁的多——因为超级循环里面的任务整体执行周期就很短。
这样做也许有点浪费,但如果系统允许这种浪费,那么也未尝不可——毕竟简单。
    如果一个外设产生的事件是实时性要求很高,则应该采用中断处理。

2、当一个外设事件被明确要求用中断处理时
a. 中断处理程序原则上不允许开嵌套
b. 中断处理程序里面原则上不易进行复杂操作,而应该采用生产者和消费者模型来将外设事件资源化。然后通过
    给超级循环里面的处理任务发信号或者激活他们的方式来延迟事件的处理。

    以上两条适用于大部分外设事件,并且这类外设事件都有一个共同特点,就是事件的处理都可以被拆分成早期处理
和后期处理两部分,且是实时性要求高的部分仅仅是早期处理,后期处理的实时性要求则较宽松。对于另外一类特别
少见的情况——外设事件无法明确的按照上述要求拆分,或者说即便可以拆分,拆分出来的各个部分实时性要求依
然很高,则应该在中断处理程序中直接处理——这类情形特别少见,一个系统中往往只能同时存在极少数这类任务。
这类任务基本不能被视作为调度器管理的一部分。

出0入0汤圆

发表于 2013-3-8 13:05:52 | 显示全部楼层
Gorgon_Meducer 发表于 2013-3-8 01:03
对于中断或者说硬件事件要从两个层面来考虑:
1、该事件的实时性要求
    如果一个外设产生的事件实时性 ...

在这里我又有疑问了,注册一个周期性查询任务去处理中断,任务的周期不是由超级循环里面的任务整体
执行周期决定吧,你这个意思好象是说这个任务是一直存在的,然后就放在超级循环里,不去判断查询的
周期时间是否到,而是每次运行到这个任务就去执行,而且每个查询任务的周期不是一样了吗?我觉的应
该将各个周期性查询任务根据不同的周期由定时中断事件触发,将触发的查询任务放在任务队列中,再由
超级循环去执行


说到超级循环的任务整体执行周期,我还要问一下,刚开始你就说过“通过状态机结构,每一个任务都被
拆分成细小的步骤——也就是一个一个的状态代码——因此超级循环执行一圈的时间是极其短的”,所以
也能够像时间触发一样能够在准确的时刻执行,比方说我的程序中有一块是电机驱动,在控制电机时需要
以0.5ms的周期对电机芯片输出一定频率的驱动波形,如果不能以0.5ms的周期或者偏差过大的话,驱动波
形频率会出现变动,这样会导致电机匀速运转时有轻微抖动现象,所以这里采用超级循环的前提最好是它
的任务整体执行周期需要小于0.5ms吧,不知道我说的对不对?


中断处理程序不允许开嵌套,那如果在一个中断程序中,发生了另一个中断事情,在退出中断后会响应吗
,不然不是发生丢失了?其实就算开了中断嵌套,时间触发里面就说到也是有可能丢失中断的

出0入296汤圆

发表于 2013-3-9 17:13:42 | 显示全部楼层
本帖最后由 Gorgon_Meducer 于 2013-3-9 17:22 编辑
NIC 发表于 2013-3-8 13:05
在这里我又有疑问了,注册一个周期性查询任务去处理中断,任务的周期不是由超级循环里面的任务整体
执行 ...


1、对于查询周期的理解,是对的,就是一个一直存在的任务,以系统周期查询。这里的
     系统周期,就是超级循环循环一周的时间。但你后续的说法,我不加以评论,你思维
     已经被时间触发限制住了。你脑袋没有倒空,我说的东西你是听不进去的。或者说你
     只是想尽办法以先前接受的理论去理解别人给你说的一切东西。除非你完全放弃一切
     都是基于时间触发的概念,否则关于事件调度的东西,你都是无法真正领悟到,也
     无法针对具体应用熟练发挥的。同类问题我将不再赘述。当然,我也不过是一家之言。
     你也不必耿耿于胸。说不定你坚持的还是正确的呢?所以我们都可以保留自己的东西。
2、中断嵌套,当另外一个中断发生的时候,当前中断退出以后会继续执行另外一中断的
     处理程序。这个知识你应该仔细看看所用芯片的终端控制器。所谓丢失中断并不是说
     你没有及时响应就丢了,而是说,某一个中断,在你没有响应的期间,该中断又被
     触发了若干次,那么中断处理标志只有1个,而且不存在 buffer机制,所以,这若干次
     同一个中断的事件,相当于丢失了n-1次。
3、关于0.5ms的系统周期的判定是正确的。不过你不要以人类的感官来看待这个问题。
     对人类来说0.5ms是几乎无法想象时间,但对CPU来说,这是一个可以定量判定快慢
     的概念。比如,系统时钟是1M,意味着1个系统时钟周期就是1us。那么假如系统是
     8M,那么1us有几个系统周期呢?显然是8个。又因为1ms=1000us,所以,8M的
     的系统在0.5ms内能执行的系统周期数就是4000个。
     接下来,我教你如何粗略一个或一系列函数在数量级上所需的系统周期数。比如4000
     个系统周期,假设你的单片机是AVR或者ARM Cortex M系列的,则我们可以粗劣的
     认为1个系统周期就是一条指令,差不多就是1个系统周期对应2个字节的机器指令。
     那么4000个系统周期,意味着PC指针走过的指令流差不多是8000个字节,也就是8K
     那么你就可以看看你的主循环里面的程序,如果把循环拆分开(一个系统周期只执行
     一遍循环体),那你看看,你超级循环一圈所涉及的代码是否接近8K了。如果远远
     不足8K,那么你就可以初步放心了,如果接近或者超过了,那你就需要进一步精确   
     测定主循环的周期了。
     以上方法同样适用于中断处理程序所占用时间的估计。记住,为了系统的栈存在确定性,
     所以中断是不允许嵌套的,就是为了执行中断处理程序的时候,不至于让别的中断存在
     上文所说的中断丢失(其实是中断覆盖),所以中断处理程序才需要尽可能的短。至于
     是否足够短,可以运用刚才说的方法来定量评估。

希望这些方法能对你有用,切忌不可以凭空感觉一个中断信号或者时间要求是快还是慢,
对CPU来说,它的时间概念和人类是不同的,他的时间是可以定量评估的。
     

出0入0汤圆

发表于 2013-3-9 23:44:22 | 显示全部楼层
本帖最后由 NIC 于 2013-3-10 00:01 编辑
Gorgon_Meducer 发表于 2013-3-9 17:13
1、对于查询周期的理解,是对的,就是一个一直存在的任务,以系统周期查询。这里的
     系统周期,就是 ...


谢谢傻孩子的耐心详细的讲解。关于0.5ms那个任务,如果超级循环跑一圈的时间是0.1ms,这个任务的执行时间上的误差为0.1/0.5=20%,应该就要看实际的要求了,就像你之前说的实时性,
但为以后可能考虑到不断在超级循环中增加新的任务,我觉得应该先留有充足的余量去考虑这个问题

出0入296汤圆

发表于 2013-3-10 02:43:24 | 显示全部楼层
NIC 发表于 2013-3-9 23:44
谢谢傻孩子的耐心详细的讲解。关于0.5ms那个任务,如果超级循环跑一圈的时间是0.1ms,这个任务的执行时间 ...

其实我想你现在一定也理解了,无论是中断还是超级循环,我们拥有的不过是
单位时间内同一片系统周期,如果理论上这些周期就不够满足应用要求,那怎
么折腾都不行。剩下的,就看怎么合理安排了。

对于那些真正超级循环都无法保证实时性的任务,那就显然是实时性超高的任
务,放到中断里面直接处理没商量的。不过我想,大部分情况下都不会那么糟
糕。
其实有一句很有争议的话是这么说的:操作系统永远只能接近或达到状态机所
能达到的最好实时性,但永远无法超越它。
还有一句话是我说的,估计也是蛮有争议的:无理由的迷信中断,你也许能获
得一两个"胜利"但很可能会输掉整个"战争"。

出0入0汤圆

发表于 2013-3-10 15:41:29 | 显示全部楼层
本帖最后由 NIC 于 2013-3-10 15:58 编辑
Gorgon_Meducer 发表于 2013-3-10 02:43
其实我想你现在一定也理解了,无论是中断还是超级循环,我们拥有的不过是
单位时间内同一片系统周期,如 ...


"操作系统永远只能接近或达到状态机所能达到的最好实时性,但永远无法超越它",是不是说操作系统上的调度算法等因素造成的,这个我就以后慢慢体会了
但我总觉得只对于一个时间上要求严格的周期性任务来说,采用时间片的方法的话,在任务运行时刻上的准确度来说,在基于每个任务执行时间很短的前提下,
它的最大误差也就是因调度算法造成的运行时刻的误差(即对所有任务下一个运行时刻的刷新以及判断是否已到执行时间,这个误差应该是很小很小的),
以后增加任务也差不多就这个误差,而不像超级循环执行一圈时间越长误差越大,可能我太钻牛角了,哈,但还是想把这个彻底搞明白

出0入296汤圆

发表于 2013-3-10 21:27:23 | 显示全部楼层
NIC 发表于 2013-3-10 15:41
"操作系统永远只能接近或达到状态机所能达到的最好实时性,但永远无法超越它",是不是说操作系统上的调度 ...

道理就这些,能帮你的就这些了。我也是这么走过来的。有一件事情我印象深刻,
我那时候也是抓住"时间严格"的任务不放,结果思路阻塞了好久,现在好后悔,不过
似乎每个人都是这样过来的。做思维训练的时候,先要发散,不要因为一两个点就停
下来,先发散,回头再来看那些点,会有完全不同的理解和深度。

出0入0汤圆

发表于 2013-3-10 23:13:26 | 显示全部楼层
Gorgon_Meducer 发表于 2013-3-10 21:27
道理就这些,能帮你的就这些了。我也是这么走过来的。有一件事情我印象深刻,
我那时候也是抓住"时间严格 ...


这么多天你已经给我很多帮助了,我也不纠结于这点了,感谢傻孩子,以后要多多拜读你的帖子

出0入0汤圆

发表于 2013-3-23 11:36:43 | 显示全部楼层
厂家pcb专业打样,抄板,画板!买五送一,一律95折,四层板400元, 三天出货  价格优惠!多层板加急!品质保证qq275976130 朱工13410685530 新客户打样给予48小时打样免加急费  24小时加急100元

出0入0汤圆

发表于 2013-3-24 16:28:43 | 显示全部楼层
学习学习
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-29 15:40

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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