PDA

توجه ! این یک نسخه آرشیو شده میباشد و در این حالت شما عکسی را مشاهده نمیکنید برای مشاهده کامل متن و عکسها بر روی لینک مقابل کلیک کنید : برنامه نویسی در keil



aliimani
16-08-2010, 19:51
سلام
میخواستم بدونم جذز یک عدد و به چه صورت میتوان حساب کرد.؟
اصلا هدری وجود دارد برای keil که محاسبات ریاضی رو انجام بده؟

1nafar
24-08-2010, 16:22
سلام
برای دستورات ریاضی هدر math.h ارائه شده که در نرم افزار keil وجود داره
برای بدست آوردن جذر میتونید از دستور sqrt استفاده کنید .
کلیه دستوررات این هدر در مجله ی شماره ی 5 تشریح شده که میتونید مطالعش کنید

lord67
04-10-2011, 00:15
کجا میتونم این هدر را پیدا کنم؟

agape
04-10-2011, 07:17
هدر همراه خود کامپایلر تو میسر نصب کایل ک\ی میشه و شما فقط نیاز هست که اونو اینکلود کنید.

bbj
06-11-2011, 12:45
سلام و خسته نباشید
یک نفری که با dsp کار میکرد به من گفت برای اینکه به حداکثر سرعت ÷ردازنده برسی باید برنامه رو از حافظه فلش ببری داخل رم میخواستم بدونم چطوری میشه این کا رو کرد کسی میتونه راهنمایم کنه
خیلی ممنون

1nafar
15-01-2012, 23:29
سلام
توی میکروکنترلر همه چیز به صورت اتوماتیک انجام میشه .
شما برنامه رو توی حافظه ی فلش میریزید ، cpu برنامه یه بخش از برنامه رو میخونه ( یک یا چند خط ) و متغیر های مورد نیاز رو در حافظه ی رم تشکیل میده و مقدار دهی میکنه .
در کل کاربر به حافظه ی رم میکروکنترلر ها دسترسی نداره .

agape
16-01-2012, 15:58
البته داخل کایل این امکان هست که برنامه رو توی رم نوشت !
و من این کار رو کردم برای آرم اتمل و البته جواب هم گرفتم و سرعت هم به نسبت بیشتر شده البته !

esisafa
16-01-2012, 16:21
البته داخل کایل این امکان هست که برنامه رو توی رم نوشت !
و من این کار رو کردم برای آرم اتمل و البته جواب هم گرفتم و سرعت هم به نسبت بیشتر شده البته !

ای ول زدی به خال
مطمئنا arm های سری 9 و 11 قابلیت اجرای دستورات از روی رم و حتی حافظه ی رم و فلش خارجی رو دارن چون تمام گوشی های موبایل بر این اساس کار میکنن و فقط بوت لودرشون روی میکرو پروگرم میشه.
اما یک سوال اساسی : چه جور باید فهموند که دستور رو از روی رم بخون نه از روی فلش میکرو. یعنی ادرس رم باید در پروگرم کانتر قرار بگیره. لطفا راهنمایی کنید ممنون میشم

agape
16-01-2012, 17:59
این یه راهش اینه که تابع رو اینلاین تعریف کنی با کلید
__inline ولی خوب این روش برای کایل هست

esisafa
16-01-2012, 19:22
ببینین با روش inline چند دستور محدود در حافظه ی کش cpu قرار میگیره ولی بلاخره این دستور از روی حافظه ی فلش باید خونده بشه دیگه پس این منظور من نیست.
منظورم اینه که مثلا از روی حافظه ی mmc یا nand flash یک فایل خونده بشه و در داخل رم قرار بگیره بعد این دستورات اجرا بشن. مثل اتفاقی که در کامپیوتر و موبایل و تبلت و غیره میافته
میدونین که ایسی حافظه ی موبایل سه نوع حافظه ی رم و رام و فلش رو باهم در خارج از میکرو فراهم میکنه و برنامه ها در داخل این حافظه قرار میگیرن
یک مثال واضحتر همین ویندوز ce هست که نیاز به حافظه ی جانبی داره

