NOTICE توجه: این یک موضوع قدیمی است که آخرین پست ارسالی آن مربوط به 4284 روز قبل است . لطفا فقط پاسخ ها ، سوالات و درخواست های 100 درصد مرتبط را به آن ارسال کنید و برای درخواست ها و سوالات جدید موضوع جدیدی را ایجاد کنید
نمایش نتایج: از 1 به 19 از 19

موضوع: چند سوال فوق تخصصی avr

  1. #1
    مدیرکل انجمنها
    تاریخ عضویت
    May 2011
    نام
    احسان صفامنش
    نوشته ها
    1,763
    تشکر
    919
    تشکر شده 2,261 بار در 1,056 پست

    پیش فرض چند سوال فوق تخصصی avr

    سلام دوستان
    چندتا سوال فوق تخصصی در مورد برنامه نویسی وابسته به سخت افزار avr داشتم.

    1. متاسفانه کاری پیش اومده که نمیتونم به صورت ساخت یافته برنامه بنویسم و مجبورم از دستورات پرش استفاده کنم. میخوام تا جایی که میشه اسمبلی نباشه و از goto استفاده کنم ( واسه قابلیت حمل برنامه ). میدونیم که goto به یک برچسب ( label ) میپره.حالا سوال اینه که به جای اسم برچسب میشه آدرس قرار داد ؟؟؟؟؟؟
    یعنی مثلا goto 0x12fc;
    یا اشاره گر مثل
    int *ptr
    ptr = 0x12fc
    goto ptr

    2. وقتی روتین وقفه اجرا میشه، آدرس برنامه در حال اجرا، که در sp هست در کدوم پشته ذخیره میشه؟ در هنگام پرش به توابع که در hardware stack ذخیره میشه چون با دستور CALL اسمبلی میپره به تابع. حالا در زمان وقفه هم به همین صورته یا در data stack ذخیره میشه؟ گفتم شاید وقفه ها با توابع عادی فرق کنن.

    با خود c میشه پشته رو تغییر داد؟

    هدف از سوالا اینه که میخوام در حال اجرای یک برنام عادی، وقتی وقفه اجرا شد، در داخل روتین وقفه، ادرس برنامه اصلی رو از پشته بردارم و آدرس دلخواه خودم رو جای آدرس قبلی ذخیره کنم تا با تموم شدن روتین وقفه از جای جدید ادامه بده برنامه رو.
    با خود c میشه پشته رو تغییر داد؟
    خلاصه اینکه این تغییر ادرسها حتما باید با اسمبلی باشه یا جوری میشه با goto انجام داد.
    ویرایش توسط esisafa : 20-07-2012 در ساعت 10:40

  2. کاربران : 2 تشکر کرده اند از شما esisafa برای ارسال این پست سودمند:


  3. # ADS
    Circuit advertisement
    تاریخ عضویت
    Always
    نام
    Advertising world
    نوشته ها
    Many
     

  4. #2
    کاربر فعال
    تاریخ عضویت
    Mar 2010
    نوشته ها
    236
    تشکر
    101
    تشکر شده 246 بار در 163 پست

    پیش فرض

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

  5. کاربران : 2 تشکر کرده اند از شما mrm برای ارسال این پست سودمند:


  6. #3
    مدیر باز نشسته behnam6500 آواتار ها
    تاریخ عضویت
    Jan 2009
    نوشته ها
    801
    تشکر
    311
    تشکر شده 899 بار در 390 پست

    پیش فرض

    کارت یه جورایی با multi tasking برابری میکنه... اگه با مالتی تسکینگ بتونی کار کنی، اینم پیاده سازی میشه

  7. کاربران : 3 تشکر کرده اند از شما behnam6500 برای ارسال این پست سودمند:


  8. #4
    مدیرکل انجمنها
    تاریخ عضویت
    May 2011
    نام
    احسان صفامنش
    نوشته ها
    1,763
    تشکر
    919
    تشکر شده 2,261 بار در 1,056 پست

    پیش فرض

    تشکر

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

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

    آخرین خونه پشته رو میشه تغییر داد. باید آدرس SP رو بخونیم، بعدش آدرس جدید رو جاش قرار بدیم. با اسمبلی میشه. بلاخره اساس سیستم عامل همینه. میخواستم رو میکرو های مختلف قابل حمل باشه که نباید از اسمبلی استفاده کرد.

    بالاخره c هم کم آورد. حالشو ببرین

    آقا بهنام اگه جزوه سیستم عامل بخونم، روشش رو داره؟؟؟؟

  9. #5
    مدیرکل انجمنها
    تاریخ عضویت
    May 2011
    نام
    احسان صفامنش
    نوشته ها
    1,763
    تشکر
    919
    تشکر شده 2,261 بار در 1,056 پست

    پیش فرض

    سلام راستی واسه چی نشه به sp دسترسی داشت. میشه. یادم رفته بود که رجیستر sp جزو رجیسترهای io میکرو هستن. باید ببینم مثل مقداردهی به مثلا porta ، میشه مقدار sp رو خوند. حتما باید بشه چون در عمل ماهیت اونا یکی هست. اونم بدون دستور اسمبلی.
    تا جایی که وارد کار شدم فکر کنم فقط باید بتونم مقدار sp رو تغییر بدم و به پشته ی مورد نظر انتقالش بدم.

    اگه بشه که یعنی زبان c هنوز کم نیاورده و میتونه برنامه قابل خمل به میکروهای دیگه باشه

  10. #6
    مدیر باز نشسته behnam6500 آواتار ها
    تاریخ عضویت
    Jan 2009
    نوشته ها
    801
    تشکر
    311
    تشکر شده 899 بار در 390 پست

    پیش فرض

    جزوه سیستم عامل نمیدونم... ولی اونی که ما خوندیم اصلن این چیزا رو نداشت!

    با اسمبلی بنویسی چرا رو میکروهای مختلف نمیشه؟

  11. #7
    مدیر باز نشسته behnam6500 آواتار ها
    تاریخ عضویت
    Jan 2009
    نوشته ها
    801
    تشکر
    311
    تشکر شده 899 بار در 390 پست

    پیش فرض


    ldi r30, low (ramend)
    out spl, r30
    ldi r30, high (ramend)
    out sph, r30

  12. کاربران : 3 تشکر کرده اند از شما behnam6500 برای ارسال این پست سودمند:


  13. #8
    مدیر باز نشسته behnam6500 آواتار ها
    تاریخ عضویت
    Jan 2009
    نوشته ها
    801
    تشکر
    311
    تشکر شده 899 بار در 390 پست

    پیش فرض

    با استفاده از ثبات های spl و sph میشه به حافظه پشته دسترسی داشت.
    spl:
    register = 0x3d و ادرس= 0x5d

    sph:
    register = 0x3e و ادرس = 0x5e

  14. کاربران : 3 تشکر کرده اند از شما behnam6500 برای ارسال این پست سودمند:


  15. #9
    مدیرکل انجمنها
    تاریخ عضویت
    May 2011
    نام
    احسان صفامنش
    نوشته ها
    1,763
    تشکر
    919
    تشکر شده 2,261 بار در 1,056 پست

    پیش فرض

    اگه با C کار کنیم برنامه آسونتر و قابل حملتر میشه حتی رو میکروهای arm و pic .
    البته این اولین بارمه که اینقدر وارد جزئیات میکرو شدم و از اسمبلی اون میکروها اطلاعی ندارم.

  16. #10
    کاربر فعال
    تاریخ عضویت
    Mar 2010
    نوشته ها
    236
    تشکر
    101
    تشکر شده 246 بار در 163 پست

    پیش فرض

    شکل حافظه وقتی وارد وقفه میشید :اگر از تابع main پرش کنید به وقفه )
    متغیر های لوکال ایجاد شده در وقفه
    ریجسترهای ذخیره شده در استک در زمان ورود به وقفه
    ادرس برگشت به تابع در حال اجرای قبل از وقفه
    متغیر های لوکال ایجاد شده در تابع قبل از وقفه
    .
    .
    .

    و نکته ایی که وجود داره اینه که تمام اینها نسبت به کد شما و در زمان کامپایل متفاوت هستند
    و سایز یکسانی ندارند.
    در برنامه های مولتی تسکینگ ،تمام متغیر های لوکال ( ذخیره شده در استک ) و تمام ریجسترها، ذخیره می شوند بعد از اون یک استک نو ( clean ) برای تسک جدید ساخته میشه و یک تسک جدید شروع میشه
    بعد از پایان تسک دوم دوباره تمام پارامترها ( ذخیره/حذف) میشوند و پارامترهای تسک اول دوباره بازگردونده میشوند تا تسک اول به کارش ادامه بده و این حلقه مدام بین تمام تسک ها تکرار میشه ( تقریبا )

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

  17. کاربران : 2 تشکر کرده اند از شما mrm برای ارسال این پست سودمند:


  18. #11
    مدیرکل انجمنها
    تاریخ عضویت
    May 2011
    نام
    احسان صفامنش
    نوشته ها
    1,763
    تشکر
    919
    تشکر شده 2,261 بار در 1,056 پست

    پیش فرض

    ممنون.
    فرض میکنیم 3 تا تسک داریم و برای هر کدون 8 تا استک سخت افزاری در نظر میگیریم. حالا یک آرایه دوبعدی 3*8 تشکیل میدیم. هر بار که یک تسک جدید رو میخوایم اجرا کنیم، آدرس مورد نظر از این آرایه رو در sp قرار میدیم تا در داخل آرایه اطلاعات پشته ذخیره بشن و درواقع ما در زمان اجرای یک تسک مشخص، استکمون اون چیزی نیست که کامپایلر در نظر گرفته و آرایه ی ما به عنوان استک عمل میکنه. که با اشارگرها هم میشه هر آدرسی رو بدست آورد.
    برای شروع و پایان هر تسک هم با یک روشی میشه در همون ابتدا با یک برچسب آدرس هر تسک رو با یک برنامه بدست آورد.
    نظر شما چیه؟ این روش کار میکنه؟ اگه نه اشکالش کجاست. البته دقیق توضیح ندادم.
    هدفم اینه که میشه یک آرایه تعریف کرد و بعد از اون به عنوان استک استفاده کرد. فقط کافیه آدرس آخرین خونه ی آرایه رو در استک پونتر قرار داد. یعنی لازم نباشه دائما عمل ذخیره و حذف و بارگزاری تکرار بشه و فقط استک پوینتر رو تغییر داد
    ویرایش توسط esisafa : 20-07-2012 در ساعت 21:27

  19. #12
    ناظم انجمن Ma3ood آواتار ها
    تاریخ عضویت
    Aug 2011
    نام
    مسعود
    نوشته ها
    2,248
    تشکر
    1,912
    تشکر شده 3,087 بار در 1,509 پست

    پیش فرض

    با درود دوستان
    دستور یا کد زیر به چه زبانیه C یا ASM
    کد:
    #if ADC_8BIT_TYPE
      	return ADCH;
      #else
      	return ADCW;
    	#endif
    کاربردش چیه؟ و چرا به این صورت مینویسند

  20. #13
    کاربر فعال M_GH آواتار ها
    تاریخ عضویت
    Mar 2012
    نام
    م. غیور
    نوشته ها
    314
    تشکر
    464
    تشکر شده 367 بار در 177 پست

    پیش فرض

    تو ASM که اصلا if نداریم
    تو c هم که اینجوری نمینویسن
    گمونم پاسکال باشه
    کاربردشم نمدونم!

  21. تشکرها از این نوشته :


  22. #14
    ناظم انجمن Ma3ood آواتار ها
    تاریخ عضویت
    Aug 2011
    نام
    مسعود
    نوشته ها
    2,248
    تشکر
    1,912
    تشکر شده 3,087 بار در 1,509 پست

    پیش فرض

    نقل قول نوشته اصلی توسط m_gh نمایش پست ها
    تو asm که اصلا if نداریم
    تو c هم که اینجوری نمینویسن
    گمونم پاسکال باشه
    کاربردشم نمدونم!
    نه پاسکال نیست اتفاقا تو کدویژن حرفه ای ها زیاد استفاده میکنند
    میخوام ببینم مزیتش این کد نسبت به حالت عادی چیه مثلا سریعتر و....

  23. #15
    مدیر کل انجمن ها morteza_rk آواتار ها
    تاریخ عضویت
    Apr 2009
    نام
    مرتضی رحیمی کردمحله
    نوشته ها
    2,071
    تشکر
    2,376
    تشکر شده 2,899 بار در 1,263 پست

    پیش فرض

    سلام

    مالا زبان برنامه نویسی بیسیک و کامپایلر بسکام هست. از این دستور if برای بررسی ثابت ها استفاده میشه و نسبت به شکل معمول دستور if حجم کمتری کد تولید می کنه و سریعتر اجرا میشه.

    کامپایلر بسکام یه سری ثابت های عددی و رشته ای رزرو شده داره که معمولا برای بررسی اونها از این دستور استفاده می کنن. مثلا یکی از این ثابت ها ورژن کامپایلر رو مشخص می کنه.
    .
    اَللّهُمَ صَلّ عَلی مُحَمَّد وَ آلِ مُحَمَّد وَ عَجّل الفَرَجَهُم


    وبلاگ شخصی من

  24. کاربران : 2 تشکر کرده اند از شما morteza_rk برای ارسال این پست سودمند:


  25. #16
    ناظم انجمن Ma3ood آواتار ها
    تاریخ عضویت
    Aug 2011
    نام
    مسعود
    نوشته ها
    2,248
    تشکر
    1,912
    تشکر شده 3,087 بار در 1,509 پست

    پیش فرض

    نقل قول نوشته اصلی توسط morteza_rk نمایش پست ها
    سلام

    مالا زبان برنامه نویسی بیسیک و کامپایلر بسکام هست. از این دستور if برای بررسی ثابت ها استفاده میشه و نسبت به شکل معمول دستور if حجم کمتری کد تولید می کنه و سریعتر اجرا میشه.

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

  26. #17
    مدیرکل انجمنها
    تاریخ عضویت
    May 2011
    نام
    احسان صفامنش
    نوشته ها
    1,763
    تشکر
    919
    تشکر شده 2,261 بار در 1,056 پست

    پیش فرض

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

  27. تشکرها از این نوشته :

    KHM

  28. #18
    ناظم انجمن Ma3ood آواتار ها
    تاریخ عضویت
    Aug 2011
    نام
    مسعود
    نوشته ها
    2,248
    تشکر
    1,912
    تشکر شده 3,087 بار در 1,509 پست

    پیش فرض

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

  29. #19
    مدیرکل انجمنها
    تاریخ عضویت
    May 2011
    نام
    احسان صفامنش
    نوشته ها
    1,763
    تشکر
    919
    تشکر شده 2,261 بار در 1,056 پست

    پیش فرض

    یک مثال از کدهای خود کدویژن میزنم. وقتی برای پورت سریال بافر تعیین میکنین یه همچین کدی تولید میشه
    [PHP]
    #if RX_BUFFER_SIZE <= 256
    unsigned char rx_wr_index,rx_rd_index,rx_counter;
    #else
    unsigned int rx_wr_index,rx_rd_index,rx_counter;
    #endif
    [/PHP]
    اگر سایز بافر از 256 کمتر باشه سه متغیر 8 بیتی توسط کامپایلر انتخاب میشه و اگر بزرگتر باشه سه متغیر 16 بیتی.
    نویسنده هدر موقع نوشتن هدر از حجم خبر نداشته و با این کار باعث مدیریت بهتر حافظه میشه که میتونه سه بایت در حافظه صرفه جویی کنه و همچنین باعث افزایش سرعت اجرا بشه
    نکته اصلی اینه که این تشخیص و اختصاص حافظه در زمان کامپایل انجام میشه نه موقع اجرای برنامه
    ویرایش توسط esisafa : 07-08-2012 در ساعت 01:19

  30. تشکرها از این نوشته :


