از اونجا که پروژههای بزرگ برای تولید خروجی نهایی ممکنه زمان زیادی رو از تیم برنامه نویس به گیره و همچنین احتمال رخداد خطاهای انسانی تو این فرایند هم بالاست به همین خاطر ناچار هستیم از ابزار سودمندی که GNU برای استفاده منتشر کرده استفاده کنیم. این ابزار عنوانهای مختلفی داره که مهمترین شون Build management software هستش که فک میکنم این اسم به خوبی هدف از به کارگیری این ابزار رو مشخص می کنه! تو سایت رسمی GNU ابزار Make File رو اینطور تعریف کرده:
Tool that controls the generation of executable and other non-source files of a program from the program’s source files.
برای استفاده از این ابزار لازمه فایل (یا فایلهایی) تحت عنوان Make files در اختیار این ابزار قرار بگیره. این فایلها در واقع به این خاطر استفاده میشن که به ابزار Make بفهمونن چطوری باید فرایند Build یه پروژه خاص رو انجام بده.
اهمیت مهم دیگه Make file ایجاد امکانی هستش که تو فرایند Version Control خیلی میتونه مؤثر باشه. بذارید بیشتر توضیح بدم. فرض کنید شما کدتون رو تو یه محیط اشتراک کد مثه Github قرار دادید و یه make file هم براش نوشتید و کنارش گذاشتین. حالا بعد یه مدت بعضی از قسمتهای کدتون رو تغییر میدین به نحوی که تو فرایند کامپایل هم این تغییرات تأثیرگذار هستند مثلاً یه سری فلگ ها رو باید تو دستوراتتون تغییر بدین. کاری که میشه انجام داد اینه که خیلی ساده فقط این فلگ ها رو توی Make file عوض کنید. به این ترتیب هرکس که اون Make file رو اجرا کنه بدون اینکه بدونه در گذشته چه بلاهایی سر کد در اومده میتونه خروجی مطلوب رو دریافت کنه.
کار با make file
خب حالا که با این ابزار تا حدی آشنا شدیم ببینیم اصولاً چطوری کار میکنه و ما چطور میتونیم ازش استفاده کنیم؟
داخل Make file تعداد build rule وجود داره که به فرمت زیر هستند:
Target : prerequisite1 prerequisite2 prerequisite3 …
Command1
Command2
…
برای مثال یه build rule رو به صورت زیر تصور کنید:
My_file.o : my_file.c my_file.h
Gcc –c my_file.c –o my_file.o
خب حالا اگه دستور زیر رو توی ترمینال وارد کنیم :
$ make my_file.o
با اجرای این دستور ابزار Make میاد تو make file دنبال تارگتی به اسم my_file.o میگرده و اگه prerequisite هایی که براش مشخص شده هم برقرار باشه (تو این مثال فایلهای my_file.c و my_file.h داخل دایرکتوری پروژه وجود داشته باشن) اونوقت میره و دستورات این build rule رو اجرا می کنه.
ساختار کلی make file
ساختاری که برای نوشتن Make file به کار میره:
- استفاده از # برای نوشتن کامنت ها
- میتونه یه سری Make file دیگه رو include کنه داخل خودش
- میتونه متغیر داخلش تعریف بشه و از این متغیرها هم استفاده شه
- میتونه Build rule های مختلفی رو داخلش داشته باشه
- دستورات اجرایی هر Build rule با یه tab نسبت به خط اول نوشته میشن
- برای ادامه خطها در خط بعد از “\” استفاده میشه
در تصویر زیر مثالی از یک Make file ساده رو میتونید ببینید:
خب احتمالاً تا همین مرحله کافیه اگرچه نوشتن Make file کلی بحثهای پیشرفته دیگه هم داره که اینجا بهش پرداخته نشد.
ابزار های GNU
در انتها هم به معرفی یه سری از ابزارهای GNU میپردازیم که میتونه تو روند برنامه نویسی و دیباگ کردن پروژهها به خصوص به منظور انجام بهینه سازی ها کمک قابل توجهی کنه. البته اینم بگم که GNU ابزارهای خیلی زیادی برای توسعه نرم افزارها داره که ما اینجا صرفاً به اونایی اشاره میکنیم که مهندسای سخت افزار به کارشون میاد!
اولین ابزار که بهمون کمک می کنه سایز بخشهای مختلف تو کد کامپایل شده رو بفهمیم به صورت زیر قابل استفادست. طبیعتاً استفاده از این ابزار با توجه به شناختی که نسبت به معماری حافظه داریم باعث میشه قسمتهایی از کد که Performance رو کاهش میده پیدا کنیم و براشون چارهای بیندیشیم!
arm–none-eabi-size –Atd demo.out
این مقاله را از دست ندهید:
ابزار objdump
ابزار بعدی objdump هستش که با دریافت آبجکت فایل میتونه کد اسمبلی هر قسمت رو به صورت جداگانه نمایش بده. آخرین ابزاری هم که معرفی خواهیم کرد readelf هست که اطلاعات مهمی رو میتونه از فایلهای خروجی با پسوند *.elf استخراج کنه و نمایش بده. اطلاعاتی راجع به بخشهای کامپایل شده،بخشهای حافظه، جدول نمادها (symbol table) و در نهایت اطلاعات معماری سخت افزار. برای استفاده از این ابزارها هم دستوری مثل دستور زیر رو میتونیم به کار ببریم:
arm-none-eabi-readelf demo.out –all
در انتها هم لازمه عرض کنم تمامی این ابزارها رو میشه تحت عنوان پکیج GNU binutils پیدا کرد.
امیدوارم این مطلب براتون مفید بوده باشه:)
سلام، واقعا این سری مقالتون خیلی خوب هستش. جذاب و خفن!!!
سلام
خوشحالم که برات مفید بوده 🙂
اگه پیشنهادی برای ادامه آموزش ها داری هم حتما تو کامنتت بگو که برم سراغش و آموزشش رو اینجا بذارم در صورت امکان
هوممم، همون طور که خودت هم گفتی بیشتر به عنوان سر نخ مطالب و توضیحات کلی و البته جامع هستش. پتانسیل این مطالب بالاست.
اگه بشه یه خورده بیشتر مطالب شکافته بشه و برای فهم بیشتر،مثالی هم زده بشه خیلی بهتر میشه. شاید طولانی تر بشه ولی مفید تر و خوندنی تر میشه. چون منابع فارسی هم تو این زمینه نادر هستن.
در مورد ریجستر نویسی و یا توضیحاتش هم اگه بنویسی خوب میشه!
نقش پروتوکل های ارتباطی تو این قضیه و یا حتی توضیحات اونا
در ادامه هم بعد از اتمام کلیات میشه چند تا ایده رو بررسی کرد.مثلا:
1) بعد تولید *.s یه سری تغییرات خودمون برای بهینه کردن برنامه ،روشون انجام بدیم.
2) نوشتن یه کامپایلر محدود و کوچیک
3)یه برنامه ساده(مثلا toggle led) رو به عنوان مثال، بخش های مختلفش رو بررسی کرد.
4) stm32cube چجوری کد اولیه رو تولید میکنه
و…
( البته در مورد عملی بودنشون نمیدونم و خواستم برا مثال چند تا بنویسم)
البته اینا فقط نظر منه:)
آره اتفاقا تصمیم داشتم یه آموزش راجع به برنامه نویسی اسمبلی میکروهای ARM بذارم.البته مهندس کی نژاد یه آموزش برای AVR دارن تو سایتشون که خیلی خوب گفتن بحث اسمبلی رو ولی خب برای ARM هنوز من ندیدم کسی کار کرده باشه.
مرسی از پیشنهاداتت!
سلام .
استفاده بردم .
اما تقریبا تیتر وار و خیلی خلاصه گفته شده .
براتون مقدور هست با جزییات بیشتر توضیح بدید؟( البته از حق نگذریم برای هرکدوم از اون ابزاره ممکنها چند قسمت مطلب لازم باشه )
سپاس
سلام حسین جان
خوشحالم که مفید بوده برات
همونطور که خودت هم اشاره کردی بسط این مطالب نیاز به چندین مقاله مفصل داره که هم از حوصله اینجا خارج هستش و هم اینکه مخاطب خسته میشه از خوندنش
هدف اینه که یه ایده اولیه راجع به این موضوع داده بشه و اگه کسی علاقه داشت به صورت مفصل راجع بهش مطالعه کنه
اگه به این فیلد علاقه داری پیشنهاد میکنم کتاب Programming Embedded Systems رو از انتشارات Oreilly مطالعه کن.مطالب رو خیلی جالب با مثال های کاربردی توضیح داده.مزیت دیگه این کتاب اینه که چون میخواد برا سیستم های با منابع حافظه محدود برنامه نویسی کنه یه گریزی به برنامه نویسی با کارکرد بالا هم میزنه که واقعا جذابه 🙂
سپاس.