ايران ويج

نسخه‌ی کامل: انجام دسترات در background
شما در حال مشاهده‌ی نسخه‌ی متنی این صفحه می‌باشید. مشاهده‌ی نسخه‌ی کامل با قالب بندی مناسب.
با سلام 

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

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

میشه همچین کاری با میکرو؟
سلام.

بله. می شه ، برای اجرای هر task بایستی زمانی مشخص تخصیص بدید. طبیعیه که میکرو در هر لحظه تنها یک کار رو می تونه انجام بده.
باید یه درک پایه ای از نحوه ی عملکرد سیستم عامل داشته باشید.

موفق باشید.
میشه یه کم توضیح بدید؟
چند تا رفرنس هم معرفی کنید ممنون میشم انگلیسی و فارسی فرقی نمیکنه البته فارسی باشه بهتره.

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

کد php:
config timer0=timer,prescale=8
enable intrupts
enable timer0
enable ovf0
on ovf0 barname
start timer0
خب تا اینجا که تعریف تامیر میشه 
do 
تابه اصلی رو داخل این مینویسیم 
loop 

حالا برنامه ای که میخواین  در حین انجام برنامه  ی اصلی هم  زمان انجام  بشه رو اینجا مینویسیم من اسمشو گذاشتم barname 

کد php:
:barname
حالا اینجا برنامه ای که میخواین تکرار شه مینویسیم مثلا من نوشتم  یه پین رو خاموش روشن کنه 
 toggle portd.0

waitms 200

return 

کلمه ی return رو  حتما نباید فراموش کنید چون ارور میده  در ضمن اینی که من نوشتم با نرم افزار بسکامه و یه زیر برنامه  اس نه برنامه ی اصلی 
@antegral00
برای گذاشتن کد می تونید از tag های code و یا php استفاده کنید که جلوه ی بهتری داشته باشه. ویرایشش کردم.

ایده ی مطرح شده برای شروع ، ایده ی خوبیه ...
سلام 
خوب هستيد اين توضيح را كه مي خواهم بدهم در واقع در مورد نحوه كار هر پردازشگره :
كلا چند قانون در مورد سيستم پردازشگر وجود داره ( سيستم تك هسته اي )
1- در يك زمان مشخص كه ما به آن كلاك يا پالس مي گويم فقط يك دستور در ان واحد انجام مي شود
2- حافظه اي وجود دارد كه اطلاعات هر پردازش درون ان ذخيره مي شود .
3- پالس بايد منظم باشد 
با يك مثال روش كار يك پروسسگر را ، شبيه سازي مي كنيم  
فرض كنيم مي خواهيم يك تصوير را با يك صفحه ماتريكس 10 در 10 سياه و سفيد نشان بديم براي اين كار صرف نظر از پروسه هاي قبلي براي خواندن تصوير و .... براي نمايش تصوير روي اين ماتريس چند روش وجود داره 
1- تمامي نقاط روشن و خاموش رو با هم روشن كنيم 
2- دانه دانه هر نقطه رو بر اساس روشن و خاموش بودن روشن و خاموش كنيم به ترتيب 
روش اول عملا براي تعداد نقطه زياد عملي نيست  چون حافظه زيادي مصرف مي شود . 
روش دوم عملي است اما داراي يك  مشكل است و ان هم اينكه تصوير تشكيل نمي شود.
روش دوم در عمل انجام مي شود براي اين كار سرعت را بايد زياد كنيم و از يك خاصيت چشم استفاده مي شود. اينكه تصوير اي كه ديده شود براي مدت كوتاهي باقي ميماند  اگر سرعت روشن و خاموش كردن براي كل صفحه نقاط ماتريكس كمتر از اين زمان باقي ماندن باشد ما تصوير رو كامل ميبينيم . به اين كار روبش گفته مي شود.

فرض كنيم دو عدد  پروسس داريم كه ميخواهيم با هم انجام شود . پروسس 1 و 2 داري چندين دستور هستند كه مجموع انها مي شود پروسس ما . اگر در ان واحد هر دفعه يك دستور از هر پروسس انجام بشه در سرعت پايين بنظر مي رسد كه پروسس جدا گانه انجام مي شود . ( قانون يك ) اگر سرعت انجام كار  بالا برود دقيقا مثل مثال بالا بنظر مي رسد كه همزمان دو پرسس انجام شده و مولتي تكس به وقوع مي پيوند. براي اين كار نياز به حافظه براي ذخيره جايي كه پروسس انجام شده وجود دارد ( قانون دوم ). براي سرعت بايد پالس ها منظم و يكنواخت باشند ( قانون سوم ) تا مولتي تكس يكنواخت انجام گيرد

اميدوارم كمك كنه
(۰۹-دى-۱۳۹۴, ۱۹:۳۷:۴۱)sharin نوشته است: [ -> ]@antegral00
برای گذاشتن کد می تونید از tag های code و یا php استفاده کنید که جلوه ی بهتری داشته باشه. ویرایشش کردم.

ایده ی مطرح شده برای شروع ، ایده ی خوبیه ...

سلام من  تازه عضو شدم خیلی اشنایی نداشتم  
اون که  نوشتم  فقط یه مثال بود واسه اینکه  بیشتر  متوجه شن 
تازه میشه توی برنامه ی سرریز میکرو یه متغییر تعریف کرد که مثلا  سر یه زمان خاصی اون تابع تکرار شه  مثلا اون تایمری که من تعریف کردم  تقریبا هر سر ریز  256 میکرو ثانیه طول میکشه حالا اگه یه متغییر تعریف کنیم که بگیم وقتی به 4000 رسید یعنی تقریبا یه ثانیه اون وقت بیا این این تابع رو انجام بده  اینجوری میتونیم بگیم سر یه زمان خاصی هم این کارو انجام بده 
کد php:
barname:
timer0=5
// این خط واسه اینه که  تقریبا یه ثانیه بشه 
i=i+1
if i=4000 then 
i
=0
toggle portd.0
end  if 
return 

@antegral00
بهتر شد...
البته این روش برای تعیین سطح و اولویت پردازش مناسب هست.
درک شهودی پردازش همزمان رو جناب saeedsmk خیلی خوب رسوندن. یعنی اگر 10 تا task داشته باشیم که زمان لازم برای هر کدوم 200 ms باشه ، اگر task ها رو پشت سر هم بنویسیم، 10 task هر سری برای اجرای کامل 2 ثانیه زمان نیاز داره، و اینطوری task ها پشت سر هم هستند و احساس نمی شه که با هم در حال اجرا هستند، اما اگر 10ms ، 10ms از هر task رو پشت سر هم بذاریم، بعد از اینکه 20 بار این چرخه اتفاق افتاد اون 2 ثانیه سپری می شه و احساس می کنیم همه ی task ها با همدیگه اجرا شدن.
البته کار برنامه نویسیش قدری پیچیده می شه و معمولا دادن اولویت به اجرای پردازش ها در سطح میکروکنترلر برای انجام چندکار توسط میکرو به طور همزمان مناسب هست.( به سبکی که عموما کد می زنن، بدون استفاده از سیستم عامل منظورمه )

موفق باشید.