RTOS, آموزش RTOS با STM32, توصیه شده

آموزش RTOS با STM32 قسمت 3:دیباگر GDB

آموزش RTOS با STM32 قسمت 3:دیباگر GDB

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

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

این مقاله قسمت سوم از سری آموزشی آموزش RTOS در STM32  می باشد. شما می توانید کلیه دوره های آموزش RTOS را در سیسوگ مشاهده نمایید.

تعریف

و اما تعریف GDB از زبان پروژه GNU:

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

آموزش RTOS با STM32 قسمت 3:دیباگر GDB

GDB Sign

حالا که با هدف تولید GDB آشنا شدیم، می توانیم کار کردن با آن را شروع کنیم:

استفاده از GDB برای اشکال زدایی برنامه

  • قدم اول: بدیهی است در قدم اول باید GDB را نصب کنیم. برای نصب GDB در محیط سیستم عامل لینوکس از ترمینال به صورت زیر عمل می کنیم:

و برای مطمئن شدن از نصب GDB به صورت زیر عمل می کنیم:

تا به اینجا دو تا خبر دارم، خبر خوب اینه که gdb نصب شد اما خبر بد اینه که کار کردن با gdb در محیط ترمینال خیلی جالب نیس و به همین دلیل در قسمت های بعدی خواهیم دید که از این دیباگر در IDE هایی مثل  Eclips استفاده خواهیم کرد. اما برای اینکه در این قسمت بتوانیم یک خاطره نسبتا خوب از کار با gdb در محیط ترمینال ثبت کنیم، از یک اکستنشن کاربردی برای شکیل تر کردن ظاهر gdb در ترمینال استفاده می کنیم. نام این اکستنشن gdb-dashboard است که از اینجا می توانید آن را دانلود و استفاده کنید.

 

حالا باید در حین کامپایل برنامه پارامتر دیباگ را به برنامه اضافه کنیم اما چطور؟

  • قدم دوم: اضافه کردن پارامتر دیباگر به فایل کامپایل شده برنامه.

Makefile بالا همان فایلی است که در قسمت های قبلی آن را نوشتیم. همانطور که می بینید در خط زیر پارامتر دیباگ را به فرایند کامپایل برنامه اضافه کرده ایم:

پس از کامپایل برنامه برای دیباگ آن به شیوه زیر عمل می کنیم:

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

آموزش امبدد لینوکس از مقدماتی تا پیشرفته + پروژه

دستورات GDB

  • run : این دستور مانند زمانی که فایل خروجی برنامه را اجرا می کنیم، عمل می کند و برنامه را در حالت عادی اجرا می کند.
  • start : این دستور نیز برنامه را اجرا میکند، با این تفاوت که برنامه را در حالت دیباگ اجرا و به همین دلیل در اولین خط قابل اجرا از برنامه متوقف می شود. خطوط که از لحاظ اسمبلی اجرا نمی شوند: مانند خطوط تعریف متغیر یا ..
  • quit : این دستور ترمینال را از حالت دیباگ برنامه خارج می کند.

سه دستور بالا دستورات ورود و خروج به محیط دیباگ برنامه هستند و اما دستوراتی که دلیل استفاده از دیباگر هستند:

  • next(n) : این دستور فقط یک خط از برنامه را اجرا می کند. حال آن یک خط ممکن است فراخوانی یک تابع یا یک عملیات ریاضی ساده باشد.
  • step(s) : این دستور فقط یک step از برنامه را اجرا می کند. حال اگر در خطی از برنامه باشیم که محل فراخوانی یک تابع است، با دستور step وارد تابع می شویم.
  • finish(fin) : این دستور برای خروج از یک تابع فراخوانی شده و بازگشت به تابع فراخوان استفاده می شود. برای مثال شما در خطی از برنامه هستید که تابع sum(مربوط به عملیات جمع دو عدد)  از تابع main فراخوانی شده است. حال با دستور step به داخل آن تابع می روید. برای خروج از تابع sum و بازگشت به تابع main می توانید از دستور finish استفاده کنید.

سه دستور بالا نیز دستوراتی برای حرکت گام به گام در برنامه بودند اما گاهی اوقات ما قصد توقف برنامه در یک نقطه خاص یا شروع برنامه از یک نقطه مشخص را داریم، در این صورت از دستورات زیر استفاده می کنیم:

  • break(b) : استفاده از این دستور با فرمت های مختلفی، می تواند در نقاط مختلفی از برنامه یک breakpoint ایجاد کند. در واقع breakpoint نقطه ای از برنامه است که برای متوقف شدن اجرا مشخص می شود.

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

