|
闂傚倸鍊搁崐鎼佸磹閻戣姤鍤勯柛顐f礀缁犵娀鏌熼崜褏甯涢柛濠傜埣閺屾盯顢曢悩鎻掑缂佺偓鍎抽…鐑藉蓟閻旂厧绀堢憸蹇曟暜濞戙垺鐓熼柟鎯ь嚟濞叉挳鏌$仦鍓ф创妞ゃ垺娲熼、鏇綖椤撶姷娉块梻鍌欐祰椤曆勵殽韫囨洘宕叉繝闈涱儏閽冪喖鏌ㄥ☉妯侯仱闁稿鎹囬弫鎰償濠靛牏娉块梻浣告惈濡盯宕戦妶澶婅摕闁绘梻鈷堥弫宥嗙箾閹寸偟鎳愭俊顐㈠暙铻栭柣姗€娼ф禒锕傛煥濮樿埖鍋傞柕鍫濇川绾捐棄霉閿濆牏鏌堢紓鍌涚閵囧嫰鍩為崹顔碱瀳闂佸疇顫夐崹鍧楀极瀹ュ绀嬫い鎰ㄥ墲濠⑩偓闂傚倷鑳舵灙閼峰酣鏌涢妷鎴濇媼閸炵敻姊绘担鑺ョ《闁革綇绠撻獮蹇涙晸閿燂拷
|
缂傚倸鍊搁崐鎼佸磹閹间礁纾归柟闂寸绾惧綊鏌熼梻瀵割槮缁炬儳婀遍幉鎼佹偋閸繄鐟查梺绋款儏椤戝棛鎹㈠┑鍥╃瘈闁稿本绮岄。娲⒑缂佹ɑ灏扮紒璇茬墦瀵濡搁埡鍌氫簽闂佺ǹ鏈粙鎴︻敂閿燂拷
|
IC
|
闂傚倸鍊搁崐鎼佸磹妞嬪海鐭嗗〒姘e亾妤犵偞鐗犻、鏇㈡晝閳ь剛绮婚悩鑽ゅ彄闁搞儯鍔嶉幆鍫ユ煠閺夋寧鍋ラ柡灞剧洴閺佸倻鎷犻幓鎺旑啋缂傚倷璁查崑鎾斥攽閻樺弶澶勯柛濠勬暬閺屻劌鈹戦崱娑扁偓妤€顭胯濠㈡﹢鍩ユ径鎰鐎规洖娉﹁閺岋紕浠︾拠鎻掝潎闂佽鍠撻崐婵嗙暦閹烘垟妲堟慨妤€妫旂槐锟�
|
缂傚倸鍊搁崐鎼佸磹閹间礁纾瑰瀣椤愪粙鏌ㄩ悢鍝勑㈢紒鎰殕娣囧﹪濡堕崒姘闂備椒绱徊浠嬪床閼煎墎浜芥繝鐢靛仜濡盯宕戦幘鎵挎帡鏁撻敓锟�
|
濠电姷鏁告慨鐑藉极閹间礁纾婚柣鎰惈閸ㄥ倿鏌涢锝嗙缂佺姴缍婇弻宥夊传閸曨剙娅i梺娲诲幗椤ㄥ﹪寮诲☉銏犵疀闂傚牊绋掗悘渚€姊洪柅鐐茶嫰婢ь噣鏌涙繝鍌涘仴鐎殿噮鍋婇獮妯肩磼濡粯顏熼梻浣芥硶閸o箓骞忛敓锟�
|
闂傚倸鍊搁崐鎼佸磹閻戣姤鍤勯柤鍝ユ暩娴犳氨绱撻崒娆掑厡缂侇噮鍨堕妴鍐川閺夋垹鍘洪梺鍝勫€哥花鍗炍i崼銉︾厪闊洤艌閸嬫捇宕楅崨顔间簼闂傚倸鍊峰ù鍥р枖閺囥垹闂柨鏇炲€哥粻顖炴煥閻曞倹瀚�
|
闂傚倸鍊搁崐鎼佸磹閻戣姤鍊块柨鏇炲€归崕鎴犳喐閻楀牆绗掗柛銊ュ€婚幉鎼佹偋閸繄鐟查梺绋匡龚閸╂牠骞堥妸銉庣喓鎹勯妸褏鍕樺┑鐘愁問閸犳绻涙繝鍥ц摕闁靛ň鏅滈崑鍡涙煕鐏炲墽鈽夋い蹇ユ嫹
|
闂傚倸鍊搁崐鎼佸磹閻戣姤鍤勯柛鎾茬劍閸忔粓鏌涢锝嗙闁汇倝绠栭弻锝夊箛椤撶姰鍋為梺鍝勵儏缁夊綊寮婚妸銉㈡斀闁糕檧鏅滆倴闂備線鈧偛鑻崢鍝ョ磼閼搁潧鍝虹€殿噮鍋婇獮妯肩磼濡粯顏熼梻浣芥硶閸o箓骞忛敓锟�
|
闂傚倸鍊搁崐鎼佸磹閻戣姤鍊块柨鏇楀亾妞ゎ亜鍟村畷褰掝敋閸涱垰鏁搁梻渚€鈧偛鑻晶鎵磼鏉堛劌娴鐐存崌楠炴帒鈹戦崼婵囧€梺璇叉唉椤煤濡厧鍨濋柟鎹愵嚙閺嬩線鏌熼崜褏甯涢柡鍛倐閺屻劑鎮ら崒娑橆伓
|
闂傚倸鍊搁崐鎼佸磹妞嬪海鐭嗗〒姘e亾妤犵偞鐗犻、鏇㈡晝閳ь剟鎮块鈧弻锝呂旈埀顒勬偋婵犲洤鐭楅煫鍥ㄧ⊕閻撶喖鏌熸潏鍓хɑ妞ゃ儱顦甸弻娑橆潩椤掑倻楔闂佸搫琚崝鎴﹀箖閵堝纾兼繛鎴烇供娴硷拷
|
婵犵數濮烽弫鍛婃叏閻戣棄鏋侀柟闂寸绾惧鏌i幇顒佹儓闁搞劌鍊垮濠氬醇閻斿墎绻侀梺鎼炲€栧ú鐔煎箖鐟欏嫨鍋婇悷浣靛€愰崑鎾诲焵椤掑嫭鐓涢悗锝庝簽鏁堥梺鍝勮閸旀垿骞冮妶澶婄<婵炴垶锕╂导锟�
|
闂傚倸鍊峰ù鍥敋瑜嶉湁闁绘垼妫勯弸浣糕攽閻樺疇澹樼痪鎹愵嚙閳规垿鎮╅崣澶嬫倷缂備焦鍔栭〃鍡樼┍婵犲洤围闁告侗鍘藉▓銊╂⒑缂佹ê绗掗柨鏇ㄤ邯瀵濡搁埡鍌氫簽闂佺ǹ鏈粙鎴︻敂閿燂拷
|
缂傚倸鍊搁崐鎼佸磹閹间礁纾瑰瀣捣閻棗銆掑锝呬壕闂佽鍨伴惌鍌氱暦閹烘垟鍫柛娑卞灲缁辫櫕绻濆▓鍨灍閺嬵亪鏌涢埡鍌滃⒌鐎规洘娲栭鍏煎緞鐎n剙寮抽梻浣虹帛濞叉牠宕愰崷顓涘亾濮樼偓瀚�
|
闂傚倸鍊搁崐鎼佸磹妞嬪海鐭嗗ù锝堟缁€濠傗攽閻樻彃鈧绱撳杈ㄥ枑闁哄啫鐗勯埀顑跨窔瀵粙顢橀悙鑼垛偓鍨攽閿涘嫬浠х紒顕呭灦瀵偊鎮╃紒妯锋嫼闂備緡鍋嗛崑娑氱矓閻㈢鍋撳鐐
|
|
闂傚倸鍊搁崐鎼佸磹閻戣姤鍤勯柛鎾茬閸ㄦ繃銇勯弽顐粶闁哄嫨鍎甸弻娑㈩敃閻樻彃濮庨梺绋胯閸斿矂婀侀梺缁樏Ο濠囧磿韫囨洜纾奸柣妯挎珪缁跺弶銇勯鐐村仴闁硅櫕绮撳Λ鍐ㄢ槈濮楀棙缍嬮梻鍌氬€搁崐鎼佸磻閸℃稑鍨傞柛顐f礀閽冪喖鏌曟繛鐐珕闁稿妫濋弻娑氫沪閸撗€妲堝銈呴獜閹凤拷
|
闂傚倸鍊搁崐鎼佸磹閻戣姤鍊块柨鏇炲€归崕鎴犳喐閻楀牆绗掗柛銊ュ€块弻锕€螣娓氼垱小缂傚倸鍊瑰銊╁箟閸涘﹥鍎熼柕濞垮劤閻ゅ嫰姊洪棃娴ュ牓寮插☉銏″亗婵炴垯鍨洪悡鏇㈡倶閻愭彃鈷旈柍钘夘槹閵囧嫰顢曢鍌滅槇濠殿喖锕ㄥ▍锝夊箲閸曨垰惟闁靛濡囪ぐ姘舵⒒娴g儤鍤€闁搞倖鐗犻獮蹇涙晸閿燂拷
|
LED闂傚倸鍊搁崐宄懊归崶顒夋晪鐟滃繘骞戦姀銈呯婵°倐鍋撶痪鎯ф健閺岀喐娼忛崜褏鏆犵紓浣哄閸ㄥ爼寮婚妸鈺傚亞闁稿本绋戦锟�
|
闂傚倸鍊搁崐鎼佸磹閻戣姤鍤勯柛鎾茬閸ㄦ繃銇勯弽銊х煁闁哄棙绮撻弻鐔兼倻濮楀棙鐣烽梺鍝勬噺缁诲牓寮婚弴鐔风窞闁割偅绻傛慨澶愭⒑鐞涒€充壕闂佹寧娲栭崐褰掓偂閸愵亝鍠愭繝闈涱儏缁狀垶鏌ㄩ悤鍌涘
|
您现在的位置: 华玉生活网 >> 技术文库 >> 无线 >> 正文>> 繁体中文

μC/OS-II中缩短中断关闭时间的方法

引言在实时操作系统中,由于是多任务的并发运行,所以在进入一些临界区时为了保证多任务的正常运行要关中断。而最大关中断时间是衡量一个实时操作系统性能的重要指标,因为外部的输入一般都是通过中断方式来通知系统的,系统如果关中断时间长,必然不能及时接收中断,对中断的及时处理就更谈不上。更重要的是,有些应用场合对关中断的时间有非常严格的要求。例如,在电力系统微机继电保护装置中,对电流A/D采样时,为了保障对采样

引 言

在实时操作系统中,由于是多任务的并发运行,所以在进入一些临界区时为了保证多任务的正常运行要关中断。而最大关中断时间是衡量一个实时操作系统性能的重要指标,因为外部的输入一般都是通过中断方式来通知系统的,系统如果关中断时间长,必然不能及时接收中断,对中断的及时处理就更谈不上。

更重要的是,有些应用场合对关中断的时间有非常严格的要求。例如,在电力系统微机继电保护装置中,对电流A/D采样时,为了保障对采样值的正确处理,定时中断的每一个周期时间都必须及时采样。试想,如果定时器设置的周期时间到,定时器中断产生,但恰恰这时系统处于关中断时间,系统就不能及时进行采样;而当关中断时间过长,超过一定的值时,系统再来进行采样,依据此采样值的计算结果就会出错。所以,在这样的场合中,一种实时操作系统的最大关中断时间就成为该种实时操作系统能否成功运用的最关键的因素。

