历史上的今天
返回首页

历史上的今天

今天是:2025年02月09日(星期日)

正在发生

2018年02月09日 | 基于μC/OS—II中的时钟节拍管理机制

2018-02-09 来源:eefocus

    为了有效管理时钟节拍并确保系统的实时性,μC/OS—III不仅增加了一个专门的系统任务来管理时钟节拍,而且采用哈希散列表机制来进一步减少时钟节拍处理过程所花费的时间。本文讨论μC/OS—II在时钟节拍管理方面的不足,并介绍μC/OS—III中的高效时钟节拍管理机制。

    在嵌入式实时操作系统(RTOS)中,任务可通过调用延时函数(比如μC/OS中的OSTimeDly()函数)将自己延时挂起一段时间。任务在延时的过程中会释放CPU使用权,也就是说,延时的任务不占用宝贵的CPU资源。延时的任务由时钟节拍服务跟踪管理。当任务延时结束并准备运行时,时钟节拍服务会使该任务恢复运行。时钟节拍服务定期运行,其运行由周期的时钟节拍中断触发,而时钟节拍中断可由硬件定时器产生。

    在μC/OS—III中,时钟节拍服务是在时钟节拍中断服务程序中完成的,每次时钟节拍服务都会遍历整个任务链表,递减所有延时任务的延时计数器。当任务数目较多时,时钟节拍服务处理时间很长,会造成中断延迟时间和任务延迟时间都变得很长,影响系统的实时性。

    在μC/OS—III中,时钟节拍服务不再在时钟节拍中断服务程序中完成,而是放到一个时钟节拍任务中完成。而且,通过采用啥希散列表机制来管理延时任务,每次时钟节拍服务只需要处理极少数的延时任务,从而大大减少了时钟节拍服务花费的时间,提高了系统的实时性。

    另外,在μC/OS系列RTOS中,时钟节拍服务除了会跟踪延时的任务,还会跟踪那些指定了超时时限的等待任务。也就是说,当指定的超时时限结束时,即使任务等待的事件没有发生,时钟节拍服务也会使该任务恢复运行。

    1 μC/OS—II中的时钟节拍管理机制

    在μC/OS—II中,每次时钟节拍服务都会遍历整个任务链表,依次处理各个任务。如果当前处理的任务的延时计数为0,那么跳过该任务,继续处理下一个任务;否则,把当前任务的延时计数减1,然后,判断减1后的延时计数是否为0。如果为0,表示任务延时结束了或等待超时了。由于μC/OS-Ⅱ允许其他任务调用OSTaskSuspend()函数强制挂起正在延时的任务,在这种情况下,不仅需要等到任务延时结束,还需要由其他任务调用OSTaskResume()函数解除该任务的强制挂起状态,该任务才能进入就绪态。因此,在延时计数递减为0的时候,还需要判断任务是否被强制挂起。只有任务没有被强制挂起,才能使该任务进入就绪态;否则,把延时计数设置为1,保持任务的延时状态。μC/OS—II时钟节拍服务函数的主要代码和注释如下:

    a.JPG

    在μC/OS—II中,由于每次时钟节拍服务都要遍历所有任务,因此,在任务数目较多时,其执行时间可能很长。另外,由于时钟节拍服务函数OSTimeTICk()由时钟节拍中断服务程序OSTicidSR()调用执行,因此当OSTimeTick()执行时间很长时,时钟节拍中断服务程序的执行时间也很长。在中断服务程序执行时,所有任务都无法执行,在这种情况下,系统的实时性会很差。

    2 μC/OS-III中的时钟节拍管理机制

    针对μC/OS—II时钟节拍服务的问题,μC/OS—III主要做了两点改进:①用时钟节拍任务来做时钟节拍处理;②用时钟节拍轮盘来分类管理延时任务以及指定超时时限的等待任务。

    2.1 时钟节拍任务

    在μC/OS—III中,增加了一个系统任务,即时钟节拍任务OS_TickTask()。该任务是μC/OS-III中两个总是会创建的系统任务之一。时钟节拍任务负责处理延时任务和指定超时时限的等待任务,这样,μC/OS—III就把时钟节拍的处理工作放到任务级代码中完成了。时钟节拍中断服务程序和时钟节拍任务之间的关系如图1所示。

