آردوینو آموزش آردوینو پروژه های آردوینو

برنامه نویسی چند نخی یا Multi threading آردوینو DUE

آموزش پردازش موازی در آردوینو DUE
نوشته شده توسط علیرضا قربانی

برنامه نویسی چند نخی یا Multi threading  آردوینو DUE

مبحث thread   یک مبحث مهم در برنامه نویسی می‌باشد. بدون استفاده از Thread  معمولا برنامه‌ها عمل‌کرد بالایی را  پیدا نمی‌کنند.هنگامی که درون یک برنامه دو یا چند بخش نیاز به پردازش همزمان داشته باشند  می‌توانیم روی هر قسمت  Thread  جدا گانه اجرا  کنیم.چند نخی یا Multi Thrending  در واقع می‌تواند چند وظیفگی یا تقسیم پردازش یا برنامه به بخش‌های مجزا را منجر شود.با این سبک برنامه‌نویسی می‌توانیم چند پردازش را به صورت همزمان اجرا کنیم. مثلا می‌توانیم به صورت همزمان مقدار چند سنسور را خوانده و در همان حال چند بازوی رباتیک را کنترل نمود. آردوینو DUE نیز از  میان سایر آردوینو‌ها از برنامه نویسی چندنخی پشتیبانی می‌کند و با آن می‌توان برنامه‌هایی با چند پردازش همزمان اجرا نمود. در ادامه آموزش با مرجع تخصصی آردوینو ، دیجی اسپارک همراه باشید.

(توجه داشته باشید که این آموزش صرفا مخصوص آردوینو DUE می‌باشد)

کتابخانه‌ای به نام Scheduler  مختص آردوینو DUE وجود دارد که به وسیله آن می‌توانید چند تابع را به صورت همزمان در برنامه اجرا کنید. به عبارت دیگر برنامه شما می‌تواند دارای چند loop باشد که همگی بدون ایجاد وقفه در دیگری در حال پردازش می‌باشند. در واقع توسط این کتابخانه CPU  به چند بخش تقسیم می‌شود و هر بخش وظیفه اجرای یک loop را بر عهده می‌گیرد.

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

در مرحله‌ی بعدی می‌بایست برای هر قسمتی که می‌خواهیم عملیات چند نخی یا همان Thread را برا روی آن اجرا کنیم یک تابع بنویسیم.برای مثال در قطعه کد زیر ما ۳ عدد loop می‌خواهیم در برنامه ایجاد کنیم و عملیات Thread را بر روی آن‌ها اجرا کنیم به این معنی که این سه عدد loop به طور همزمان برنامه‌های داخلشان بدون تداخل با یکدیگر اجرا شوند.

سپس نوبت به استفاده از تابع زیر می‌رسد:

Scheduler.startLoop(loop name)

توسط این تابع درون setup برنامه ، loop‌های نوشته شده را به برنامه معرفی می‌کنیم. توجه داشته باشید که loop  شماره ۱ به طور پیش‌فرض معرفی می‌شود و loop های بعد از شماره ۱ را باید معرفی نمود .پس کد‌های ذکر شده در بالا را به صورت زیر توسعه می‌دهیم:

 

در مرحله بعدی باید در آخرین loop موجود در تابع  yield را صدا بزنیم تا cpu در بین loop ها عملیات سوئیچ را انجام دهد. در صورتی که تابع yield فراخوانی نشود ، برنامه قفل می‌کند و دیگر هیچ عملیاتی را انجام نمیدهد .پس مطابق کدهای فوق باید در پایان  loop3  تابع yield را فراخواند همانند کد زیر:

 


 

