بردهای آردوینو گستره فراوانی از پروژه های مختلف را در بر می گیرند. به کمک این پلتفرم، روند توسعه پروژه ها بسیار تسریع یافته است. یکی از ابزارهای مهم توسعه پروژه، کتابخانه ها هستند. به کمک کتابخانه ها از بازنویسی مجدد کدها جلوگیری می شود. همچنین در بسیاری از موارد، به جای برنامه نویسی یک پروسه، می توان از کتابخانه های آماده آن استفاده نمود. نمونه بارز این مورد، کتابخانه ArduinoQueue.h است. به کمک این کتابخانه می توان به ایجاد و مدیریت صف پرداخت. در این آموزش به تحلیل و بررسی این کتابخانه کلیدی می پردازیم. در ادامه این آموزش با مرجع تخصصی آردوینو به زبان فارسی، دیجی اسپارک، همراه باشید.
تعریف مفهوم صف
پیش از آنکه به تحلیل و بررسی این کتابخانه بپردازیم، بهتر است تا کمی در رابطه با صف، صحبت کنیم. صف در سیستم های کامپیوتری، تعریفی دقیقا شبیه به صف در واقعیت دارد. به عنوان یک نمونه، افرادی در صف نانوایی منتظر شاطر برای توزیع نان هستند. در این صف، افرادی که زودتر در صف قرار گرفته باشند، زودتر هم نان خود را دریافت می کنند(به جز صف یکی ها!!!).
در یک سیستم کامپیوتری، داده ها وارد یک صف می شوند. سپس پردازنده به ترتیب ورود، به پردازش آن ها می پردازد. با پردازش هر داده، آن را از صف خارج کرده و به سراغ بعدی می رود. این چرخه تا انتهای صف ادامه دارد. این مورد را می توان با آرایه هم در نظر گرفت؛ اما در اینجا صف باید مدیریت شده و داده های پردازش شده از صف خارج شوند.
در ادامه برای اطلاعات بیشتر، مطالعه دو آموزش زیر توصیه می شود.
لینک آموزش تعریف آرایه در آردوینو، کلیک کنید
لینک آموزش طراحی و پیاده سازی سیستم نوبت دهی بانکی با آردوینو، کلیک کنید
نصب کتابخانه ArduinoQueue.h
به منظور استفاده از کتابخانه ArduinoQueue.h، ابتدا می بایست آن را نصب کنیم. در این قسمت به نصب کتابخانه سنسور شتاب سنج با جستجو در مخازن آردوینو می پردازیم. به همین منظور، ابتدا در نرم افزار آردوینو بر روی گزینه Tools و سپس Manage Libraries را کلیک کنید. پس از کلیک بر روی این گزینه، با تصویر زیر رو به می شوید. این منو کتابخانه های در دسترس را به شما نشان می دهد. شما نیز می توانید با جستجوی نام کتابخانه مورد نظر خود، آن را در مخازن آردوینو یافته و سپس نصب کنید.
مطابق فلش مشخص شده در تصویر فوق، در کادر جستجو عبارت ArduinoQueue.h را تایپ کنید. پس از چند لحظه با تصویر زیر رو به رو می شوید. در این مرحله، کتابخانه را با کلیک بر روی گزینه install، نصب کنید.
الزامات فنی کتابخانه ArduinoQueue.h
پس از نصب کتابخانه و پیش از تحلیل، نیاز است تا در مورد موارد فنی کتابخانه، اطلاعات داشته باشیم. این کتابخانه، صف را به صورت ساختار داده لیست پیوندی پیاده سازی می کند. تخصیص حافظه در این کتابخانه به صورت پویا صورت می گیرد. اما پس از حذف عنصر از صف، کپی آن همچنان در حافظه می ماند. مورد بعدی در رابطه با این کتابخانه، در مورد برنامه نویسی چند نخی است. این کتابخانه به صورت Thread Safe پیاده سازی نشده است.
توابع کلیدی کتابخانه ArduinoQueue.h
پس از بررسی الزامات فنی، نوبت به تحلیل و بررسی توابع کلیدی کتابخانه می رسد. مطابق رویه معمول تحلیل کتابخانه ها، ورودی های توابع از چپ به راست ورودی اول، ورودی دوم، ورودی سوم و…. نام گذاری می گردند. این توابع در جدول زیر تحلیل و بررسی می گردند.
شرح | ورودی ها | تابع |
این تابع، تابع سازنده کلاس کتابخانه صف است. ورودی اول این تابع تعداد آیتم های صف و ورودی دوم هم حجم هر داده را مشخص می کند.
توجه: مقدار پیشفرض هر دو ورودی، برابر با ۶۵۵۳۵ است. |
ورودی اول از نوع بدون علامت تعداد داده های صف
******* ورودی دوم از نوع بدون علامت جهت تعیین بیشترین حافظه مورد نیاز برای ذخیره هر آیتم در صف |
ArduinoQueue(unsigned int maxItems = (unsigned int)-1, unsigned int maxMemory = (unsigned int)-1) |
به کمک این تابع یک آیتم به صف اضافه می شود. وردی تابع از نوع قالب است. | ورودی از نوع قالب | bool enqueue(T item) |
این تابع اولین آیتم را از صف خارج کرده و در خروجی قرار می دهد. با اجاری این تابع صف مدیریت شده و عنصر دوم، جای عنصر نخست، عنصر سوم جای عنصر دوم و… را خواهد گرفت.
خروجی از نوع قالب است. |
بدون ورودی | T dequeue() |
با فراخوانی این تابع، چنانچه صف خالی باشد، خروجی true خواهد شد. | بدون ورودی | bool isEmpty() |
با فراخوانی این تابع، چنانچه صف پر باشد، خروجی true خواهد شد. | بدون ورودی | bool isFull() |
این تابع تعداد آیتم های موجود در صف را شمارده و در خروجی قرار می دهد. | بدون ورودی | unsigned int itemCount() |
این تابع حجم آیتم موجود در صف را به بایت در خروجی قرار می دهد. | بدون ورودی | unsigned int itemSize() |
این تابع نخستین عنصر موجود در صف را در خروجی قرار می دهد.
این تابع عنصر نخست را از صف خارج نخواهد کرد. |
بدون ورودی | T getHead() |
این تابع آخرین عضو صف را در خروجی قرار می دهد. این عضو از صف خارج نخواهد شد. | بدون ورودی | T getTail() |
پس از بررسی توابع کلیدی و کاربردی، نوبت به اجرای یک نمونه برنامه می رسد. قسمت بعدی مربوط به این موضوع است.
اجرای یک نمونه برنامه
پس از بررسی توابع کلیدی، نوبت به اجرای یک نمونه برنامه می رسد. این برنامه تعدادی عضو در صف قرار می دهد. سپس دو مرتبه اولین ایتم را از صف خارج کرده و آن را می خواند.
#include <ArduinoQueue.h> //اضافه کردن کتابخانه #define QUEUE_SIZE_ITEMS 10 //تعیین سایز آیتم های صف ArduinoQueue<int> intQueue(QUEUE_SIZE_ITEMS); //ایجاد شی از کلاس کتابخانه void setup() { Serial.begin(115200); delay(500); Serial.println("Adding value"); Serial.flush(); for (int n = 1; n < QUEUE_SIZE_ITEMS + 5; n++) { //اضافه کردن داده در صف if (!intQueue.isFull()) { intQueue.enqueue(n); } } Serial.println("Adding value done!"); Serial.flush(); Serial.print("First item in queue:"); Serial.flush(); Serial.println(intQueue.dequeue()); //خواندن و خارج کردن اولین آیتم صف Serial.flush(); //****************************************** Serial.print("First item in queue after dequeue:"); //مجددا آیتم اول صف را خوانده و از صف آن را خارج می کنیم. Serial.flush(); Serial.print(intQueue.dequeue()); Serial.flush(); } void loop() { // Add elements: (add more than the queue size for demo purposes) }
لوازم متناسب با آموزش
جمع بندی
در مجموعه آموزش های تحلیل و بررسی کتابخانه، این قسمت به بررسی کتابخانه صف پرداختیم. صف یکی از ساختارهای مهم و کاربردی در سیستم های کامپیوتری به شمار می رود. به کمک این ساختار داده ها همانند صف های فیزیکی، در انتظار پردازش قرار می گیرند. ایجاد، مدیریت و دریافت داده ها در صف شاید در پروژه ها امری زمانبر باشد. امابه کمک کتابخانه صف به سادگی و بدون نیاز به صرف زمان، می توانیم به سادگی صف ها را ایجاد کرده و عملیات پردازشی روی صف اجرا کنیم. در این آموزش ابتدا به طور مختصر به معرفی و تعریف صف پرداختیم. در ادامه نکات فنی این کتابخانه بررسی شد. پس از نصب کتابخانه، توابع کلیدی و کاربردی کتابخانه مورد تحلیل و بررسی قرار گرفت. در نهایت با یک برنامه، نحوه استفاده از توابع در پروژه ها را مشاهده نمودیم.
چنانچه در مراحل راه اندازی و انجام این پروژه با مشکل مواجه شدید، بدون هیچ نگرانی در انتهای همین پست، به صورت ثبت نظر سوالتان را مطرح کنید. من در سریعترین زمان ممکن پاسخ رفع مشکل شما را خواهم داد. همچنین اگر ایرادی در کدها و یا مراحل اجرایی وجود دارند میتوانید از همین طریق اطلاع رسانی کنید.