Slide
Slide

آموزش نرم افزار Keil - زبان اسمبلی
نویسنده: مسئول فنی در
۰۱ اسفند ۱۳۹۵
[ آخرین به روزرسانی در ۰۲ اسفند ۱۳۹۵ ]

در این بخش با نرم افزار Keil با تکیه بر نوشتن برنامه به زبان اسمبلی آشنا خواهید شد.

آموزش نرم افزار Keil 

ابتدا با بخش های مورد نیاز نوار ابزار آشنا می شویم.
نوار ابزار نرم افزار Keil  مشابه غالب نرم افزاری های برنامه نویسی است . ما در اینجا بیشتر در مورد بخش های مورد نیاز و متمایز آن میپردازیم.Keil Tool Bar

 در زیر بخش File منوی مقابل را می بینیم :Keil File Menu

در منوی File تنها دو مورد ممکن است نظر شما را جلب کند. مورد Device Database و License Management را برایتان توضیح می دهم.

-          Device Database همانطور که از نامش پیدا است، لیست میکروکنترلرهایی که نرم افزار شما پوشش می دهد را در بر دارد، با زدن روی این مورد، پنجره Device Database باز می شود و لیست کارخانجات سازنده میکرو در بخش چپ نمایان می شود. برای راحتی و سرعت بیشتر بهتر است به جای چرخیدن در لیست سازنده ها و بعد در لیست میکروهای هر سازنده، در بخش search مشابه شکل زیر نام میکروکنترلر مورد نظر خود را وارد کنید. در این صورت سازنده، نام  قطعه و پک خانواده آن خواهد آمد.

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

Keil Device Database

 -          License Management  با زدن روی این مورد پنجره زیر باز می شود و مجوزهای نصب شده را نشان می دهد. چنانچه  مجوزهای لازم را نصب نکرده اید، نصب کنید.
Keil License Management

بخش های edit و View نیاز به توضیح خاصی ندارند و به سراغ بخش Project در نوار ابزار می رویم.
Keil Project Management

