با قسمت یازدهم از دوره ورود به دنیای امبدد لینوکس که دوره مقدماتی آموزش امبدد لینوکس می باشد همراه ما باشید.
(فصل دوم – بخش هفتم)
خوب! توی قسمت قبل یاد گرفتیم که چطوری یه برد “رسپبری پای سه بی پلاس – Raspberry Pi 3 B Plus” یا “لیچی پای نانو – Lichee Pi Nano” رو راه اندازی اولیه کنیم. یعنی بتونیم از طریق یه سیستم دیگه بهش ssh بزنیم. توی این قسمت میخوایم با crosstool-NG و menuconfig که قبلاً قولشو داده بودیم، بیشتر آشنا بشیم و کار کنیم، همین طور بتونیم برای این دو برد، تولچین بسازیم.
در قسمتهای قبلی آموزش، مسیر حرکت و فصلهای پیش رو، بسیاری از مفاهیم مورد نیاز و سؤالها و ابهامات شما در این دوره پاسخ داده شده است.
پس اگر اولین بار است که این آموزش را شروع میکنید، با توجه به سلسله مراتب پیش بینی شده برای آموزشها، بهتر است از جلسه اول شروع کنید!
جلسه اول آموزش، ورود به دنیای امبدد لینوکس
کار با crosstool-NG
مسیر کامل crosstool-NG روی سیستم من با توجه به تنظیمات نصب این هست:
1 | /home/at00/EmbeddedLinux/F1C100s/build-tools/crosstool-ng-build/bin/ct-ng |
منطقی نیست هر بار که میخوام ازش استفاده کنم اینجوری اجراش کنم درسته؟
راه بسیار هست واسه جلوگیری از این کار که من این راه رو ترجیح میدم.
یه فایل میسازیم اینجوری:
1 | vi /home/at00/EmbeddedLinux/F1C100s/at00exports.sh |
راستی اگه با vi رفیق فاب نیستین باز هم عمو جادی رو دریابید!
و توش اینا رو میریزیم فعلا در آینده هم بیشتر میشه:
1 2 3 | #!/bin/sh export PATH=$PATH:/home/at00/EmbeddedLinux/F1C100s/build-tools/crosstool-ng-build/bin/ |
خب حالا هر سری اول کار این فایل رو source میکنیم توی ترمینالمون و دیگه به راحتی میشه توی اون ترمنیال فقط ct-ng رو صدا بزنیم.
1 2 3 | source /home/at00/EmbeddedLinux/F1C100s/at00exports.sh ct-ng list-samples |
خب همون طور که اولش گفتیم crosstool-NG یه سری makefile بوده و menuconfig طور هست رابط کاربریش مثل Kernel و U-Boot و خیلی چیزهای دیگه.
خب اگه بدون هیچ ورودی اجراش کنیم یه سری اطلاعات به ما میده:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 | ct-ng This is crosstool-NG version 1.24.0.105_5659366 Copyright (C) 2008 Yann E. MORIN <yann.morin.1998@free.fr> This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See below for a list of available actions, listed by category: Configuration actions: show-config - Show a brief overview of current configuration saveconfig - Save current config as a preconfigured target menuconfig - Update current config using a menu based program nconfig - Update current config using a menu based program oldconfig - Update current config using a provided .config as base upgradeconfig - Upgrade config file to current crosstool-NG extractconfig - Extract to stdout the configuration items from a build.log file piped to stdin savedefconfig - Save current config as a mini-defconfig to ${DEFCONFIG} defconfig - Update config from a mini-defconfig ${DEFCONFIG} (default: ${DEFCONFIG}=./defconfig) show-tuple - Print the tuple of the currently configured toolchain Preconfigured toolchains (#: force number of // jobs): list-samples - Prints the list of all samples (for scripting) show-<sample> - Show a brief overview of <sample> (list with list-samples) <sample> - Preconfigure crosstool-NG with <sample> (list with list-samples) build-all[.#] - Build *all* samples (list with list-samples) and install in ${CT_PREFIX} (set to ~/x-tools by default) Build actions (#: force number of // jobs): list-steps - List all build steps source - Download sources for currently configured toolchain build[.#] - Build the currently configured toolchain Clean actions: clean - Remove generated files distclean - Remove generated files, configuration and build directories Distribution actions: check-samples - Verify if samples need updates due to Kconfig changes update-samples - Regenerate sample configurations using the current Kconfig updatetools - Update the config tools Environment variables (see http://crosstool-ng.github.io/docs/build/) STOP=step - Stop the build just after this step (list with list-steps) RESTART=step - Restart the build just before this step (list with list-steps) CT_PREFIX=dir - Install samples in dir (see action "build-all", above). V=0|1|2|<unset> - <unset> show only human-readable messages (default) 0 => do not show commands or human-readable message 1 => show only the commands being executed 2 => show both Use action "menuconfig" to configure your toolchain Use action "build" to build your toolchain Use action "version" to see the version See "man 1 ct-ng" for some help as well |
خوب نحوه استفاده ازش چه جوری هست حالا؟
اول برید توی فولدری که میخواید Toolchain رو بسازید:
1 | cd /home/at00/EmbeddedLinux/F1C100s/build-tools |
بعدش با این دستور تنظیمات مربوط به یکی از سمپلها رو که به پردازندهتون میخوره توی فولدری Toolchain تون ذخیره کنید. مثلا:
1 | ct-ng arm-unknown-linux-gnueabi |
خب حالا میتونید با دستور زیر به منو تنظیمات دسترسی داشته باشین
1 | ct-ng menuconfig |
خبر خوب یا بد این هست که همه این منوها رو قرار نیست توضیح بدیم واستون و قراره خودتون برین یادبگیرین!
چون الان دیگه میدونید هر قسمت چی هست!
ساختن تولچین Toolchain برای لیچی پای نانو Lichee Pi Nano
خب یه ترمینال باز میکنیم و این دستورات رو اجرا میکنیم
1 2 3 4 5 | source /home/at00/EmbeddedLinux/F1C100s/at00exports.sh cd /home/at00/EmbeddedLinux/F1C100s/build-tools ct-ng arm-unknown-linux-gnueab |
سوال: چرا این تنظیمات؟ چرا بقیه رو انتخاب نکردین؟
1 2 3 4 5 | arm-unknown-linux-gnueabi arm-unknown-linux-musleabi arm-unknown-linux-uclibcgnueabi |
جواب: چون لینوکسی که الان روی برد هست با کتابخانه glibc ساخته شده. ولی وقتی که ما میخوایم از صفر همه چیز رو بسازیم بهتره به توصیه کریس گوش کنیم.
خب حالا بریم توی منو و یکم crosstool-NG رو شخصیسازی کنیم!
توی اولین منو من ترجیح میدم که این متغیر رو تغییر بدم.
به چی و چرا؟
به:
1 | ${CT_TOP_DIR}/at00toolchain |
و زیرا! در نهایت تولچین توی این مسیر خواهد بود و مقدار دیفالت این متغیر اشاره به مسیری داره که مطلوب من نیست.
بقیه متغیرها رو هم ببینید و اگه دوست داشتین تغییر بدین.
منوی دوم که واسه خودم خیلییییی گیج کننده بود تا مدتها!!!!
به یاد دبستان مانند نمونه پر کنید. ?
برای این که بفهمید هر کدوم چی هست و چه مقادیری میتونه داشته باشه انتخابش کنید و هلپش رو ببینید و هم زمان این سایت رو هم ببینید:
https://gcc.gnu.org/onlinedocs/gcc/ARM-Options.html
این رو هم اگر نمیدانید بدانید!
آرم یه اسم معماری داره یه اسم پردازنده یا کور و یه اسم خانواده:
معماری مثل armv5te
پردازنده مثل arm926ej-s
و خانواده مثل خانواده آرم ۹
منوی بعد هم تغییر خاصی نمیخواد
به منوی سیستم عامل هم یه سر بزنید و اگه صلاح دونستین ورژن کرنل رو کمش کنید.
دیدن سایر منوها و بررسیشون هم خالی از لطف نیست.
در نهایت این دستور رو بزنید و برید مدتها بعد بیاین بسته به سیستمتون و اینترنتتون ممکنه از یه رب تا یه عمر!!! طول بکشه!
هشدار: از تحریم شکن مناسب استفاده کنید!
1 | ct-ng build |
سوال: چه خطاهایی ممکنه داشته باشیم؟ و راه حلشون چیه؟
جواب: خطاهایی که مربوط به نبودن یه سری پکیج روی سیستمتون هست که راه حل هم نصب اون پکیجهاست.
خطاهای مربوط به دانلود که راهحل استفاده از تحریمشکن خوب و یا اینکه خودتون دانلود کنید و بریزید سر جاش
سوال: از کجا دانلود کنیم و جاش کجاست؟
جواب: اگه به گزینههای منو و متن خطا دقت کنی جواب خواهی گرفت!
تست کردن تولچین Toolchain برای لیچی پای نانو Lichee Pi Nano
خوب من اولش ترجیح میدم این خط رو به فایل at00exports.sh اضافه کنم:
1 | export GCC=/home/at00/EmbeddedLinux/F1C100s/build-tools/at00toolchain/bin/arm-richdad-linux-gnueabi-gcc |
و دوباره این فایل رو source کنم.
خوب الان میریم توی فولدر پروژههامون و یه فایل میسازیم:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | cd /home/at00/EmbeddedLinux/F1C100s/project vi first.c #include <stdio.h> #include <stdlib.h> #include <string.h> int main(void) { printf("\r\nHello World!\r\n"); printf("I'm AT00FirstF1C100S!\r\n"); return 0; } |
خب حالا با کراس کامپایلرمون Cross Compiler کامپیالش میکنیم:
1 | $GCC first.c –o at00 |
خوب حالا فایل اجرایی رو یه بررسی کنیم و بعدش بریزیم روی SD Card
1 2 3 | file at00 at00: ELF 32-bit LSB executable, ARM, EABI5 version 1 (SYSV), dynamically linked, interpreter /lib/ld-linux.so.3, for GNU/Linux 4.4.214, with debug_info, not stripped |
حسب ظاهر که اکی هست امیدوارم حسب باطن هم اکی باشه!
خوب حالا کارت حافظه رو میذاریم و برد رو روشن میکینم و برنامه رو از هرجایی که ریختیم اجرا میکنیم:
خب خوشبختانه انگار همه چیز درست هست.
چرا انگار چون تست اصلی زمانی هست که کرنل رو کامپایل کنیم با تولچین خودمون.
ساختن تولچین Toolchain برای رسپبری پای سه بی پلاس Raspberry Pi 3 B Plus
خب معما چون حل گشت گلابی شد دیگه، مخصوصاً که یکی از مثالها دقیقا واسه رسپبری پای سه بی پلاس Raspberry Pi 3 B Plus
اولش طبق قاعده از اولش منظم باشیم تا آخرش گم نشیم فولدرهامون رو میسازیم
1 2 3 4 5 6 7 | mkdir /home/at00/EmbeddedLinux/RPI3BP cd /home/at00/EmbeddedLinux/RPI3BP mkdir bootldr build-tools debug doc images kernel project rootfs sysapps tmp tools cd build-tools |
خب در اینجا من چون crosstool-NG رو توی فولدر F1C100s نصب کردم دوباره فایل at00exports.sh رو از اونجا source میکنم و بعدش این دستورات
1 2 3 | ct-ng aarch64-rpi3-linux-gnu ct-ng menuconfig |
خب تغییراتی که من دادم یکی در مورد مسیر هست یکی هم کرنل:
و بعدش
1 | ct-ng build |
مدتها صبر میکنیم و در نهایت به موفقیت میرسیم.
برای تست کردنش هم مثل قبل منتهی برای ریختن فایل روی رسپبری پای سه بی پلاس Raspberry Pi 3 B Plus از scp قافل نشید!
خب الان همه چیز رو برای ساختن همه چیز دارید! اگه سازنده باشید خیلی چیزها رو تا قسمت بعد خواهید ساخت. ?
پایان بخش هفتم از فصل دوم
سلام
نبود این کتابخونه رو چطور میشه حل کرد؟
test: /lib/libc.so.6: version `GLIBC_2.34′ not found (required by ./test)
سلام. این معمولا بر میگرده به نسخه سیستم عاملی که دارید ازش استفاده میکنید و اگر نسخه دیگه ای از این کتابخونه رو نصب کنید معمولا بقیه قسمت های سیستم عامل به مشکل میخورند و احتمالا دیگه بوت نشه
برای همین با سیستم عامل و دستورات پیشنهادی پیش برید.
سلام.
ممنون از مطالب خوبتون.
فقط یک سوال ما اگه بخوایم یک بردی رو خودمون طراحی کنیم و از یک چیپ مثلا Rockchip استفاده کنیم، اونموقه هم با همین Roadmap میتونیم بریم جلو؟ مثلا ان بخش دانلود فایل راه اندازه برای چیپ ها هم موجوده یا فقط برای بردها(سینگل برد کامپیوتر ها مثل lichee یا Raspberry) موجوده؟؟ چون در نهایت بردهای کاستوم برای ما اهمیت دارن نه راه اندازی روی بردهای آماده… راهنمایی کنید ممنون میشم.
سلام.
برازید من یکم کلی تر بگم
ببینید چیپ به چیپ و شرکت به شرکت این موضوع متفاوته. در واقع غیر از این فایل ها شما چیز های دیگه ای مثل دیوایس تری یا درایور های بخش های مختلف چیپ نیاز دارید که ممکنه بعضیش توی اینترنت باشه ، ممکنه بعضی دیگش نیاز به هزینه کردن و خریدش داشته باشه و ممکنه بعضی دیگه نیاز به نوشتنش باشه و کلا نباشه.
پیشنهاد اینه که شما اگر میخواید بردی رو طراحی کنید با چیپ هایی باشه که اطلاعات بیشتری ازشون در دسترس هست و شماتیکتون هم بر اساس یک برد آماده با همون چیپ آماده کنید و تا اون موقع خودتون خیلی چیز های بیشتری متوجه شدید و خودتون میتونید جواب سوال خودتون رو بدید 🙂
خیلی عالی
تو بخش Paths and misc options یک گزینه هست Local tarballs directory که یه مسیر توش نوشته
اون مسیر قراره که فایل هایی که دانلود میشه رو تو خودش نگه داره. اگه اون رو به یک دایرکتوری که موجوده تغییر بدید، فایل های سورس توی اونجا ذخیره میشن و برای build های بعدی لازم نیست همه چیز از اول دانلود بشه
ممنون از شما.
البته این کانفیگ یک مقدار پیشفرض هم داره که
default "${HOME}/src"
هست.یعنی در حالت عادی هم چنین اتفاقی میوفته که نیاز نباشه دوباره دانلود کنیم ، اما میتونبم مسیرش رو تغییر هم بدیم.
سلام
موارد آموزشی که برای 3B plus ارائه میدید، روی 3B هم جواب میده یا متفاوته؟
سلام بر سید
آموزشها مربوط به امبدد لینوکس به صورت کلی هست و اگر از اول دنبال کنید برای تمامی بردها قابل استفاده است.
سلام
ممنون از آموزش های خوبتون
من به مرحله ی build رسیدم و خطای failed to retrieve isl-0.24 رو نشون میده.
فایل مربوط به این پکیج رو دانلود کردم. ولی نمی دونم باید کجا قرارش بدم تا موقع build شناسایی بشه.
ممنون که راهنمایی می کنید
سلام سعید جان
تشکر می کنم از توجه و پیگیری شما
همینطور که در متن آمده است:
«سوال: از کجا دانلود کنیم و جاش کجاست؟»
جواب: اگه به گزینههای منو و متن خطا دقت کنید جواب را خواهی یافت!
موفق باشید
سلام
کامپایل toolchain و شروع کردم. فقط چون هنوز SoM لیچی پای رو تهیه نکردم، قصد دارم روی qemu تستهای خودم رو بزنم.
ممنونم
سلام جناب صاحبی عزیز
هر تلاش و تمرینی در راستای ارتقای توان و مهارت، قابل ستایش است.
البته اگر سخت افزار با آنچه معرفی شده یکی باشد، می تواند مسیر سریعتر طی شود.
مرسی داداش 🙂 تمام مراحلی که تا اینجاش اومدم به کنار … اون scp با اینکه آسونش بود … سر کپی نشدن فایلی که کامپایل کرده بودم نزدیک بود سرمو بکوبم به دیوار … در هر صورت اویل به این سایت و مطالبش …
ضمن اینکه من برای raspberry pi zero w انجام دادم .
soc این برد bcm2835 هست – معماری cpu اون هم armv6 – از خانواده arm11 که دقیق تر بگم ARM11J6JZF-S
برای ساخت تولچین این soc از
ct-ng armv6-unknown-linux-gnueabihf
استفاده کنید…
توی قسمت menuconfig هم وقتی بخش معماری چک می کنید متوجه می شید که بری همین معماری و خانوادس :))
یه نکته ای هم هست را جب GCC که برای نسخه های متفاوتی که شما نصب می کنید ساختار فایلا تغییر می کنه و خب باید پیداش کنید …
بعد از نصب شدن فایلای toolchain شما باید اون آدرسو بگردید بین فایلاتون (که می تونید از دستور locate هم استفاده کنید برای بیدا کردن) و فایل
armv6-rpi-linux-gnueabihf-gcc
که البته اگه معماری cpu شما فرق می کنه طبیعتا اسم فایل فوق فرق خواهد کرد ولی اخرش gcc داره که … خلاصه با این فایله می تونید برنامه های c رو مثلا first.c رو کامپایل کنید 🙂 … پس:
export GCC=/path/…/armv6-rpi-linux-gnueabihf-gcc رو من زدم …. و بعدش می تونیم از GCC$ استفاده کنیم برای کامپایل.
🙂
ضمن سخن ادمین : ‘ اما متاسفانه غالب افراد مهارت در امبدد لینوکس را با بازی کردن با رسپبری پای اشتباه میگیرند! ? ‘ شما هم اینو یادتون باشه … واقعا فرق دارن :)))))))
تا درودی دگر …
سلام پویا جان
خداقوت و ممنون از توضیحات ?
سلام وقت بخیر
این دوره دیگه قرار نیس ادامه پیدا کنه؟
سلام آرمین جان
به علی آقا هم گفتمف همه ما سخت درگیر کارها هستیم و مطالب این مقاله هم در حال تست و پیاده سازی هست تا به مرحله نشر برسد
شما از تمرین غافل نشوید
سلام آرمین جان
به علی آقا هم گفتم، همه ما سخت درگیر کارها هستیم و مطالب این مقاله هم در حال تست و پیاده سازی هست تا به مرحله نشر برسد
شما از تمرین غافل نشوید
سلام. وقتتون بخیر و خدا قوت. سپاس فراوان. دلمون قرص شد واسه ادامه تمرین ها
خیلی قشنگ توضیح دادی. واقعا فکر نمی کردم تو منابع فارسی این جور آموزشی پیدا کنم. عالیه
سلام داود جان
امیدوارم برای شما راه گشا باشد
سلام مهندس خیلی خیلی باحال بودش فقط یکم پا رو بیشتر رو پدال گاز فشار بده چون واقعا این بحث خیلی با حاله و جای کار داره
سلام علی جان
ممنون از پیگیری شما، همه ما سخت درگیر کارها هستیم و مطالب این مقاله هم در حال تست و پیاده سازی هست تا به مرحله نشر برسد
شما از تمرین غافل نشوید
سلام
ممنون از لطفتون که تجربه و دانشی که دارین به اشتراک گذاشتین
مهندس من کامپایل تول چین و نمونه سمپل hello wordهم انجام دادم و بر روی بورد lichee pi اجرا کردم و به خوبی اجرا شد , برای ادامه کار مثلا بخوام به GPIO ها دسترسی داشته باشم چه کتابخانه ای باید اضافه بکنمو از کجا اون کتابخانه رو باید پیدا کنم ؟ اصولش به چه صورت ؟
پیشاپیش از پاسختون ممنونم
سلام بر محمد مهدی کریمی عزیز
همان طور که در مقدمه گفته شد، سوال شما در حیطه Linux System Programming است که در مقالات آخر به آن خواهیم پرداخت.
در همان مقدمه کتابهایی در این زمینه معرفی شدهاند که به آنها نیز میتوانید رجوع کنید.
موفق باشید
سلام جناب. وقت شما بخیر
بیصبرانه منتظر ادامه آموزشها هستیم. این برد لیچی پای کاربردهای عالی برای ما داره. ما یه سیستمی داریم که یه GUI داره و کاربر باهاش ارتباط داره. این برد برای اینجور کارا خیلی خوبه و قیمتش مناسبه. همچنین میشه چیپشو تهیه کرد و روی برد خودمون قرار بدیم. اگر بتونید این PDF که لینکشو میزارم برامون دانلود کنید و در اختیارمون بزارید خیلی خوب میشه. این شماتیک برد لیچی نانو هست.
سپاس فراوان…
سلام و عرض ادب
پیرو این درخواست، تعدادی از نقشه های مربوطه روی سرور سیسوگ برای دوستان آپلود شد.
البته در ادامه مقاله ها این لینک ها مجدد معرفی می گردد:
https://sisoog.com/wp-content/uploads/2021/01/Lichee_nano-1.pdf
https://sisoog.com/wp-content/uploads/2021/01/lichee_nano_new-1.pdf
https://sisoog.com/wp-content/uploads/2021/01/lpi-nano-dock-1.pdf