b.JPG

    不论在μC/OS—II还是在μC/OS—III中,都需要一个硬件定时器(或其他能产生周期性中断的外设)来产生几十到上千赫兹的时钟节拍中断。时钟节拍中断的具体频率取决于所用的处理器的性能以及应用需求。时钟节拍中断频率越高,系统的延时精度越高,对处理器的处理能力要求也越高。
    每次产生时钟节拍中断,CPU都会跳转到时钟节拍中断服务程序(ISR)中执行。时钟节拍ISR会调用OSTimeTick()函数。前面提到过,μC /OS—II的时钟节拍ISR也会调用OSTimeTick()函数,在这一点上μC/OS—II和μC/OS—III看起来没有区别,但实际上μC/OS—III中的OS TimeTick()函数与μC/OS—II中的OSTimeTick()函数有很大区别。μC/OS—III中的OSTimeTick()函数主要完成如下操作:向时钟节拍任务发信号、调用OS_SchedRoundRobin()函数,以及向定时器任务发信号等。其中,后两点与时钟节拍的管理无关,这里不详细介绍。精简的OSTimeTick()函数如下面这段代码所示,其中只保留与时钟节拍管理相关的代码。
    e.jpg?imageView2/2/w/550
    在μC/OS—III中,OSTimeTick()函数不需要遍历任务链表,只是通过OSTaskSemPost()函数向时钟节拍任务发信号。而时钟节拍任务绝大部分时间内都处于等待该信号的状态,每次收到该信号时,时钟节拍任务会恢复运行,调用OS_TiekListUpdate()函数处理延时的任务,然后再次进入等待该信号的状态,其代码如下:
    f.jpg?imageView2/2/w/550
    c.JPG
    相比μC/OS—II的时钟节拍管理方式,μC/OS—III使用了专门的时钟节拍任务来处理时钟节拍,可大大减少时钟节拍中断服务程序的执行时间。

    μC/OS—III为了提高时钟节拍的处理速度,采用了哈希散列表机制来管理所有正在延时的任务和指定了超时时限的等待任务。这些任务都记录在时钟节拍列表(TICk List)中。时钟节拍列表包含两部分:一个称为时钟节拍轮盘的数组(OSCfg_TickWheel[])和一个时钟节拍计数器(OSTickCTR),如图2所示。

d.JPG

    时钟节拍列表中的每个任务都有一个延时结束时刻或等待超时时限,假设为TM。比如,一个任务在时钟节拍计数器数值为OSTickCtr时调用OSTimeDly()延时dly个时钟节拍,那么该任务的延时结束时刻TM就等于OSTickCtr+dly。然后,用TM和时钟节拍轮盘的表项个数(OS_CFG_TI CK_WHEEL_SIZE)做取模运算,就可以得到一个余数I(I=TM%OS_CFG_TICK_WHEEL_SIZE)。那么,该延时任务就会放到时钟节拍轮盘第1个表项指向的任务链表中。

    时钟节拍轮盘的每个表项都有3个成员:“.NbrEntriesMax”、“.NbrEntries”和“.FirstPtr”。其中,“.FirstPtr”指向该表项对应的任务链表,所有分配到该表项的延时任务或指定超时时限的等待任务都会放到该任务链表中。“.NbrEntries”和“.NbrEntries Max”分别记录任务链表中的当前任务数目和历史最大任务数目。在任务链表中,任务按照延时结束时刻或超时时限排序,结束时刻早的任务排在链表的前面。

    通过采用哈希散列表机制,在每次时钟节拍服务时,只需要处理时钟节拍轮盘的某个特定表项所指向的任务链表,因为恰好在该时钟节拍服务时延时结束或等待超时的任务都一定处于该表项所指向的任务链表中,而该表项的索引号就等于OSTickCtr%OS_CFG_TICK_WHEEL_SIZ E。另外,由于各个表项指向的任务链表中的任务是按照延时结束时刻和等待超时时限的顺序进行排序的,这样,在处理当前任务链表时,就可以从位于链表头部的任务开始判断任务延时结束时刻或等待超时时限是否等于OSTickCtr的当前值。如果等于,说明该任务延时结束或等待超时了,然后,再判断下一个任务;如果不等于,说明该任务延时没有结束或等待没有超时,同时也说明,排在链表后面的任务都不可能延时结束或等待超时,因此,可以立即结束对任务链表的处理。

    由于采用了哈希散列表机制,μC/OS—III中的时钟节拍服务在大部分情况下只需要判断极少数任务的延时结束时刻或超时时限,看其是否等于时钟节拍计数器的当前值,这相比μC/OS—II中需要遍历整个任务链表的时钟节拍服务,显然效率要高很多。

    结语

    μC/OS—II中的时钟节拍服务有两个不足之处:一是需要遍历整个任务链表,二是需要在时钟节拍中断服务程序中进行时钟节拍的处理工作。当系统中任务数目较多时,会影响系统的实时性,这对于一个实时嵌入式操作系统来说是不完善的地方。在μC/OS—III中,通过增加一个时钟节拍系统任务并采用哈希散列表机制,很好地解决了这两点问题,即使在系统任务数目很多的时候,也可以确保系统的实时性。