1nafar
16-01-2012, 21:03
ببینین با روش inline چند دستور محدود در حافظه ی کش cpu قرار میگیره ولی بلاخره این دستور از روی حافظه ی فلش باید خونده بشه دیگه پس این منظور من نیست.
منظورم اینه که مثلا از روی حافظه ی mmc یا nand flash یک فایل خونده بشه و در داخل رم قرار بگیره بعد این دستورات اجرا بشن. مثل اتفاقی که در کامپیوتر و موبایل و تبلت و غیره میافته
میدونین که ایسی حافظه ی موبایل سه نوع حافظه ی رم و رام و فلش رو باهم در خارج از میکرو فراهم میکنه و برنامه ها در داخل این حافظه قرار میگیرن
یک مثال واضحتر همین ویندوز ce هست که نیاز به حافظه ی جانبی داره
در کل توی این سوال دو تو مورد مجهول وجود داره :
1- نوشتن برنامه و ریختن اون در حافظه ی رم داخلی میکروکنترلر و اجرا کردنش .
2- نوشتن برنامه و ریختن اون در یک حافظه ی رم جانبی و اجرا کردنش .
مورد اول منتفی هست و شما دسترسی مستقیم به حافظه ی رم ندارید . منظور من این هست که شما نمیتونید یک برنامه رو در یک کامپایلر به کد هگز تبدیل کنید و بعد اون رو با پروگرامر به حافظه ی رم منتقل کنید .

البته داخل کایل این امکان هست که برنامه رو توی رم نوشت !
و من این کار رو کردم برای آرم اتمل و البته جواب هم گرفتم و سرعت هم به نسبت بیشتر شده البته !
فکر کنم شما یه تعداد متغیر توی برنامه معرفی کردید و مکان ذخیره شدن اونا رو توی حافظه ی رم قرار دارید .
توی تمامی کامپایلر ها متغیر ها به صورت پیش فرض در حافظه ی رم قرار میگرند ، و استفاده از چنین دستورات ( دستوراتی که متغیر رو به رم میبرند ) برای حالتی هست که شما یک حافظه ی جانبی ( external memory ) به میکرو متصل کرده باشید .
البته شاید من اطلاع کمی از این موضوع داشته باشم ، ممنون میشم در صورت استفاده از روش دیگه ، بیشتر توضیح بدید .
مورد دوم رو میشه تحت شرایط زیر اجراش کرد :
برای میکروکنترلر یک برنامه ی مجزا نوشته بشه و در این برنامه میکرو بتونه برنامه رو از حافظه ی جانبی بخونه و اون رو ترجمه کنه .
توی موبایل و ... معمولا یک برنامه ی مجرا برای سیستم عامل و یک فایل مجرا برای پردازنده تهیه میشه .
در صورتی که ویندوز ce رو دانلود کنید و بخوایید برای Arm کامپایلش کنید ، دو تا دسته فایل در اختیارتون قرار میگره، فایلی که باید بر روی میکرو ریخته بشه و فایلی که باید در حافظه ی جانبی قرار بگیره .
در این سیستم عامل در برنامه ی میکروکنترلر ، cpu باید برنامه ی موجود از حافظه ی جانبی رو بخونه و اون رو اجرا کنه .

agape
16-01-2012, 21:10
دایی جان این کاری نیست که میکروی sam7 یا کورتکس بتونه انجام بده ! البته اگه core باشه میشه ، یعنی خودت بیای مبدل باس به یکی از این رابط ها بنویسی !
در ضمن تابع __inline برنامه تو رم لود میشه و بعد از لود میکرو دیگه از رم اجرا میشه !

esisafa
16-01-2012, 21:16
منظور من این هست که شما نمیتونید یک برنامه رو در یک کامپایلر به کد هگز تبدیل کنید و بعد اون رو با پروگرامر به حافظه ی رم منتقل کنید .


