اطلاعیه

Collapse
No announcement yet.

مشکل در با ضرب در mplab ide

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

    #16
    پاسخ : مشکل در با ضرب در mplab ide

    شاید اگر متغییر هامون مشخص باشن کامپایلر بتونه این کارو بکنه. ولی وقتی متغییرامون مشخص نیستش چطوری میخاد همچین کاری کنه؟؟ مثلا داریم یه مقداری از ADC میخونیم و در 200 مثلا ضرب میکنیم. اینجوری دیگه کامپایلر سی یا هر کامپایلر دیگه ای نمیتونن جواب یه ضرب از پیش تعیین شدر نشون بدن. پس ضرب انجام میشه با یه دستور خاصی.من فکر میکنم با همین گیتا میشه انجام دادش.ولی چطوری نمیدانم
    درسته حق با شماست
    بهینه ساز کامپایلر خودش استفاده شدن یا عدم استفاده از متغییر رو مشخص مینه و اگر در طول برنامه جایی استفاده نشده بود شامل بهینه سازی میشه و اگر جایی در برنامه عملیاتی روی اون انجام شده بود واقعا عملیات ضرب رو برای میکرو ترجمه می کنه (خواه سخت افزاری خواه نرم افزاری)
    مثال
    برنامه سطح بالا (با بهینه سازی کد):

    [code=asm]
    program aaa
    Dim a,b as byte
    dim cc as word
    main:
    a=100
    b=200
    cc=a*b
    end
    [/code]
    اگر به کد اسمبلی تولید شده نگاه کنیم:

    [code=asm]
    _main:
    ;aaa.mbas,6 :: main:
    ;aaa.mbas,7 :: a=100
    MOVLW 100
    MOVWF _a+0
    ;aaa.mbas,8 :: b=200
    MOVLW 200
    MOVWF _b+0
    ;aaa.mbas,9 :: cc=a*b
    MOVLW 32
    MOVWF _cc+0
    MOVLW 78
    MOVWF _cc+1
    GOTO $+0
    ; end of _main
    [/code]

    همونطور که توی کد می بینیم اصلا اثری از ضرب نیست و کدی که ترجمه شده جایگذاری عدد 78 توی هشت بیت بالای جواب و جایگذاری عدد 32 توی 8 بیت پایین جوابه که حاصل 78*256+32=20000 و کلا ضرب رو کامپایلر انجام داده نه میکرو

    حالا کد رو کمی تغییر می دیم تا مقادیر a و b از قبل مشخص نباشه:
    کد سطح بالای برنامه(بدون بهینه سازی)
    [code=asm]program aaa
    Dim a,b as byte
    dim cc as word
    main:
    cc=a*b
    end[/code]
    اگه به کد اسمبلی ولید شده نگاه کنیم:
    [code=asm]_main:
    ;aaa.mbas,4 :: main:
    ;aaa.mbas,5 :: cc=a*b
    MOVF _a+0, 0
    MOVWF R0+0
    CLRF R0+1
    MOVF _b+0, 0
    MOVWF R4+0
    CLRF R4+1
    CALL _Mul_16x16_U+0
    MOVF R0+0, 0
    MOVWF _cc+0
    MOVF R0+1, 0
    MOVWF _cc+1
    GOTO $+0
    ; end of _main[/code]
    همونطور که معلومه چون مقادیر اولیه a و b مشخص نیست برنامه کد رو بهینه سازی نکرده و واقعا عملیات ضرب رو به اسمبلی ترجمه کرده و تابع _Mul_16x16 فراخوانی شده (خود این تابع حدود 30 خط اسمبلی هست)

    در هر صورت (به نظر من) ضرب واقعی بدون سخت افزار ضرب توی 4 سیکل امکان نداره(8*8 بیتی) {اگه شد من سیبیلمو میزنم :mrgreen

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

    دیدگاه


      #17
      پاسخ : مشکل در با ضرب در mplab ide

      خب یه پیشنهاد دارم. دو تا تبدیل ADC رو بخونین و مقدار 8بیتش رو بردارین و تو هم ضرب بکنین.اینجوری دیگه کامپایلر نمیتونه ما رو دور بزنه! :nerd:

      نوشته اصلی توسط abbasmh
      در هر صورت (به نظر من) ضرب واقعی بدون سخت افزار ضرب توی 4 سیکل امکان نداره(8*8 بیتی) {اگه شد من سیبیلمو میزنم :mrgreen
      یعنی شرط بندی در حد گرو گذاشتن شاهرگ بودهاااا.... :mrgreen: :mrgreen:

      دیدگاه


        #18
        پاسخ : مشکل در با ضرب در mplab ide

        نوشته اصلی توسط شاهرخ مستقیمی
        خب یه پیشنهاد دارم. دو تا تبدیل ADC رو بخونین و مقدار 8بیتش رو بردارین و تو هم ضرب بکنین.اینجوری دیگه کامپایلر نمیتونه ما رو دور بزنه! :nerd:
        یعنی شرط بندی در حد گرو گذاشتن شاهرگ بودهاااا.... :mrgreen: :mrgreen:
        آخه این کارم کردم. حداکثر 7 میکرو ثانیه طول میکشه!!!! واقعا عجیبه برام
        طب اسلامی

        دیدگاه


          #19
          پاسخ : مشکل در با ضرب در mplab ide

          مقدار ADCها رو تغییر دادین تا ببینین اون زمان هم عوض میشه یا نه؟ برنامه تون مولتی تسک نباشه؟!! :mrgreen:

          دیدگاه


            #20
            پاسخ : مشکل در با ضرب در mplab ide

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

            دیدگاه


              #21
              پاسخ : مشکل در با ضرب در mplab ide

              با اون روشی که جناب Abbasmh توی عکس نشون دادن و این توضیحاتشون، این تاخیر رو حساب کردین ببینین جور در میاد؟

              نوشته اصلی توسط abbasmh
              4x4 bit from John Payson, Ray Gardiner, Dmitry ***yashov (12 cycles/ 12 instructions)
              8x8 bit from Andrew Warren (10 or 35 instructions, 38 cycles)
              8x8 bit from unknown author (please step forward) (35 instructions, 37 cycles)
              8x8 bit from Scott Dattalo with small correction by Dmitry ***yashov (52 instructions, 24-36 cycles, 34 avg)
              16x8 bit from Dingbat
              16x8 bit from Martin Sturm (18 instructions, 84-124 cycles, 104 avg)
              16x8 bit from Martin Sturm (69 instructions, 69 cycles)
              10x10 bit from Martin Sturm (73 instructions, 57-73 cycles, 65 avg)
              14x10 bit from Martin Sturm (83 instructions, 71-83 cycles, 77 avg)
              12x12 bit from Martin Sturm (92 instructions, 92 cycles)
              16x16 bit from Martin Sturm (140 instructions, 140 cycles)
              16x16 bit from Jim Bixby Unsigned, fast (16x16 mpy in 164 instructions ~168 cycles):
              16x16 bit macro from Bob Fehrenbach, Scott Dattalo (22 instructions, 215 to 295 cycles)
              16x16 bit From Clyde Smith-Stubbs of HI-TECH software (21 instructions, < 289 cycles)
              16x16 bit from malin. Unsigned (32 instructions, 128 to 229 cycles)
              16x16 bit from malin. Signed. (64 instructions, 134 to 248 cycles)
              16x16 bit from Ravi Pailoor Signed or Unsigned (240 instructions, < 282 cycles)

              دیدگاه


                #22
                پاسخ : مشکل در با ضرب در mplab ide

                نوشته اصلی توسط abbasmh
                عزیز این برنامه ای که گفتی توی 40 یا 50 سیکل حداکثر اجرا میشه. منم میتونم یه برنامه بنویسم که حداکثر توی 20 خط اجرا شه. ولی یه همچین برنامه ای یه مشکل داره. اونم اینه که مقداری که توی 8 بیت اول و 8 بیت آخر میریزه به صورتی نیستش که بشه ازش مستقیم استفاده کردش. مثلا مقدار 255*255 میشه 65025.ولی مقدار 8 بیته بالا و 8 بیت پایین جدا میشه و گذارش داده میشه. اگه مثلا بخام از اینا استفاده کنم چطوری میشه استفاده کنم؟؟ مثلا واس این مثال 8 بیت بالا میشه 254 و 8 بیت پایین میشه 1 .مثلا میخام این مقدار توی ال سی دی نشون بدم. چطوری نشون بدم به صورت ده دهی؟؟
                طب اسلامی

                دیدگاه


                  #23
                  پاسخ : مشکل در با ضرب در mplab ide

                  از اون جایی که خیلی تمایل به استفاده از اسمبلی ندارم، واسه همین هم زیاد سمتش نرفتم و الان متوجه سوالی که پرسیدین نشدم.
                  همچنان برام سواله که چرا اینقدر اصرار بر استفاده از اسمبلی دارین. جان من بیخیالش بشین :redface: خب از همون CCS یا C18 استفاده کنین دیگه...

                  دیدگاه


                    #24
                    پاسخ : مشکل در با ضرب در mplab ide

                    نوشته اصلی توسط شاهرخ مستقیمی
                    از اون جایی که خیلی تمایل به استفاده از اسمبلی ندارم، واسه همین هم زیاد سمتش نرفتم و الان متوجه سوالی که پرسیدین نشدم.
                    همچنان برام سواله که چرا اینقدر اصرار بر استفاده از اسمبلی دارین. جان من بیخیالش بشین :redface: خب از همون CCS یا C18 استفاده کنین دیگه...
                    توی اسمبلی شاید ضرب و تقسیم سخت باشه. ولی چیزای دیگه انقدر راحته که فکرشم نمیکنی آقا شاهرخ.اصلا به نظر من این چینیا زبونایی مثل سی یا سی شارپ..... اینار به وجود آوردن که ماهارو از دنیا عقب نگه دارن. توی سی برنامه نوشتن مثل شعبده بازی میمونه واس من. اصلا نمیفهمم چیکار دارم میکنم. یه سری برنامه از پیش تعیین شده....... واس من که اصلا جالب نیست.2 تا خطم برنامه مینویسی حافظت پر میشه فوری. به صرفه نیست آقا. تجاریم نیستش.سی خیلی کار کردما.ولی حیف وقتی که روش کذاشتم واقعا
                    طب اسلامی

                    دیدگاه

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