اطلاعیه

Collapse
No announcement yet.

شیفت 16 بیت ذر کدویژن

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

    #16
    پاسخ : شیفت 16 بیت ذر کدویژن

    نوشته اصلی توسط reza_agha
    با عرض تبریک سال نو خدمت سروران.متاسفانه این مشکل بیشتر به وجود چیزی مانند کد ویژن برمیگرده که خیلی از قواعد کاری رو برای به اصطلاح راحتی برنامه نویس بهم ریخته. اگر قراره علی آباد هم شهری باشه که تکلیف بقیه دهات و شهر ها نا معلومه. منظورم اینه که وقتی عبارتی مثل PORTA.0 در این زبان C استفاده میشه قاعدتا بایستی در نظر گرفت که سیستم مقدار عبارت قید شده رو با استفاده از یک cast ضمنی به مقدار بیتی تبدیل میکند. و قاعدتا این مقدار بیتی بایستی از صفر بودن یا نبودن مقدار محاسبه شده نهایی نشات بگیرد. انصافا بنظر میرسد که کد ویژن هم با همین دید جلو میرود ولی وقتی نتیجه محاسبه را در جفت رجیستر 31 و 30 برای تابع داخلی فوق الذکر پاس میکند میبینیم که در تابع فوق فقط مقدار r30 چک میشود. که این باگ کامپایلر است.
    ضمنا در عبارت اول رجیستر پورت مد نظر نیست و فقط یک بیت از آن مد نظر است. بنا براین نبایستی طبق روالهای موجود حاصل سمت راست عبارت به بایت تبدیل شود. مضاف بر اینکه حاصل سمت راست عبارت دارای مقدار 16 بیتی بوده و بفرم 16 بیتی محاسبه میشود.
    با تبریک سال نو و آرزوی موفقیت و سلامت برای شما، مشکل اصلی در همان دست بردن کدویژن در استانداردهای C و اضافه کردن امثال PORTA.0 به امکان برنامه نویسی است که منجر به این مسائل می شود. با بررسی کدهای معادل اسمبلی مشخص می شود که در عمل کدویژن برای چنین عبارتی به عنوان بیتی از یک بایت برخورد می کند و ماهیت true و false را برای عبارت مورد سنجش و نسبت دادن آن به پین مورد نظر قائل نمی شود. این رفتار را قبل از نوشتن پست های قبل در سیمولاتور AVRStudio بررسی کردم و جالب است که با قرار دادن optimization در سطوح مختلف، کدهای متفاوتی هم تولید می شوند، ولی ظاهرا در کدویژن تا زمانی که عبارت مورد سنجش در محدوده یک بایت باشد، به پین مقدار یک را نسبت می دهد. اما بیت های واقع در مکان هشتم به بعد به نتیجه صفر منجر می شوند.
    اوژن: به معنای افکننده و شکست دهنده است
    دانایی، توانایی است-Knowledge is POWER
    برای حرفه ای شدن در الکترونیک باید با آن زندگی کرد
    وضعمان بهتر می شود، اگر همه نسبت به جامعه و اطراف خود مسوول باشیم و نگوئیم به ما چه
    قوی شدن و خوب ماندن - خوبی کردن به دیگران یک لذت ماندگار است
    اگر قرار باشد نفت و منابع خام را بدهیم و چرخ بگیریم، بهتر است چرخ را از نو اختراع کنیم
    ساعت کار بدن اکثر انسان ها کمتر از 800000 ساعت است و بعد از آن از کار می افتد

    دیدگاه


      #17
      پاسخ : شیفت 16 بیت ذر کدویژن

      دوستان یه سوال دیگه

      برای 32 بیت و 64 بیت به حای U چه حرفی باید بزارم؟

      ممنون از کمکتون

      دیدگاه


        #18
        پاسخ : شیفت 16 بیت ذر کدویژن

        در سیستمهای متفاوت ممکنه فرق کنه. در سیستمهای 16 بیتی؛ یک عدد long یک عدد 32 بیتی هست. ولی در یک سیستم 32 بیتی یک عدد 32 بیتی یک فرم معمول هست. در همان نسخ 16 بیتی اگر کامپایلر از عدد 64 بیتی پشتیبانی کند بصورت long long یا LL هست.
        در AVR چون بصورت عملیاتی (و نه ساختاری) یک سیستم 16 بیتی فرض میشود (int یک عدد 16 بیتی هست) یک عدد 32 بیتی بایستی بفرم long یعنی با پسوند L و عدد 64 بیتی بفرم long long با پسوند LL قید شود. در هر صورت یک U هم برای مشخص کردن unsigned بودن می آید.

        مثلا:
        0x12345678UL
        یک عدد 32 بیتی بدون علامت هست.

        0x1234567887654321LLU یک عدد 64 بیتی بدون علامت هست. (البته به شرطی که کامپایلر پشتیبانی کنه)

        دیدگاه

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