در مقاله دوم آموزش رزبری پای، به معرفی ساختار CPU نحوه اجرای برنامه در رزبری پای پرداختیم. در این مقاله قصد داریم نحوه نصب و کانفیگ ابزارهای لازم جهت کامپایل کدهای نوشتهشده برای بردهای رزبری پای را آموزش دهیم.
همانطور که قبلا توضیح دادیم، پلتفرم سختافزاری رزبری پای مبتنی بر پردازنده های ARM است و نمیتوان از کامپایلرهای x86 مثل ویژوال استودیو برای کامپایل کدهای زربری استفاده کرد.
برای آشنایی با ابزارهای لازم و نحوه نصب و کانفیگ آنها با سیسوگ همراه باشید.
معرفی کامپایلرهای موجود:
واضح است برای تبدیل کدهای نوشتهشده به بیت کدهای قابلفهم توسط پردانده، نیاز به ابزاری است که اصطلاحاً به آن کامپایلر میگویند. کامپایلری که برای تبدیل کدهای رزبری پای موردنیاز است باید قابلیت کامپایل برای پلتفرم ARM را داشته باشد. کمپایلرهای زیادی وجود ندارند که دارای چنین قابلیتی باشند. کامپایلر هایی که قادر به پشتیبانی پلتفرم ARM باشند، (معروفترین آنها) به شرح زیر هستند:
- ARM Keil
- ARM IAR
- GCC
بله، تقریبا همین سه مورد! ممکن است فکر کنید که خب Atmel Studio یا CooCox و خیلی از ایزار های دیگر قابلیت کامپایل برای ARM را دارند ولی باید خاطرنشان کنم که هماکنون در خصوص کامپایلر صحبت میکنیم و موارد ذکرشده فقط ویرایشگر کد هستند و خود دارای کامپایلر نیستند. بهعنوان نمونه SEGGER Embedded Studio و حتی Atmel Studio از GCC استفاده میکنند.
از چه کامپایلری استفاده کنیم؟
تصمیمگیری در خصوص کامپایلر مورداستفاده با توجه به لیست معرفیشده چندان دشوار نیست. کامپایلر Keil و IAR هردو غیر رایگان هستند و برای استفاده از آنها باید لایسنس آنها را خریداری کرد. ما در سیسوگ سعی میکنیم که به معرفی و استفاده از ابزارهای متنباز و رایگان بپردازیم. با توجه به پولی بودن کامپایلرهای Keil و IAR از آنها چشمپوشی کرده و آموزشهای خود را بر اساس کامپایلر رایگان GCC ادامه میدهیم.
اما در نظر داشته باشید که انتخاب کامپایلر رایگان GCC از روی ناچاری نیست. یکی از دلایل انتخاب این کامپایلر، انعطافپذیری زیاد و برتری آن نسبت به کامپایلر Keil است. شاید نتوان گفت که از IAR قویتر است اما به جرئت میتوان گفت که چیزی از آن کم ندارد و عملکردی بسیار نزدیک به یکدیگر دارند.
کامپایلر GCC چنان قدرتمند است که حتی ARM Keil امکان استفاده از آن را در محیط خود، به کاربر میدهد و کاربر میتواند بسته به نیاز از ویرایشگر Keil و کامپایلر GCC استفاده کند.
از طرفی رایگان و متنباز بودن کامپایلر GCC، باعث شده است که افراد زیادی در سراسر جهان از آن استفاده کنند و در بهینهسازی این کامپایلر مشارکت داشته باشند. با توجه به طیف وسیع استفادهکنندههای این کامپایلر، اگر احیاناً در قسمتی دچار مشکل شدید بهراحتی با جستجو در اینترنت میتوانید منشأ مشکل را پیدا و آن را حل کنید. از طرفی بیشتر سورسهای منتشرشده، با استفاده از این کامپایلر انجام شدهاند.
چگونگی نصب کامپایلر GCC:
نصب و راهاندازی GCC کار پیچیده ای نیست و بهراحتی قابل انجام است. اگر از لینوکس استفاده میکنید، لبخند بزنید چرا که برای نصب و پیکربندی کافی ست فقط خط زیر را در ترمینال تایپ کنید:
1 | sudo apt-get install gcc-arm-embedded |
دقت داشته باشید که دستور فوق برای نصب بر روی توزیعهای مبتنی بر دبیان است.
اما کاربران ویندوز نیاز است که یکی دو مرحله بیشتر طی کنند. ولی جای نگرانی نیست. مراحل خیلی ساده هستند و میتوان بهراحتی آنها را انجام داد.
در مرحله اول با مراجعه به سایت GCC ARM Embedded ، آخرین نسخه مبتنی بر ویندوز خود را دریافت کنید.
نکته : دقت کنید که حتما نسخه نصبی را دانلود کنید.
بعد از دانلود فایل نصبی کامپایلر GCC، بهراحتی مثل نصب دیگر نرمافزارها، مطابق ویدئو زیر کافی ست که بر روی دکمه Next کلیک کنید تا کار نصب خودکار انجام شود:
بعد از تمام شدن مراحل نصب، برای بررسی نصب صحیح میتوان دستور زیر را در خط فرمان (Command Prompt ویندوز یا ترمینال لینوکس) وارد کرد:
1 | arm-none-eabi-gcc -v |
در صورت نصب صحیح برنامههای موردنیاز، با اجرای دستور فوق، خروجی مطابق زیر خواهد بود:
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 | Using built-in specs. COLLECT_GCC=arm-none-eabi-gcc COLLECT_LTO_WRAPPER=c:/program\ files\ (x86)/gnu\ tools\ arm\ embedded/4.9\ 2015 q1/bin/../lib/gcc/arm-none-eabi/4.9.3/lto-wrapper.exe Target: arm-none-eabi Configured with: /home/build/work/GCC-4-9-build/src/gcc/configure --build=i686-l inux-gnu --host=i686-w64-mingw32 --target=arm-none-eabi --prefix=/home/build/wor k/GCC-4-9-build/install-mingw --libexecdir=/home/build/work/GCC-4-9-build/instal l-mingw/lib --infodir=/home/build/work/GCC-4-9-build/install-mingw/share/doc/gcc -arm-none-eabi/info --mandir=/home/build/work/GCC-4-9-build/install-mingw/share/ doc/gcc-arm-none-eabi/man --htmldir=/home/build/work/GCC-4-9-build/install-mingw /share/doc/gcc-arm-none-eabi/html --pdfdir=/home/build/work/GCC-4-9-build/instal l-mingw/share/doc/gcc-arm-none-eabi/pdf --enable-languages=c,c++ --disable-decim al-float --disable-libffi --disable-libgomp --disable-libmudflap --disable-libqu admath --disable-libssp --disable-libstdcxx-pch --disable-nls --disable-shared - -disable-threads --disable-tls --with-gnu-as --with-gnu-ld --with-headers=yes -- with-newlib --with-python-dir=share/gcc-arm-none-eabi --with-sysroot=/home/build /work/GCC-4-9-build/install-mingw/arm-none-eabi --with-libiconv-prefix=/home/bui ld/work/GCC-4-9-build/build-mingw/host-libs/usr --with-gmp=/home/build/work/GCC- 4-9-build/build-mingw/host-libs/usr --with-mpfr=/home/build/work/GCC-4-9-build/b uild-mingw/host-libs/usr --with-mpc=/home/build/work/GCC-4-9-build/build-mingw/h ost-libs/usr --with-isl=/home/build/work/GCC-4-9-build/build-mingw/host-libs/usr --with-cloog=/home/build/work/GCC-4-9-build/build-mingw/host-libs/usr --with-li belf=/home/build/work/GCC-4-9-build/build-mingw/host-libs/usr --with-host-libstd cxx='-static-libgcc -Wl,-Bstatic,-lstdc++,-Bdynamic -lm' --with-pkgversion='GNU Tools for ARM Embedded Processors' --with-multilib-list=armv6-m,armv7-m,armv7e-m ,cortex-m7,armv7-r Thread model: single gcc version 4.9.3 20150303 (release) [ARM/embedded-4_9-branch revision 221220] ( GNU Tools for ARM Embedded Processors) |
این خروجی یعنی تمام کارهای مربوط به نصب و پیکربندی بهدرستی انجام شده است.
نوشتن اولین برنامه
همیشه سختترین قسمت کار، نوشتن اولین برنامه است؛ چرا که پارامترهای زیادی وجود دارد که ممکن است در کار نکردن یک برنامه دخیل باشند و پیدا کردن مشکل را سخت کنند.
برای همین هم است که معمولاً اولین برنامه را در سادهترین حالت ممکن انتخاب میکنند. در دنیای کامپیوتر برنامه شروع را Hello world مینامند و بهسادگی کد زیر است:
1 2 3 | main( ) { printf("hello, world"); } |
اما در دنیای الکترونیک وضع مقداری فرق دارد. پیادهسازی فرمان printf خود مستلزم آگاهی بسیار زیادی از اجزاء سختافزاری و نرمافزاری است. به همین دلیل معمولاً برنامه شروع در دنیای الکترونیک خیلی متفاوت از آن چیزی است که در دنیای کامپیوتر وجود دارد. در دنیای الکترونیک برای شروع با هر سختافزار و یا میکرو کنترلر، ابتدا سعی میشود برنامه یک چشمکزن نوشته شود. یعنی برنامه ای که با صفر و یک کردن یکی از پورت های موجود بر روی سختافزار، بتوان به صحت اجرای برنامه پی برد. در واقع سادهترین برنامهای که میتوان نوشت، برنامه یک چشمکزن است. برای همین است که در اکثر بردهای آموزشی، حداقل یک LED وجود دارد که میتوان وضعیت آن را با استفاده از پردازنده مرکزی کنترل کرد. سختافزار رزبری پای نیز از این قاعده جدا نبوده و خوشبختانه یک LED به نام ACT بر روی آن تعبیه شده است.
برای شروع، باید بدانیم که این LED به کدام پایه از پردازنده متصل شده است. با توجه به سختافزار های متفاوت در ورژن های مختلف برد رزبری، لازم است که یکی را بهعنوان سختافزار پیشفرض در نظر بگیریم و آموزش را بر اساس آن جلو ببریم. با توجه به قدیمی شدن ورژن 1 و کمیاب شدن آن در بازار، سختافزار پیشفرض را Raspberry pi 2 در نظر میگیریم.
قبل از هر چیز برای دانستن وضعیت اتصال ACT LED، باید شماتیک برد را داشته باشیم. خوشبختانه شماتیک آن توسط تیم توسعهی رزبری پای در دسترس قرار گرفته است. برای دانلود شماتیک میتوانید به سایت رزبری پای مراجعه کنید.
همانطور که در تصویر فوق مشاهده میکنید، ACT LED که در شماتیک بهصورت Status LED از آن نام برده شده به GPIO16 از پردازنده متصل شده است. در گام بعدی برای اینکه بتوانیم وضعیت یک GPIO را کنترل کنیم لازم است با ساز و کار مربوط به آن آشنا شویم و در واقع نیاز به دیتاشیت پردازنده داریم که خوشبختانه آن نیز در دسترس قرار گرفته است.
با توجه به اطلاعات بهدستآمده در خصوص سختافزار و همچنین رجیسترهای کنترلی پردازنده، بهراحتی میتوان برنامه موردنظر را نوشت. در این بخش از مقاله بیش از این وارد جزئیات نوشتن و عملکرد برنامه نمیشویم. در مقالات بعدی با توضیحات بیشتر، به نحوه پیادهسازی و کار با رجیستر های پردازنده خواهیم پرداخت.
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 | /* The base address of the GPIO peripheral (ARM Physical Address) */ #define GPIO_BASE 0x3F200000UL #define LED_GPFSEL GPIO_GPFSEL4 #define LED_GPFBIT 21 #define LED_GPSET GPIO_GPSET1 #define LED_GPCLR GPIO_GPCLR1 #define LED_GPIO_BIT 15 /** GPIO Register set */ volatile unsigned int* gpio; /** Simple loop variable */ volatile unsigned int tim; /** Main function - we'll never return from here */ int main(void) __attribute__((naked)); int main(void) { /* Assign the address of the GPIO peripheral (Using ARM Physical Address) */ gpio = (unsigned int*)GPIO_BASE; /* Write 1 to the GPIO16 init nibble in the Function Select 1 GPIO peripheral register to enable GPIO16 as an output */ gpio[LED_GPFSEL] |= (1 << LED_GPFBIT); /* Never exit as there is no OS to exit to! */ while(1) { for(tim = 0; tim < 500000; tim++) ; /* Set the LED GPIO pin low ( Turn OK LED on for original Pi)*/ gpio[LED_GPCLR] = (1 << LED_GPIO_BIT); for(tim = 0; tim < 500000; tim++) ; /* Set the LED GPIO pin high ( Turn OK LED off for original Pi)*/ gpio[LED_GPSET] = (1 << LED_GPIO_BIT); } } |
چگونگی کامپایل برنامه
برنامه فوق را با اسم blinkact.c ذخیره میکنیم. برای کامپایل برنامه قبل از هر مسئلهای نیاز است که یک سری تنظیمات را در خصوص پلتفرم مورداستفاده انجام بدهیم که خوشبختانه با توجه به کامند لاین بودن کامپایلر GCC، تمام تنظیمات مربوطه بهصورت پارامترهای ورودی دریافت می کند. برای کامپایل برنامه فقط کافی است که دستور زیر را یا در ترمینال یا کامند پرامپت اجرا کنیم:
1 | arm-none-eabi-gcc -O0 -mfpu=neon-vfpv4 -mfloat-abi=hard -march=armv7-a -mtune=cortex-a7 -nostartfiles -g blinkact.c -o kernel.elf |
کلید -mtune=cortex-a7 به کامپایلر میگوید که کد موردنظر را برای پردازندههای خانوادهی Cortex-a7 کامپایل کند و کلید -march=armv7-a به نوع معماری این خانواده اشاره دارد. بعد از اجرای دستور فوق، برنامه کامپایل شده و خروجی kernel.elf ایجاد میشود. فایلهای elf، حاوی اطلاعات زیادی در خصوص کتابخانههای مورداستفاده، پارامترهایی جهت خطایابی و همچنین اطلاعات اجرایی هستند. برای استخراج کدهای اجرایی نیاز است که دستور زیر را اجرا کنیم:
1 | arm-none-eabi-objcopy kernel.elf -O binary kernel.img |
بعد از اجرای دستور فوق، فایل اجرایی kernel.img ایجاد میشود.
هماکنون برنامه آماده اجرا است.
در مقالهی بعد، ابزارهای مورداستفاده را کاملتر خواهیم کرد و نحوه کانفیگ ادیتور Eclipse را نیز توضیح خواهیم داد.
سلام-میشه در مورد کد مخصوصا بخش رجیستر هاشو یک توضیح دهید
درخواست دیگم این بود که اموزشو ادامه بدهید لطفا
سلام دوست عزیز
رجیسترها رو توی دیتاشیت ماژول میتونید پیدا کنید اونجا عملکرد هر کدوم رو توضیح داده
اگر دقیقتر بگید کدوم رجیستر بهتر میتونم راهنمایی کنم
– متشکر از فیدبک شما – انشالله اگر فرصت بشه توی دستور کار هست
کن انتخاب میکنند. در دنیای کامپیوتر برنامه شروع را Hello world مینامند و بهسادگی کد زیر است:
main( ) {
printf(“hello, world”);
}
این کد خراب هست شما قبل اسم تابع باید ریترن تایپش هم می دادید قبل main بنویسید void
سلام 🙂
در حالت های مثلا وقتی سیستم عاملی نیست که بخواد تصمیمی بگیره میتونه تابع مین برنامه هیچ چیزی رو برنگردونه و منطقا کسی هم ناراحت نشه بابتش 🙂
خیلی ممنون
سلام .
وقت بخیر .
آیا gcc میتواند کد برای پردازنده های 4 هسته را کمپایل کند ؟
و آیا میتوان تنظیم کرد که کدها فقط به وسیله 1 هسته اجرا شود ؟
اساسا کدنویسی برای 4 هسته چقدر مشکل است ؟
تا حالا شما تجربه ای در این زمینه داشته اید؟
سپاس.
سلام دوست عزیز
بله قطعا میشه – همین الان کرنل لینوکس داره با gcc کامپایل میشه دیگه !!!
ولی این که چطور باید ازش استفاده کرد بیشتر برمیگرده به مستندات سازنده پردازنده و میکروکنترلر
به شخصه تا حالا بدون سیستم عامل از چند پردازنده اسنفاده نکردم ولی فکر نمیکنم خیلی چیز پیچیده ای باشه.
میخوام یک بورد بخرم که از لحاظ قیمت تفاوت چندانی با رزبری 0 w نداره ولی پردازنده خیلی قویتری داره و ubuntu 14 lts روی اون اجرا میشه . منتها برام مهمه بتونم بدون سیستم عامل و بدون صرف زمان زیاد ، برای اون کد بنویسم .
سپاس جناب زئوس.
خوب برای این کار باید با پردازنده اون برد آشنایی داشته باشید – روند های بوت و نحوه بوت اون رو بدونید همونطور که توی این سه مقاله توضیح دادم
و کار نشد نداره 🙂
با سلام مجدد.
راستش سوییچ های gcc را بررسی کردم .
برای انتخاب کورتکس گزینه ای به این شکل دیدم cortex-A17.cortex-A7 که فکر میکنم مربوط به 2 هسته باشه ( اگر اشتباه میکنم بنده را اصلاح کنید)
ولی چیزی که بیانگر 4 هسته باشه ندیدم .
سپاس.
تا اونجا که من اطلاع دارم هسته ها روند های جدایی از هم طی میکنند و مثلا یک برنامه برای هسته یک نوشته میشه – یکی برای دوم و یکی برای سوم و ….
فکر نمیکنم زیاد کاری به کامپایلر داشته باشه و بیشتر روند نرم افزاری است مدیریت این مساله
سلام .
اگر قرار باشه توی یک فایل دستورات رو بنویسیم احتمالا باید یک سوییچی باشه که به کمپایلر بفهمونیم این کد مال کدام هسته هست . حالا کمپایلرهای تک هسته میتونن اینکارو بکنن ؟
کلا من اصلا اطلاعاتی در این زمینه ندارم . و نمیدونم چه رفرنسهایی رو باید مطالعه کنم .
سپاس
در حالت کلی برای برنامه نویسی موازی از کتابخانه های openMP و .. استفاده میشه که دستورات اون قبل از بخش هایی از کد که قابلیت موازی سازی شدن دارند مثل حلقه ها آورده میشه تا یک حلقه به صورت موازی بر روی چند هسته اجرا بشه. بنده این رو با Cpp امتحان کردم ولی بر روی آرم اطلاعی ندارم که امکانش هست یا نه
میشه تحقیق کرد 🙂
با سلام مجدد .
راستش از اون وبسایتی که معرفی کرده بودید موفق به دانلود کمپایلر نشدم .
اما یک نسخه سال 2019 ( نسخه 8.3.1 ) را دانلود و نصب کردم .
همان دستوررای کمپایل در خط فرمان وارد کردم از یکسری از دیفاینها خطا گرفت . میگفت GPIO_GPFSEL4 و GPIO_GPSET1 و GPIO_GPCLR1 نمیشناسه .
به جای اونها یکسری اعداد دلخواه وارد کردم . مشکل برطرف شد. ولی یک warning داد به این مضمون :
cannot find entry symbol _start de defulting 00008000
این مربوط چی هست ؟
احتمالا تنظیمات پروژه درست نیست !
یک بار دیگه چک کنید تنظیمات پروژه رو
راستش در قسمت سوم هستیم .
الان که چیزی به نام پروژه وجود نداره که بخواد تنظیما ت داشته باشه!!!
فایل تکست با پسوند .C رو توی خط فرمان همانطور که در مطلب این قسمت ذکر شده بود کمپایل کردم .
و اخطار cannot find entry symbol _start de defulting 00008000 رو میده .
گفتم شاید اشکال از نسخه جدیده باشه ، با نسخه 2016 تست کردم باز هم همین اخطار رو میداد.
من فکر نمیکنم مشکل از نسخه باشه
تو کامنت های قبلی راه کار رو گفتم تست کنید ببینید درست میشه ؟!
سپاس.
سلام بر زئوس گرامی ..
لینهای دانلود arm gcc vh در سایتی که آدرسش رو برای دانلود قرار دادیدوجود ندارد .
در قسمت دانلود این رو مینوسه
Downloads
GNU Arm Embedded Toolchain does not have any download files registered with Launchpad.
اگر ممکن است . راهنمایی کنید؟
با سپاس.
بله درسته به دلیل جابجا شدن ورژن استیبل این اتفاق افتاده ولی همچنان از بخش آرشیو می تونید اون ورژن رو دانلود کنید. لینکشو میذارم
https://launchpad.net/gcc-arm-embedded/4.9/4.9-2015-q3-update
سپاسجناب زئوس.
با سلام مجدد.
راستش من یک موبایل قدیمی دارم که پردازنده ش arm1136 هست با کلاک 700 MHZ .
با خودم گفتم . کی پد که داره . ال سی دی هم داره .میکرو SD هم که میخوره . سیم کارت خور هم که هست ( ماژول gsm داره ) . صدا هم که میتونه تولید کنه .سیستم باطری و شارژر باطری هم که فابریک داره . … حتی led هم داره ( چراغ قوه ش رو میگم )، فقط پورتهای ارتباطیش کم هست . که حالا بعدا با یک سخت افزار ساده و ارتباطش با otg یک کاریش میکنم .خب فعلا همینا برام کافیه.
این کاری رو که با رزبری میخوایم انجام بدیم . آیا میشه با سخت افزار موبایل انجام داد .یعنی منظورم اینه که ساختارش این اجازه رو میده؟!
تا حالا کسی اینکارو کرده ؟!
سلام بله قطعا میشه و من خودم این کار رو انجام دادم البته با تبلت – ولی باید دقت کنید یه اما وجود داره
شما چون دارید با سخت افزار کار میکنید لازمه آدرس پورت ها رو بدونید مثلا مدل داریور lcd رو بدونید و این که مثلا led به کدوم پورت وصل شده gsm چطور هندل میشه و ….
علاوه بر این که لازمه نقشه شماتیک مدار رو داشته باشید لازمه جزییات سخت افزاری راجب راه انداز هر یک از ماژول ها رو نیز بدونید
این اطلاعات رو که فرمودید از کجا بدست آوردید ؟!
من نقشه های گوشی رو دیدم ولی این اطلاعات توی اون نبود .
و در مورد پروگرام کردنش ( فکر میکنم فلش داخلی داشته باشن ) آیا با بوت لودر امکانپذیر هست ؟
خوب اون تبلتی که من راه انداختم خودم باز کردم و شماره آیسی ها رو در آوردم و تا حدود زیادی معماریش مشخص شد 🙂
از این تبلت چینی ها بود
فلش ها معمولا روی گوشی ها و تبلت ها به شکل nand فلش هست و برای خوندن آنها باید پروگرامر مربوطه رو داشته باشید مگر این که ته و توی بوت لودر سیستم رو در اورده باشید.
واقعا تعجب کردم . !!!!!
فکرش رو نمیکردم اینجوری آدرسها رو پیدا کرده باشی.!!
البته من قبلا شماره چند تا از آی سی های موبایلم رو سرچ کرده بودم و تقریبا هیچی بدست نیومد !!
به هر حال سپاس که تجارب خودت رو در اختیار من قرار دادی .
گاهی باید راه های سخت رو رفت تا به نتیجه رسید 🙂
خواهش میکنم
سلام.
سپاس بابت مطالب بسیار خوبی که مینویسید.
یک بورد رزبری هست به اسم نانو پای اما پردازندش bcm نیست یک تراشه از سامسونگ هست .
آیا کمپایلری که توی مقاله ذکر کردید ،پردازنده بورد نانو پای را ساپورت میکنه ؟
سلام
بله شما با این کامپایلر میتونید برای پردازنده ARM کدهاتونو کامپایل کنید و فرقی نمیکنه شرکت سازنده چی باشه!
سلام
کارتون بسیار ارزنده و عالی بود.
اما مشکلی که برای من وجود داره اینه که به نظر میرسه سرعت میکروکنترلر پایین باشه یا به عبارتی تنظیمات کلاک آن بر روی 700 مگاهرتز یا بیشتر نباشه. یک حلقه 1000000 تایی حدود یک ثانیه طول می کشه.
چطور میشه فرکانس کلاک و PLL این پردازنده رو تعیین کرد؟؟؟
سلام دوست عزیز 🙂 خواهش میکنم ؛ خوشحالم که این مقاله مورد توقیق قرار گرفته
در مورد پیکربندی اولیه توی قسمت دوم مقاله توضیح دادیم که روال چیه و چطوره انجام میشه
با سلام
بنده 1 سوال و 1 مشکل برام پیش اومده.
مشکل اینه که موقع کامپایل این خطا رو دریاف میکنم:
‘GPIO_GPFSEL4’ undeclared (first use in this function); did you mean ‘GPIO_BASE’?
#define LED_GPFSEL GPIO_GPFSEL4
التبه تعداد دیگه ای خطا هست که به نظرم با حل شدن این خطا همگی با هم رفع شن.
و سوال اینه که برای رزبری از یه آرم کورتکس A استفاده شده، اما این کامپایلر داخل توضیحاتش چیزی در مورد اینکه میتونه کد روبرای این سری هم کامپایل کنه نگفته! پس چطور میتونه این کارو انجام بده!؟
متن داخل صفحه ی دانلود:
The toolchains support Arm Cortex-M0, Cortex-M0+, Cortex-M3, Cortex-M4, Cortex-M7, Cortex-M23, Cortex-M33, Cortex-R4, Cortex-R5, Cortex-R7, Cortex-R8 and Cortex-R52 processors.
سلام دوست عزیز ، خطای مربوطه داره میگه که GPIO_GPFSEL4 ماکرو تعریف نشده ، احتمالا فایل رو include نکردید یا در مسیری نیست که کامپایلر ببیندش ، مشکل احتمالا از آدرس دهی است.
در خصوص کامپایلر و توانایی کامپایل برای Cortex-A باید بگم که اگر به معماری و ساختار ARM نگاه کنید ، فارغ از نام گذاری Cortex-x ، هر ساختاری یک ورژن از این پردازنده رو استفاده می کنه ، به عنوان نمونه هسته های Cortex-M از ورژن ARMv7 و ARMv6 استفاده می کنه و Cortex-R عموما از ARMv7 استفاده میکنه ، خانواده Cortex-A هم از ARMv7 استفاده میکنه !
البته ARMv7 با اون آرم هفت (مثل پردازنده های LPC2368) که در اصل ARM-TDMI هست فرق میکنه و پردازنده ARM-TDMI در واقع ARMv4 هست. باری به هر جهت ، وقتی هسته ها یک ورژن باشند دیگه فرقی نمیکنه ، و کامپایلر قادر به تولید ماشین کد مناسب برای اون معماری خواهد بود.
برای اصلاعات بیشتر در خصوص ورژن های ARM به صفحه List of ARM microarchitectures مراجعه کنید.
سلام
تشکر از مطلب فوق العاده تون اتفاقا دنبالش بودم که با ناامیدی از منابع فارسی سرچ کردم و اومد خیلی خوشحال شدم! به اندازه یکی دو هفته کارم رو جلو انداختید ممنون! 🙂
من الان دارم برای برد nano pi m1 همچین کاری میکنم! برنامه اش رو نوشتم (به کمک دیتاشیت و…)
ولی نمیدونم فرایند بوت شدن توی Nano PI چطوریه! 🙁
شما درباره بوت شدن توی Nani PI M1 اطلاعی دارید؟!
چجوری میتونم برنامه ای که نوشتم رو اجرا کنم؟!
با تشکر
خواهش میکنم دوست عزیز ، خیلی خوشحالم که این مطالب مورد استقبال دوستان قرار گرده
ببینید در خصوص برد مورد نظر شما ، اطلاع چندانی ندارم ، ولی معمولا تمام سیستم های Soc از یک رویه پیروی میکنند ، اول دنیال یه پراتیشن بوت روی استوریج مورد نظر می گردند و از اونجا فایل های مربوطه رو لود می کنند ، پردازنده مورد استفاده شما H3 است که اتفاقا طرف دار های زیادی داره ، شاید به این پردازنده هم بپردازیم
در مورد اجرا ، ببینید فکر میکنم همین رویه که برای رزبری پای در پیش گرفتیم رو پیش برید با این تفاوت که احتمالا باید نوع کامپایل رو با توجه به پردازنده تغییر بدید.
سلام.
خیلی عالی بود!
دستتون درد نکنه….
منتظر قسمت بعدی هستیم…..
سلام.
متشکرم ، دوست عزیز ، خوشحالم که مطلب مورد توجه شما قرار گرفته است
قسمت چهارم آموزش آماده و منتشره شده است
برای مشاهده می توانید بر روی این لینک کلیک کنید.
سلام قسمت بعدی کی میاد؟
به زودی منتشر میشه
در حال آماده سازی مطلب هستیم
ممنون از مطالب مفید سایتتون. وقتی میبینم یه سایت ایرانی هم میتونه خوب توضیح بده و ترجمه کنه خوشحال میشم. فقط سعی کنید مخصوصا تو این پست حجم مطالب قسمت های بعدی رو افزایش بدید تا از زیاد شدن قسمت ها و سردرگمی ها کم بشه باتشکر.
خواهش میکنم دوست عزیز
باعث افتخاره اگر توانسته باشیم نظر کاربران را جلب کنیم.
در انتشار آموزش ها سعی میکنیم تا جای ممکن مطالب مفید باشند و در انتهای هر بخش به پایان کلی برسیم که باعث سردرگمی کاربران نشود
متشکرم از نظر سازنده شما. حضور کاربرانی مثل شما باعث دلگرمی ما برای ادامه فعالیت میشه.