برد ESP8266

روش‌های نوشتن یک برنامه بد برای بردهای ESP8266

bad-programming-for-esp8266-boards-digispark
نوشته شده توسط معین صابری

بردهای ESP8266 را دیگر تقریبا در تمام پروژه های IOT می بینیم. این بردها دارای وای فای در کنار قابلیت برنامه نویسی هستند. به عبارت دیگر، این بردها می توانند همانند یک تلفن همراه به مودم اینترنتی متصل شده و به تبادل داده در بستر اینترنت بپردازند. در طرف دیگر، ماژول های ESP می توانند به حالت نقطه دسترسی دربیایند تا سایر دستگاه ها به آن متصل شوند. در آموزش برنامه نویسی esp قصد داریم به روش های رایج و البته اشتباه در برنامه نویسی این ماژول بپردازیم. با در پیشگیری این روش ها، اجرای برنامه متوقف شده و ماژول CRASH خواهد کرد. در ادامه، با مرجع تخصصی رزبری پای و آردوینو به زبان فارسی، دیجی اسپارک همراه باشید.

 


ماژول ESP8266 تعریف و کاربرد


 شاید لازم باشد قبل از ادامه بحث، به معرفی اجمالی ماژول ESP8266 بپردازیم. ماژول وای فای ESP8266 یک ماژول کلیدی، کاربردی و در یک کلمه خفن!!! است. این ماژول می تواند ارتباط بیسیم وای فای را بین برد الکترونیکی شما و تلفن همراه، رایانه، تبلت و …. برقرار کند. ین ماژول به دلیل اندازه کوچک، مصرف کم انرژی و قابلیت‌های داخلی Wi-Fi‌ آن، در پروژه‌ها و برنامه‌های اینترنت اشیا (IoT) گسترده‌ای استفاده می‌شود.

در کنار امکاناتی که برای برد ESP ذکر شد، این برد قابلیت برنامه نویسی را در خود جای داده است. به عبارت دیگر، ماژول ESP8266 می تواند در کنار ارتباط بی سیم وای فای، برنامه های کاربر را روی خود اجرا کند. بدین ترتیب این ماژول شما را از یک میکروکنترلر جانبی، بی نیاز می کند. جهت راه اندازی و کار با این ماژول، پلتفرم آردوینو بستر نرم افزاری فراهم کرده است. به کمک این بستر شما می توانید با همان دستورات C++ آردوینو، برد را پروگرام کنید. جهت راه اندازی و کار با این برد سلسله آموزشی در دیجی اسپارک منتشر کرده ایم. جهت مطالعه این سلسله آموزش، روی این لینک کنید.

 


روش بد شماره ۱: حلقه تکرار مرگ


ماژول ESP8266 دارای لم و قلق خاص خود است. همین اول بیاید یک قاعده را با هم طی کنیم. برنامه نویسی ESP8266 با آردوینو متفاوت است. ماژول ESP8266 به صورت یک مدیریت کننده تسک عمل می کند. این سیستم واحد وای فای و برنامه کاربر را به دو قسمت اصلی تقسیم می کند. در صورتیکه به این مورد در برنامه خود دقت نکنید، ماژول کرش خواهد کرد. به عبارت دیگر حلقه تکرار مرگ (Infinite Loop) در برنامه‌نویسی به حالتی گفته می‌شود که برنامه وارد حلقه‌ای می‌شود که هیچگاه خاتمه نمی‌یابد و به طور مداوم تکرار می‌شود. در برنامه‌نویسی بردهای ESP (مثل ESP8266 یا ESP32)، این مشکل ممکن است به دلیل خطاهای مختلفی در کد یا نحوه نوشتن برنامه پیش بیاید.

 

علل بروز حلقه تکرار مرگ در برنامه نویسی esp

