مقدمه
امروزه هستههای پردازنده ARM به عنوان رایجترین پردازنده 32 بیتی با سرعت پردازش چند مگاهرتز تا چند گیگاهرتز در طیف وسیعی از سیستمهای نهفته و قابل حمل مورد استفاده قرار میگیرند. به طوری که امروزه اغلب تلفنهای هوشمند و حتی کامپیوترهای قابل حمل از این هسته پردازشی بهره میبرند. اغلب تولیدکنندگان مطرح در ساخت پردازندهها، این نسل را در لیست تولیدات خود قرار دادهاند. توان مصرفی پایین و قدرت پردازشی بالا در کنار قیمت بسیار اندک و ابعاد کوچک این پردازندهها، باعث گردیده تا از یک سو به عنوان جایگزینی قدرتمند به جای میکروکنترلرهای رایج 8 بیتی و 16 بیتی مورد استفاده قرار گیرند و از سوی دیگر به عنوان پردازندههای قوی و کم مصرف در سیستمهای پردازشی جای خود را باز کنند. سازندگان میکروکنترلرهای ARM با گردآوردن هسته پردازشی در کنار بلوکهای جانبی مانند USB، CAN، ADC، Timer و حتی Ethernet در داخل یک تراشه، امکانات بسیار خوبی را برای این کارکرد این میکروکنترلر در سیستمهای خانگی و صنعتی مهیا نمودهاند. میکروکنترلرهای ساخته شده بر مبنای هسته ARM به قدری متنوع هستند که میتوان مناسب با هر کاربرد، از میکروکنترلری بهینهسازی شده برای آن منظور استفاده نمود. با توجه به ماهیت 32 بیتی این پردازندهها، نسخههای متعددی از سیتم عاملهای بیدرنگ بر روی آنها قابل اجراست. همچنین بستههای نرمافزاری متعددی برای پیادهسازی پروتکلهای شبکه و همچنین واسطهای گرافیکی در دسترس است. در ادامه به بررسی معماری پردازندههای ARM و ابزارهای موجود برای توسعه سیستمهای بر پایه این پردازنده ارائه میگردد.
تاریخچه
نخستین ایده استفاده از پردازندههای ARM در سال 1983 در شرکت Acorn زمانی شکل گرفت که این شرکت تصمیم به استفاده از معماری اختصاصی برای پردازندههای استفاده شده در محصولات کامپیوترهای شخصی خود گرفت. میکروپروسسورها درآن زمان بسیار کندتر از حافظههای موجود عمل میکردند و دستورات آنها به صدها سیکل جهت اجرا نیازمند بود. در آن زمان امکانات و منابع لازم برای برای طراحی یک پردازنده جدید حتی برای شرکتهای بزرگ نیز کار دشتواری محسوب میشد. دو سال قبل از آن، در دانشگاه برکلی تحقیقات گستردهای برای طراحی یک پردازنده RISC[1] با معماری ساده که کارآیی آن قابل مقایسه با پردازندههای پیچیده CISC[2] باشد شروع شده بود. شرکت Acorn با استفاده از تحقیقات انجام شده طراحی پردازنده اختصاصی خود را آغاز نمود و درسال 1985 اولین پردازنده تجاری با معماری RISC خود را به بازار با نام Acorn RISC Machine عرضه نمود. در این پردازنده بسیاری از بخشهای موجود در معماریهای پیشین که پیچیدگی سخت افزار را زیاد مینمود حذف شده بود. بنابراین معماری بسیار ساده بود و تنها با 25000 ترانزیستور قابل پیادهسازی بود. با این حال کارآیی آن قابل مقایسه با پردازنده اینتل 80286 در آن زمان بود. امروزه آن نسل از پردازنده ARM با نام ARM V1 شناخته میشود. دو سال بعد و در سال 1987 نسل دوم از پردازندههای ARM با قابلیت پشتیبانی از پردازنده کمکی[3] ارائه گردید. در سال 1990 که شرکت Apple تصمیم به استفاده از معماری ARM را در پردازندههای کامپیوترهای جیبی خود گرفت، شرکت ARM با سرمایهگذاری مشترک سه شرکت Apple ، Acorn و VLSI Technology تأسیس گردید و نسل سوم از پردازندههای ARM با هسته ARM7 که از قابلیت بخش مدیریت حافظه[4] و دستورات جمع و ضرب بهره میبرد ارائه گردید. نسل چهارم از پردازندههای ARM در سال 1996 و با پشتیبانی از دستورات فشرده شده 16 بیتی به بازار عرضه گردید. با استفاده از این دستورات، حجم کد مورد استفاده در برنامه به میزان 40 درصد کاهش پیدا میکرد اما در مقابل از کارآیی نیز کاسته میگردید.
به طور کلی از مزایای پردازندههای ARM میتوان به موارد زیر اشاره نمود:
– سرعت بالا در کنار توان مصرفی پایین
– قیمت مناسب
– تنوع گسترده محصولات
– حجم کوچک هسته پردازنده که امکان استفاده از ادوات جانبی متعدد را در کنار هسته پردازشی در یک تراشه فراهم میکند.
– سازگاری پردازندههای جدید با تراشههای قبلی که امکان اجرای کدهای نوشته شده روی یک پردازنده را بر روی پردازندههای جدید مهیا میسازد.
– در دسترس بودن ابزارهای توسعه متعدد.
نکتهای که در مورد شرکت ARM باید به آن اشاره نمود این است که این شرکت یک سازنده تراشه نیست. بلکه تنها امتیاز تولید هستههای طراحی شده را به شرکتهای تولید کننده نیمههادی واگذار مینماید. شرکتهای سازنده تراشه، با افزودن ادوات جانبی موردنظر خود، میکروکنترلرهای متنوعی را به بازرا عرضه مینمایند.
معماری ARM
تمامی پردازندههای ARM مبتنی بر معماری RISC هستند. هدف طراحان این معماری، سادگی، توان عملیاتی[5] بالا، پاسخ بیدرنگ و کم بودن توان مصرفی پردازنده است. در شکل 1-4 معماری ساده شده از هسته پردازندۀ میکروکنترلر مورد استفاده در این پروژه[6] آمده است. کلیه محاسبات انجام شده، توسط یک بانک ثبات[7] که از 16 رجیستر 32 بیتی تشکیل شده است صورت میپذیرد. برخی از رجیسترها دارای عملکرد از پیش تعریف شدهای هستند در حالیکه برخی دیگر میتوانند بعنوان عملوند و یا اشارهگر به حافظه استفاده شوند. اطلاعات 8 یا 16 بیتی خوانده شده از حافظه، قبل از آنکه در رجیسترها ذخیره شوند، به صورت خودکار به قالب 32 بیتی علامتدار تبدیل میشوند. کلیه محاسبات ریاضی و منطقی توسط رحیسترها صورت میپذیرد. قالب کلی دستورات مورد استفاده به صورت زیر است:
opcode Rd,Rn,Rm
در قالب بالا، نتیجۀ عملیات انجام شده بر روی دو رجیستر Rn و Rm در رجیستر Rd ذخیره میشود. از ویژگیهای پردازنده ARM میتوان به واحد MAC اشاره کرد که در ضرب دو رجیستر مورد استفاده قرار میگیرد و در کاربردهای پردازش سیگنال مفید واقع میشود.
[1] reduced instruction set computing
[2] complex instruction set computing
[3] coprocessor
[4] MMU- memory management unit
[5] throughput
[6] ARM Cortex-M3
[7] register bank
پردازندههای ARM دارای هفت مُد کاری شامل User، System، FIQ، Supervisor، Abort، IRQ و Undefined هستند. در حالت عادی پردازنده در مُد کاربری بوده و در حال اجرای برنامه کاربر میباشد. این حالت نسبت به دیگر حالتها از اولویت کمتری برخوردار است. در این حالت 18 رجیستر 32 بیتی در دسترس است که از این تعداد، 16 رجیستر جهت انجام محاسبات و 2 رجیستر به عنوان وضعیت مورد استفاده قرار میگیرند. در این حالت رجیسترهای r13، r14 و r15 دارای عملکرد تعیین شده هستند:
– رجیستر r13 بعنوان اشارهگر پشته[1] عمل میکند.
– رجیستر r14 به منظور نگهداری آدرس برگشت از زیربرنامه ها مورد استفاده قرار میگیرد.
– رجیستر r15 نیز بعنوان شمارنده برنامه[2] استفاده میشود.
همانگونه که اشاره شد، پردازنده ARM دارای هفت مُد کاری است. این حالتها توسط 5 بیت کم ارزش رجیستر CPSR[3] تعیین میگردد. این رجیستر عملکرد CPU را گزارش کرده و یا کنترل مینماید. چهار بیت پرارزش پرچمهایی هستند که پس از اجرای دستورالعملها بوسیلهCPU تغییر پیدا میکنند. همچنین 8 بیت کم ارزش توسط برنامه قابل کنترل هستند .
رجستر دیگری به نام SPSR در هنگام تغییر حالت کاری پردازنده، مقدار رجیستر CPSR را ذخیره مینماید. این کار مختص پردازنده ARM است. یعنی در هنگام تغییر حالت کاری – مثلا وقوع وقفه- رجیستر وضعیت ذخیره میگردد. این کار سرعت پاسخگویی به رخدادها را افزایش میدهد.
[1] stack pointer
[2] program counter
[3] current program status register
حالتهای کاری پردازنده ARM
در جدول زیر حالتهای مختلف کاری پردازنده ARM به همراه بیتهای حالت اختصاص داده شده به هرکدام در رجیستر CPSR آمده است:
Status Bits | Abbreviation | Operational Mode |
10111 | abt | abort |
10001 | fiq | fast interrupt request |
10010 | irq | interrupt request |
10011 | svc | supervisor |
11111 | sys | system |
11011 | und | undefined |
10000 | usr | user |
در زیر به معرفی مختصر هریک از این حالات کاری میپردازیم:
- User Mode: در این حالت کد کاربر اجرا میشود و بیتهای کنترلی در رجیستر CPSR قابل تغییر نیستند. در این حالت تنها در صورت وقوع یک رخداد حالت کاری پردازنده تغییر میکند.
- FIQ Mode: این حالت به منظور پاسخ دهی سریع به وقفه ها مورد استفاده قرار میگیرد.
- IRQ Mode: در این حالت از وقفههای عادی پشتیبانی میشود.
- Supervisor Mode: در این حالت امکان پشتیبانی از هسته[1] سیستم عامل وجود دارد.
- System Mode: در سیستمهای ساده که نیازی به سیستم عامل ندارد، از این حالت به منظور تغییر در بیتهای کنترلی رجیستر CPSR استفاده میگردد.
- Abort Mode: در صورتیکه دستورات و یا اطلاعات در ناحیه غیر معتبری از حافظه قرار گیرند، این رخداد صورت میپذیرد.
- Undefined Mode: اگر دستوری که از حافظه خوانده میشود، قابل بازگشایی[2] نباشد، این حالت رخ خواهد داد.
آرایش حافظه
حافظه مورد استفاده در پردازنده ARM مجموعهای از بایتهاست که به صورت تک بایتی، دو بایتی و چهار بایتی قابل دسترسی است. این اطلاعات به دو صورت زیر میتوانند مورد استفاده قرار گیرند:
– Big Endian: در این حالت پرارزشترین بایت، در کمارزشترین آدرس قرار میگیرد.
– Little Endian: در این حالت کمارزشترین بایت در کمترین آدرس قرار میگیرد.
[1] kernel
[2] decode
باسهای مورد استفاده در پردازندههای ARM
با توجه به معماری تعریف شده جهت میکروکنترلرهای پیشرفته[1]، باسهای پردازنده ARM به طور کلی به دو دسته زیر تقسیم میشوند:
– باس مورد استفاده در ادوات پیشرفته و پرسرعت سیستم[2]
– باس مورد استفاده در ادوات جانبی و کم سرعت سیستم[3]
همانطور که درشکل 5-4 دیده میشود، باس AHB به منظور اتصال پردازنده با حافظه و قطعات پرسرعت تراشه مورد استفاده قرار میگیرد. این باس دارای پهنای باند زیادی است و میتواند جهتد انتقال حجم زیادی از دادهها مورد استفاده قرار گیرد. باس APB دارای پهنای باند کمتری است و به منظور ایجاد ارتباط با ادوات جانبی بهکار میرود. یک پل[4]، به عنوان واسطه میان باس AHB و باس APB قرار گرفته است. دلیل عدم استفاده از باس AHB برای ارتباط با ادوات جانبی این است که اولا افزوده شدن ادوات جانبی به باس باعث بارگذاری بیشتر بر روی باس خواهد شد و توان مصرفی بالا خواهد رفت و کارآیی پایین میآید. ثانیا، با افزوده شدن ادوات جانبی، کارآیی باس به کندترین وسیله روی باس محدود خواهد شد.
باس AHB در موارد زیر بهکار میرود:
– ارتباط با حافظه داخلی تراشه
– ارتباط با حافظه خارجی
[1] AMBA- Advanced Microcontroller Bus Architecture
[2] AHB- Advanced High Performance Bus
[3] APB- Advanced Peripheral Bus
[4] AHB to APB Bridge
نسخههای مختلف معماری
در طی سالها، شرکت ARM توسعه پردازندههای جدید خود و بلوکهای سیستمی را ادامه داده است که این توسعه شامل پردازنده معروف و پر کاربرد ARM7TDMI و پردازنده جدید ARM1176TZ(F)-S میشود. این پردازندهها به صورت گسترده در محصولاتی مانند تلفنهای هوشمند مورد استفاده قرار گرفتهاند. در طول زمان، سیر تکاملی قابلیتها، توسعه نرمافزاری و سختافزاری پردازندهها، منجر به ارائه نسخههای پی در پی و مختلف از معماری ARM شده است. ذکر این نکته ضروری است که شماره نسخههای معماری، مستقل از اسامی پردازندهها است. به عنوان مثال پردازنده ARM7TMDI از نسخه معماری ARMv4 استفاده میکند.
پس از نسخه معماری چهارم، معماری ARMv5 با معرفی پردازنده خانواده ARM9E به بازار عرضه گردید. این معماری شامل پردازندههایی با قابلیت اجرای دستورالعملهای DSP برای کاربردهای پردازشی و چندرسانهای بود.
با ورود پردازنده ARM11، نسخه معماری ARMv6 توسعه داده شد. ویژگی جدید این معماری در توسعه ویژگیهای سیستم حافظه و همچنین پشتیبانی از دستورات SIMD[1] میباشد. با معرفی این خانواده از پردازندهها، بسیاری از تکنولوژیهای جدید مانند استفاده از مجموعه دستورالعملهای Thumb-2 تنها به بازار میکروکنترلرها محدود شود.
در سالهای گذشته، شرکت ARM محصولاتش را با ارائه CPU هایی متنوع توسعه داده است که دارای معماری نسخه هفتم و یا ARMv7 بودند. در این نسخه، ساختار و طراحی معماری به سه دسته کلی تقسیم بندی میشد:
– پرفایل A[2]: این پروفایل برای کاربردهای با کارایی بالا طراحی شده است و معمولاً در ساخت تلفنهای هوشمند و کامپیوترهای قابل خمل استفاده میشوند. این پردازندهها نیاز به اجرای برنامههای کاربردی پیچیده مانند اجرای سیستمعاملهای قدرمتندی مانند Linux، Android و Windows CE که نیاز به توان پردازشی بالا و پشتیبانی از واحد مدیریت حافظه هستند دارند.
– پروفایل R[3]: این پروفایل برای سیستمهای تعبیه شدهای که به کارآیی بلادرنگ نیاز دارند طراحی شده است. پردازندهها این گروه بلادرنگ و با کارآیی بالا هستند. این محصولات در سیستمهایی مانند ترمز پیشرفته و کنترلکنندههای هارد دیسک مورد استفاده قرار میگیرند. در این سیستمها توان پردازشی بالا، پایداری زیاد و تأخیر کم بسیار حیاتی است.
– پروفایل M[4]: برای سیستمهای میکروکنترلری با ادوات جانبی متنوع طراحی شده است. این پروفایل کاربردهای ارزان قیمت را نشانه رفته است که در آنها، کارآیی، توان پردازشی، قیمت، توان مصرفی، وقفه با تأخیر کم و سهولت در استفاده مهم و حیاتی هستند. نمونهای از این سیستمها، شامل کنترلکنندههای صنعتی بلادرنگ میباشد.
نامگذاری پردازندهها
شرکتARM از یک الگوی نامگذاری برای پردازندهها استفاده میکند. در ابتدا، پسوندها برای مشخص نمودن ویژگیها بکار گرفته میشد. مثلا در پردازنده ARM7TDMI، حروف مختلف به معنی زیر هستند:
T: پشتیبانی از دستورالعملهای Thumb
D: پشتیبانی از واسط اشکال زدایی با ارتباط JTAG
M: به استفاده از ضرب کننده سریع در این پردازنده اشاره دارد
I: این حرف استفاده از ماژول ICE را نشان میهد
بعدها، این شرکت تصمیم گرفت تا این ویژگیها به استاندارد پردازندههای ARM تبدیل شوند و دیگر در نامگذاریهای جدید از آنها استفاده نمیشود. در عوض، تغییراتی که در رابطه با حافظه، نوع و مقدار cache و حافظههای بهم وابسته[5] در طراحی ایجاد میشود، در یک الگوی جدید نامگذاری ذکر میشوند. بعنوان مثال، امروزه پردازندههای با حافظه cache و MMU با پسوندهای 26 و یا 32 مشخص میشوند، درحالیکه پردازندههای با MPU با پسوند 46 مشخص میشوند. علاوه بر این سایر پسوندها برای مشخص کردن قابلیتهایی مانند قابلیت ترکیب[6] و تکنولوژی Jazelle[7] به نامگذاریها اضافه شدهاند. البته در معماری نسخه هفتم، شرکت ARM این پیچیدگی نامگذاری را که نیاز به رمزگشایی دارد را با یک نامگذاری پایدار برای خانوادههای مختلف پردازندهها تغییر داده است. نخستین خانواده از این پردازندهها با نام Cortex شناخته میشود. پردازنده استفاده شده در این پروژه هم بر مبنای این پردازنده است. بنابراین در ادامه به طور خاص در مورد یک پردازنده از این خانواده صحبت خواهیم نمود.
[1] Single Instruction Multiple Data
[2] Application Profile
[3] Real-Time Profile
[4] Microcontroller Profile
[5] TCM- Tightly Coupled Memory
[6] Synthesizable (S)
[7] (J)
انتخاب پردازنده مناسب
با توجه به بحثهای بالا، گستره وسیعی از پردازندههای ARM با قابلیتها و کاربردهای فراوان موجود است. در این پروژه بدلیل اینکه یکی از اهداف، آشنایی با این پردازندهها بوده است، پس بهتر آن است که این آشنایی با پردازندهای با معماری جدید باشد. همچنین به علت نیاز به سختافزارهایی جانبی مانند مبدل آنالوگ به دیجیتال، واسط سریال و مبدل دیجیتال به آنالوگ، انتخاب یک میکروکنترلر با هسته ARM یکپارچگی و پیشرفت سریعتر را در پی خواهد داشت. از تولیدکنندگان نام آشنای میکروکنترلرهای ARM که سهم عمدهای از این بازار را نیز در اختیار دارند، میتوان به شرکتهای ATMEL و NXP (فیلیپس) اشاره کرد. برخی از محصولات این دو شرکت نیز در ایران موجود است. گرچه استفاده از میکروکنترلرهای 32 بیتی در ایران امری متداول نیست، ولی خوشبختانه سخت افزار مورد نیاز برای این کار، در دسترس میباشد. با توجه به توضیحات بالا، در پیاده سازی این پروژه از میکروکنترلر LPC1768 محصول شرکت NXP که از معماری به روز Cortex-M3 بهره میبرد، استفاده شده است. در ادامه، مشخصاً به بررسی این معماری و همچنین قابلیتهای میکروکنترلر مورد استفاده خواهیم پرداخت.
رویکردی به آینده
در زمان ویرایش این پایان نامه، آخرین پردازنده معرفی شده توسط ARM، پردازنده Cortex-A15 میباشد که قرار است در ساخت جدیدترین تلفنهای همراه هوشمند و رایانههی قابل حمل مورد استفاده قرار گیرد. این پردازنده قابلیت چند هستهای[1] را داراست و قادر خواهد بود تا در فرکانس 2.5 گیگاهرتز کار کند. تغییر اساسی که در معماری آخرین پردازنده در دست طراحی ARM داده شده است، این خانواده از معماری که ARMv8 نام دارد نوعی معماری 64 بیتی را به پردازنده اضافه نموده است. این معماری امکان اجرای برنامههای 32 بیتی را بر روی سیستمعامل 64 بیتی امکانپذیر میکند و همچنین اجرای سیستمعامل 32 بیتی نیز تحت نظارت یک Hypervisor 64 بیتی امکانپذیر خواهد بود.
بررسی پردازنده Cortex-M3
در این بخش به بررسی ویژگیهای پردازنده انتخاب شده برای پیاده سازی سخت افزاری پروژه میپردازیم.
بخشهای اصلی
خانواده Cortex-M3 یک میکروپروسسور 32 بیتی میباشد که دارای یک مسیر داده[2] 32 بیتی، یک بانک رجیستر[3] 32بیتی و رابطهای حافظه[4] 32 بیتی میباشد. همانطور که قبلاً نیز اشاره شد، این پردازنده بر اساس معماری هاروارد طراحی شده است. این بدین معناست که پردازنده دارای گذرگاههای جداگانه برای دادهها و دستورالعملها میباشد. معماری هاروارد اجازه میدهد تا اجرای دستورالعملها و دسترسی به دادهها در آن واحد امکانپذیر باشد. این ویژگی باعث میگردد تا پردازنده Cortex-M3 دارای رابط باس چندگانه با کاربردی بهینه و قابلیت استفاده به صورت همزمان باشد، هرچند گذرگاههای داده و دستورالعمل از یک سیستم واحد حافظه بهره میبرند. در کاربردهای پیچیدهتر که نیاز به ویژگیهای بیشتری از سیستم حافظه است، این پردازنده میتواند از واحد حفاظت حافظه[5] بهره ببرد.
[1] multicore
[2] data path
[3] register bank
[4] memory interface
[5] memory protection unit