笔者将以μC/OS-II实时内核为例,通过对μC/OS-II的改进,向读者描述一种缩短实时操作系统中断关闭时间的方法。之所以选择μC/OS-II,一是因为读者容易获得相关代码,国内很多读者也对μC/OS-II有一定程度的了解;二是因为其自身结构简单,适合运用于低档嵌入式处理器,关中断时间的问题更加突出。低档嵌入式处理器的处理速度慢,在关中断时间里处理相同的软件代码,花费的时间更长,相对地延长了关中断时间,这时尽量从软件着手解决关中断时间的问题。

1 系统状态标志法概述

μC/OS-II中在进入临界区之前为什么要关闭中断?通过相关资料[1]的介绍和对μC/OS-II源代码的理解,我们知道在μC/OS-II中一旦不关中断就进入临界区。当某一任务进入临界区时,若恰好发生中断,那么这时有可能引起两种对临界区操作的冲突:①在中断服务程序中要操作同一临界区;②因为中断的产生而引起任务的转换,在新的任务中要操作同一临界区。所以μC/OS-II中在进入临界区前要关闭中断。

针对μC/OS-II关中断机制的分析,考虑用一种系统状态标志法来解决这样的临界冲突。在μC/OS-II增加一个全局布尔变量来表示系统的状态,称为"系统状态标志"。