حلقه‌های تکرار بی‌پایان: استفاده نادرست از حلقه‌های while یا for بدون شرط خاتمه معتبر.
خطاهای منطقی: اشتباهات منطقی در کد که باعث می‌شود شرایط خاتمه حلقه هرگز محقق نشود.
عدم مدیریت وقفه‌ها: وقفه‌ها یا اینتراپت‌هایی که به درستی مدیریت نشده‌اند می‌توانند برنامه را وارد حالت بی‌پایان کنند.
استفاده نادرست از توابع کتابخانه‌ای: برخی توابع کتابخانه‌ای ممکن است به طور نادرست استفاده شوند و منجر به حلقه تکرار بی‌پایان شوند.

در برنامه های تحت ESP8266، به هیچ عنوان نباید حلقه تکرار بی نهایت استفاده نمود. استفاده از حلقه تکرار بی نهایت سبب می شود تا تسک منیجر در برنامه شما گیر کند! گیر کردن در برنامه شما همانا، نرسیدن به سرویس وای فای همانا و کرش کردن همانا!!!!!!!

 

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

while(1){

delay(10);

}

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

while(1){

yield();

}

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

 


روش بد شماره ۲:  عدم بازگردانی مقدار در توابع خاص


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

int data(){

Serial.println(“data function”);

}

در تابع فوق، مقدار خروجی تعریف شده است؛ اما در ادامه هیچ گونه خروجی در تابع لحاظ نشده است. این مورد به کمک دستور return، مثلا return 0 باید صورت گیرد. البته، همانطور که پیشتر گفته شد، در برخی از نسخه ها این مورد خطای نحوی بوده و کامپایلر خطا ایجاد خواهد کرد. در برخی نسخه های دیگر، این مورد به عنوان باگ سبب کرش کردن ESP خواهد شد.

 


روش بد شماره ۳: Stack Over Flow


یکی از حافظه های اصلی یک میکروکنترلر، حافظه RAM است. حافظه RAM خود به دو دسته STACK و HEAP تقسیم بندی می شود. پیشتر در آموزشی که با کلیک بر روی این لینک قابل مشاهده است، به این مفاهیم پرداخته ایم. با کلیک بر روی این لینک می توانید آموزش آن را مطالعه کنید. یکی از روش های پرشدن حافظه STACK و کرش کردن برنامه، فراخوانی تو در تو یک تابع است. به برنامه زیر دقت کنید.

String data = "";

void setup() {

// put your setup code here, to run once:

Serial.begin(115200);

 

}

 

void loop() {

ssl();

 

}

void ssl(){

ssl();

}

در برنامه فوق، یک تابع به نام SSL تعریف شده است. این تابع به صورت تو در تو فراخوانی شده است. اگر دقت کنید، همین تابع را در خود آن فراخوانی کرده ایم. این عمل سبب پر شدن حافظه STACK و در نهایت کرش شدن ESP خواهد شد. بدین ترتیب، هیچ گاه چنین توابعی را، حتی محض رضای خنده!!! در پروژه های خود اجرا نکنید!

 


قطعات مورد نیاز


لینک خرید انواع برد وای فای ESP، کلیک کنید

 


جمع بندی


در این آموزش به بررسی برنامه نویسی esp و روش های مختلف جهت عدم اجرای صحیح برنامه در ESP پرداختیم. برد ESP دارای تفاوت های ساختاری بسیاری با بردهای آردوینو است. اگرچه دستورات برنامه نویسی بین بردهای آردوینو و ESP یکسان است، اما عدم توجه به تفاوت ساختاری پردازنده ها موجب کرش کردن ESP خواهد شد. در این آموزش به بررسی روش های مختلفی که ممکن است منجر به عدم اجرای صحیح برنامه در ESP شود، پرداختیم. با رعایت نکات صحیح، برنامه در ESP به درستی اجرا شده و پایدار خواهد بود.

 

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

 

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

معین صابری

کارشناسی ارشد رشته معماری سیستم های کامپیوتری

مالي که ز تو کس نستاند، علم است
حرزي که تو را به حق رساند، علم است
جز علم طلب مکن تو اندر عالم
چيزي که تو را ز غم رهاند، علم است
(شیخ بهایی)

تبادل نظر و رفع عیب با ثبت دیدگاه