در صورتی که ویندوز ce رو دانلود کنید و بخوایید برای Arm کامپایلش کنید ، دو تا دسته فایل در اختیارتون قرار میگره، فایلی که باید بر روی میکرو ریخته بشه و فایلی که باید در حافظه ی جانبی قرار بگیره .
در این سیستم عامل در برنامه ی میکروکنترلر ، cpu باید برنامه ی موجود از حافظه ی جانبی رو بخونه و اون رو اجرا کنه .

نه منظورم تبدیل به کد هگز کردن نیست. برنامه به کد هگز تبدیل شده. شما کامپیوتر رو فرض کنید. یک برنامه رو کلیک میکنیم تا اجرا بشه این برنامه از قبل کامپایل شده از روی هارد وارد حافظه ی رم میشه و بعد خط به خط اجرا میشه. توجه کنید که هم دستورات و هم داده ها در حافظه ی رم قرار دارند.

ویندوز Ce فایلی که برای میکرو درست میکنه برای بوت لودر هست و خود ویندوز بر روی حافظه ی جانبی قرار میگیره و این در صورتی هست که بعد از بالا اومدن ویندوز برنامه از این به بعد فقط از روی حافظه ی جانبی که ویندوز روش قرار گرفته خونده میشه و دیگه هیچ برنامه ای از روی حافظه ی فلش خود میکرو اجرا نمیشه تا سری بعد که دستگاه رو روشن کنیم.

وقتی دستگاه رو روشن میکنیم میکرو در ابتدا برنامه ی بوت لودر رو از حافظه ی فلش خودش اجرا میکنه تا ویندوز رو اجرا کنه و بعد از اجرای ویندوز دیگه برنامه ی بوت لودر اجرا نخواهد شد

agape
16-01-2012, 21:17
فکر کنم شما یه تعداد متغیر توی برنامه معرفی کردید و مکان ذخیره شدن اونا رو توی حافظه ی رم قرار دارید .
توی تمامی کامپایلر ها متغیر ها به صورت پیش فرض در حافظه ی رم قرار میگرند ، و استفاده از چنین دستورات ( دستوراتی که متغیر رو به رم میبرند ) برای حالتی هست که شما یک حافظه ی جانبی ( external memory ) به میکرو متصل کرده باشید .
البته شاید من اطلاع کمی از این موضوع داشته باشم ، ممنون میشم در صورت استفاده از روش دیگه ، بیشتر توضیح بدید .
نه دایی جان !
ببینید پردازنده آرم باس یکسانی برای رم و فلشش داره ! اگر دقت کرده باشید مثلا آدرس فلش 100000 هست و آدرس رم 200000 این خودش ثابت کننده حرف منه ، خوب حالا چطور میشه برنامه رو از روی رم اجرا کرد ، قبل از هر چیزی باید برنامه توی رم کپی بشه ، خوب قطعا برنامه هنگام پروگرام کردن البته در حالت عادی ، روی فلش ریخته میشه ، حالا شما موقه بوت میکرو میآی بهش میگی که اونو کپی کنه تو رم و اشاره گر برنامه رو میپرونی به آدرس رمی که کد های برنامه رو اونجا کپی کردی ، البته باید دقت داشته باشید که متغییر ها رو کجا ذخیره میکنید که برهم نهی نداشته باشن ، خوب حالا شما چی دارید ؟
برنامه ای که روی رم ریخته شده و میکرو داره اونو اجرا میکنه - مذیت این روش اینه که سرعت اجرای برنامه به مراتب بیشتر خواهد بود!