对于μC/OS-II中所有可以在中断中出现又要对临界区操作的函数,可以在进入临界区之前先查询系统状态标志。如果目前系统没有进入临界操作状态,则首先将该标志置位,表示系统进入临界操作状态,然后该函数就可以操作临界区;而如果发现系统已进入临界操作状态,则将该函数对临界区操作的部分单独形成一个函数,放到一个系统循环函数数组里,等待系统任务调度时执行。

对于μC/OS-II中所有不可能在中断程序中出现而又要对临界区操作的函数,因为函数不在中断中出现,所以函数开始时系统状态标志肯定不会在临界操作状态,因此可在函数操作临界区时直接将系统状态标志置位,表示系统进入临界操作状态,然后即可进行临界区的操作。

系统状态标志的复位在任务调度函数中执行。当然对系统状态标志的设置是要在关中断的条件下执行的,这应该算是系统新的一个临界区。

2 该方法的具体实现

下面以对μC/OS-II v2.61代码的改进为例,具体讲解该方法的具体实现。 2.1 任务调度函数OS_Sched的修改

修改后的任务调度函数OS_Sched的伪代码如下:



因为在任务调度函数OS_Sched中要执行循环函数数组里的函数,同时还要对系统状态标志复位,退出系统临界操作状态,所以修改过的函数在遇到以下3种情况--该函数是在中断里调用时、在任务调度锁定时、当前任务就是最高优先级任务时,都将执行系统循环函数数组里的函数,并将系统状态标志复位,而原任务调度函数在遇到以上3种情况时是直接返回的。

2.2 增加任务重调度函数OS_Resched

任务重调度函数OS_Resched的伪代码如下:

任务重调度函数在以下两处执行:

(1) 当μC/OS-II将当前任务控制块压栈,而还没有将最高优先级任务的控制块弹出栈时执行,因为这时在系统循环函数数组里有可能还有未执行的函数,这些函数的执行有可能导致另外一个更高优先级任务的就绪。
(2) 在中断服务函数的末尾执行。如果μC/OS-II中断返回函数返回的是一个真值,则表示需要执行重调度函数,这时就要执行重调度函数。

2.3 中断返回函数OSIntExit的修改

中断返回函数OSIntExit的伪代码如下:

原函数的返回是void,而改动后的函数返回一个布尔量,用来表示下一步是要正常中断返回(返回布尔假值时),还是要调用任务重调度函数(返回布尔真值时);同时,改动后还增加对系统状态标志的查询,如果发现系统在临界操作状态,则直接返回布尔假值。所以在中断服务程序的最后不是象原来那样简单的调用,而是调用后根据返回值作相应的处理。

2.4 信号量发送函数OSSemPost的修改

这里将以信号量发送函数OSSemPost为例来描述对可在中断中调用而又会对临界区操作的函数的改进。对于μC/OS-II中的其他函数,改进的方法大致相同。

信号量发送函数OSSemPost的伪代码如下:

在这里,改动后的函数将先判断系统状态标志,如果系统在临界区操作状态,则将临界操作作为另一个函数放入全局函数循环数组,等待在任务调度时执行,如果不在临界区操作状态,则关中断后将系统状态标志置位,然后开中断进行原函数的那些临界操作和任务调度。

