新聞中心

        EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計應(yīng)用 > 關(guān)于RTX51 TINY的分析與探討

        關(guān)于RTX51 TINY的分析與探討

        作者: 時間:2012-04-12 來源:網(wǎng)絡(luò) 收藏

        3 共享資源實現(xiàn)[1]

        由于是一個多任務(wù)的操作系統(tǒng),那么就不免會有幾個任務(wù)使用同一個資源,這些資源可能是一個變量,也可能是輸入/輸出設(shè)備。這就要求一個任務(wù)在使用共享資源時必須獨占該資源,否則可能會造成數(shù)據(jù)被破壞。

        中實現(xiàn)共享資源獨占的方法比較多。比如,可以通過TIMESHARING這個變量來禁止時間片輪轉(zhuǎn),使其值為0,就可以實現(xiàn)禁止任務(wù)切換,從而當(dāng)前任務(wù)就可以獨占共享資源。還可以關(guān)閉中斷來實現(xiàn),使EA=0,定時器T0的中斷被關(guān)閉,不能再為時間片輪轉(zhuǎn)提供基準(zhǔn),從而禁止了任務(wù)切換。但這兩種方法都帶有一定的局限性,前一種方法只能適用于實時性要求不高的場合,后一種方法由于T0中斷關(guān)閉時間不能太長,只能適用于一些簡單變量操作的場合。基于以上情況,下面通過另一種方法來實現(xiàn)共享資源的使用。

        full中可以利用信號量很好地實現(xiàn)對共享資源的操作,也可以把這種思想應(yīng)用到RTX51 中;而在RTX51 TINY中不支持信號量,這就要求用戶自己定義信號量及其操作過程。以下是部分代碼:

        struct signal {//定義信號量結(jié)構(gòu)體
            uchar count;//該信號量的當(dāng)前計數(shù)值
            uint list_tasks;//等待該信號量任務(wù)表
          } signal_list[3];
          /*初始化信號量 */
          void init_signal(uchar task_id,uchar count) {
            signal_list[task_id].count=count;
            signal_list[task_id].list_tasks=0;
          }
          /*等待信號量 */
          char wait_signal(uchar task_id) {
            if(signal_list[task_id].count>0) {
              signal_list[task_id].count;//獲取信號量
              return(-1);
            }
            signal_list[task_id].list_tasks|=(1os_running_task_id());//標(biāo)記為等待狀態(tài)
            return(0);
          }
          void wait_sem(uchar task_id) {
            if(wait_signal(task_id==0)
              while(os_wait(K_TMO,255,0)!=RDY_EVENT);//等待,直到該任務(wù)就緒
          }
          /*釋放信號量 */
          char release_signal(uchar task_id) {
            uchar i:
            uint temp=1;
            if((signal_list[task_id].count>0)||( signal_list[task_id].list_tasks==0)) {
              signal_list[task_id].count++; //釋放信號量
              return(-1);
            }
            for(i=0;i16;i++) {
              if((signal_list[task_id].list_tasks(temp))!=0){//查找任務(wù)表
                signal_list[task_id].list_tasks= ~(1i);return(i); //返回等待信號量的任務(wù)號
              }
              temp=1:
            }
          }
          void release_sem(uchar task_id) {
            char task_temp;
            task_temp=release_signal(task_id);
            if(task_temp!=-1) {
              os_set_ready(task_temp); //任務(wù)task_id進入就緒狀態(tài)
              os_switch_task();
            }
          }



        關(guān)鍵詞: 探討 分析 TINY RTX51 關(guān)于

        評論


        相關(guān)推薦

        技術(shù)專區(qū)

        關(guān)閉
        主站蜘蛛池模板: 元阳县| 辽源市| 若尔盖县| 安庆市| 同心县| 十堰市| 民丰县| 西安市| 三台县| 天津市| 嵩明县| 马龙县| 桦南县| 肇源县| 彰化县| 益阳市| 安平县| 砚山县| 北宁市| 漯河市| 巨鹿县| 巨野县| 马公市| 东乌珠穆沁旗| 昆山市| 普兰县| 徐水县| 惠安县| 丰顺县| 昂仁县| 南涧| 柳林县| 新邵县| 平顶山市| 彭山县| 旺苍县| 汉寿县| 井冈山市| 浮山县| 西盟| 金沙县|