اطلاعیه

Collapse
No announcement yet.

حافظه فلش و اتمل استدیو

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

    حافظه فلش و اتمل استدیو

    سلام
    من با کتابخونه tuxgraphic میخوام به enc28j60 و اترنت وصل بشم!!

    توی قسمتی از این کتابخونه یه تابع هست به این شکل:

    کد:
    uint16_t fill_tcp_data_p(uint8_t *buf,uint16_t pos, const char *progmem_s PROGMEM)
    {
        char c;
        // fill in tcp data at position pos
        //
        // with no options the data starts after the checksum + 2 more bytes (urgent ptr)
        while ((c = pgm_read_byte(progmem_s++))) {
            buf[TCP_CHECKSUM_L_P+3+pos]=c;
            pos++;
        }
        return(pos);
    }
    البته پارامتر سوم prog_char بود که کامپایلر ارور میداد و من سرچ کردم و ظاهرا باید اینجور نوشته میشد...

    اما موقع استفاده از این تابع اینجور استفاده میکنیم:
    کد:
                        plen=fill_tcp_data_p(buf,0,PSTR("HTTP/1.0 200 OK\r\nContent-Type: text/html\r\n\r\n"));
    و کاراکتر هامون رو به تابع PSTR میدیم!!

    کد:
    /** \ingroup avr_pgmspace
      \def PSTR(s)
    
      Used to declare a static pointer to a string in program space. */
    # define PSTR(s) ((const PROGMEM char *)(s))
    #else /* !DOXYGEN */
    /* The real thing. */
    # define PSTR(s) (__extension__({static const char __c[] PROGMEM = (s); &__c[0];}))
    #endif /* DOXYGEN */
    حال سوال اینجاست:

    1- استرینگ هایی که در کد برنامه و به صورت "asdasd" نوشته میشوند در جه حافظه ای فضا میگیرند؟! مگر فلش نیست ! پس این تبدیل و .. برای چیه؟!

    2- چرا برنامه نویس این کار رو کرده و مستقیم اینجوری برنامه ننوشته :

    کد:
    uint16_t fill_tcp_data(uint8_t *buf,uint16_t pos, const char *s)
    {
        // fill in tcp data at position pos
        //
        // with no options the data starts after the checksum + 2 more bytes (urgent ptr)
        while (*s) {
            buf[TCP_CHECKSUM_L_P+3+pos]=*s;
            pos++;
            s++;
        }
        return(pos);
    }
    اخبار فناوری - راز روز

    http://razerooz.com

    #2
    پاسخ : حافظه فلش و اتمل استدیو

    رشته ها در فایل HEX خروجی قرار میگیرند و به حافظه Flash کپی می شوند اما از آنجایی که در AVR آدرس دهی فضای RAM و Flash با یکدیگر متفاوت هست، در صورتی که طبق روش شما از رشته ها استفاده شود کامپایلر طبق معمول محل قرار گیری رشته را در RAM در نظر میگیرد بنابراین قبل از شروع کدهای اصلی برنامه تان ابتدا رشته های تعریف شده را از Flash به محل مورد نظر در RAM کپی می کند تا در برنامه از آن استفاده کند و اشکال کار اینجاست که هر دو حافظه Flash و RAM با دیتای تکراری اشغال می شوند. اما طبق کدهای موجود در کتابخانه رشته ها در Flash قرار دارند و آدرس محل آنها در Flash به کامپایلر داده شده و برنامه متناسب با آن نوشته شده، در نتیجه عملیات کپی اولیه انجام نمی شود و به این ترتیب در مصرف RAM صرفه جویی می شود.

    لینک مثال مشابه
    لینک برای prog_char
    گاهی افرادی به موفقیت های بزرگ می رسند، تنها به این دلیل ساده که نمی دانند کاری که به آن دست زده اند بسیار دشوار، بلکه غیر ممکن است.

    دیدگاه


      #3
      پاسخ : حافظه فلش و اتمل استدیو

      نوشته اصلی توسط Hamed Gh
      رشته ها در فایل HEX خروجی قرار میگیرند و به حافظه Flash کپی می شوند اما از آنجایی که در AVR آدرس دهی فضای RAM و Flash با یکدیگر متفاوت هست، در صورتی که طبق روش شما از رشته ها استفاده شود کامپایلر طبق معمول محل قرار گیری رشته را در RAM در نظر میگیرد بنابراین قبل از شروع کدهای اصلی برنامه تان ابتدا رشته های تعریف شده را از Flash به محل مورد نظر در RAM کپی می کند تا در برنامه از آن استفاده کند و اشکال کار اینجاست که هر دو حافظه Flash و RAM با دیتای تکراری اشغال می شوند. اما طبق کدهای موجود در کتابخانه رشته ها در Flash قرار دارند و آدرس محل آنها در Flash به کامپایلر داده شده و برنامه متناسب با آن نوشته شده، در نتیجه عملیات کپی اولیه انجام نمی شود و به این ترتیب در مصرف RAM صرفه جویی می شود.

      لینک مثال مشابه
      لینک برای prog_char
      ممنون از پاسختون اما هنوز یه چیزی رو خوب نفهمیدم!

      مگر "string" درون فلش نبود!
      بعد ما با تابع PSTR اون رو داخل رم قرار میدیم
      برای مدت موقت؟(آیا درسته و موقت هست؟!)

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

      یعنی در واقع نفهمیدم چه معنی داره که یا تابع آرگمانش متغییری از درون فلش باشه!!
      یعنی یه فضای char توی فلش همیشه هست که ما تابع رو صدا میزنیم هرچی داخل آرگومان سوم باشه میره اونجا میشینه!

      خب اگه قراره بره اون جا بشینه چرا میریزیمش توی رم (PSTR) و بعد میدیم به تابع؟

      آرگومان سوم اشاره گره و آدرس میخواد! ما آدرس قسمتی از رم رو داریم بهش میدیم یا قسمتی از فلش ؟!
      مطابق این خط pgm_read_byte(progmem_s++) احتمالا داریم ادرسی از فلش بهش میدیم!
      پس PSTR چی جور برای ما ریخت توی رم ؟! :angry: :read:
      اخبار فناوری - راز روز

      http://razerooz.com

      دیدگاه


        #4
        پاسخ : حافظه فلش و اتمل استدیو

        PSTR رشته مورد نظر را در Flash قرار میدهد و آدرس آنرا به تابع ارسال می کند. در داخل تابع با استفاده از pgm_read_byte دیتای موجود در Flash در دسترس هست.
        گاهی افرادی به موفقیت های بزرگ می رسند، تنها به این دلیل ساده که نمی دانند کاری که به آن دست زده اند بسیار دشوار، بلکه غیر ممکن است.

        دیدگاه


          #5
          پاسخ : حافظه فلش و اتمل استدیو

          نوشته اصلی توسط Hamed Gh
          PSTR رشته مورد نظر را در Flash قرار میدهد و آدرس آنرا به تابع ارسال می کند. در داخل تابع با استفاده از pgm_read_byte دیتای موجود در Flash در دسترس هست.
          درسته :applause:
          ممنون
          (من فکر کردم اسم تابع pstr = put string to ram هست ) )
          اما مگه دیتای مورد نظر کجاست که ما اونو توی فلش قرار میدیم؟!؟ مگه دیتا توی کد برنامه و کد برنامه خودش توی فلش نیست؟
          اگه بخواد یه جای دیگه از فلش باشه که بازم دیتای تکراری دو جا هست
          یکی داخل کد یکی اونجا که الان میریزیمیش :|
          اخبار فناوری - راز روز

          http://razerooz.com

          دیدگاه


            #6
            پاسخ : حافظه فلش و اتمل استدیو

            اما مگه دیتای مورد نظر کجاست که ما اونو توی فلش قرار میدیم؟!؟ مگه دیتا توی کد برنامه و کد برنامه خودش توی فلش نیست؟
            منظور همان دیتای موجود در کد برنامه هست. PSTR آدرس آنرا به تابع ارسال می کند.
            گاهی افرادی به موفقیت های بزرگ می رسند، تنها به این دلیل ساده که نمی دانند کاری که به آن دست زده اند بسیار دشوار، بلکه غیر ممکن است.

            دیدگاه

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