新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > MCU上的無鎖原子讀操作

        MCU上的無鎖原子讀操作

        作者: 時間:2016-11-17 來源:網絡 收藏
        原子讀操作是在MCU并發編程中常用的操作,簡單舉個例子來闡述問題:

        我們使用RTOS或裸機狀態編程時,必然需要一個全局時鐘基準,通常是在一個定時器中斷中累加實現,簡化代碼如下:

        static unsigned long volatile __jiffies = 0; /* 全局時鐘基準節拍累加器 */

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

        對于其中的__jiffies變量,就是全局時間基準,程序中其它地方都會對其進行原子讀操作來判斷時間,典型的接口實現如下:

        unsigned long get_jiffies(void)
        {
        unsigned long tmp;

        CLOCK_IRQ_DIS(); /* 關定時中斷 */
        tmp = __jiffies;
        CLOCK_IRQ_EN(); /* 開定時中斷 */

        return tmp;
        }

        請注意,其中關于對中斷的開關是對該定時中斷中所有代碼會帶來影響。如果在RTOS中,關中斷的時間是一種重要性能指標,決定了整個系統的中斷快速響應能力。
        在此假設一個最艱難的架構,8位機(AVR、51等等),其上只有8位單字節數據的讀寫是單指令原子的,其中unsigned long型在這樣的架構下是32位8字節。

        根據各位朋友提出情況,進行說明:

        1、有朋友認為讀操作沒必要關中斷.

        這個顯然不可能,當你讀了32位變量任何一個字節的時候,剩下的7個字節都可能改變。

        2、認為在中斷函數建立數據拷貝

        這個理由同上,無論如何復制,都難以避免讀的瞬間數據被破壞

        3、建立單字節原子鎖

        該體系必須支持測試清零指令,而且就算支持。如果中斷里發現鎖被占有了,那這個周期還能進行+1操作么?無論是用變量緩存還是丟棄,所記時間都不準了。


        實現如下:
        unsigned long get_jiffies(void)
        {
        unsigned long tmp;

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

        return tmp
        }

        簡單得大家可能都不相信,可以滿足任何MCU架構完成如上對__jiffies變量的操作(必須單核),大家可以仔細想想。
        無鎖單讀單寫隊列是MCU上經常用的,對中斷通信接口的緩沖非常方便可靠。以此為基礎,可跨平臺實現。


        關鍵詞: MCU無鎖原子讀操

        評論


        技術專區

        關閉
        主站蜘蛛池模板: 三台县| 民勤县| 托里县| 梅州市| 阿勒泰市| 巩留县| 中江县| 平罗县| 张家界市| 漾濞| 兰考县| 油尖旺区| 太仆寺旗| 石狮市| 定远县| 上饶县| 湖北省| 永城市| 大足县| 治县。| 新密市| 宁海县| 金山区| 和平区| 曲麻莱县| 始兴县| 东辽县| 竹北市| 浦江县| 疏附县| 峡江县| 关岭| 菏泽市| 喀什市| 武汉市| 汕头市| 灵川县| 石河子市| 阜城县| 县级市| 安徽省|