سلام
یک سوال ساده داشتم :
می خواستم بدونم مدت زمان اجرای و یا هموت تعداد سیکلی که هر دستور بیسکام طول میکشه چقدره ؟
مثلا یک دستور if ساده توی چند سیکل اجرا میشه و اگر شرط if دوتا بشه چقدر میشه ؟
ممنون از کمکتون.
سلام
یک سوال ساده داشتم :
می خواستم بدونم مدت زمان اجرای و یا هموت تعداد سیکلی که هر دستور بیسکام طول میکشه چقدره ؟
مثلا یک دستور if ساده توی چند سیکل اجرا میشه و اگر شرط if دوتا بشه چقدر میشه ؟
ممنون از کمکتون.
سلام
از اونجا اغلب کامپایلر های سطح بالا ( زیان c ، بیسیک ، پاسکال و.. ) برنامه ی نوشته شده رو به زبان سطح پایین و سپس به کد ماشین ترجمه میکنن ، بدست آوردن سرعت دقیق اجرای دستور در اونا یه مقدار مشکل هشت و در کل سرعت اجرای هر دستور بستگی به ساختار کامپایلر و نحوه ی تبدیل کد نوشته شده به کد اسمبلی بستگی داره .
مثلا توی بسکام دستور start adc به دستورات زیر و سپس به کد هگز تبدیل میشه .
[HTML]ADMUX=$7C
ADCSRB=$7B
ADCSRA=$7A
ADCSR=$7A
ADCH=$79
ADCL=$78[/HTML]
توی کد ویژن نیازی به نوشتن دو خط از موراد بالا نیست .
و در اسمبلی میشه با مساوی قرار دادن مقدار ریجستر ها ، یک خط دیگه رو هم حذف کرد .
در کل توی avr هر دستور توی یک سیکل کلاک اجرا میشه ، مثلا اگه فرکانس کریستال برابر با یک مگاهرتز باشه ، راه اندازی adc ( فقط دستور شروع به کار ) در بسکام 6 میکرو ثانیه و در کد ویژن تقریبا 4 میکرو ثانیه و در اسمبلی تقریبا 3 میکرو ثانیه طول می کشه .
موارد بالا 100 درصد دقیق نیست و صرفا برای درک موضوع من اونا رو مطرح کردم ، اما اگه شما میخوایید سرعت دقیق اجرای یک دستور رو بفمید میتونید تعداد زیادی از اون رو پشت سرهم بیارید و سپس زمان اچرای کل رو به تعدا تقسیم کنید .
سلام !
آقای یک نفر درست میفرمایند !
دقیقا همین مشکلی بود که من داشتم توی پروژه اخیرم ! این که هر دستور چند سیکل مصرف میکنه ولی من با زبان سی مینوشتم
برای مثال عرض میکنم - من با وین ای وی آر کار میکردم ، اپیمایز کد رو غیر فعال کردم ، مثلا برای پرش به یه تابع اول میرفت تو یه زیر برنامه و تمام رجیستر های کاربردی رو مثل r28,r29,r30,r31 رو پوش میکرد که میشد 16 سیکل ماشین - موقه برگشت هم همه رو پاپ میکنه که اونم میشه 16 سیکل ، حالا باز تو نحوی تعریف حلقه ها تفاوت هست اگه شما از رجیستر های سیستم استفاده کرده باشی مثل متغییر های که تو رجیستر ذخیره میشن و یا نکرده باشی دو متد مختلف داره ، خلاصه من که کاملا نا امید شدم ازش ، آخه کد تولید شده وابستگی های زیادی داره و نمیشه حدس زد که چی تولید میشه تازه این که زبان سی هست و اپتیماز نداره ، چه برسه به بیسیک ، که اصلا معلوم نیست چی به چیه ،
من قیدش رو زدم و مستقیم با اسمبلی نوشتم برنامه رو دردسر داشت ولی واقعا آدم میبینه دستش بازه روحیه میگیره
سلام!
برای هر کدی فرق می کنه حتی هر if با if دیگری سیکل مصرفی آن فرق میکنه!
هدفتون از فهمیدن این زمان چیه ؟ اگر می خواهید یک زمان دقیقی رو تولید کنید از تایمر استفاده کنید.
یا می تونید از پروتئوس کمک بگیرید من برای فهمیدن دقیق اینکه چقدر طول می کشه از Debug پروتئوس استفاده می کنم.
سلام به اساتید!!!
اصلا کی گفته که دستورات در bascom از codvision بیشتر تولید میشه و سیکل اجراییش بالا هست؟؟؟؟
من خودم اصلا غیرتی نیستم و زبان برنامه نویسی برام مهم نیست، خدارو شکر به اکثرشون تسلط دارم. ولی این بحث رو همیشه بین AVR کارها دیدم که....
رفتم تحقیق کردم و فهمیدم که تمام کد هایی که با کامپایلر های مختلف نوشته میشه، در اخر با کامپوننت و سیستم داخلی که AVRStudio داره به HEX تبدیل میشه و هیچ تفاوتی نمیکنه.
باید بگم که در واقع حتی Bascom بهتره چون که تمام منابع رو به صورت بهینه کنترل میکنه و ...
در رابطه با کنترل منابع در میکرو پیشنهاد میکنم که معماری ریز پردازنده ها و معماری رایانه رو برید و بخونین!!!
سلام!
شما درست می گید که در آخر فایل اسمبلی تولید شده توسط یک فایل "avrasm" تبدیل به یک فایل می شه ولی در کل کد اسمبلی تولید شده در دو برنامه مختلف فرق می کنند.
من خودم به شخصاً اول بسکام و بعد اسمبلی و بعد C را یاد گرفتم.
بسکام ساده و دستت برای کارهای پیچیده مثل پردازش همزمان ( thread ) کارایی دارد ولی زیاد سخت هست!
در اسمبلی کد های نوشته شده زیاد می شود که بسیاری از موارد پیچیده و گمراه کننده می شود!
در C چون چندین صفحه و به دلیل آزاد بودن ( نسبت به بیسیک ) در ارتباط با رجیستر های بیسیک از نظر نوشتن برای برنامه های پیچیده بهتر است ( نظر شخصی خودم )!
منظور من اینه که در همان برنامه با هم فرق می کنند!برای هر کدی فرق می کنه حتی هر if با if دیگری سیکل مصرفی آن فرق میکنه!
مثال از C:
[HTML]
; 0000 0014 if(a==0)PORTD=10;
TST R5
BRNE _0x6
LDI R30,LOW(10)
OUT 0x12,R30
; 0000 0015 if(a==0)
_0x6:
TST R5
BRNE _0x7
; 0000 0016 {
; 0000 0017 PORTD=10;
LDI R30,LOW(10)
OUT 0x12,R30
; 0000 0018 PORTC=0x00;
LDI R30,LOW(0)
OUT 0x15,R30
; 0000 0019 }
; 0000 001A if(a==0)
_0x7:
TST R5
BRNE _0x8
; 0000 001B {
; 0000 001C PORTD=10;
LDI R30,LOW(10)
OUT 0x12,R30
; 0000 001D PORTC=10;
OUT 0x15,R30
; 0000 001E }
; 0000 001F
; 0000 0020 };
_0x8:
RJMP _0x3
; 0000 0021 }
_0x9:
[/HTML]
اینی هم که شما میگید درست، اما اطمینان داشته باشید که اگر هم کد های بسکام به مقدار کد زیادی در اسمبلی تبدیل بشه، باز هم در برنامه های با توابع زیاد و پیچیده سریع تر عمل میکند.
در هر حال در بدترین شرایط برطبق گفته هایی در یک سایت خارجی، سرعت بسکام در استفاده از حد اکثر کلاک AVR برابر 93% و در CodeVision برابر با 96% هست. و اسمبلی 100% است.
پس اگه واقاٌ کد نویس باشید میبینید که .....
من خودم روی ربات های انسان نما کار میکنم و بخش کنترل تعادل و حرکت با یک M128 انجام میشود. که نزدیک به 5 thread یا( برنامه همزمان) در میکرو صورت میگیره و در از تمام منابع در میکرو ( تایمر ها ، مبدل ها ، پورت های سریال ، I2c، و.... ) استفاده شده که به جرات میتونم بگم که به هیچ وجه نمیشه این برنامه رو با CV نوشت.
www.mojtabakarimi.webstarts.com
mojtaba_sky@live.com
سلام
اگه توی پست های فوق دقت کنید ، اسمی از تمامی دستورات یک کامیپایلر برده نشده . مثلا هیچ کس نمیتونه ادعا کنه که سرعت اجرای تمامی دستورات بیسیک از دستورات کد ویژن کمتر هست .
اما چیزی که در اینجا مسلمه این هست که در زبان های c و بیسیک برای اجرای هر دستور ، میکرو باید تابعی رو از کتابخونه ی مربوطه بخونه و اون رو اجرا کنه .
کد های که در تابع مربوطه قرار دارن توسط برنامه نویس کامپایلر انتخاب شده و از اونجا که ما روش های مختلفی رو برای نوشتن یک تابع داریم و قطعا از میون این روش ها فقط یکی در کمترین زمان اجرا میشه ، پس سرعت اجرای دستورات مختلف در کامیپالر های مختلف متفاوت خواهد بود .
اقا درگیری اکثرا سر این هست که میشه با میکرو بیشتر از 1 مگاهرتز ساخت یا نه ؟