به کمک این بخش شما می توانید پروژه جدید ایجاد کنید و یا پروژه های قبلی را باز و یا پروژه جاری را ذخیره کنید. با امکان Export می توانید پروژه خود را در فرمت های مختلف از جمله ویرایش های قبلی Keil ذخیره کنید.
قسمت Manage این بخش که آیکون های آن را در نوار ابزار نیز می بینید، در آینده خیلی به کمک شما خواهند آمد. به خصوص بخش Run_Time Environment بسیار مفید است و به کمک آن API های لازم برای افزودن امکانات جانبی را براحتی می توانید به پروژه خود اضافه کنید و براحتی با بخش های مختلف میکروکنترلر کار کنید و به پیاده سازی پروژه خود شتاب دهید. از جالبترین بخش های آن
(Cortex Microcontroller Software Interface Standard (CMSIS است. CMSIS علیرغم اینکه برنامه نویسی شما را ساده می کند، ارتباط شما با سخت افزار از دست نمی رود. از طرف دیگر با توجه به کتابخانه های استاندارد، انتقال نرم افزار به قطعات دیگری که بر پایه Cortex-M هستند، براحتی انجام می شود. در شکل زیر نقش CMSIS را به عنوان یک لایه میانی بین هسته میکروکنترلر و اجزاء جانبی آن و برنامه کاربردی خود را می بینید.

CMSIS قسمت سوم از نوار ابزار که می خواهم کمی در مورد آن صحبت کنم، Debug است. Debug یکی از بخش های بسیار مفید برای دانشجویان و مجریان پروژه های صنعتی است. برای دانشجویان هم جنبی آموزشی بسیار بالایی دارد و از طرف دیگر برای پیداکردن اشکال برنامه مفید است. برای مجریان پروژه بیشتر جنبه عیب یابی دارد. پس از کامپایل کردن برنامه، آن را می توانید در فضای دیباگ اجرا کنید. برای اینکار از منوی Debug و یا از نوار ابزار Start/Stop Debug Session را کلیک کنید. حال وارد فضای دیباگ می شوید و ضمن اجرای برنامه به صورت خط به خط  و یا فرم های دیگر می توانید، مقادیر رجیسترهای میکروکنترلر، متغیرها و حافظه های مختلف را ببینید.

Keil Debug Menu

همانطور که می بینید برای اجرا روش های زیر را دارید :
-          Run برای اجرای برنامه
-          Stop برای متوقف کردن برنامه
-          Step برای اجرای خط به خط و رفتن به داخل زیر برنامه ها
-          Step Over برای اجرای خط به خط و داخل زیربرنامه نرفتن، در این حالت زیربرنامه با زدن این آیکن به یکباره اجرا و داخل زیر برنامه نمی رود.
-          Step Out برای خارج شدن از داخل یک زیربرنامه
-          Run to Cursor Line برنامه از محل PC تا محل مکان نما اجرا می شود
در ادامه امکان اضافه کردن نقطه توقف و یا حذف آن آمده است.











با این مقدمه سراغ نحوه ایجاد پروژه در Keil می رویم.
1-      پس از اجرای برنامه Keil از منوی Project -> Create New Project  را انتخاب کنید، تا صفحه زیر بیاید.

Keil Create New Project
2-      حال روی کامپیوتر، یک پوشه ایجاد کنید. سعی کنید برای هر پروژه یک پوشه جداگانه داشته باشید. برای مثال من پوشه EX0 را انتخاب و نام پروژه خود را Example0 گذاشته ام. در انتها دکمه Save را بزنید.
3-      با زدن دکمه Save   صفحه زیر با عنوان Select Device for target  می آید. در واقع این صفحه از شما می خواهد که میکروکنترلر مورد نظر خود را انتخاب کنید. شما در قسمت Search نام میکروکنترلر را بطور صحیح وارد و پس از انتخاب آن دکمه Ok را بزنید.
Keil Select Device for Target
4-      با زدن دکمه Ok صفحه Manage Run-Time Environment می آید. در این صفحه زحمت زیادی برای شما کشیده اند. در واقع یکسری (Application Programming Interface (API آماده است و شما کافیست بدانید چه کار می خواهید بکنید و به چه واسط هایی نیاز دارید. حال با انتخاب API مورد نظر، از قابلیت های آن استفاده کنید. متاسفانه غالب ما نمی دانیم، چکار می خواهیم بکنیم و یا API ها را نمی شناسیم. دقیقاً مثل آدمی که داخل یک سوپر مارکت وارد شده و به او گفته اند همه چیز مجانی است و هر چه می خواهید در سبد خود گذاشته و ببرید. اگر کسی نیازهای خود را نشناسد یا با سبد خالی بیرون می آید و یا هر چه دید در سبد خود می گذارد و سنگین بار از سوپرمارکت خارج می شود. حکایت شما همین است. پس تا چیزی را نشناخته اید، انتخاب نکنید.
البته طراحان Keil زحمت زیادی کشیده اند و اگر شما چیزی را انتخاب کنید و پیش نیازهای آن را انتخاب نکنید، شما را راهنمایی و با رنگ نارنجی مشخص می کنند و یا با زدن دکمه Resolve در سبد شما قرار می دهند. ولی من مثل همیشه می گویم، سعی کنید همواره بفهمید چه می کنید.
برای برنامه نویسی اسمبلی هیچکدام از Software Component ها را انتخاب نکنید و با سبد خالی دکمه OK را بزنید. فعلا باید روی پای خودتان بایستید.
البته برای برنامه نویسی C راه دیگری را دنبال خواهیم کرد، که پس از آموزش برنامه اسمبلی خواهم گفت.
Keil Manage Run Time Environment
5-      با زدن دکمه OK صفحه خالی زیر می آید و موقع آن رسیده که اولین برنامه اسمبلی را به پروژه خود اضافه کنید.
Keil Assembly

نرم افزار برای شما یک Source Group1ایجاد کرده است. شما می توانید در همین گروه فایل های خود را ایجاد و یا اضافه کنید. البته می توانید گروه دیگری نیز ایجاد کنید.
فعلا به همین Source Group1 فایل خود را اضافه کنید. برای اینکار روی عبارت Source Group1  کلیک راست کنید. در پنجره باز شده شما می توانید یک فایل جدید و یا فایل موجود از قبل را به  Source Group1 اضافه کنید. شما می توانید یک فایل را از Source Group1 خارج کنید.

Keil Add New File

چون الان برای بار اول برنامه می نویسیم، Add New Item را انتخاب کنید. با زدن آن پنجره جدیدی باز می شود.در این پنجره نوع فایل مورد نظر خود را انتخاب کنید. این فایل Text,Header,Asm,C++,C و... می تواند باشد. در اینجا Asm را انتخاب کرده و نام آن را در قسمت Name  وارد کرده و دکمه Add را بزنید.

Keil Add New Assembly File

حال یک فایل با نام انتخابی شما و با پسوند S. باز می شود. این فایل خالی است. مطابق شکل زیر اولین برنامه اسمبلی خود را بنویسید. این برنامه دو رجیستر R0 و R1 را مقدار داده و با هم جمع و حاصل را در رجیستر R1 قرار می دهد. حال با زدن آیکن Rebuild  برنامه خود را کامپایل کنید. در صورتیکه خطا نداشته باشد، فایل اجرایی آماده و امکان پروگرام کردن میکروکنترلر فراهم است. اما از آنجایی که فعلا میکروکنترلی در کار نیست، از امکانات شبیه سازی Keil برای بررسی برنامه خود استفاده می کنیم.

Keil Simple Assembly Program

پس از کامپایل کردن برنامه از نوار ابزار Debug -> Start/Stop Debug Session را کلیک کنید. ( البته پس از آشنا شدن با آیکون ها بهتر است، برای راحتی با زدن آیکون مربوطه به هدف تان برسید.)
در صورتیکه با پیغام خطای مقابل مواجه شدید، نگران نشوید، نرم افزار به صورت پیش فرض از ارتباط ULINK برای پروگرام کردن میکروکنترلر استفاده می کند.

Keil ULINK error

برای پیش برد کارتان باید مراحل زیر را دنبال کنید:

از نوار ابزار flash -> Confige flah Tools… را انتخاب کنید، تا پنجره زیر بیاید. این بخش برای تنظیم نحوه اجرای پروژه شما است. علیرغم اینکه تنها با تنظیمات سربرگ Debug می توانیم به هدف خود برسیم، اما اجازه دهید تا با بقیه تنظیمات flash آشنا شویم.

-          در سربرگ Device قطعه مورد استفاده شما و بسته نرم افزاری مرتبط با آن مشخص می شود. در اینجا LPC1768 است.

Keil Select Device

-          در سربرگ Target  فرکانس میکرو کنترلر و محدوده آدرس حافظه flash داخلی و خارجی و حافظه RAM داخلی و خارجی مشخص می شود. این مقادیر بر اساس ساختار حافظه میکروکنترلر مشخص می شود. فعلا نیازی به تغییر این مقادیر ندارید، اما بهتر است محدوده آدرس ها را با Memory Map  در بخش ساختار حافظه میکروکنترلر LPC1768 مقایسه کنید، تا فلسفه این آدرس ها را بفهمید.

Keil Target

سربرگ سوم Output است. در اینجا نوع فایل های خروجی تولید شده توسط کامپایلر مشخص می شود. در صورت نیاز به فایل HEX آن را نیز علامت بزنید.

Keil Output File

سربرگ بعدی Debug است و لازم است برای شبیه سازی در آن تغییر داده شود. در حالت پیش فرض حالت سمت راست Use: ULINK2 انتخاب شده است و لازم است، برای شبیه سازی حالت Use Simulator در سمت چپ انتخاب شود.

Keil Use Simulator

اگر شما یک برد واقعی دارید و لازم است میکروکنترلرآن را پروگرام کنید. باید ابتدا بر اساس شکل زیر باتوجه به نوع پروگرامر خود از منوی سمت راست پروگرامر را مشخص کنید.

Keil Use ULINK JLINK

پس از انتخاب پروگرامر، برای بار اول لازم است در قسمت Setting در سربرگ Flash Download میکروکنترلر را اضافه و عملکرد Reset and Run را فعال کنید. با اینکار پس از پروگرام شدن حافظه فلش، میکروکنترلر ریست و برنامه آن اجرا می شود.

Keil Programmer Setting

پس از تنظیمات بالا مجددا به سراغ دیباگ می رویم. حال اگر پس از کامپایل کردن برنامه از نوار ابزار Debug -> Start/Stop Debug Session را کلیک کنید، به احتمال زیاد خطایی از شما نخواهد گرفت و وارد فضای آموزنده دیباگ خواهید شد.

Keil Debug Windows

همانطور که می بینید، در سمت چپ رجیسترهای عمومی و خاص میکروکنترلر، رجیسترهای وضعیت، مود عملکرد، حالت اجرا (ممتاز) و استک فعال را می بینید. در پنجره سمت راست بالا محتویات حافظه فلش دیده می شود. همانطور که می بینید چهار بایت اول برابر SP است، که خودتان تعریف کرده اید. چهار بایت دوم نیز آدرس شروع برنامه پس از ریست است، که آن را نیز شما در برنامه تعیین کرده اید. فقط بیت 0 آن در اینجا 1 است، دقت داشته باشید آدرس های بردارهای استثنا و وقفه در Cortex-M3 باید بیت صفر آن ها 1 باشد، که نشانه حالت  Thumbاست.
در اینجا برنامه شما از آدرس 00000008 شروع شده است، در این آدرس محتویات خانه حافظه که شامل Opcode و Operand دستورالعمل است آمده و در مقابل آن دستورالعمل به زبان اسمبلی مشخص است. پنجره پایین برنامه شما است.
در حالت دیباگ شما با استفاده از نوارابزار با انتخاب View-> Watch Windows می توانید متغیرهای برنامه، با انتخاب View->Watch Memory حافظه های مختلف میکرو را مشاهده کنید. البته امکانات زیادی برای مشاهده خروجی پورت ها و سریال داریم، که خودتان کم کم با آن آشنا خواهید شد.

برای برنامه نویسی اسمبلی لازم است شما با Directive های اسمبلر مورد استفاده آشنا باشید. Directive ها کلمات را هنمای زبان اسمبلی هستند و به اسمبلر در کامپایل برنامه اسمبلی کمک می کنند. توجه داشته باشید، Directive ها دستورالعمل نیستند. در زیر با چند Directive اسمبلر Keil آشنا می شویم.

-          AREA این کلمه راهنما، به اسمبلر می گوید، بعد از آن یک بخش جدید کد یا داده قرار دارد.
نحوه نگارش :    AREA sectionname {,attr}{,attr}…                                            

  • Sectionname نام اختیاری بخش جدید کد یا داده است و با حروف باید شروع شود و اگر بخواهید با عدد شروع کنید لازم است بین دو بار قرار گیرد. مثال:  |1_DataArea|
  • attr  یک یا بیشتر از خواص این بخش است که با کاما از یکدیگر جدا می شوند.
  • تعدادی از attr ها بشرح زیر هستند : CODE ، DATA ، READONLY ، READWRITE ، ALLIGN و...

-          EQU این کلمه راهنما برای برابر قرار دادن یک نام به یک عدد یا رجیستر و... به کار می رود.
نحوه نگارش :    name  EQU expr{, type}

  •  name نام اختیاری است.
  • expr  یک عدد یا رجیستر می تواند باشد.
  • Type در حالتیکه یک آدرس مطلق به عنوان expr می دهید لازم است و به صورت CODE16,CODE32,THUMB,ARM و DATA تنظیم می شود.

-          DCD  این کلمه راهنما، یک یا چند خانه ( به صورت کلمه = چهار بایت ) از حافظه را اختصاص می دهد. توجه کنید DCD برای تعریف ثابت ها بکار می رود و برای دادن مقدار اولیه است. از شکل & به جای DCD می توان استفاده کرد.
نحوه نگارش :                                      {label} DCD{U} expr{,expr}  

  • Label  نام داده ای است که شما تعریف می کنید. اگر بخواهید در خانه ای از حافظه عددی قرار دهید، نیاز به نام نیست. مانند خانه 0 حافظه که مقدار SP قرار می گیرد.
  • Expr یک مقدار عددی است.

 

-          DCB  این کلمه راهنما، یک یا چند خانه تک بایتی از حافظه را اختصاص می دهد. توجه کنید DCD برای تعریف ثابت ها بکار می رود و برای دادن مقدار اولیه است. از شکل = به جای DCB می توان استفاده کرد.

نحوه نگارش :                                      {label} DCD{U} expr{,expr}  

  • Label  نام داده ای است که شما تعریف می کنید. اگر بخواهید در خانه ای از حافظه عددی قرار دهید، نیاز به نام نیست. مانند خانه 0 حافظه که مقدار SP قرار می گیرد.
  • Expr یک مقدار عددی است.
  • Expr می تواند یک رشته کاراکتر باشد، که داخل دو عدد " قرار گرفته است.   MyName   DCB  "Abbas Laki",0

-          ENTRY  این کلمه راهنما، نقطه ورود به برنامه را مشخص می کند.
نحوه نگارش :                                      ENTRY

  • در زبان اسمبلی از کلمه راهنمای ENTRY در کد برنامه استفاده کنید.

در زبان C یا C++ از main() استفاده کنید.

-          COMMON  این کلمه راهنما، یک بخش از حافظه  با طول معین را به یک  متغیر اختصاص می دهد.
نحوه نگارش :                                      COMMON  symbol{,size{,alignment}} {[attr]}  

  • Symbol   نام داده ای است که شما تعریف می کنید.
  • Size تعداد بایتی که می خواهید برای داده رزرو کنید.
  • Alignment نحوه تراز شدن داده ها، اگر 4 باشد به صورت word تراز می شود.
  • Attr یکی از چهار حالت  PROTECTED, HIDDEN,   DYNAMIC  و INTERNAL است.

 

نظرات کاربران
مهدی :    
۰۹ ارديبهشت ۱۳۹۹
۰۹ ارديبهشت ۱۳۹۹
ممنون بسیار عالی بود


نظر بدهید

ایمیل شما پنهان می ماند.