agape
16-01-2012, 21:22
ویندوز Ce فایلی که برای میکرو درست میکنه برای بوت لودر هست و خود ویندوز بر روی حافظه ی جانبی قرار میگیره و این در صورتی هست که بعد از بالا اومدن ویندوز برنامه از این به بعد فقط از روی حافظه ی جانبی که ویندوز روش قرار گرفته خونده میشه
نه دایی جان اینطور نیست ، م که با لینوکس کار کردم ورند کار اینه که ایمیج روی یه حافظه خارجی ریخته میشه ، حالا میدونی چرا این سیستم ها باید رم زیادی داشته باشن ، چون اون فایل بودت میآد اون فایلی که روی حافظه خارجی هست رو که بهش ایمیج سیستم عامل میگن رو کپی میکنه توی رم و بعد اشاره گر برنامه رو میفرسته به اون آدرس رم ، اگر قرار بود برنامه از حافظه خارجی مثل nand flash اجرا بشه چرا به این همه رم نیاز داشت !

esisafa
16-01-2012, 21:26
نه دایی جان !
ببینید پردازنده آرم باس یکسانی برای رم و فلشش داره ! اگر دقت کرده باشید مثلا آدرس فلش 100000 هست و آدرس رم 200000 این خودش ثابت کننده حرف منه ، خوب حالا چطور میشه برنامه رو از روی رم اجرا کرد ، قبل از هر چیزی باید برنامه توی رم کپی بشه ، خوب قطعا برنامه هنگام پروگرام کردن البته در حالت عادی ، روی فلش ریخته میشه ، حالا شما موقه بوت میکرو میآی بهش میگی که اونو کپی کنه تو رم و اشاره گر برنامه رو میپرونی به آدرس رمی که کد های برنامه رو اونجا کپی کردی ، البته باید دقت داشته باشید که متغییر ها رو کجا ذخیره میکنید که برهم نهی نداشته باشن ، خوب حالا شما چی دارید ؟
برنامه ای که روی رم ریخته شده و میکرو داره اونو اجرا میکنه - مذیت این روش اینه که سرعت اجرای برنامه به مراتب بیشتر خواهد بود!

آره منظور منم همینه .
پس شما میگید که آدرس رم و فلش در میکرو های arm 9 و 11 با هم یکیه. دمت گرم.
در واقع میکروهای Arm هم میکرو کنترلر هستند و هم میتونن مثل میکرو پروسسر عمل کنند.

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

esisafa
16-01-2012, 22:11
حالا یک سوال دیگه:
از زمان 8051 که با اسمبلی برنامه مینوشتن اولین دستور که باید مینوشتن، ادرس اولین خونه ی حافظه بود که اولین دستور قرار میگیره. یعنی کامپایلر پروگرم کانتر رو اون مقدار میداد.

حالا که با c برنامه مینویسیم خود کامپایلر اولین ادرس رو معین میکنه و در Avr اولین خونه بعد از مقدار حافظه ی بوت لودر مثلا 1024 رو مد نظر میگیره.
در keil از کجا میشه آدرس اولین خونه رو خودمون انتخاب کنیم. یعنی اولین ادرسی که اولین دستور قرار میگیره و برنامه از اونجا شروع میشه.؟؟؟؟
مسلما با این تفاسیر که آدرس حافظه ی فلش و رم یکی هست باید بشه کاری کرد که آدرس اولین خونه، در حافظه ی رم قرار بگیره (در هنگام کامپایل ) و بعد این برنامه رو ابتدا روی رم از اون ادرس به بعد بریزیم و بعد تمام برنامه از روی رم اجرا بشه

M.ABDOLLAHI
16-01-2012, 22:17
سلام دوستان این قضیه اجرای برنامه از RAM هم تو KEIL هست و هم توی IAR ولی خوب چه فایده این فقط برای دیباگ کردنه...
این عکس برای KEIL
You can see links before reply
این هم عکس برای IAR
You can see links before reply

1nafar
16-01-2012, 22:29
بازم سلام
بزارید یه جمع بندی کلی بکنیم ، در زیر نقشه ی حافظه ی یک میکروکنترلر نوعی ( at91sam7x256 ) آورده شده :