موضوعات مشابه

  1. مجله تخصصی میکروکنترلر pmm شماره 18
    توسط armstk در انجمن اطلاعیه ها و اخبار سایت
    پاسخ: 26
    آخرين نوشته: 13-06-2015, 13:49
  2. دانلود:مجله تخصصی میکروکنترلر شماره 16-17
    توسط kavir در انجمن مقالات و آموزش های متن باز
    پاسخ: 25
    آخرين نوشته: 29-12-2013, 00:12
  3. دانلود : مجله تخصصی میکروکنترلر شماره 6-7
    توسط kavir در انجمن مقالات و آموزش های متن باز
    پاسخ: 83
    آخرين نوشته: 13-05-2013, 16:22
  4. دانلود : مجله تخصصی میکروکنترلر شماره 8
    توسط 1nafar در انجمن مقالات و آموزش های متن باز
    پاسخ: 72
    آخرين نوشته: 27-09-2012, 13:15
  5. راهنمایی (سوال تخصصی نیست)
    توسط mhz_electronic در انجمن AT91 series (ATMEL)
    پاسخ: 5
    آخرين نوشته: 31-12-2009, 00:57

مجوز های ارسال و ویرایش

  • شما نمیتوانید موضوع جدیدی ارسال کنید
  • شما امکان ارسال پاسخ را ندارید
  • شما نمیتوانید فایل پیوست کنید.
  • شما نمیتوانید پست های خود را ویرایش کنید
  •