اطلاعیه

Collapse
No announcement yet.

چگونه میشه توسط وقفه از داخل یک حلقه خارج شد؟

Collapse
X
 
  • فیلتر
  • زمان
  • Show
Clear All
new posts

    چگونه میشه توسط وقفه از داخل یک حلقه خارج شد؟

    با سلام.
    برنامه زیر رو در نظر بگیرید:
    کد:
    do
    {
    statement1;
    statement2;
    statement3;
    .
    .
    .
    .
    }while(OK1==1);
    /*----------------------*/
    do
    {
    statement1;
    statement2;
    statement3;
    .
    .
    .
    .
    }while(OK2==1);
    /*----------------------*/
    do
    {
    statement1;
    statement2;
    statement3;
    .
    .
    .
    .
    }while(OK3==1);
    [hr]
    فرض کنید این برنامه در داخل تابع main در حال اجرا هستش طوری که در داخل یکی از loop ها گیر افتاده . طوری که نمیشه ok1 یا ok2 یا ok3 را تغییر داد.
    و فرض کنید که وقفه ی خارجی صفر رو هم بایک لبه بالا رونده فعال کردیم.
    حالا من میخوام با ایجاد وقفه به صورت لحظه ای از داخل اون حلقه خارج بشم و برم به حلقه بعدی... یعنی به محض اجرای تابع وقفه و خروج از تابع وقفه برنامه من باید از داخل اون لوپ خارج بشه.
    یعنی مهم نیست که داره جمله یک رو اجرا میکنه یا جمله دو رو. باید خارج بشه.
    براي جوينده ي علم محدوديتي نيست. "ولو بالسين"

    #2
    پاسخ : چگونه میشه توسط وقفه از داخل یک حلقه خارج شد؟

    به طور کلی عرض کنم راهی که شما انتخاب کردید راه درستی نیست
    و در ادامه با مشکل مواجه خواهید شد .
    تمام سعی شما باید بر این باشد که در برنامه فقط یک حلقه بی نهایت داشته باشید (البته اگر stand alone هستید نه os )

    پس سعی کنید مراحل اجرای برنامه (sequence ) را هوشمندانه تر اجرا کنید :

    کد:
    uint_16 sequence_step1;
    uint_16 sequence_step2;
    
    void main(){
    
    
    proce_1(sequence_step1);
    proce_2(sequence_step2);
    }
    void proce_1(uint_16 step){
    switch (step)
    {
    	case (1):
    	//do things for step1 
    	// you can change step here if you want 
    	break;
    
    	case (2):
    	//do things for step 2
    	break;
    	default :
    	break;
    	}
    
    }
    
    void proce_2(uint_16 step){
    switch (step)
    {
    	case (1):
    	//do things for step1 
    	// you can change step here if you want 
    	break;
    
    	case (2):
    	//do things for step 2
    	break;
    	default :
    	break;
    	}
    
    }
    از جمله ی رفتگان این راه دراز
    باز آمده ای کو که به ما گوید راز
    هان بر سر این دو راهه از روی نیاز
    چیزی نگذاری که نمی آیی باز

    دیدگاه


      #3
      پاسخ : چگونه میشه توسط وقفه از داخل یک حلقه خارج شد؟

      ممنون از جواب خوبتون
      با توجه به برنامه شما:
      با فرض اینکه تابع proce_1 داره اجرا میشه و با فرض ورودی 1 این تابع داره شرط switch اول رو اجرا میکنه...من میخوام به محض دریافت یک ورودی وقفه دار ( مثلا توط یوزارت دریافت کردیم که این اجرای تابع متوقف بشه وبره به برنامه بعدی) .آیا میشه با دریافت یک ورودی وقفه ای از داخل اون شرط خارج شد و به شرط بعد یا برنامه بعد رفت؟
      براي جوينده ي علم محدوديتي نيست. "ولو بالسين"

      دیدگاه


        #4
        پاسخ : چگونه میشه توسط وقفه از داخل یک حلقه خارج شد؟

        خب شما داخل سابروتین اون وقفه متغیر شرط حلقه رو تغییر میدید
        Don't hesitate to ask any question ..

        دیدگاه


          #5
          پاسخ : چگونه میشه توسط وقفه از داخل یک حلقه خارج شد؟

          میدونید مشکل کجاست؟
          حق با شماست باید شرط رو عوض کرد تا از اون حلقه خارج شد.
          ولی به محض عوض کردن اون شرط در داخل سابروتین و خروج از وقفه .برنامه میکرو (سری های مگا و ایکس مگا) از ادامه اجرای برنامه قبل توسط پشته بازیابی میشه و اجرا میشه.
          یعنی به صورت لحظه ای که شرط حلقه چک نمیشه... بلکه باید اون حلقه به آخرش برسه بعد بیاد دوباره شرط رو چک کنه . چون ممکنه در داخل شرط هر switch صدها خط برنامه باشه.
          براي جوينده ي علم محدوديتي نيست. "ولو بالسين"

          دیدگاه


            #6
            پاسخ : چگونه میشه توسط وقفه از داخل یک حلقه خارج شد؟

            سلام
            خب یکی از رهها اینه که تو زیرروال وقفه پرش به لیبل بعد از حلقه رو بنویسی
            اینجوری تا وقفه اومد پرش میکنه به بعد از حلقه
            البته جریان کلی برنامتو نمیدونم چیه شاید راه حل بهتری هم باشه
            محک

            دیدگاه


              #7
              پاسخ : چگونه میشه توسط وقفه از داخل یک حلقه خارج شد؟

              نوشته اصلی توسط mahank
              سلام
              خب یکی از رهها اینه که تو زیرروال وقفه پرش به لیبل بعد از حلقه رو بنویسی
              اینجوری تا وقفه اومد پرش میکنه به بعد از حلقه
              البته جریان کلی برنامتو نمیدونم چیه شاید راه حل بهتری هم باشه
              اول اینکه واقعا ما نمیدونیم که الان میکرو داره کدوم برنامه رو اجرا میکنه. چون ممکنه تو تابع اولی باشه ویا تو تابع دومی...و دوم اینکه نمیدونیم که کدوم خط این برنامه رو اجرا میکنه...
              حالا ما تو برنامه نویسی مون چجوری و به کجا لیبل برنیم؟

              اضافه شده در تاریخ :
              کارمن چیزی شبیه force close کردن یک برنامه و اجرای برنامه ای دیگه است.
              براي جوينده ي علم محدوديتي نيست. "ولو بالسين"

              دیدگاه


                #8
                پاسخ : چگونه میشه توسط وقفه از داخل یک حلقه خارج شد؟

                اگه تو برنامت مشخص باشه که بعد از وقفه دقیقا کدوم برنامه میخواد اجرا بشه که با لیبل میری به همون نقطه
                و دیگه برنامه بعد از اتمام وقفه به حلقه اولی بر نمیگرده
                لیبل تو برنامه هدف هست و دستور پرش به لیبل داخل زیر روال وقفه
                محک

                دیدگاه


                  #9
                  پاسخ : چگونه میشه توسط وقفه از داخل یک حلقه خارج شد؟

                  نوشته اصلی توسط mahank
                  اگه تو برنامت مشخص باشه که بعد از وقفه دقیقا کدوم برنامه میخواد اجرا بشه که با لیبل میری به همون نقطه
                  و دیگه برنامه بعد از اتمام وقفه به حلقه اولی بر نمیگرده
                  لیبل تو برنامه هدف هست و دستور پرش به لیبل داخل زیر روال وقفه
                  در زبان سی باید لیبل و دستور goto داخل یک تابع باشند و نمیشه لیبل رو در برنامه هدف مشخص کرد و دستور goto رو در برنامه وقفه اجرا کرد...
                  براي جوينده ي علم محدوديتي نيست. "ولو بالسين"

                  دیدگاه


                    #10
                    پاسخ : چگونه میشه توسط وقفه از داخل یک حلقه خارج شد؟

                    نوشته اصلی توسط m52r65
                    در زبان سی باید لیبل و دستور goto داخل یک تابع باشند و نمیشه لیبل رو در برنامه هدف مشخص کرد و دستور goto رو در برنامه وقفه اجرا کرد...
                    یعنی اگه تا آخر حلقه بره و خارج بشه مشکلی ایجاد میکنه؟
                    دوست عزیز اگه مفید بود روی تشکر بزن

                    دیدگاه


                      #11
                      پاسخ : چگونه میشه توسط وقفه از داخل یک حلقه خارج شد؟

                      نوشته اصلی توسط david24
                      یعنی اگه تا آخر حلقه بره و خارج بشه مشکلی ایجاد میکنه؟
                      من اگر میخواستم تا آخر حلقه صبر کنم که مشکلی پیش نمیومد . هر حلقه من ممکنه 20 یا 30 ثانیه طول بکشه.ولی من طبق صحبت های پیشین باید اون حلقه رو force close کنم
                      براي جوينده ي علم محدوديتي نيست. "ولو بالسين"

                      دیدگاه


                        #12
                        پاسخ : چگونه میشه توسط وقفه از داخل یک حلقه خارج شد؟

                        نوشته اصلی توسط m52r65
                        من اگر میخواستم تا آخر حلقه صبر کنم که مشکلی پیش نمیومد . هر حلقه من ممکنه 20 یا 30 ثانیه طول بکشه.ولی من طبق صحبت های پیشین باید اون حلقه رو force close کنم
                        البته من هم این مشکل را برای یه کار دیگه داشتم کسی راهی نداد.
                        یعنی در هر جای برنامه که بود بصورت فورس بیاد بیرون.
                        ما هم منتظریم.
                        دوست عزیز اگه مفید بود روی تشکر بزن

                        دیدگاه


                          #13
                          پاسخ : چگونه میشه توسط وقفه از داخل یک حلقه خارج شد؟

                          راستش فقط سوال تون رو خوندم نه همه پاسخ ها رو اگه ... من الگریتم حل رو می نویسم

                          در زمان اجرا تایمر شمارنده افزایش یابد اگر شمارنده به انتها رسیده صفر شود

                          1-اگر شمارنده برابر یک است ... کار را انجام بده
                          2-اگر شمارنده برابر دو است ... کار را انجام بده
                          .
                          .
                          .
                          N- برو به 1
                          به زبان c هم می تونم بنویسم اگه نتونستین کد کنین این رو
                          التماس دعا

                          دیدگاه


                            #14
                            پاسخ : چگونه میشه توسط وقفه از داخل یک حلقه خارج شد؟

                            نوشته اصلی توسط ali.ra
                            راستش فقط سوال تون رو خوندم نه همه پاسخ ها رو اگه ... من الگریتم حل رو می نویسم

                            در زمان اجرا تایمر شمارنده افزایش یابد اگر شمارنده به انتها رسیده صفر شود

                            1-اگر شمارنده برابر یک است ... کار را انجام بده
                            2-اگر شمارنده برابر دو است ... کار را انجام بده
                            .
                            .
                            .
                            N- برو به 1
                            به زبان c هم می تونم بنویسم اگه نتونستین کد کنین این رو
                            من دقیقا متوجه منظورتون نشدم.
                            اگر لطف کنید و همین مطلب رو به صورت کد بیان کنید ممنون میشم
                            براي جوينده ي علم محدوديتي نيست. "ولو بالسين"

                            دیدگاه


                              #15
                              پاسخ : چگونه میشه توسط وقفه از داخل یک حلقه خارج شد؟

                              من راهی که به نظرم می رسه (که شاید اصولی نباشه) هر وقت دیتا روی پورت سریال آمد ، وضعیتی که قرار بعد از دریافت سریال انجام بشه (مثلا رفتن به مود 2 برنامه ) توی یک متغیر eeprom ذخیره بشه و بعدش میکرو ریست بشه (ریست شدن میتونه با فعال کردن تایمر watchdog بعد از دریافت سریال انجام بشه ) در ابتدای main هم watchdog غیر فعال بشه
                              Don't hesitate to ask any question ..

                              دیدگاه

                              لطفا صبر کنید...
                              X