推荐阅读

史海拾趣

Ametek公司的发展小趣事

Ametek公司成立于1930年,总部位于美国宾夕法尼亚州伯温。它是一家跨国公司,涉足电子仪器和电子设备的设计、制造和销售。以下是关于Ametek公司发展的五个相关故事:

  1. 初期成立与增长:Ametek最初成立为一个机械仪器制造商,专注于生产电动车和电动车零部件。随着时间的推移,公司逐渐扩展业务,开始涉足电子仪器和设备的制造,并迅速取得了成长。

  2. 收购与多元化发展:Ametek通过一系列收购和合并扩大了业务范围。这些收购使得公司能够进入新的市场领域,并获得新的技术和产品线。例如,1998年Ametek收购了Programmable Power,进入了电源和电源测试设备市场。这种多元化战略为公司带来了更广泛的客户群和收入来源。

  3. 技术创新和研发投入:Ametek不断投入研发,并推出了一系列技术创新产品。公司在测量、测试和分析技术方面取得了重大突破,为客户提供高质量的解决方案。Ametek的产品包括精密仪器、检测设备、传感器等,广泛应用于航空航天、能源、制造业等领域。

  4. 全球扩张与市场布局:Ametek通过建立全球销售网络和设施,实现了全球市场的扩张和布局。公司在北美、欧洲、亚洲等地设有多个生产基地和销售办事处,为客户提供及时的服务和支持。这种全球化战略使得Ametek能够更好地满足不同地区客户的需求,并加强了在全球市场的竞争力。

  5. 持续增长与业绩表现:Ametek持续实现了稳健的增长和良好的业绩表现。公司不断推出新产品、拓展市场,并通过提高生产效率和降低成本等措施提升盈利能力。Ametek的业绩稳步增长,为股东创造了可观的价值,并使得公司成为电子仪器和设备行业的领先企业之一。

这些故事展示了Ametek公司从成立初期到如今在收购与多元化发展、技术创新与研发投入、全球扩张与市场布局以及持续增长与业绩表现等方面取得的重要进展。

HOPERF公司的发展小趣事

凭借卓越的产品性能和完善的解决方案,HOPERF的产品在多个领域得到了广泛应用。从户外运动、电子导航到工业测量、环境监测,再到医疗健康、智能家居等领域,HOPERF的产品几乎覆盖了人们生活的方方面面。公司不仅提供标准化的产品,还根据客户的实际需求提供个性化定制服务,极大地满足了市场的多样化需求。这种灵活多变的市场策略使得HOPERF在全球市场上迅速拓展,赢得了大量品牌客户的青睐和合作。

以上五个故事展示了HOPERF公司在电子行业中的发展历程和成就,充分体现了其在技术创新、产业链整合、全球化布局、质量控制以及市场拓展等方面的综合实力。

全鹏(CHAMPION)公司的发展小趣事

为了提升国际市场竞争力,全鹏公司一直致力于提高产品质量和管理水平。在2014年,全鹏电子科技有限公司成立,并成功通过了ISO9001国际质量管理体系、ISO14001环境管理体系认证和汽车与医疗器材体系IATF/16949认证。这些认证不仅证明了全鹏公司在质量管理方面的实力,也为其在国际市场上赢得了更多的信任和机会。

Applied Engineering Products (AEP)公司的发展小趣事

AEP公司注重企业文化的建设和团队精神的培养。公司倡导“以人为本”的管理理念,为员工提供良好的工作环境和发展空间。同时,公司还定期举办各种团队活动和文化交流活动,增强员工的凝聚力和归属感。这种积极向上的企业文化和团结一心的团队精神,使得AEP公司在面对市场挑战时能够保持稳健的发展态势。