چکیده: با استفاده از چندنخی در آردوینو DUE می‌توان پردازش‌های سنگین را دسته بندی کرد بدون اینکه در حین انجام یک پردازش سنگین قسمت‌های دیگر برنامه موقف شود. برای مثال طبق آموزش داده شد شما میتوانید حتی در loop شماره ۳ از با استفاده از delay یک ناخیر به میزان ۲۰ ثانیه ایجاد کنید بدون اینکه در loop شماره۱ و ۲  اینن تاخیر تاثیری ایجاد کند و loop شماره ۱ و ۲ به صورت طبیعی به کار خود ادامه می‌دهد.

 

پروژه:

 

در این پروژه یک سه عدد LED را به پین‌های شماره ۸ ، ۹ و ۱۳ متصل می‌کنیم.سپس در loop شماره ۱ ، LED متصل به پین شماره۸ را با تاخیر ۱ ثانیه به صورت چشمک زن در می‌آوریم و همچنین در loop شماره ۲ ، LED متصل به پین شماره ۹ را با تاخیر ۱۰۰ میلی‌ثانیه به صورت چشمک زن در می‌آوریم و همچنین در loop شماره ۳ ، به وسیله ارتباطط سریال و دریافت دو کاراکتر ۰ و ۱ ، LED متصل به پین شماره ۳ را خاموش روشن می‌کنیم.در صورتی که کد‌های زیر را بر روی آردوینو DUE آپلود کنید مشاهده خواهید کرد که delay های موجود در loop ها بر روی هم تاثیری نمی‌گزارند و هر loop به صورت مستقل پردازش می‌شود.

درباره نویسنده

علیرضا قربانی

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

۱۳ دیدگاه

  • سلام جناب مهندس خسته نباشید
    با سایر آردوینو ها هم میتونیم از این تکنیک استفاده کنیم مثلا آردوینو Uno
    پیش نهادی هم داشتم : لطفآ آموزش هایی به این سبک قرار بدین .به نظر من آموزش هایی به این سبک خیلی مفیدن .مثل آموزش دیبانس کلید که من همیشه با کلید مشکل داشتم ولی وقتی اون مطلب شما رو خوندم تونستم مشلم را رفع کنم

    بازم ممنون
    پیروز باشیید

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

      • سلام مهندس من به کمک شما خیلی نیاز دارم من یک اردینو due گرفتم ولی به یک مشکلی برخورد همه جارو هم گشتم نتونستم پیدا کنم من می خواستم اگه لطف کنین کمک کنید من می خواسم ماژول وای فای esp8266 به اردینو وصل کنم تو برنامه نویسی که میکنم تو اردینو ینو و غیره کار میکنه ولی وقتی می خوام به این ارینو اپلودش کنم ارور میده مشکل از بردم نیست چون برنامه های دیگه رو تست کردم متاسفانه تو نرم افزار ارور میده برنامه های ساده رو ساپورت میکنه میشه اپلودش کرد ولی این ببرنامه که نوشتم فقط تو این برد ارور میده از هر دو پورتشم تست کردم حافظه اشم پاک کردم ولی باز نشده از کتابخانه های some serial و softwareserial استفاده کردم از ارینو uno هم نمی تونم استفاده کنم چون خطاش زیاده دستوراتی که میگیره اردینو چون باید همزمان عمل کنه خطای سخت افزار بالا میره

  • سلام خسته نباشید
    برد اردوینو uno این قابلیت را ندارد؟
    پروژه من اندازه گیری همزمان رطوبت و دما به صورت غیر تماسی است که دو سنسور جداگانه است
    و بردی که تهیه کردم uno هست

    • نخیر متاسفانه تنها بردی که این قابلیت را دارا میباشد Arduino DUE هست. البته شما میتوانید در آردوینو Uno , دستور داده گیری از سنسور ها را پشت سریکدیگر بگذارید و با تقریب خیلی خوبی از اینکه داده ها در زمان بسیار نزدیکی به یکدیگر خوانده می‌شود خیالتان را راحت کنید. فرکانسی که آردوینو Uno دستور ها را میخواند از محدوده مگاهرتز میباشد . ( ۱۲ مگاهرتز )

دیدگاهتان را بنویسید