اطلاعیه

Collapse
No announcement yet.

بیرون آمدن از حلقه به محض بر آورده نشدن شزایط حلقه

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

    بیرون آمدن از حلقه به محض بر آورده نشدن شزایط حلقه

    برای اینکه توی یه حلقه while به محض اینکه شرایط حلقه برقرار نشد از حلقه خارج بشه ( قبل از اینکه به انتهای حلقه برسه ) باید از چه دستوری استفاده کرد ؟
    با دستور breack به طور کامل از حلقه خارج میشه بدون اینکه توجه شرط حلقه داشته باشه . من نمیخوام بعد هر خط یه شرط بزارم و بعدش بریک کنم . لطفا کمک کنید .
    این برنامه رو برای AVR میخوام بنویسم ، وقتی رفت تو اینتراپت و یه دفعه متغییر عوض شد سریعا از حلقه خارج بشه .
    يا حق

    #2
    پاسخ : بیرون آمدن از حلقه به محض بر آورده نشدن شزایط حلقه

    باید وسط حلقه اونجایی که شرایط عوض میشه دستور های if بزاری و توی اونها break بنویسی
    :job:
    قنديل، تنديس قطره هايي است كه تسليم جاذبه زمين نشدند. "چگوآرا"

    دیدگاه


      #3
      پاسخ : بیرون آمدن از حلقه به محض بر آورده نشدن شزایط حلقه

      نوشته اصلی توسط mohsen_22
      باید وسط حلقه اونجایی که شرایط عوض میشه دستور های if بزاری و توی اونها break بنویسی
      :job:
      از جوابت ممنونم ولی من توی سوالم هم گفتم که نمیخوام بعد هر خط بیام یه شرط بزارم برای بریک شدن . چون این تغییر ممکنه تو هر خطی اتفاق بیفته .
      يا حق

      دیدگاه


        #4
        پاسخ : بیرون آمدن از حلقه به محض بر آورده نشدن شزایط حلقه

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

        دیدگاه


          #5
          پاسخ : بیرون آمدن از حلقه به محض بر آورده نشدن شزایط حلقه

          نوشته اصلی توسط exelance
          این کار و به چند رو میتونی انجام بدی بستگی به خلاقیت شما داره یه کم روش فکر کنین پیدا می کنین
          اگه تیکه کد میزاشتین اون موقع می تونستم کمک کنم
          در خدمتم
          فکر کنین من یه اینتراپت برای یکی از پایه های میکرو رو فعال کردم . بعد از یه طرف دیگه توی برنامم یه while گذاشتم به اینصورت :
          کد:
          while(true==1){
          line1;
          line2;
          line3;
          .
          .
          .
          }
          حالا فرض کن الان سی پی یو داره خط 3 رو لود میکنه ، در همین هین اینتراپت فعال میشه و متغییر رو (true) مقدارشو صفر میکنه . حالا چه طور میشه از خط سوم بپره بیرون ؟
          يا حق

          دیدگاه


            #6
            پاسخ : بیرون آمدن از حلقه به محض بر آورده نشدن شزایط حلقه

            به نظر من شما با آدرس های پروگرم کانتر بازی کن.
            سرویس روتین وقفه وقتی که وارد وقفه میشه آخرین آدرس برنامه ای که در سرویس عادی برنامه اجرا میشده تو خودش ذخیره می کنه. و پس از اینکه از روتین وقفه خارج میشه اون آدرس رو ریکاوری میکنه و به ادامه ی کار عادی خودش می پردازه.
            شما هم به صورت نرم افزاری هر وقت به قول خودت شرط مورد نظر برقرار نبود بپر به آدرسی که دوست داری وبرنامه رو ازاونجا شروع کن. حتی با این کار شما می تونی به صورت نرم افزاری میکرو رو ریست کنی و بپری به آدرس صفر .که این مورد رو من در یکی از پروژه های خودم انجام دادم و در روتین وقفه با چک کردن یک فلگ، اگر اون شرط برقرار نبود میکرو رو ریست می کردم.
            موفق باشی دوست من.
            براي جوينده ي علم محدوديتي نيست. "ولو بالسين"

            دیدگاه


              #7
              پاسخ : بیرون آمدن از حلقه به محض بر آورده نشدن شزایط حلقه

              برای تغییر پروگرم کانتر مجبوری از اسمبلی استفاده کنی
              هنگامی که برنامه به روتینی (عادل یا وقفه) پرش میکنه مقدار پروگرم کانترو
              با دو دستور پوش (آخه آدرسی که در پروگرم کانتر قرار داره دو بایتیه)به استک میفرسته
              باید آدرس رو با آدرس لیبلی که با پرش به اون از حلقه خارج میشه عوض کنی
              گذشت خصلت مردان است

              دیدگاه


                #8
                پاسخ : بیرون آمدن از حلقه به محض بر آورده نشدن شزایط حلقه

                نیازی به استفاده از زبان اسمبلی نیست. با همون زبان سی می تونی کار رو انجام بدی.
                براي جوينده ي علم محدوديتي نيست. "ولو بالسين"

                دیدگاه


                  #9
                  پاسخ : بیرون آمدن از حلقه به محض بر آورده نشدن شزایط حلقه

                  با سلام

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

                  دیدگاه


                    #10
                    پاسخ : بیرون آمدن از حلقه به محض بر آورده نشد&#1606

                    نوشته اصلی توسط Shapour-Ardebil
                    با سلام

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

                    این کار درستی نیس .
                    اگر لیبل مورد نظر در تابع دیگری باشه و بخوایم بهش از تابع دیگری پرش کنیم
                    کامپایلر موقع کامپایل ارور میده مگر اینکه لیبل رو با اسمبلی تعیین کنیم و با اسمبلی پرش کنین .
                    اگر در C پرش انجام بشه در اینصورت باید بعد از پرش ، وقفه رو دوباره راه اندازی کرد
                    چون هنگامی که در روتین وقفه هستیم وقفه سراسری غیر فعال میشه
                    و برای اینکه استک درست کار کنه باید مقدار اشاره گر رو 2 بار اضافه کنیم
                    و یا دوبار از دستور پاپ استفاده کنیم .

                    بهتره تمامی روش ها رو تست بزنی .
                    گذشت خصلت مردان است

                    دیدگاه


                      #11
                      پاسخ : بیرون آمدن از حلقه به محض بر آورده نشدن شزایط حلقه


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

                      دیدگاه


                        #12
                        پاسخ : بیرون آمدن از حلقه به محض بر آورده نشدن شزایط حلقه

                        سورس بزار ، در صورت امکان کد های مورد نیاز رو بهش اضافه کنیم
                        گذشت خصلت مردان است

                        دیدگاه


                          #13
                          پاسخ : بیرون آمدن از حلقه به محض بر آورده نشدن شزایط حلقه

                          نوشته اصلی توسط tohid041
                          سورس بزار ، در صورت امکان کد های مورد نیاز رو بهش اضافه کنیم
                          ممنون

                          کد:
                          bit true =0;
                          interrupt[TCD0_OVF_vect] void tcd0_overflow_isr{
                          true = 0;
                          }
                          interrupt[TCC0_OVF_vect] void tcc0_overflow_isr{
                          true = 1;
                          }
                          void main(){
                          while(1){
                          while(true==1){
                          line1;
                          line2;
                          line3;
                          .
                          .
                          .
                          }
                          while(true==0){
                          line1;
                          line2;
                          line3;
                          .
                          .
                          .
                          
                          }
                          }
                          خیلی ممنون از لطفتون.
                          يا حق

                          دیدگاه


                            #14
                            پاسخ : بیرون آمدن از حلقه به محض بر آورده نشدن شزایط حلقه

                            چند وقتی میشه با کدویژن کار نکردم ، avr-gcc یه چی دیگست - یه چیزایی نوشتم
                            کد:
                            #define change_stck() \
                             #asm \
                              pop r26 \
                              pop r26 \
                              ldi r26, high(L1) \
                              push r26 \
                              ldi r26, low(L1) \
                              push r26 \
                             #endasm
                            
                            bit true=0;
                            
                            interrupt[TCD0_OVF_vect] void tcd0_ovf_isr() {
                             change_stck();
                             true=0;
                            }
                            
                            interrupt[TCC0_OVF_vect] void tcc0_ovf_isr() {
                             change_stck()
                             true=1;
                            }
                            
                            void main() {
                             while(2) {
                              #asm("L1:")
                              while(true==1) {
                               line1;
                               line2;
                               line3;
                               ...
                              }
                              while(true==0) {
                               line1;
                               line2;
                               line3;
                               ...
                              }
                             }
                            }
                            البته نمیدونم که اول بایت پایین و بعد بایت بالایی به استک فرستاده میشه یا بر عکس
                            اگر درست کار نکرد جای ldi r26, low(L1) رو با ldi r26, high(L1) عوض کن
                            تستش کنید و خبر بدین لطفا
                            گذشت خصلت مردان است

                            دیدگاه


                              #15
                              پاسخ : بیرون آمدن از حلقه به محض بر آورده نشدن شزایط حلقه

                              توابع وقفه رو دوباره نوشتم :
                              کد:
                              interrupt[TCD0_OVF_vect] void tcd0_ovf_isr() {
                               if(true!=0) {
                                change_stck();
                                true=0;
                               }
                              }
                              
                              interrupt[TCC0_OVF_vect] void tcc0_ovf_isr() {
                               if(true!=1) {
                                change_stck()
                                true=1;
                               }
                              }
                              گذشت خصلت مردان است

                              دیدگاه

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