2.5 信号量等待函数OSSemPend的修改

同理,这里以信号量等待函数OSSemPend为例来描述对不能在中断中调用而又会对临界区操作的函数的改进。

信号量等待函数OSSemPend的伪代码如下:

在这里,改动后的函数先将系统状态标志置位,然后进行原来函数的临界区操作。需要说明的是,对于函数因为等待信号量时间到、还未获取信号量而返回的情况的处理机制,改动后的函数与原函数不同,改动后的函数将OS_EventTO函数放到时间节拍函数OSTimeTick中执行,并将OS_EventTO函数的输入参数由原来的事件pevent指针,改为任务控制块指针ptcb,因为在函数OSTimeTick中是按照任务控制块指针操作的。

结语

上述方法已经在笔者的一个电力微机继电保护项目中成功运用,该方面的实现,提高了μC/OS-II的性能,扩大了μC/OS-II的应用范围,使得单边及工程师能更好的利用μC/OS-II提高嵌入式软件编程水平。特别要说明的是,虽然笔者是以μC/OS-II为例来介绍的,但该方法的原理可以运用到其他实时操作系统上,笔者正在将该方法在实时操作系统RTEMS上实现。从这个意义上讲,该方法的提出也对那些致力于编写自己的实时操作系统的嵌入式软件工程师具有借鉴意义。


  • 扩展阅读
  • 上一个文章:
  • 【返回网站首页】 【返回无线】
  • 下一个文章:
  • 【字体: 】【】【发表评论】【加入收藏】【告诉好友】【打印此文
    文章 软件 电影 商品

    相关文章

    本站公告

    • 扫一扫,打赏给我们,谢谢!

      本站2016年12月16日起取消ruida.org.cn域名,该域名正式作废,该域名发布任何信息与本站无关。


      启用ruida.orghy928.net域名;

      瑞达网,瑞达科技网宣

    专 题 栏 目

    • 公元干支年号皇帝对照年表618年-2025年
      全国各地庙会圩日表
       婵犵數濮烽弫鍛婃叏閻戣棄鏋侀柟闂寸绾剧粯绻涢幋鐐垫噧缂佸墎鍋ら弻娑㈠Ψ椤旂厧顫╃紓浣插亾闁割偆鍠撶弧鈧梻鍌氱墛缁嬫帡鏁嶉弮鍫熺厾闁哄娉曟禒銏ゆ婢舵劖鐓ユ繝闈涙閸f椽鎮归幇銊ュ⒉闁靛洤瀚伴崺锟犲礃閵娿儱绠i梻浣筋嚃閸犳盯锝炴径鎰闁告稒娼欐导鐘绘煏婢舵ê鐏g紒鈧繝鍕=闁稿本鐟чˇ锔姐亜閿旇鐏﹂柟顔矫埞鎴犫偓锝庝簽閸欌偓濠电姰鍨奸崺鏍礉閺囩姷涓嶅┑鐘崇閸婂灚绻涢幋鐑嗕痪妞ゅ繐妫楅ˉ姘舵煕閹邦剚鈻曟繛鎾愁煼閺屾洟宕煎┑鍫㈩唺闁诲簼绲婚崑鎰閹烘鏁婇柣锝呮湰閸Q冾渻閵堝棙绌跨紓宥勭閻g兘骞囬悧鍫濅簻闂佹儳绻楅~澶婎熆閹达附鈷掑ù锝呮啞閹牊绻涚仦鍌氬鐎规洑鍗抽獮妯肩磼濡桨绮ч梻浣芥硶閸o箓骞忛敓锟�
    网友评论:(只显示最新10条。评论内容只代表网友观点,与本站立场无关!)
        没有任何评论

    | 服务声明 | 充值中心| 华安五金电器 | 收费标准| 论坛| 留言| 实用查询| 会员中心| 下载帮助| 设为首页|

    技术支持:瑞达科技 即时交谈QQ:237013889 QQ群:13810759 E-Mail:237013889@qq.com
    非盈利网站,如有侵权,请来信来电告知,第一时间处理,谢谢!
    桂ICP备17008104号 华玉生活网网站统计
    tj