شروع به نوشتن یک کد ساده با استفاده از قالبهای آماده کنید و کم کم آماده تست طرح روی سخت افزار بشوید.
توسعه نرم افزار خود را با ایجاد یک بسته پشتیبانی بورد (BSP) شروع میکنیم.
به طور کلی BSP ها حاوی درایورها، کتابخانهها و به طور کلی هر چیزی که به نرم افزارهای شما امکان دسترسی به قابلیتهای سخت افزار را میدهد، میباشند. در بسیاری از موارد مسئولیت ایجاد یک BSP از صفر تا صد و یا دریافت کردن آن از کاربران دیگر به عهده کاربر است. ابزار Xilinx از این منظر به کلی متفاوت است چرا که توانایی ایجاد خودکار BSP را دارا میباشد. این مزیتی عمده محسوب میشود و زمان زیادی را در فرایند توسعه نرم افزار شما صرفه جویی خواهد کرد.
۱- از منوها گزینه File > New > Board Support Package را انتخاب کنید. کلیه پیشفرضها را تأیید و بر روی Finish کلیک نمایید.
۲- پنجره تنظیمات BSP باز میشود و به شما امکان تغییر اینکه چه چیزهایی داخل BSP قرار داده شوند را میدهد. ما قصد پیچیده کردن کار را نداریم، پس لطفاً برای ادامه کار بر روی OK کلیک کنید.
۳- در زبانه Console در پایین صفحه نمایش، شما کامپایلر و ابزاری ویژه به نام Library Generator را مشاهده خواهید نمود که برای ایجاد BSP در حال کار هستند. در نهایت بعد از لحظاتی پیغام اتمام ساخت “Build Finished” را در Console خواهید دید که نشان دهنده تکمیل BSP میباشد. همین! شما حالا یک BSP تمام عیار را ایجاد کردهاید که در حالت عادی مستلزم هفتهها کار مهندسی بود. مشاهده خواهید کرد که در صفحه Project Explorer در سمت چپ صفحه نمایش یک BSP با عنوان “standalone_bsp_0” در فهرست سورسها اضافه شده است. این پروژه را با کلیک بر روی پیکان کوچکی که در سمت چپ نام آن قرار دارد باز کنید و باز کردن زیرپوشهها را تا جایی ادامه دهید که به پوشه include برسید. این پوشه را نیز باز کنید تا فهرست فایلهای هدر یا کتابخانه (h.) که نشان دهنده کلیه درایورهایی است که برای توسعه نرم افزار به آنها نیاز خواهید داشت، مشاهده نمایید.
۴- به عنوان یک نمونه از درایورهای موجود، فایل هدر xuartps.h را با دو بار کلیک روی آن باز کرده و محتوای آن را کنکاش کنید. خواهید دید که مجموعهای از توابع (فانکشنها) که به شما امکان کنترل UART را میدهند در آن تعریف شده است. نزدیک به پایین فایل توابعی را میبینید که بایتها را از/به UART دریافت/ارسال مینمایند. در این مرحله همچنین زبانه Outline را که در سمت راست صفحه واقع شده، بررسی نمایید. هنگام کار با سورس فایلهای بزرگ و پیچیده، زبانه Outline به شما این امکان را میدهد که به راحتی داخل فایل سورس جابجا شوید. به عنوان تمرین بر روی چند تا از آیتمهای موجود در زبانه Outline کلیک کنید و مشاهده کنید چطور نمایش داخل صفحه سورس کد سریعاً به همان بخش از کد شما انتقال مییابد.
۵- مشاهده میکنید که کلیه توابع اصلی اولیه موجود در فایل هدر که اصطلاحاً “function prototypes” نامیده میشوند، به همراه توضیحات تکمیلی در کد سورس C به صورت کامل تعریف شدهاند (از داخل پوشه مربوطه libsrc در BSP میتوانید به آنها دسترسی پیدا کنید). این توابع از جمله مفیدترین منابعی هستند که توسعه دهندگان نرم افزار به آن نیاز دارند، و در صرفه جویی زمان حین نوشتن کد به شما کمک بسیاری خواهد کرد.
۶- فایل هدر و کلیه پوشههای BSP را ببندید تا صفحه Project Explorer خلوت شود.
اکنون به ایجاد یک برنامه نرم افزاری ساده خواهیم پرداخت. به سنت همه مهندسین نرم افزار حرفهای، اولین برنامه ما هم عبارت “Hello World” را به UART ارسال خواهد کرد.
۷- از منوها گزینه File > New > Application Project را انتخاب نمایید.
۸- برای پروژه یک نام انتخاب کنید، مثلاً “Exercise_01”.
۹- در پایین صفحه، در فیلد Board Support Packages برای بسته پشتیبانی بورد گزینه Use existing را انتخاب و سپس از منوی کشویی آن نام BSP را که چند لحظه پیش با هم ساختیم، انتخاب کنید. بر روی Next کلیک کنید.
۱۰- در نهایت قالب Hello World را از لیست قالبهای آماده انتخاب کرده و بر روی Finish کلیک کنید.
۱۱- صفحه Project Explorer را بررسی کنید، خواهید دید که پروژه نرم افزاری جدید با نام “Exercise_01” در سمت چپ ظاهر شده است.
۱۲- با کلیک بر روی پیکان کوچکی که در سمت چپ پوشه Exercise_01 وجود دارد آن را بگسترانید تا به زیر پوشه src برسید. بر روی فایل helloworld.c دوبار کلیک کنید تا باز شود، سپس محتوای آن را بررسی نمایید. خواهید دید که کد بسیار سادهای دارد و خبری از کدهای پیچیده و عجیب و غریبی که عموماً برای راه اندازی اولیه پردازشگر به کار میرود، نیست. در واقع این کدها گم نشدهاند، بلکه به شکلی هوشمندانه توسط Xilinx به مکانی دیگر منتقل شدهاند. (بعداً میتوانید محلی که کد راه اندازی در آن پنهان شده را ببینید، ولی فعلاً فقط به من اعتماد کنید!)
۱۳- اگر بورد روشن نیست آن را روشن نمایید. کنترل کنید که LED سبز رنگ مربوط به منبع تغذیه روشن باشد.
۱۴- حالا به تنظیم ترمینال UART داخلی میپردازیم تا به وسیله آن ترافیک ورودی از بورد را رصد کنیم.
۱۵- در پایین صفحه SDK بر روی زبانه Terminal کلیک کنید تا فعال شود. اگر این زبانه فعال نیست از منوی جستجو در سمت راست و بالا صفحه نمایش که در آن عبارت Quick Access نوشته شده است عبارت Terminal را تایپ کنید و از بین گزینهها Terminal را انتخاب و آن را اجرا کنید.
۱۶- در منوی مربوط به زبانه Terminal بر روی آیکون Terminal Settings که به صورت یک جدول زرد رنگ با نوار فوقانی سبز رنگ میباشد کلیک کنید. تنظیمات ترمینال در یک پنجره پاپ-آپ کوچک نمایش داده میشود.
17- از منوی کشویی Connection Type گزینه Serial را انتخاب کنید.
۱۸- پورت COM را به یکی از پورتهای USB-UART نصب شده بر روی کامپیوتر خود تغییر دهید. ممکن است برای تشخیص اینکه کدام پورت را باید انتخاب کنید نیاز به باز کردن Device Manager از طریق Control Panel سیستم عامل ویندوز داشته باشید.
۱۹- برای فیلد Baud rate مقدار 115200، برای فیلد Data Bits مقدار 8، برای فیلد Stop bits مقدار 1 و برای هر دو فیلد Parity و Flow Control گزینه None را انتخاب کنید. سایر تنظیمات را به صورت پیشفرض رها کنید و روی OK کلیک کنید. اتصال به UART به صورت خودکار باز خواهد شد، و عبارت “CONNECTED” را در زبانه Terminal خواهید دید.
۲۰- در صفحه Project Manager بر روی پروژه Exercise_01 راست کلیک کرده و گزینه Run as > Launch on Hardware – System Debugger را انتخاب نمایید. اپلیکیشن بر روی ZedBoard دانلود خواهد شد و بر روی هسته اول پردازشگر Cortex A9 اجرا میشود. باید در پنجره ترمینال پیغام “Hello World” را رویت کنید.
در اینجا ممکن است با توجه به تنظیمات SDK از شما سؤالی در رابطه با پیکره بندی FPGA پرسیده شود. با این مضمون که پین Done غیرفعال است و FPGA پیکره بندی نشده است آیا آماده اجرای اپلیکیشن هستید؟ چون ما هیچ بخش سخت افزاری روی PL نداریم از این رو در پنجره پیغام نمایش داده شده روی Yes کلیک کنید و آن را تأیید کنید.
۲۲- تمام! مسیر درس اول طولانی بود، ولی شما توانستید یک تراشه Zynq را گرفته و از صفر تا صد برای اجرای یک اپلیکیشن نرم افزاری ساده تنظیم کنید. تبریک میگویم شما موفق شدید!
یک خط دیگر به کد اضافه کنید و در آن عبارت This is my 1st project in Zynq beginner course را روی صفحه نمایش پرینت کنید.
دستور “print” در زبان C را میتوان برای نمایش پیامهای متنی روی خروجیهای استاندارد (که در مورد کار ما UART خواهد بود) استفاده کرد. شیوه استفاده از دستور “print” به صورت زیر است:
print("Your line of text goes in here!\n\r");
برچسب ویژه “n\r\” که به STDOUT دستور میدهد تا یک تعویض سطر یا (line feed (\n را به همراه یک سر سطر یا (carriae return (\r به UART بفرستد. بنابراین برای ارسال یک خط خالی به UART میبایست از فراخوانی تابع به شکل زیر استفاده کنیم:
print("\n\r");