You can see links before reply
مطابق تصویر بالا ( که شما میتونید در صفحه ی 18 AT91SAM7X512/256/128 Preliminary اون رو مشاهده کنید ) حافظه ی داخلی میکروکنترلر به 5 بخش تقسیم شده :
1- Boot Memory :
حافظه ی بوت توی میکروکنترلر می تونه یکی از حافظه های ROM, Flash یاا SRAM باشه
2-Internal Flash
حافظه ی داخلی هست که برنامه توسط پروگرامر روی اون ریخته میشه
3-Internal SRAM
حافظه ی رم داخلی هست که میتونه متغیر های و سایر داده ها رو در خودش ذخیره کنه
4-Internal ROM
حافظه ی روم داخلی میکروکنترلر هست که اطلاعات اصلی میکروکنترلر مانند اسم و مشخصات میکرو و بوت لدر sam-ba و ... در اون وجود داره .
............................
توی تصویر بالا یه سری آدرس دهیه وجود داره ، منظور از این آدرس دهی ، آدرس خانه های حافظه نیست ، بلکه منظور از اونا آدرسی هست که cpu در هنگام خواندن حافظه به اون مراجعه میکنه . برای مثال هنگامی که برنامه ی ما از حافظه ی روم بوت میشه ، آدرس 0x0000000 به اولین خونه از این حافظه تعلق میگره ، و بعد از آدرس دهی کلیه خانه های این حافظه ، آدرس های بعدی به خانه های حافظه های بعدی داده میشه .
در کل همونطور که تکنولوژی ساخت حافظه های رم و فلش و روم با هم فرق میکنه ، ما نمیتونیم اونا رو پشت سر هم بیاریم .
............
روند کلی اجرای برنامه توی میکروکنترلر ها به شرح زیر هست :
1- راه اندازی بخش های داخلی میکرو و چک کردن اونا (بخش های اصلی همچون فلش ، رم و ... )
2-راه اندازی واحد اسیلاتور
3- مراجعه به حافظه ی فلش و خوندن اطلاعات به اندازه ی حجم حافظه ی sram و کپی کردن اطلاعات در sram
مثلا میکروکنترلر At91sam7x256 دارای 256 کیلو بایت حافظه ی فلش هست ، هنگامی که برنامه اجرا میشه ، cpu به اندازه ی حجم حافظه ی sram ( که 64 کیلو بایت هست ) از حافظه ی فلش اطلاعات میگره و اون رو به sram منتقل میکنه .
4- با توجه به رجیستر ها ، بخش های جانبی فعال میشه .
5- اطلاعات از بخش های فعال شده گرفته میشه و کاربر حالش رو می بره .
...................
با فرض اینکه ما قبول هم کنیم برنامه از حافظه ی فلش به حافظه ی رم منتقل کردیم ، یه چیزی جور در نمیاد و اون مقادیر حافظه ها هست .
در کل حرف من اینه هست که کپی شدن برنامه از حافظه ی فلش به حافظه ی رم به صورت خودکار توسط Cpu انجام میشه و کاربر دخالتی در این امر نداره . اگه این حرف صحیح نیست با دلایل منطقی ردش کنید .

1nafar
16-01-2012, 22:52
سلام دوستان این قضیه اجرای برنامه از RAM هم تو KEIL هست و هم توی IAR ولی خوب چه فایده این فقط برای دیباگ کردنه...
این عکس برای KEIL
این بخش برای دیباگ کردن برنامه هست که شما میتونید با استفاده از دیباگر u-link برنامه ی موجود در حافظه ی فلش ، یا برنامه ی موجود در حافظه ی رم ( که بخشی از برنامه ی موجود در حافظه ی فلش هست ) رو شبیه سازی کنید .

agape
16-01-2012, 23:13
خوب البته این روند اجرای برنامه در حالت خاص هست وقتی که ما کامپایلر رو مجبور میکنیم که برنامه ما رو روی رم بریزه ، در غیر این صورت روند اجرای برنامه به صورت کلاسیک هست !
خوب حالا چطور میتونیم کامپایلر رو مجبور به این کار کنیم ، یکی استفاده از کلید اینلاین هست و راه دیگه که بخوایم یه کتابخونه رو کامل روی رم بریزم توی کایل به این صورت عمل میکنیم !
روی فایل کتابخونه مورد نظرمون توی کایل راست کلیک میکنم و از منوی ظاهر شده اپشن رو انتخاب میکنم و بعد این تصویر گویای باقی قضیه هست
You can see links before reply
من این کار رو تست کردم در کار با ال سی دی گرافیکی - سرعت به نحو مشهودی افزایش پیدا کرد!