برای حذف breakpoint های ایجاد شده نیز از دو راه زیر می توانید استفاده کنید:

  • clear : این دستور با فرمت های مختلف breakpoint های موردنظر را پاک می کند:
  • delete : این دستور کلیه breakpoint های ایجاد شده را حذف می کند.

 

شاید براتون سوال شده باشه که پس از ایجاد یک breakpoint با کدام دستور برنامه را به حالت اجرا تا زمان رسیدن به breakpoint در بیاورم؟ جواب اینجاست:

  • continue(c) : این دستور برنامه را تا رسیدن به اولین breakpoint اجرا می کند.

دستورات زیر هم اطلاعاتی در مورد متغیر های local یا global  برنامه، breakpoint های ایجاد شده و … به ما ارائه می دهد:

  • Info variable : این دستور برای نمایش اطلاعات متغیرهای global استفاده می شود. این متغیرها شامل تمامی متغیرهای استفاده شده در برنامه اعم از متغیر های خود برنامه یا کتابخانه هایی که برنامه از آنها استفاده می کند، می شود.
  • Info locals : این دستور برای نمایش اطلاعات متغیرهای محلی استفاده می شود. این متغیرها تنها متغیرهای خود برنامه را شامل می شود.
  • Info breakpoint : این دستور اطلاعات breakpoint های ایجاد شده در برنامه را نشان می دهد.

خب این قسمت های به بخش پایانی خودش رسید. در این قسمت سعی شد به طور اجمالی شما را با دیباگر رایگان و قدرتمند gdb یکی دیگر از محصولات محبوب پروژه gnu آشنا کنیم. در قسمت بعد برنامه نویسی به روشی عمیق برای میکروکنترلرهای cortex m رو شروع خواهیم کرد و قراره کارهای خیلی جذابی انجام بدیم.

در ضمن قسمت نظرات هم خیلی خلوته و بالا بودن انرژی مطالب نظرات شما بزرگواران خواننده رو می طلبه.

 

انتشار مطالب با ذکر نام و آدرس وب سایت سیسوگ، بلامانع است.

شما نیز میتوانید یکی از نویسندگان سیسوگ باشید.   همکاری با سیسوگ

6 دیدگاه در “آموزش RTOS با STM32 قسمت 3:دیباگر GDB

  1. Avatar for محسن محسن گفت:

    سلام
    ممنون از زحمتی که برای آموزش کشیدین
    من با کیل کار کردم این امکانات که توضیح دادین اونجا سر جمع و بی درد سر در دسترس بود متوجه نمی شم چرا باید از این روش بریم
    منتظر آموزش خود قضیه rtos هستم
    ممنون

    1. Avatar for Metech Metech گفت:

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

  2. Avatar for سعید سعید گفت:

    سلام
    GDB قابلیت اجرا در stm cube IDE را دارد؟

    1. Avatar for Metech Metech گفت:

      سلام بله.
      stm32cubeide به صورت پیش فرض از دیباگر gdb برای دیباگ برنامه استفاده می کنه که میتونید از قسمت Debug Configurations این موضوع رو ببینید.

  3. Avatar for امیر امیر گفت:

    خیلی جالب شد!!
    ویژگی چاپ متغیر محلی خیلی کاربردی است.
    این ویژگی در کیل با بریک پوینت و پنجره واتچ یا دستور printf امکان پذیره.
    سوال منم همین جاست که آیا به بریک پوینت نیازه یا از منابع خود میکرو همانند prtintf استفاده میکنه؟
    سپاس

    1. Avatar for Shadow Shadow گفت:

      سلام
      سوالتون رو درست متوجه نشدم اما
      به طور کلی هسته های cortexm دارای امکاناتی هستند که می توانند از طریق درگاه SWD یا JTAG اطلاعات مورد نیاز برای دیباگ برنامه مثل مقدار متغیرها و … رو با کامپیوتر ردوبدل کنند. بنابراین اگر منظور شما از printf استفاده از uart برای دیباگ برنامه ست نیازی به این کار نیست. در مورد بریک پوینت هم باید بگم که شما در هر کجا از برنامه که اجرا رو متوقف کنید می تونید متغیرهای local همون قسمت و متغیرهای global برنامه رو آنالیز کنید. در همین راستا بریک پوینت به عنوان یکی از ویژگی های هر دیباگری برنامه رو در نقطه خاصی از اجرا متوقف میکنه.
      امیدوارم که پاسخ سوالتون رو گرفته باشید و اگر هنوز ابهامی مونده در مورد اینکه یک دیباگر مثل GDB چطور برنامه روی میکروکنترلر رو دیباگ میکنه در قسمت آینده با مثال عملی توضیح داده میشه.

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

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *