مقایسه کتابخانه HAL و CMSIS

مقدمه:

با توجه به نیاز روز افزون برنامه نویسان میکروکنترلر ARM به هر چه سریعتر پیش بردن اهداف خود و همین طور نتیجه گرفتن از پروژه خود در کم ترین زمان ممکن ، دست به استفاده از کدهای شخص ثالث می زنند. لذا  کمپانی ARM کتابخانه CMSIS که مخفف  Cortex Microcontroller Software Interface Standard را روانه بازار کرده است  که اجازه برنامه نویسی با سرعت بیشتر را در صنعت می دهد .

مقایسه:

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

میکروکنترلر STM32

  آموزش نرم افزار STM32 Cube MX

 

CMSIS چیست؟

با معرفی نسل اول Cortex های سری “M” واژه CMSIS  که مخفف Cortex Microcontroller Software Interface Standard است نیز به گوش می رسید. این تکنیک به منظور نزدیک تر کردن برنامه نویسی میکرو کنترلرها به یکدیگر به کار گرفته شد.

یکی از مشکلاتی که در میکروکنترلر های با هسته ARM به چشم می خورد تغییرات زیاد بین سری های مختلف بود. این تغییرات کاربران قدیمی میکروکنترلر ها نظیر کسانی که با PIC و AVR ها کار می کردند و کاربران جدید که به عنوان اولین بار با میکروکنترلر ARM آشنا شده بودند را آزار می داد؛ چرا که در هر میکروکنترلر رجیسترها تغییر می کرد و کار با امکانات قبلی که کاربران آموخته بودند دشوار می شد و نیازمند مطالعه مجدد بود. این مشکل در نگاه اول دو راه حل داشت یکی یکسان سازی رجیسترهای میکروکنترلرهای جدید و راه دیگر ارائه یک لایه نرم افزاری برای یکسان سازی برنامه نویسی. بدلیل این که تغییرات سخت افزاری به مراتب کاری سخت تر نسبت به تغییرات نرم افزاری است شرکت ARM تصمیم به ارائه راه حل لایه نرم افزاری گرفت. در طراحی نسل های جدید پردازنده های ARM یعنی سری Cortex ها سازندگان میکروکنترلرها همراه برگه های اطلاعاتی درایور هایی نیز ارائه می کنند که لایه سطح بالای آن ها یعنی توابع و دستوراتی که کاربران به آن ها نیاز دارند یکسان است و تفاوت در لایه های سطح پایین یعنی در دسترسی های رجیستری است که معمولا کاربران به آن ها یا نیاز ندارند و یا در موارد خاصی به آن ها نیاز پیدا می کنند.

به این درایورها و سایرفایل هایی که از سوی شرکت های سازنده میکروکنترلر ارائه می گردد CMSIS می گویند.

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

دیگر مزیت استفاده از توابع CMSIS کاهش تغییرات نرم افزاری در زمان تغییرات سخت افزاری می باشد. به این معنی که کاربران میکروکنترلر های ARM می توانند چیپ های خود را تغییر دهند و تغییرات کمی از نظر نرم افزاری داشته باشند ،البته بدیهی است که این عمل به شرطی امکان پذیر است که چیپ تغییر یافته امکانات چیپ قبلی را پوشش دهد.

به بیان ساده با استفاده از دستورات رجیستر خود میکروکنترلر می توان قسمت های مختلف میکرو را راه اندازی کرد ، ولی با استفاده از کتابخانه های CMSIS دیگر نیازی به وارد کردن تک به تک رجیسترها در مدهای مختلف نبوده و فقط دستورات اجرایی آن مد را بر حسب نوع دستور مورد استفاده در کتابخانه CMSIS فراخوانی و اجرا می کنیم.

CMSIS ها به طور کلی به هفت دسته تقسیم می شوند که هر کدام را به طور مختصر شرح می دهیم.

 

  • CMSIS-CORE : این دسته واسط بین پردازنده سری Cortex-M و امکانات جانبی میکروکنترلر می باشد. در واقع قسمت core حداقل توابع و ماکرو ها رو برای دسترسی به رجیستر ها کلیدی CPU فراهم می کند . همچنین این قسمت یک تابع برای پیکربندی ساختار کلاک و اسیلاتور معرفی می کند پس زمانی که شما به تابع main() رسیدید میکرو آماده به کار است . در نهایت این قسمت اسم های رجیستر های هر پریفرال را استاندارد می کند .
  • CMSIS-DRIVER : این دسته از CMSIS ها دریوار و راه اندازهای امکانات جانبی را شامل می شوند. این گروه امکان برقراری ارتباط با لایه میانی(میان افزار) را ممکن و استفاده از آن ها را ساده تر می کنند.
  • CMSIS-DSP : این کتابخانه بیش از ۶۰ تابع که برای عملیات روی دیتا های مختلف (اعداد ثابت و اعداد اعشاری با یک رقم اعشار) را جمع آوری کرده است.
  • CMSIS-RTOS API : واسط رایج برای سیستم هایی با عملیات های Real-Time می باشد. این دسته واسط نرم افزاری استانداردی را ارائه می کند که بسیاری از سیستم های RTOS را قادر به پرتابل شدن می کند ،در نتیجه سیستم را قادر می سازد از  قالب های نرم افزاری، لایه میانی(میان افزار)،کتابخانه ها و سایر قطعات که سیستم عامل RTOS پشتیبانی می کند استفاده کند.

  • CMSIS-PACK : این دسته توضیحاتی را به کاربر در مورد اجزای مرتبط به قطعه می دهد، این پک شامل سورس،هدر، کتابخانه ها، مقاله های مورد نیاز،الگوریتم های پروگرام کردن حافظه فلش،نمونه کدها و پروژه های نمونه می باشد. ابزارات توسعه و وب سایت ها از این فایل که با نام PDSC شناخته می شوند، برای استخراج پارامتر های قطعات،اجزای نرم افزاری و ساختار برد های آموزشی استفاده می کنند.
  • CMSIS-SVD : سیستم توضیح و توصیف امکانات جانبی می باشد. امکانات جانبی یک قطعه را توصیف می کند و می تواند برای دریافت اطلاعات از یک بخش قطعه(یکی از امکانات قطعه) در دیباگر ها و هدر فایل ها مورد استفاده قرار گیرد.
  • CMSIS-DAP : دسترسی به پورت دیباگ (Debug Access Port). یک FirmWare استاندارد برای اتصال به بخش دیباگ و اشکال زدایی می باشد و به پورت دسترسی به واحد اشکال زدایی هسته (CoreSight) متصل می شود.
منبع: ntaco.ir

HAL چیست؟

شرکت STMicroelectonics یکی از شرکت های مطرح تولید کننده میکروکنترلر است که با خرید این مجوز، محصولات ۳۲ بیتی خود را در غالبی نام STM32 عرضه می کند. امکانات زیاد موجود بر روی میکروکنترلرهای ARM از یک طرف دست طراح را در سخت افزار باز کرده است اما از طرف دیگر استفاده از این امکانات نیازمند دانش و زمان طراحی زیاد است. از این رو کمپانی های مختلف تولید کننده میکروکنترلر ARM کتابخانه ها ی استانداردی برای محصولات خود منتشر می کنند که طراح را در این زمینه یاری کنند. کتابخانه هایی مانند CMSIS از شرکت ARM و SPL از شرکت ST نمونه هایی از این کتابخانه هاست.

کمپانی STMicroelectronics یک قدم فراتر رفته و پس از انتشار کتابخانه SPL اقدام به توسعه نرم افزاری با نام STM32Cube نموده است. این نرم افزار قادر به ساخت پروژه، کانفیگ کردن Pripheral ها، راه اندازی و مدیریت آنهاست. کد تولید شده در خروجی این نرم افزار تحت لایه ای با نام HAL در اختیار کاربر قرار می گیرد که امکاناتی بیش از یک کتابخانه معمولی را عرضه می کند.

شرکت STMicroelectronics این نرم افزار را جهت تسهیل کدنویسی میکروهای STM32 عرضه کرده است. نرم افزار شامل یک محیط گرافیکی به منظور انجام موارد زیر است:

  • انتخاب میکروکنترلر یا برد میکروکنترلری
  • فعال یا غیر فعال کردن Peripheral ها
  • کانفیگ کردن Peripheral فعال شده
  • تنظیم کلاک واحدهای مختلف
  • تنظیم مصرف توان تراشه
  • انتخاب منبع کلاک میکروکنترلر
  • انتخاب درگاه پروگرام در میکروکنترلر

کارایی نرم افزار Cube برای راه اندازی مد های مختلف میکرو STM32 با کتابخانه HAL

کلمه HAL مخفف عبارت Hardware Abstraction Layer است و همان گونه که از نامش پیداست لایه ای است که کاربر را از سخت افزار جداکرده و به عنوان یک واسط خواسته های کاربر را روی سخت افزار اعمال می کند. توجه داشته باشید که این مفهوم را با مفهومی مانند سیستم عامل اشتباه نگیرید چرا که سیستم عامل مدیریت منابع سخت افزاری را در اختیار گرفته و با توجه به تفسیر خود این منابع را به برنامه های در حال اجرا تخصیص می دهد حال آنکه لایه HAL آنچه کاربر خواسته را مستقیما اجرا می کند و با دارا بودن تعداد زیادی کتابخانه از پیش نوشته شده تنها زحمت کدنویسی کاربر را کاهش می دهد و از حدود اختیارات کاربر بر منابع سخت افزاری نمی کاهد.

لایه HAL در واقع از تعداد زیادی API تشکیل شده است. اصطلاح API (Application Programing Interface) در برنامه نویسی به قطعه کدهایی اطلاق می شود که ارتباط یک نرم افزار را با سطوح بالاتر امکان پذیر می سازند. مثلا ارتباط یک کاربر با یک شبکه اجتماعی از طریق API هایی که برای این منظور نوشته شده اند میسر می شود.  لایه HAL با لایه های بالاتر از خود ارتباط دارد. این لایه های بالاتر از آنچه در رجیسترها و لایه سخت افزار می گذرد بی اطلاع هستند و تنها با API هایی که HAL در اختیار آنها قرار می دهد کار می کنند. به عنوان مثال STM32F1xx_hal_usart.c یک API است که کاربر به عنوان لایه بالاتر، از توابع و ماکروهای موجود در آن برای ارتباط با واحد USART استفاده می کند.

برای ارتباط با هر مد کارکرد Pripheral ها در HAL یک ماژول  نوشته شده است. برای درک بهتر موضوع ابتدا باید مفهوم ماژول و مفهوم مد کارکرد Pripheral را مرور کنیم. در برنامه نویسی Embeded ماژول قطعه کدی است که امکان تنظیم ویژگی ها و کنترل یک واحد سخت افزاری را به زبان سطح بالا در اختیار کاربر قرار می دهد. مد کارکرد Pripheral به این معناست که یک Pripheral ممکن است در چند مد مختلف به کارگرفته شود. به عنوان مثال واحد USART در میکروکنترلر STM32F1XX ممکن است در مد USART، UART، IrDA و یا Smart Card تنظیم شود. به هریک از این حالات یک مد کارکرد گفته می شود. اصطلاحا لایه HAL را نه یک محیط IP Oriented بلکه یک محیط Feature Oriented می نامند. در یک محیط IP Oriented  برای هر Preipheral یک ماژول وجود دارد مثلا ماژول USART1 و ماژول USART2. اما در محیط Feature Oriented برای هر ویژگی(یا مد کارکرد) یک ماژول قرار داده می شود مانند ماژول USART و ماژول UART.

اگر دو واحد USART باید استفاده شود از روی ماژول USART دو نمونه (Instance) ساخته می شود و هر واحد USART با یکی از این instance ها ارتباط برقرار می کند. توجه داشته باشید هر instance از یک ماژول باید از منابع سخت افزاری مجزا استفاده کند تا امکان استفاده همزمان از دو instance مانند USART1 و USART2 ایجاد شود. البته این موضوع در ساختار لایه HAL رعایت شده و کاربر نگرانی در این مورد نخواهد داشت. این ویژگی را اصطلاحا Multi-instance گویند.

 یکی از ویژگی های منحصر به فرد لایه HAL امکان Run Time Checking برای یافتن خطاست. روند کار به این صورت است که ورودی هر تابع در لحظه مقدار گرفتن، چک شده و در صورتی که خارج از رنج تعریف شده برای آن تابع باشد تابع assert_failed فراخوانی شده شده و نام فایل و شماره خط کد تابعی که ورودی نادرست دارد نمایش داده می شود. این ویژگی در تمامی توابعی که پارامتر ورودی دارند لحاظ شده و توسط ماکروی assert_param تحقق داده می شود. توجه به این نکته ضروری است این ویژگی، حجم کد تولید شده را بالا برده و سرعت اجرای برنامه را می کاهد بنابراین توصیه می شود هنگام توسعه کد توسط طراح برای عیب یابی راحت نرم افزار استفاده شده و پس از نهایی شدن برنامه غیر فعال شود.

نرم افزار STM32Cube به صورت گرافیکی ماژول های مورد انتخاب طراح را به برنامه اضافه کرده و سایر موارد مورد نیاز اجرا شدن کد را تولید می کند. طراح فقط بر روی برنامه خود تمرکز کرده و کارهای جانبی مانند Config و Initial را به عهده Cube می گذارد.

با بیان ساده کتابخانه HAL کامل شده کتابخانه CMSIS است و بهترین روش برای ایجاد کتابخانه HAL استفاده از نرم افزار STM32 Cube MX مخصوص میکروکنترلر STM32 است. البته می توان کتابخانه CMSIS نیز برای میکرو STM32 استفاده کرد و همچنین همانند کتابخانه CMSIS می توان کتابخانه HAL را که توسط برنامه نویس دیگری ایجاد شده است نیز به پروزه خود اضافه کرد.

آموزش کتابخانه HAL در STM32

تصویر زیر نمونه ای از پروژه ایجاد شده توسط نرم افزار STM32 Cube MX و معرفی پایه های ورودی و خروجی توسط توابع HAL در نرم افزار IAR را مشاهده می کنید.

برای آشنایی بیشتر با کتابخانه HAL به لینک زیر مراجعه کنید.

آموزش تصویری