esisafa
16-01-2012, 23:47
دست شما درد نکنه که دارین اطلاعات رو بالا میبرین. دمتون گرم

ببینین بیاین اینجور برنامه بنویسیم. ما چند تا برنامه مختلف مینویسیم و میخوایم همه ی اینا رو بعد از کامپایل روی یک حافظه ی nand بریزیم. مسلما نمیشه همه ی اینا رو همزمان اجرا کرد.
حالا میایم یک برنامه مینویسیم که این برنامه های روی nand رو هرکدومش رو خواستیم اجرا کنه و این برنامه رو روی فلش خود میکرو پروگرم میکنیم.
وقتی میکرو روشن میشه برنامه ی روی فلش خود میکرو اجرا میشه و از ما میخواد که یک برنامه از حافظه ی nand رو انتخاب کنیم تا اجرا کنه و ما یکی رو انتخاب میکنیم. حالا از این به بعد این برنامه اجرا میشه.
لطفا توضیح بدین که مراحل کار چه جور هست و باید چه جور عمل کنیم

me28k
17-01-2012, 07:26
سلام.
با چه دستوری میشه یک متغیر رو در یکی از پورتهای خروجی قرار داد ویا برعکس.؟؟
(منظورم معادل دستور بیسیک var=portx و portx=var )

esisafa
17-01-2012, 15:40
کدوم میکرو arm که کنترل کننده ی حافظه ی رم داشته باشه رو پیشنهاد میکنین؟؟؟؟؟ یعنی بشه حافظه ی رم خارجی بهش اضافه کرد.

در ادامه ی صحبتای قبل : وقتی یک برنامه رو از حافظه ی جانبی ( غیر از فلش خود میکرو ) روی رم میکرو کپی کردیم، اونوقت باید چه کار کنیم که میکرو این برنامه رو اجرا کنه؟؟؟؟؟ کافیه که فقط آدرس اولین خط برنامه رو به پروگرم کانتر بدیم یا نه کارای دیگه هم لازمه؟؟؟

M.ABDOLLAHI
17-01-2012, 15:54
خوب همین سری lpc به صورت سخت افزاری SDRAM را پشتیبانی میکند به عنوان مثال همین LPC1788 خیلی خوبه توی مثالهای خود NXP مثالش هست انصافا خیلی آسونه... همون شماره ای که توی فروشگاه هست سخت افزارش هم گفته از بردOLIMEX ...

esisafa
17-01-2012, 22:13
خوب آقایان 1nafar و agape بلاخره چه شد.
بخوایم یک برنامه رو در حافظه ی جانبی ذخیره کنیم باید چه کار کنیم تا اجرا بشه؟؟؟
اول کار که باید در حافظه ی رم بریزیمش. بعد چی؟؟؟؟ یا خود پردازنده این کارم اتومات انجام میده؟؟؟؟


آقای عبدالهی جان حالا این lpc1788 قیمتش چنده و از کجا باید بخریم

تاپیک داشت به دور دستها میرفت گفتم بیاد رو اینو نوشتم

M.ABDOLLAHI
17-01-2012, 22:29
قیمتش که الان 13 دلار ولیکن اگر میکرو میخوای که تو ایران باشه LPC2478 نمونه برنامه هم از این سایت که لینکش را قرار میدم هم رم خارجی را با اون راه اندازی کرده و هم LCD 24 BIT مثل LCD PSP
ARM - SBC , Sensor , RFID , Wireless ,Display ,Embedded OS - ThaiEasyElec.net (You can see links before reply)