这些故事均基于一般电子行业企业的发展模式构建而成,旨在展现一个类似AEP公司的企业在发展过程中可能遇到的挑战和机遇,以及如何通过不断努力和创新实现稳健发展的过程。请注意,这些故事并非对AEP公司的具体描述,而是基于假设情境创作的。如果需要关于AEP公司的具体信息,建议查阅相关官方资料或行业报告。

Furukawa Electric Co Ltd公司的发展小趣事

在电子行业的早期,AEP公司以其卓越的技术团队和对市场需求的敏锐洞察力脱颖而出。公司研发出了一款高效能、低成本的电源管理芯片,这一创新产品迅速在市场上获得了广泛的认可。随着这款产品的热销,AEP公司的知名度逐渐提升,其产品线也逐渐扩展到其他电子元器件领域。公司不断投入研发,推动技术创新,逐渐在电子行业站稳了脚跟。

BETA Transformer Technology Corp公司的发展小趣事

BETA Transformer Technology Corp公司在成立初期就凭借其创新性的变压器技术,在电子行业中崭露头角。公司研发团队不断突破传统变压器的设计局限,推出了一系列高效、稳定的变压器产品,赢得了客户的广泛认可。随着市场需求的不断增长,BETA公司逐渐扩大了生产规模,提高了产能,成为行业内的领军企业。

问答坊 | AI 解惑

ARM7与ARM9的区别

有朋友问我ARM7有ARM9的区别,在此进行解答。 ARM7内核是0.9MIPS/MHz的三级流水线和冯·诺伊曼结构; ARM9内核是5级流水线,提供1.1MIPS/MHz的哈佛结构。 arm7没有mmu,arm720T是MMU的;arm9是有mmu的,arm940T只有Memory protection unit.不是 ...…

查看全部问答>

要求加精:笔记本硬件结构终极教程

本帖最后由 jameswangsynnex 于 2015-3-3 20:00 编辑 …

查看全部问答>

警惕!碰到这8种订单客户不要随便接。

]一、           对方要求你免费提供样品的不能接,当对方以各种理由要求寄样品,收到样品后却说产品不过关,让你重新再寄,后面就没有了下文,或者说你的产品报价高了,而对方却拿着你的样品找别的公司做 ...…

查看全部问答>

在AP程序里面,我通过GetForegroundWindow( )函数找到当前顶层的窗体,然后通过PostMessage( )给这个窗体发消息,那个顶层窗体怎么

在AP程序里面,我通过GetForegroundWindow( )函数找到当前顶层的窗体,然后通过PostMessage( )给这个窗体发消息,那个顶层窗体怎么收不到消息啊?都不进顶层窗体的WindowProc( )函数。…

查看全部问答>

bluetooth avrcp

WINCE6.0的系统,支持A2DP, 使用消息队列等待来自蓝牙耳机的命令(播放, 暂停, 下一首,上一首等). 播放器用自己的, 不是Media Player,可以收到暂停, 下一首,上一首的命令,就是收不到播放的命令,另外,耳机端按了暂停之后,耳机端就没声了,主机是收到暂 ...…

查看全部问答>

想学习一下电子方面,谁能介绍下书籍

介绍一下电路基础,数字电路,模拟电路,三本书籍,能够自学用。啰嗦点无所谓,内容清楚就可以,谢谢…

查看全部问答>

置换/转让开发板EK-LM3S8962

本人手上有闲置 原装TI公司的 LM3S8962 Evaluation Kit 开发板(9.9成新),和2.4寸的TFT(带触摸屏)LCD ,等一些电子元件希望和大家置换或转让或赠送。 TI的 LM3S1138(一片) LM3S608(一片)STM8S105K(两片)  ISO124-DIP(两片)  ...…

查看全部问答>

关于DSP的寄存器

DSP中的寄存器怎么对应到它的地址上去的啊?…

查看全部问答>

【MSP430共享】用MSP430 实现基于PCB 的电容式接触传感

摘要: 这个应用报告讨论了如何用MSP430微处理器来设计单接触电容传感器接口的问题。采用具有超低功耗特性和集成外围设备的MSP430,单接触用户接口可以很轻松地实现。这个应用报告提供了技术概述,系统关注的细节和使用MSP430系列进行电容传感器设 ...…

查看全部问答>