کتابخانه SPL ، HAL یا CMSIS ؟

اغلب افراد ابتدای یادگیری کار با میکروکنترلرهای STM32 این سؤال برایشان پیش می‌آید که با کدام‌یک از کتابخانه‌های HAL ، SPL  یا CMSIS کار کنند؟ تفاوت این‌ها با یکدیگر در چیست؟ هرکدام چه مزیتی نسبت به هم دارند؟ و …. در ادامه می‌خواهیم به توضیح این مفاهیم بپردازیم.

اجازه دهید در ابتدا حساب CMSIS1 را از دو کتابخانه دیگر جدا کنیم. CMSIS یک لایه نرم‌افزاری برای سخت‌افزار پردازنده‌های کورتکس M هست که توسط بنیاد ARM تعریف‌شده و فارغ از شرکت سازنده میکروکنترلر است. به عبارتی CMSIS ارائه‌شده برای شرکتی چون ST مشابه همان CMSISای است که برای شرکت فیلیپس یا شرکت‌های دیگر ارائه شده. این یکسان بودن موجب می‌شود تا اصطلاحاً Portability برنامه نوشته شده، بالا رود. درواقع  شما به کمک CMSIS یک‌بار برای میکرویی کد می‎‌زنید و با کمترین تغییرات ممکن، می‌توانید آن را بر روی میکرویی از شرکتی دیگر انتقال دهید.   این لایه بیشتر از آنکه حاوی توابعی برای انجام کارهای مختلف با پریفرال‎‌های میکرو باشد، دارای دیفاین‎‌های (#define)  مختلف از رجیسترهای میکروکنترلر است. درنتیجه شما باید بیشتر دست‌به‌کار شوید و خودتان برای راه‌اندازی و استفاده از امکانات میکروکنترلر کد بزنید.

 اگر بخواهم به‌صورت نه‌چندان دقیقی حرف‌های بالا را خلاصه کنم، باید بگویم CMSIS تنها یکسری اسم است که بر روی آدرس رجیسترهای میکرو گذاشته‌شده تا ما بتوانیم راحت‌تر با این رجیسترها کارکنیم. اگر تاکنون به فایل‌های یک پروژه ایجادشده که در آن از کتابخانه HAL2 یا SPL3استفاده‌شده نگاهی انداخته باشید. احتمالاً در میان آن‌ها به فولدر CMSIS برخورد کرده‌اید. با تفاسیر بالا، باید بدانید که نقش CMSIS در اینجا چیست و این سؤال نباید ایجاد شود که اگر از HAL یا SPL استفاده‌شده، CMSIS در اینجا چه می‌کند؟ اگر غیرازاین است در ادامه امیدوارم موضوع برایتان شفاف‌تر شود.

ازلحاظ کلی SPL و HAL شبیه هم‌اند. هر دو دارای توابع زیادی برای کار با قسمت‌های مختلف میکروکنترلر دارند و برخلاف CMSIS صرفاً حاوی تعریف رجیسترها نیستند. بلکه از تعاریف ارائه‌شده در CMSIS، در این دو استفاده‌شده است. SPL قدیمی‌تر از کتابخانه HAL است و هر دو توسط شرکت ST توسعه داده‌شده‌اند. اما ظاهراً شرکت ST علاقه‌ای به پشتیبانی و ادامه کار بر روی SPL ندارد و درنتیجه تمرکز خود را بر روی توسعه هرچه بیشتر و بهتر HAL گذاشته است. شما هم ممکن است قبلاً با کتابخانه SPL  کارکرده باشید و همانند من، آن را بیشتر از HAL بپسندید. بااین‌وجود به نظر من بهتر است از رویه شرکت پیروی کنیم و هر چه زودتر خود را به کار با توابع HAL عادت دهیم. چراکه علاوه بر اینکه دیگر از کتابخانه SPL پشتیبانی نمی‌شود، برای میکروهای سری M7 و H7 هم این کتابخانه وجود ندارد.

بعد از انتشار کتابخانه HAL بسیاری از افراد از این گلایه داشتند که این کتابخانه پردازش را سنگین می‌کند و درون توابع خود به چیزهایی می‌پردازد که برایشان لزومی ندارد. به همین دلیل ST تصمیم گرفت در کنار این کتابخانه، کتابخانه‌ای سبک‌تر به اسم LL4 ارائه دهد که سطح پایین‌تر از HAL  باشد. این‌گونه دست افراد در برنامه‌نویسی بازتر است. هرچند که خودشان بایست نکات گفته‌شده در دیتاشیت و رفرنس منوال را رعایت کنند.  در پروژه‌های ایجادشده توسط CubeMX ما می‌توانیم صرفاً با اضافه کردن خطی برای #include این کتابخانه، در کنار کتابخانه HAL از توابع LL در قسمت‌هایی که می‌خواهیم، استفاده کنیم. اگر می‌خواهید در لایه بالاتر کد بزنید و البته کد نوشته‌شده را راحت‌تر برای میکرو دیگری از شرکت ST نیز استفاده کنید، بهتر است سراغ HAL بروید. اما اگر سرعت از اهمیت بیشتری برایتان برخوردار است و از شلوغی توابع HAL فراری هستید، بهتر است با LL برنامه خود را توسعه دهید.

پانوشت:

  1. Cortex Microcontroller Software Interface Standard
  2. Hardware Abstraction Layer
  3. Standard Peripheral Library
  4. Low Layer