<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          EEPW首頁(yè) > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > MCU上的無(wú)鎖原子讀操作

          MCU上的無(wú)鎖原子讀操作

          作者: 時(shí)間:2016-11-17 來(lái)源:網(wǎng)絡(luò) 收藏
          原子讀操作是在MCU并發(fā)編程中常用的操作,簡(jiǎn)單舉個(gè)例子來(lái)闡述問(wèn)題:

          我們使用RTOS或裸機(jī)狀態(tài)編程時(shí),必然需要一個(gè)全局時(shí)鐘基準(zhǔn),通常是在一個(gè)定時(shí)器中斷中累加實(shí)現(xiàn),簡(jiǎn)化代碼如下:

          static unsigned long volatile __jiffies = 0; /* 全局時(shí)鐘基準(zhǔn)節(jié)拍累加器 */

          ISR_TIMER() /* 定時(shí)中斷服務(wù)函數(shù) */
          {
          ++__jiffies;
          /* 其它代碼...: */
          }

          對(duì)于其中的__jiffies變量,就是全局時(shí)間基準(zhǔn),程序中其它地方都會(huì)對(duì)其進(jìn)行原子讀操作來(lái)判斷時(shí)間,典型的接口實(shí)現(xiàn)如下:

          unsigned long get_jiffies(void)
          {
          unsigned long tmp;

          CLOCK_IRQ_DIS(); /* 關(guān)定時(shí)中斷 */
          tmp = __jiffies;
          CLOCK_IRQ_EN(); /* 開(kāi)定時(shí)中斷 */

          return tmp;
          }

          請(qǐng)注意,其中關(guān)于對(duì)中斷的開(kāi)關(guān)是對(duì)該定時(shí)中斷中所有代碼會(huì)帶來(lái)影響。如果在RTOS中,關(guān)中斷的時(shí)間是一種重要性能指標(biāo),決定了整個(gè)系統(tǒng)的中斷快速響應(yīng)能力。
          在此假設(shè)一個(gè)最艱難的架構(gòu),8位機(jī)(AVR、51等等),其上只有8位單字節(jié)數(shù)據(jù)的讀寫(xiě)是單指令原子的,其中unsigned long型在這樣的架構(gòu)下是32位8字節(jié)。

          根據(jù)各位朋友提出情況,進(jìn)行說(shuō)明:

          1、有朋友認(rèn)為讀操作沒(méi)必要關(guān)中斷.

          這個(gè)顯然不可能,當(dāng)你讀了32位變量任何一個(gè)字節(jié)的時(shí)候,剩下的7個(gè)字節(jié)都可能改變。

          2、認(rèn)為在中斷函數(shù)建立數(shù)據(jù)拷貝

          這個(gè)理由同上,無(wú)論如何復(fù)制,都難以避免讀的瞬間數(shù)據(jù)被破壞

          3、建立單字節(jié)原子鎖

          該體系必須支持測(cè)試清零指令,而且就算支持。如果中斷里發(fā)現(xiàn)鎖被占有了,那這個(gè)周期還能進(jìn)行+1操作么?無(wú)論是用變量緩存還是丟棄,所記時(shí)間都不準(zhǔn)了。


          實(shí)現(xiàn)如下:
          unsigned long get_jiffies(void)
          {
          unsigned long tmp;

          do {
          tmp = __jiffies;
          } while(tmp != __jiffies);

          return tmp
          }

          簡(jiǎn)單得大家可能都不相信,可以滿足任何MCU架構(gòu)完成如上對(duì)__jiffies變量的操作(必須單核),大家可以仔細(xì)想想。
          無(wú)鎖單讀單寫(xiě)隊(duì)列是MCU上經(jīng)常用的,對(duì)中斷通信接口的緩沖非常方便可靠。以此為基礎(chǔ),可跨平臺(tái)實(shí)現(xiàn)。


          關(guān)鍵詞: MCU無(wú)鎖原子讀操

          評(píng)論


          技術(shù)專(zhuān)區(qū)

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();