اطلاعیه

Collapse
No announcement yet.

خواندن برنامه از حافظه ی خارجی

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

    خواندن برنامه از حافظه ی خارجی

    با سلام
    یه سوال داشتم آیا میشه از یه حافظه ی خارجی برنامه رو خوند بجایی که برنامه از Flash میکرو خونده شه؟
    اون حافظه باید چه آی سی هایی باشند؟
    چه جوری پروگرم میشند ؟
    و... :job:
    الهم عجل لولیک الفرج

    فقط 313 نفر...

    #2
    پاسخ : خواندن برنامه از حافظه ی خارجی

    از میکروهای 8 بیتی مایکروچیپ که در بازار خودمون گیر بیاد تا اونجا که یادم هست 18F8722 این امکان رو داره که برنامه رو از حافظه خارجی اجرا کنه و محدوده آدرس دهی هم فکر میکنم 2 مگا بایت هست ( قسمت External Memory Bus در دیتاشیتش رو مشاهده کنید ) توی دیتاشیت XMEGA هم دسترسی به حافظه خارجی دیدم اما اجرای برنامه از حافظه خارجی هم امکان پذیر هست یا فقط برای داده استفاده میشه، اگر دوست داشته باشید یادی از گذشته ها بکنید میکروهای 8051 هم امکان اجرای برنامه از حافظه خارجی رو دارند، AT89S51 مقدار 64 کیلوبایت حافظه خارجی رو میتونه آدرس دهی کنه و برنامه رو از روی اون اجرا کنه.
    از آنجا که گاهی فرصت بازخوانی پست نیست، بابت غلط های املایی و نگارشی احتمالی معذرت میخوام.
    هیچیک از پاسخ هایی که میدم را کاملا تایید نمیکنم و ممکن هست اشتباه کرده باشم، اگر من به نوشته ام مطمئن هستم شما مشکوک باشید.
    اگر در حل مشکل من کمک کردید و دکمه تشکر رو نزدم حتما فراموش کردم کوچکترین کمک شما برایم ارزشمند است!
    اگر به هر طریقی از من ناراحت شدید حتما با یک پیام خصوصی تذکر بدهید تا مشکل رو حل کنیم و رابطه ی صمیمانه، پایدار بماند.
    شاد و موفق باشید

    دیدگاه


      #3
      پاسخ : خواندن برنامه از حافظه ی خارجی

      بوسیله بوت لودر نمیشه اینکارو کرد؟
      hubbard.engr.scu.edu/embedded/avr/bootloader/index.html
      {خلاف قوانین - امضا ویرایش شد}

      دیدگاه


        #4
        پاسخ : خواندن برنامه از حافظه ی خارجی

        سلام دوستان نظرم عوض شد بیایید یه کاری بکنیم من اسم تاپیک رو هم عوض میکنم تا شلوغ نشه.
        یه کامن منیجر بنویسیم که توی یه حلقه میکرو بیاد دستوراتی که ما بهش از طریق های مختلف مثل سریال ، SPi و یا حافظه های خارجی بهش میدیمو اجرا کنه و تر جیحا این دستورات اسمبلی باشن تقریبا یه چیزی شبیه کامپایلر بشه و دستوراتی که ما میدهیم رو بیاد با اسمبلی اجرا کنه نظرتون چیه؟
        و یه دستور هم داشته باشه که از اون حلقه بیاد بیرون و بقیه ی کار رو از روی فلش دنبال کنه.
        این جوری که من فهمیدم حدود 130 دستور اسمبلی داریم که میتونیم با چندتا شرط و یکسی کار ها این
        کامن منیجر رو بسازیم؟!؟؟! :nice:
        الهم عجل لولیک الفرج

        فقط 313 نفر...

        دیدگاه


          #5
          پاسخ : خواندن برنامه از حافظه ی خارجی

          یکم بیشتر توضیح بدید لطفا، زمانی که یک میکرو فقط میتونه برنامه رو از ROM داخلی اجرا کنه تنها راه اجرای دستور اینه که شما دستور رو درون ROM قرار بدید، اگر بخواید یکی یکی برای هر دستور یا هر چند دستور اینکار رو بکنید که سرعت اون برنامه خارجی که میخواید اجرا کنید میاد پایین ( احتمالا مجبور هستید از Boot Loader هم استفاده کنید ).
          برای انجام این کاری که مد نظر شما هست به نظر من بهترین کار این هست که از یک میکروکنترلر که اجرای برنامه از حافظه خارجی رو پشتیبانی میکنه استفاده کنید اما به جای اینکه از ROM خارجی استفاده کنید از RAM خارجی استفاده کنید و برنامه ای که میخواید اجرا کنید رو درون RAM بارگذاری کنید اما به میکروکنترلر بگید که داره از ROM خارجی استفاده میکنه. اینجوری نمیشه توضیح بدم توضیحش کمی مفصل هست، برای اطلاعات بیشتر برید بخش به اشتراک گذاشتن فضای برنامه و داده رو در کتابهای میکروکنترلر 8051 مطالعه کنید. قسمت External Memory Bus از دیتاشیت 18F8722 رو هم نگاه کنید بد نیست، با مدهای عملکردش آشنا بشید احتمالا برای کار شما مناسب هست. البته من نگاه مختصری به دیتاشیت XMEGA کردم دیدم فضای آدرس دهی حافظه خارجی اون خیلی بیشتر هست و اگر این قابلیت رو داشته باشه که برنامه رو از حافظه خارجی اجرا کنه میتونه کار شما رو راه بندازه.
          از آنجا که گاهی فرصت بازخوانی پست نیست، بابت غلط های املایی و نگارشی احتمالی معذرت میخوام.
          هیچیک از پاسخ هایی که میدم را کاملا تایید نمیکنم و ممکن هست اشتباه کرده باشم، اگر من به نوشته ام مطمئن هستم شما مشکوک باشید.
          اگر در حل مشکل من کمک کردید و دکمه تشکر رو نزدم حتما فراموش کردم کوچکترین کمک شما برایم ارزشمند است!
          اگر به هر طریقی از من ناراحت شدید حتما با یک پیام خصوصی تذکر بدهید تا مشکل رو حل کنیم و رابطه ی صمیمانه، پایدار بماند.
          شاد و موفق باشید

          دیدگاه


            #6
            پاسخ : خواندن برنامه از حافظه ی خارجی

            نوشته اصلی توسط FAM
            سلام دوستان نظرم عوض شد بیایید یه کاری بکنیم من اسم تاپیک رو هم عوض میکنم تا شلوغ نشه.
            یه کامن منیجر بنویسیم که توی یه حلقه میکرو بیاد دستوراتی که ما بهش از طریق های مختلف مثل سریال ، SPi و یا حافظه های خارجی بهش میدیمو اجرا کنه و تر جیحا این دستورات اسمبلی باشن تقریبا یه چیزی شبیه کامپایلر بشه و دستوراتی که ما میدهیم رو بیاد با اسمبلی اجرا کنه نظرتون چیه؟
            و یه دستور هم داشته باشه که از اون حلقه بیاد بیرون و بقیه ی کار رو از روی فلش دنبال کنه.
            این جوری که من فهمیدم حدود 130 دستور اسمبلی داریم که میتونیم با چندتا شرط و یکسی کار ها این
            کامن منیجر رو بسازیم؟!؟؟! :nice:
            آقا من نمیدونم درست فهمیدم یا نه شما میخواهید یک سیستم طراحی کنید که میکرو در حین انجام کار بتونیم هر دستوری رو که خواستیم بهش بدیم و اجرا کنه
            منم وقتی این IC هارو دیدم رفتم توی فکر اینکه یه برد بسازیم مثل برد ARM 9 و بعدش بیاییم با اسمبلی یه سیستم عامل براش بنویسیم گرچه من اسمبلی بلد نیستم اما میدونم برای این کار باید از اسمبلی استفاده بکنیم بدلیل دسترسی به رجیستر های همه منظوره ولی نمیدونم که بشه در حین اجرای برنامه خود میکرو برنامشو عوض بکنه یا نه اگر هم نشد یه کم انتظاراتمون رو کمتر میکنیم و یک برنامه برای میرو مینویسیم واطلاعات دیگر را در حافظه خارجی برای میکرو قرار میدهیم
            در هر صورت هدف اصلی من از XMEGA همینه

            دیدگاه


              #7
              پاسخ : خواندن برنامه از حافظه ی خارجی

              اگه واقعا کارتون اینقده گیره توی گوگل دنبال nanovm بگردین. یک مفسر جاوا که روی atmega8 هم اجرا میشه. کدتون رو هم جاوا بهش تحویل بدین.

              دیدگاه


                #8
                پاسخ : خواندن برنامه از حافظه ی خارجی

                هر چند خانواده AVR و XMEGA تنها قادر است دستورات را از حافظه flash اجرا کند. اما با یک تکنیک ویژه و با استفاده از دستور اسمبلی ICALL می توان مطابق اطلاعات قرار داده شده در یک حافظه خارجی، دستورات مورد نظر را در flash اجرا کرد. در این مورد پستی هم در سایت AVRFreaks قرار داده شد و مورد تائید قرار گرفت که چنین روشی کاملا ممکن است اما اشکال بزرگ آن پائین آمدن بسیار زیاد سرعت اجرای هر دستورالعمل است. مسئله دیگر این است که این روش با ایجاد یک پروسه تبدیل روی برنامه اسمبلی قابل انجام است. پس اگر برنامه به زبان های سطح بالا هم نوشته شود، بعد از بدست آوردن کد معادل اسمبلی باید توسط یک نرم افزار مفسر، کد برنامه برای ذخیره سازی در حافظه جانبی تغییر داده شود و در نهایت اطلاعات flash و mmc به تفکیک توسط این مفسر تولید شوند.
                خلاصه آنکه چنین کاری ممکن است، اما منجر به کاهش شدید سرعت موثر در اجرای برنامه می شود.
                اوژن: به معنای افکننده و شکست دهنده است
                دانایی، توانایی است-Knowledge is POWER
                برای حرفه ای شدن در الکترونیک باید با آن زندگی کرد
                وضعمان بهتر می شود، اگر همه نسبت به جامعه و اطراف خود مسوول باشیم و نگوئیم به ما چه
                قوی شدن و خوب ماندن - خوبی کردن به دیگران یک لذت ماندگار است
                اگر قرار باشد نفت و منابع خام را بدهیم و چرخ بگیریم، بهتر است چرخ را از نو اختراع کنیم
                ساعت کار بدن اکثر انسان ها کمتر از 800000 ساعت است و بعد از آن از کار می افتد

                دیدگاه


                  #9
                  پاسخ : خواندن برنامه از حافظه ی خارجی

                  اگر بخواهیم انواع کدی که بصورت عمومی در یک برنامه پیاده سازی میشود را در نظر بگیریم عمدتا سه گونه کد داریم.
                  اول کد هایی هستند که ذاتا بایستی به زبانی مانند C یا اسمبلی نوشته شوندو مثلا روتین های وقفه.
                  دوم کد هایی هستند که با هر سرعتی (البته در حد معقول) اجرا شوند مسئله خاصی ایجاد نمیکند. مثلا ایجاد یک متن برای نمایش روی lcd.
                  سوم کدهایی که به خاطر ساختار خاصشون <<<مجبور هستیم>>> به زبانی مانند C یا اسمبلی بنویسیم مثلا یک برنامه صف پیغامها که در یک rt-os استفاده میشود.

                  بنا بر تجربه من (حداقل از سال 65 تا بحال) اغلب کد ها از نوع دومی هستن.

                  بنابراین


                  شما میتونین یک محیط پایه با روتین های c و اسمبلی در میکرو ایجاد کنید و با استفاده از یک زبان استاندارد مثل جاوا یا مشابه اون و یک مفسر زمان اجرا منطق اصلی خودتون رو به اون زبان پیاده سازی کنین و هر جا ... تاکید میکنم... هر جا مجبور شدید از روتین های سی و اسمبلی استفاده کنین.

                  حالا این کد (زبان جاوا یا زبان X) میتونه در هر جایی قرار بگیره در eeprom در flash در external memory و حتی از سریال دریافت بشه.

                  اگر واقعا فکر میکنین این کار بخاطر سرعت کندش نشدنیه یک سری به NanoVM بزنین و ببینین که بنده خدا برای کنترل روبوت از این ترتیبات استفاده کرده.

                  سرعت اجرای nano-vm (که البته بد هم پیاده سازی شده) در حدود 20 هزار دستورالعمل در ثانیه هست و روی یک مگا هشت اجرا شده.

                  دیدگاه


                    #10
                    پاسخ : خواندن برنامه از حافظه ی خارجی

                    سلام دوستان آیا کسی نقشه سخت افزاری اتصال آی سی های EEPROM را داره در سایت بزاره من می خواهم بدانم چگونه می شه این حافظه ها را به آی سی اتصال داد با تشکر
                    ا همه مسافريم پس بياييد به هم كمك كنيم

                    دیدگاه


                      #11
                      پاسخ : خواندن برنامه از حافظه ی خارجی

                      اینترفیسش برای SDRAM و SRAM هست اینا حافظه های موقت هستند دیگه؟
                      یه سوال دیگه کانال DMA برای حافظه برنامه وجود نداره؟

                      دیدگاه


                        #12
                        پاسخ : خواندن برنامه از حافظه ی خارجی

                        با سلام. من یک مشکلی با رم خارجی XMega پیدا کردم.
                        کامپایلرم IAR هست و نقشه شماتیک و سورس ضمیمه شده
                        http://www.uploadefile.com/file/801/...-test.rar.html
                        تو سورس یک تابع هست به نام RamTest که میاد تو یک بافر 100000 بایتی مینویسه و میخونه.
                        اما فقط 64 کیلو بایت اول رو صحیح انجام میده و بقیه رو نمیتونه ، در صورتیکه من تنظیمات رو در تابع __low_level_init
                        برای 512 کیلو بایت انجام دادم. رم موجود در سخت افزار هم 512 کیلو بایت هست.
                        در شماتیک چون XMega روی یک برد دیگر است که با پین هدر روی برد اصلی سوار میشود ، شماره پینها درست نیست. اما نام و بیت پورتها صحیح است. PCB مربوطه پین به پین چک شده و درست است.
                        در صورت امکان بنده را راهنمایی کنید.
                        ممنون.

                        دیدگاه


                          #13
                          پاسخ : خواندن برنامه از حافظه ی خارجی

                          از آنجایی که عملکرد برنامه در 64 کیلوبایت اول تامین می شود، خطوط A0-A15 به درستی عمل می کنند. بنابراین به عنوان گام اول می توانید تغییر کوچکی در برنامه ایجاد کنید تا بصورت پشت سر هم در مرز هایی از آدرس که منجر به تغییر خطوط A16 تا A18 می شود، اطلاعاتی نوشته یا خوانده شود و در هر دو سمت میکروکنترلر و SRAM با اسیلوسکوپ، این سه خط را ببیید که آیا تغییری در آنها ایجاد می شود یا نه. در مورد جزئیات برنامه هم بصورت دقیق سورس شما را بررسی نکردم. اما مقدار EBI_CTRL با توجه به نسخه جدید XMEGA A Manual صحیح نیست و یک مقدار رزرو شده در 2 بیت آخر آن قرار داده شده است (هر چند که این دو بیت مربوط به SDRAM است). یک مورد دیگر هم فعال سازی DFLL است که با توجه به توضیحات بخش Errata برای سری A1، هر دو DFLL باید برای اسیلاتورهای 2 و 32 مگاهرتز فعال باشد تا درست عمل کند که این مسئله در کد شما رعایت نشده است. اگر تغییرات در خطوط آدرس موجود بود، برای اطمینان آزمایشی با اضافه کردن wait state با توجه به 32 مگاهرتز بودن کلاک انجام دهید. در هر صورت نتیجه را اطلاع دهید.
                          اوژن: به معنای افکننده و شکست دهنده است
                          دانایی، توانایی است-Knowledge is POWER
                          برای حرفه ای شدن در الکترونیک باید با آن زندگی کرد
                          وضعمان بهتر می شود، اگر همه نسبت به جامعه و اطراف خود مسوول باشیم و نگوئیم به ما چه
                          قوی شدن و خوب ماندن - خوبی کردن به دیگران یک لذت ماندگار است
                          اگر قرار باشد نفت و منابع خام را بدهیم و چرخ بگیریم، بهتر است چرخ را از نو اختراع کنیم
                          ساعت کار بدن اکثر انسان ها کمتر از 800000 ساعت است و بعد از آن از کار می افتد

                          دیدگاه


                            #14
                            پاسخ : خواندن برنامه از حافظه ی خارجی

                            با تشکر از استاد کی نژاد عزیز.
                            مشکل حل شد . با تغییر تابع RamTest به شکل زیر کل فضای 512 کیلو موجود تست شد و OK بود.
                            کد:
                            #define size_buf	500000L
                            char buf_test[size_buf];
                            void RamTest()
                            {
                            	ulong i,error=0;
                            	byte cnt=0;
                            	cli();
                            	_debug("Start Ram Test\r");
                            	for (i=0 ; i<size_buf ; i++)
                            	{
                            		buf_test[i] = cnt;
                            		cnt++;
                            	}
                            	_debug("write ok (%ld)\r",i);
                            	cnt = 0;
                            	for (i=0 ; i<size_buf ; i++)
                            	{
                            		if (buf_test[i] != cnt)
                            			error++;
                            		cnt++;
                            	}
                            	_debug("read end.(%ld).. Error = %ld\r",i,error);
                            }

                            دیدگاه


                              #15
                              پاسخ : خواندن برنامه از حافظه ی خارجی

                              متاسفانه برخلاف تصورم مشکل کماکان وجود دارد . با بررسیهایی که انجام دادم ، تنها نتیجه این بود که تابع __low_level_init مشکل دارد.
                              کد:
                              	char __low_level_init()
                              	{
                              		PORTH_OUT = 0xF3;
                              		PORTH_DIR = 0xF7;
                              		PORTK_DIR = 0xFF;
                              	
                              		EBI_CTRL = 1;
                              		EBI_CS0_CTRLB = 1;
                              		EBI_CS0_BASEADDR = 0;
                              		EBI_CS0_CTRLA = 0;
                              		EBI_CS1_CTRLB = 1;
                              		EBI_CS1_BASEADDR = 0;
                              		EBI_CS1_CTRLA = 0;
                              		EBI_CS2_CTRLB = 1;
                              		EBI_CS2_BASEADDR = 0;
                              		EBI_CS2_CTRLA = (0x0B<<2) | 1;
                              		EBI_CS3_CTRLB = 1;
                              		EBI_CS3_BASEADDR = 0;
                              		EBI_CS3_CTRLA = 0;
                              		return 1;
                              	}

                              و مشخصا بخش Chip Select0:3 ، چون دیتا در دو منطقه از رم ذخیره میشود.

                              در صورت امکان با توجه به شماتیکی که در چند پست فبل تر قرار دادم ، توضیحاتی راجع به Chip Select ها و مقادیرشان در این مدار ارائه فرمایید.

                              با تشکر فراوان.

                              دیدگاه

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