اطلاعیه

Collapse
No announcement yet.

|??| دسترسی بیتی به داده ها؟

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

    |??| دسترسی بیتی به داده ها؟

    سلام دوستان
    1- آیا داخل CV کدویژن میشه به داده ها به صورت بیتی دسترسی پیدا کرد؟(مثلا یه متغیر 16بیتی تعریف کردیم،حالا میخواییم فقط بیت نهم رو تغییر بدیم)
    2- هدف اینه:
    میخوام بیت 8تا15 یک متغیر 16بیتی رو جا به جا کنم: بیت8با15، 9با14، 10با13 و...
    چه الگوریتمی به نظرتون بهینه هستش؟
    ممنون...
    اونچيزي که در دانشگاه ياد ميگيريد، "الفبايي" هست براي نوشتن يک "رمان" !!

    #2
    پاسخ : |??| دسترسی بیتی به داده ها؟

    روش مستقیمی تو کدویژن برای اینکار وجود نداره(یا لااقل من نمی دونم) اما میشه با چند خط برنامه ردیفش کرد:
    فرض کنید یه متغیر unsigned int داریم به نام y
    می خواهیم بیت نهم را تغییر دهیم به این طریق عمل می کنیم:
    کد:
    y&=0b1111110111111111;
    y|=0b000000[x]000000000
    که به جای[x] مقداری که میخوای به اون بیت بدی(صفر یا یک ) را باید بذاری.
    البته حرفه ای ترش اینه:
    کد:
    y&=0xFFFE<<9;
    y|=[x]<<9;

    برای خواندن یک بیت خاص(مثلا بیت چهارم) هم باید :
    کد:
    if((y&(1<<4))>0)
    x=1;
    else
    x=0;
    خب برای جابجا کردن اون هشت تا بیت هم فقط یه الگوریتم به نظرم میرسه: اینکه مثلا بیت 8 و 15 را می خوانی با استفاده از یک متغیر کمکی ، بیت 8 را جای 15 و 15 را جای 8 می ذاری ، برای بقیه هم همین کار را می کنی. بهینه تر از این فعلا چیزی در چنته ندارم .

    دیدگاه


      #3
      پاسخ : |??| دسترسی بیتی به داده ها؟

      با سلام
      آقا یه راه نا متعارف میگم ببینید بدردتون میخوره یا نه .

      خوب تو کدویژن میشه مثلا برای مگا 16 به رجیستر های به آدرس 0 تا 1F هگزه دسترسی بیتی داشت
      خوب چیزی که مد نظر من هست اینه که مثلا شما یه رجیستر 16 بیتی بیکار که تو این رنج قرار گرفته رو به عنوان متغیر 16 بیتی تون در نظر بگیرید حالا هر کاری خواستید میتونید باهاش بکنید فقط یادتون باشه که رجیستر های 16 بیتی تو میکرو برای نوشتن و خوندن تو 8 بیت بالاشون از یک رجیستر میانجی استفاده میکنند .

      این ها رجیستر های 0 تا 1F هگزهتو مگا 16 هست ببینید از کدوم یکی از رجیستر های 16 بیتی بیکار تو این رنج میتونید برای اینکاری که میخوایید استفاده کنید

      کد:
      sfrb TWBR=0;
      sfrb TWSR=1;
      sfrb TWAR=2;
      sfrb TWDR=3;
      sfrb ADCL=4;
      sfrb ADCH=5;
      sfrw ADCW=4;   // 16 bit access
      sfrb ADCSRA=6;
      sfrb ADMUX=7;
      sfrb ACSR=8;
      sfrb UBRRL=9;
      sfrb UCSRB=0xa;
      sfrb UCSRA=0xb;
      sfrb UDR=0xc;
      sfrb SPCR=0xd;
      sfrb SPSR=0xe;
      sfrb SPDR=0xf;
      sfrb PIND=0x10;
      sfrb DDRD=0x11;
      sfrb PORTD=0x12;
      sfrb PINC=0x13;
      sfrb DDRC=0x14;
      sfrb PORTC=0x15;
      sfrb PINB=0x16;
      sfrb DDRB=0x17;
      sfrb PORTB=0x18;
      sfrb PINA=0x19;
      sfrb DDRA=0x1a;
      sfrb PORTA=0x1b;
      sfrb EECR=0x1c;
      sfrb EEDR=0x1d;
      sfrb EEARL=0x1e;
      sfrb EEARH=0x1f;


      از مزایای اینکار میتونه این ها باشه :
      1. کاهش میزان SRAM مصرفی به اندازه 16 بیت .
      2. کاهش کد تولیدی برای خوندن نوشتن به خاطر اینکه دیگه نیازی نیست که دائم برای خوندن و نوشتن داخل SRAM کامپایلر بره تو فضای حافضه SRAM و ادرس بزاره تو رجیستر اشاره گر و بعد از طریق اون آدرس از SRAM استفاده کنه .
      3. درگیر نشدن با برنامه نویسی زبان سی مثلا عدم نیاز به پوینتر و یا تعریف ساختار برای دسترسی بیتی .

      دیدگاه


        #4
        پاسخ : |??| دسترسی بیتی به داده ها؟

        ممنون دوستان
        پس راه ساده ای وجود نداره!
        مثلا اونجور که به پورت ها دسترسی داریم(PORTA.0 , PORTA.1,...)
        اگه اینجوری بی دردسر میشد میشد خیلی خوب بود
        ایده شیفت دادن و استفاده از متغیر کمکی رو خودم استفاده میکنم،اما میخواستم بدونم که راه میانبری هست یا نه که به ظاهر نیست!
        اونچيزي که در دانشگاه ياد ميگيريد، "الفبايي" هست براي نوشتن يک "رمان" !!

        دیدگاه


          #5
          پاسخ : |??| دسترسی بیتی به داده ها؟

          یعنی شما از همه این رجیسترای 16 بیتی تو این رنج دارین استفاده میکنین ؟

          دیدگاه


            #6
            پاسخ : |??| دسترسی بیتی به داده ها؟

            نوشته اصلی توسط mojtaba_led
            یعنی شما از همه این رجیسترای 16 بیتی تو این رنج دارین استفاده میکنین ؟
            خیلی ممنون، اما حقیقتش مشکل وقته و باید اول بیام این رجیسترها رو بررسی کنم که چحوری میشه باهاشون کار کرد، یه سری هاشون هم تو برنامه دارن استفاده میشن(مثل URART , ADC) و علاوه بر این مشکل من هم دقیقا با16بیتی هستش و اینجا هم باید از رجیستر میانجی استفاده کنم،با همه این اوصاف از لحاظ وقت اگه در نظر بگیریم، همین روش شیفت دادن فعلا ارجح هستش، البته قبول دارم روشی که شما گفتید میتونه اصولی تر باشه اما مشکل زمانه



            اونچيزي که در دانشگاه ياد ميگيريد، "الفبايي" هست براي نوشتن يک "رمان" !!

            دیدگاه


              #7
              پاسخ : |??| دسترسی بیتی به داده ها؟


              دیدگاه


                #8
                پاسخ : |??| دسترسی بیتی به داده ها؟

                نوشته اصلی توسط محمد نجفیان
                روش mojtaba_led روش خوبیه(به همان راحتی که انتظار دارید) اما اگر واقعا از رجیستر های خاص نمیتونید برای کارتان استفاده کنی و روش اولی که گفتم کارایی لازم را نداره این روش را انجام بدهید:

                همونطور که می دونید رجیسترهای R2 تا R14 تو AVR قابلیت استفاده به صورت تک بیتی را دارند.
                شما یک متغیر 16 بیتی سراسری تعریف می کنی و آدرسش را بین 0x02 تا 0x0D قرار می دهید.
                ***کد زیر حتما تو حوزه عمومی باشد.
                کد:
                unsigned int y @ 0x02;
                sfrb ybl=0x02;
                sfrb ybh=0x03;
                بایت پایینی تو R2 و بایت بالایی تو R3 ذخیره میشه.
                شما می تونید کلیه عملیات سطح بالا را با متغیر y انجام دهید و عملیات سطح پایین( والبته سطح بالا تا حدی که یک بایت بیشتر درگیر نشه) را با ybl,ybh انجام بدید.
                مثلا برای ست کردن بیت نهم y دستور زیر را می نویسید:
                کد:
                ybh.0=1;
                البته این روش را تازه کفش(کشف) کردم. کدویژن هم بدون هیچ اروری Build کرد.
                بسیار ممنون دوست عزیز
                سر فرصت حتما کدتون رو بررسی میکنم تا دقیق متوجه بشم
                اونچيزي که در دانشگاه ياد ميگيريد، "الفبايي" هست براي نوشتن يک "رمان" !!

                دیدگاه


                  #9
                  پاسخ : |??| دسترسی بیتی به داده ها؟

                  نوشته اصلی توسط محمد نجفیان
                  البته حرفه ای ترش اینه:
                  کد:
                  y&=0xFFFE<<9;
                  y|=[x]<<9;
                  این حرفه ای تر به نظر میاد زمان پردازش بیشتری لازم داره.

                  دیدگاه


                    #10
                    پاسخ : |??| دسترسی بیتی به داده ها؟

                    نوشته اصلی توسط gtnfs


                    این حرفه ای تر به نظر میاد زمان پردازش بیشتری لازم داره.
                    اگر منظورتون نسبت به این باشه:
                    نوشته اصلی توسط محمد نجفیان

                    کد:
                    y&=0b1111110111111111;
                    y|=0b000000[x]000000000
                    بله حرفه ای تره .
                    حرفه ای بودن به این نیست که کد نوشته شده الزاما زمان پردازش کمتری داشته باشد. بلکه قابلیت توسعه راحتتر و عیب یابی ساده تر ، خوانایی بالاتر و تعداد خطوط کمتر برنامه و... نکات خیلی مهمی هستند که یک برنامه نویس تا موقعی که از نظر زمان پردازش و حجم کد در معذوریت نباشه باید به آن پایبند باشه.اما در شرایطی که حجم کد یا زمان پردازش برای ما خیلی مهم باشه و کد های مربوطه در بخشهای بحرانی برنامه قرار داشته باشه حق با شماست.
                    به هر حال من هر دو صورت را ذکر کردم که بابا برقی بسته به نیاز خودشان از هر کدام که بهتر بود استفاده کنند، گرچه خودشان استاد هستند و از این روشها اطلاع داشتند و به دنبال روش های بهتر بودند.

                    دیدگاه

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