اطلاعیه

Collapse
No announcement yet.

یه خط اسمبلی میکنی؟؟ مرسی D:

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

    یه خط اسمبلی میکنی؟؟ مرسی D:

    سلام دوستان
    من دارم یه برنامه مینویسم که خیلی زمان بندی توش مهمه برام
    این یه خط که اون پایین نوشتم رو وقتی Debug میکنم 40 تا کلاک میخوره
    میخوام ببینم راهی هست که فقط همین خط زمان کمتری صرف کنه؟؟
    خودم c مینویسم ولی شنیدم با اسمبلی همین یه خط در حد 4 - 5 تا کلاک میخوره!!!
    اگه همین یه خط رو اسمبلی کنم اصن اینجوری میشه؟؟؟ یا باید از اول جای متغیرها و اینا رو مشخص کرد؟؟؟
    من هیچ سر رشته ای از اسمبلی ندارم اگه خدا بخواد وقت کنم یه جزوه دانلود کردم یاد بگیرم
    اگه کسی دستور اسمبلی این خط رو بده ممنون میشم :biggrin:

    کد:
    if(tens_pd_step>=tens_pd) PORTA=0;

    #2
    پاسخ : یه خط اسمبلی میکنی؟؟ مرسی D:

    نوشته اصلی توسط ameen.kh
    کد:
    if(tens_pd_step>=tens_pd) PORTA=0;
    بستگی داره متغیر های tens_pd_step و tens_pd چی باشن اگر 16 بیتی باشن یا 32 بیتی باشن که به هیچ وجه نمی تونید با 5 کلاک این دستور رو بنویسید .
    تنها موردی که همه آدما یقین دارن خدا در حقش زیاد لطف کرده
    داشتن عقله زیادتر از دیگر آدم ها است

    دیدگاه


      #3
      پاسخ : یه خط اسمبلی میکنی؟؟ مرسی D:

      نوشته اصلی توسط aliila
      بستگی داره متغیر های tens_pd_step و tens_pd چی باشن اگر 16 بیتی باشن یا 32 بیتی باشن که به هیچ وجه نمی تونید با 5 کلاک این دستور رو بنویسید .
      مرسی از جوابت
      نه میتونن 8 بیتی باشن!
      یعنی راستش 16 بیتی بودن! شما که اینو گفتی 8 بیتیشون کردم
      اون 40 کلاک شد 17 تا! نمیدونستم اینقدر مهمه!!!

      دیدگاه


        #4
        پاسخ : یه خط اسمبلی میکنی؟؟ مرسی D:

        دیگه عصر میکرو های 8 بیتی سر اومده.
        مخصوصا برا شما که زمان مهمه بهت توصیه میکنم بری رو میکرو های 32 بیتی .مخصوصا آرم . چون شرط فوق فقط 3 پالس لازم داره .
        به هر حال تو میکرو 8 بیتی با اسمبلی فکر کنم کمتر از 10 پالس نشه نوشت
        تنها موردی که همه آدما یقین دارن خدا در حقش زیاد لطف کرده
        داشتن عقله زیادتر از دیگر آدم ها است

        دیدگاه


          #5
          پاسخ : یه خط اسمبلی میکنی؟؟ مرسی D:

          خودم c مینویسم ولی شنیدم با اسمبلی همین یه خط در حد 4 - 5 تا کلاک میخوره!!!
          با سلام
          دقیقا همینطوره. توی PIC حدود 5 سیکل مبره و مسلما توی AVR هم همینطوره (من PIC کارم نه AVR)

          دیگه عصر میکرو های 8 بیتی سر اومده.
          مخصوصا برا شما که زمان مهمه بهت توصیه میکنم بری رو میکرو های 32 بیتی .مخصوصا آرم . چون شرط فوق فقط 3 پالس لازم داره .
          به هر حال تو میکرو 8 بیتی با اسمبلی فکر کنم کمتر از 10 پالس نشه نوشت
          با صحبت شما اصلا موافق نیستم
          هر چیزی جایگاه خودشو داره و مورد استفاده خودش هنوز هم کارهای بزرگی میشه انجام داد با همین 8 بیتی ها که اکثرا میکن جواب نمیده و میرن سراغ 32 بیتی درصورتیکه خود این افراد ضعیف عمل میکنن و بجای بهینه سازی راحت میگن نمیشه!(صحبت کلی هست نه در مورد شما!)
          توی PIC و AVR هم سه سیکل طول میکشه که با دستورات لود حافظه میشه 5 یا 6 سیکل
          توی قسمت ARM هم چند تاپیک بزرگ در همین موضوع بحث کرده.

          [glow=black,2,300]بردی جالب با سیستم عاملی جالب !!![/glow]

          دیدگاه


            #6
            پاسخ : یه خط اسمبلی میکنی؟؟ مرسی D:

            اگر بخواهید تمام برنامه خود را بصورت اسمبلی بنویسید، با انتخاب متغیر های مورد نظر در رجیسترهای R0-R31 می توانید مقایسه 8 بیتی و پرش شرطی و مقدار دهی به پورت را (با فرض استفاده از دستور out) جمعا در 3 سیکل انجام دهید. در صورت 16 بیتی بودن متغیرها و تعریف در رجیسترها، این عملیات در 4 سیکل انجام می شود. برای 32 بیت هم با فرض مذکور این عملیات در 6 سیکل قابل انجام است.
            اما با توجه به اینکه برنامه شما با C نوشته شده و ترکیب آن با اسمبلی نیاز به تجربه و تبحر کافی دارد، یک روش برای کاهش زمان عملیات این است که این دو متغیر را بصورت خاص در رحیسترها تعریف کنید و توجه کنید که برای این نوع تعریف محدودیت وجود دارد. به عنوان مثال:

            کد:
            register unsigned char tens_pd_step,tens_pd;

            اوژن: به معنای افکننده و شکست دهنده است
            دانایی، توانایی است-Knowledge is POWER
            برای حرفه ای شدن در الکترونیک باید با آن زندگی کرد
            وضعمان بهتر می شود، اگر همه نسبت به جامعه و اطراف خود مسوول باشیم و نگوئیم به ما چه
            قوی شدن و خوب ماندن - خوبی کردن به دیگران یک لذت ماندگار است
            اگر قرار باشد نفت و منابع خام را بدهیم و چرخ بگیریم، بهتر است چرخ را از نو اختراع کنیم
            ساعت کار بدن اکثر انسان ها کمتر از 800000 ساعت است و بعد از آن از کار می افتد

            دیدگاه


              #7
              پاسخ : پاسخ : یه خط اسمبلی میکنی؟؟ مرسی D:

              نوشته اصلی توسط طراح
              اگر بخواهید تمام برنامه خود را بصورت اسمبلی بنویسید، با انتخاب متغیر های مورد نظر در رجیسترهای R0-R31 می توانید مقایسه 8 بیتی و پرش شرطی و مقدار دهی به پورت را (با فرض استفاده از دستور out) جمعا در 3 سیکل انجام دهید. در صورت 16 بیتی بودن متغیرها و تعریف در رجیسترها، این عملیات در 4 سیکل انجام می شود. برای 32 بیت هم با فرض مذکور این عملیات در 6 سیکل قابل انجام است.
              اما با توجه به اینکه برنامه شما با C نوشته شده و ترکیب آن با اسمبلی نیاز به تجربه و تبحر کافی دارد، یک روش برای کاهش زمان عملیات این است که این دو متغیر را بصورت خاص در رحیسترها تعریف کنید و توجه کنید که برای این نوع تعریف محدودیت وجود دارد. به عنوان مثال:

              کد:
              register unsigned char tens_pd_step,tens_pd;
              طراح جان مرسی از راهنماییت :rolleyes:
              من یه مقدار برنامه رو تغییر دادم و اون دستور حذف شد
              ولی برای یه قسمتی از برنامه که داخل زیر برنامه وقفه میاد مجبورم از دستورات اسمبلی استفاده کنم
              اگه اشکال نداره من وقتی برنامه رو کامل کردم اون قسمت رو قرار میدم اینجا و شما لطف کنید کد اسمبلیش رو برام بنویسید ممنون میشم
              فقط یه سوال
              متغیرهای من چون تو توابع مختلف فراخونی میشن به صورت volatile تعریف شدن
              مثلا
              کد:
              volatile char tens_pd;
              این نوع تعریف تاثیری تو سرعت اجرای برنامه داره؟؟

              دیدگاه


                #8
                پاسخ : پاسخ : یه خط اسمبلی میکنی؟؟ مرسی D:

                نوشته اصلی توسط ameen.kh
                طراح جان مرسی از راهنماییت :rolleyes:
                من یه مقدار برنامه رو تغییر دادم و اون دستور حذف شد
                ولی برای یه قسمتی از برنامه که داخل زیر برنامه وقفه میاد مجبورم از دستورات اسمبلی استفاده کنم
                اگه اشکال نداره من وقتی برنامه رو کامل کردم اون قسمت رو قرار میدم اینجا و شما لطف کنید کد اسمبلیش رو برام بنویسید ممنون میشم
                فقط یه سوال
                متغیرهای من چون تو توابع مختلف فراخونی میشن به صورت volatile تعریف شدن
                مثلا
                کد:
                volatile char tens_pd;
                این نوع تعریف تاثیری تو سرعت اجرای برنامه داره؟؟
                فک نمیکنم تاثیری تو سرعت داشته باشه :-?
                1-ولی اگه سرعت دوست داری بیا یه کریستال 16مگاهرتز بزار
                ____________________________________
                2-اگه خوشت نیومد تغذیه میکرو رو بزار رو 3.3ولت و بیش از 16 بزار :twisted: (البته در صورت امکان این کارو بکن چون ما نمیدونیم پروژت چیه شاید با 3.3ولت راه نیوفته! ) به این کار میگن over clock
                نکته هایی درباره همین روش (over clock) :
                اگه 5 ولت بزاری میکرو مثل آتیش جهنم داغ میکنه!
                نکته بعدی : دقت کن میکرو سری Aباشه در غیر این صورت میکرو دیگه به درد نمیخوره (چون CPUش میسوزه!)
                در ضمن اگه تو کارت دقت هم میخوای من این روش رو اصلا پیشنهاد نمیکنم!

                _____________________________________

                3-اینم آموزش اسمبل: http://www.avr-asm-download.de/beginner_ir.pdf
                :nice:
                :bye
                1 در دنیا 100 در آخرت (درس و مشق فعالیتمو تو انجمن کم کرده)
                من آنچه شرط بلاغست با تو میآ‌گویم. تو خواه از سخنم پند گیر و خواه ملال. سعدی
                !Electronic On! Programming On
                هوشمندانه سوال بپرسیم!
                http://ir02x6.persiangig.com/logo/eca/tanks_01.png

                دیدگاه


                  #9
                  پاسخ : پاسخ : یه خط اسمبلی میکنی؟؟ مرسی D:

                  نوشته اصلی توسط mahan.rafiee
                  فک نمیکنم تاثیری تو سرعت داشته باشه :-?
                  1-ولی اگه سرعت دوست داری بیا یه کریستال 16مگاهرتز بزار
                  ____________________________________
                  2-اگه خوشت نیومد تغذیه میکرو رو بزار رو 3.3ولت و بیش از 16 بزار :twisted: (البته در صورت امکان این کارو بکن چون ما نمیدونیم پروژت چیه شاید با 3.3ولت راه نیوفته! ) به این کار میگن over clock
                  نکته هایی درباره همین روش (over clock) :
                  اگه 5 ولت بزاری میکرو مثل آتیش جهنم داغ میکنه!
                  نکته بعدی : دقت کن میکرو سری Aباشه در غیر این صورت میکرو دیگه به درد نمیخوره (چون CPUش میسوزه!)
                  در ضمن اگه تو کارت دقت هم میخوای من این روش رو اصلا پیشنهاد نمیکنم!

                  _____________________________________

                  3-اینم آموزش اسمبل: http://www.avr-asm-download.de/beginner_ir.pdf
                  :nice:
                  :bye
                  آقا دمت گرم مرسی بابت مطالب مفیدی که گفتی
                  اون PDF رو خواستم بخونم ولی حقیقتش یه مقدار کارم عجله ای هست واسه همین اینجا مطرحش کردم
                  کارم نیاز به دقت خیلی بالا داره در حدی که نشستم با avr studio یکی یکی پالس ساعت شمردم و یه lookup table با 650 تا مقدار درست کردم
                  کریستالم 16 مگ هست ولی برای من مهم تعداد کلاک هایی هست که کم بشن
                  چون زمان های در حد 6-7 میکروثانیه ای احتیاج دارم که اضافه کردن چندتا دستور با c باعث میشه کلی کلاک الکی بخوره و کلی خطا ایجاد بشه

                  دیدگاه


                    #10
                    پاسخ : پاسخ : یه خط اسمبلی میکنی؟؟ مرسی D:

                    نوشته اصلی توسط ameen.kh
                    آقا دمت گرم مرسی بابت مطالب مفیدی که گفتی
                    اون PDF رو خواستم بخونم ولی حقیقتش یه مقدار کارم عجله ای هست واسه همین اینجا مطرحش کردم
                    کارم نیاز به دقت خیلی بالا داره در حدی که نشستم با avr studio یکی یکی پالس ساعت شمردم و یه lookup table با 650 تا مقدار درست کردم
                    کریستالم 16 مگ هست ولی برای من مهم تعداد کلاک هایی هست که کم بشن
                    چون زمان های در حد 6-7 میکروثانیه ای احتیاج دارم که اضافه کردن چندتا دستور با c باعث میشه کلی کلاک الکی بخوره و کلی خطا ایجاد بشه
                    بهتره با زبان gccکه خودش هم جزو خانواده cهست برنامه بنویسی
                    یه کامپایلر خوب و بدون نیاز به کرک هست اسمش atmel studioس
                    هم رایگانه
                    هم عالیه
                    هم اینکه برنامه رو طوری کامپایل میکنه که هم کم حجم باشه هم پر سرعت
                    (البته خود avr studio هم هست ولی به پای atmel studio نمیرسه)
                    1 در دنیا 100 در آخرت (درس و مشق فعالیتمو تو انجمن کم کرده)
                    من آنچه شرط بلاغست با تو میآ‌گویم. تو خواه از سخنم پند گیر و خواه ملال. سعدی
                    !Electronic On! Programming On
                    هوشمندانه سوال بپرسیم!
                    http://ir02x6.persiangig.com/logo/eca/tanks_01.png

                    دیدگاه


                      #11
                      پاسخ : یه خط اسمبلی میکنی؟؟ مرسی D:

                      سلام
                      آقا این دو خط هر کدوم حدود 50 و خورده ای کلاک مصرف میکنن!
                      یه راهی هست که بشه کمش کرد؟ فقط همین دو خط
                      خیلی حیاتیه :cry: با تشکر :biggrin:

                      کد:
                            OCR3AH=tens_pd2_ocr[tens_pd_temp-1]>>8;
                            OCR3AL=tens_pd2_ocr[tens_pd_temp-1];
                            TCNT3H=0x00;
                            TCNT3L=0x00;

                      دیدگاه


                        #12
                        پاسخ : پاسخ : یه خط اسمبلی میکنی؟؟ مرسی D:

                        ---
                        اگر روزی بفهمی همه چیزایی که از بچگی تا حالا بهت گفتن بی اساس یا دروغه چه حالی میشی؟
                        کارمندان نابکار، از دزدان و آشوبگران بیشتر به کشور آسیب میآ‌رسانند

                        دیدگاه


                          #13
                          پاسخ : یه خط اسمبلی میکنی؟؟ مرسی D:

                          اینارو یه تستی کن

                          کد:
                          {
                           register unsigned short _i = tens_pd2_ocr[tens_pd_temp - 1];
                           OCR3AH = _i >> 8;
                           OCR3AL = _i;
                           TCNT3H = 0x00;
                           TCNT3L = 0x00;
                          }
                          کد:
                          {
                           union {
                            unsigned short w;
                            unsigned char b[2];
                           } _u;
                           _u.w = tens_pd2_ocr[tens_pd_temp - 1];
                           OCR3AH = _u.b[1];
                           OCR3AL = _u.b[0];
                           TCNT3H = 0x00;
                           TCNT3L = 0x00;
                          }
                          گذشت خصلت مردان است

                          دیدگاه


                            #14
                            پاسخ : پاسخ : یه خط اسمبلی میکنی؟؟ مرسی D:

                            نوشته اصلی توسط داود رهایی
                            آقا شما مطمئنی که برای 16 بیتی در مثال بالا فقط یک سیکل اضافه میشه (نسبت به 8 بیتی) و
                            برای 32 هم 2 تا دیگه؟
                            مقایسه دو تا عدد 16 بیتی به این صورت هست که ابتدا 8 بیتهای بالایی دو تا عدد
                            مقایسه میشند و با یک IF (یا جامپ در اسمبلی) به مقایسه دو تا 8 بیت پایینی میره
                            و در ضمن ماشین سیکل هر دستور میتونه بیش از یک کلاک باشه
                            یعنی اون 3 سیکلی رو هم که گفتید من مطمئن نیستم درست باشه
                            نمونه کد اسمبلی را برای مقایسه 32 بیتی قرار می دهم که از روی آن روش مقایسه های 16 و 8 بیتی هم مشخص خواهد شد. اگر فرض کنیم عدد اول 32 بیتی در R2 و R3 و R4 و R5 و عدد دوم در R6 و R7 و R8 و R9 قرار داشته باشد، مقایسه انجام شده تا پایان مرحله مقدار دهی به پورت 6 سیکل زمان می برد:

                            CP R2, R6
                            CPC R3,R7
                            CPC R4,R8
                            CPC R5,R9
                            BRLO LABEL
                            OUT PORTA,0X00
                            اوژن: به معنای افکننده و شکست دهنده است
                            دانایی، توانایی است-Knowledge is POWER
                            برای حرفه ای شدن در الکترونیک باید با آن زندگی کرد
                            وضعمان بهتر می شود، اگر همه نسبت به جامعه و اطراف خود مسوول باشیم و نگوئیم به ما چه
                            قوی شدن و خوب ماندن - خوبی کردن به دیگران یک لذت ماندگار است
                            اگر قرار باشد نفت و منابع خام را بدهیم و چرخ بگیریم، بهتر است چرخ را از نو اختراع کنیم
                            ساعت کار بدن اکثر انسان ها کمتر از 800000 ساعت است و بعد از آن از کار می افتد

                            دیدگاه


                              #15
                              پاسخ : یه خط اسمبلی میکنی؟؟ مرسی D:

                              نوشته اصلی توسط tohid041
                              اینارو یه تستی کن

                              کد:
                              {
                               register unsigned short _i = tens_pd2_ocr[tens_pd_temp - 1];
                               OCR3AH = _i >> 8;
                               OCR3AL = _i;
                               TCNT3H = 0x00;
                               TCNT3L = 0x00;
                              }
                              کد:
                              {
                               union {
                                unsigned short w;
                                unsigned char b[2];
                               } _u;
                               _u.w = tens_pd2_ocr[tens_pd_temp - 1];
                               OCR3AH = _u.b[1];
                               OCR3AL = _u.b[0];
                               TCNT3H = 0x00;
                               TCNT3L = 0x00;
                              }
                              آقا دمت گرم
                              این کد رو ننوشتم ولی ایده خوبی بود که قبل از while(1) محاسباتم رو انجام بدم

                              دیدگاه

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