آموزش CMSIS (معرفی و آموزش کامل توابع CMSIS)

محتویات
پذیرش گسترده پردازنده Cortex-M در میکروکنترلرها منجر به روند رو به رشد در صنعت الکترونیک شده است. این پردازنده توسط شرکت های مختلفی برای توسعه میکروکنترلر ها استفاده میشود. یعنی شرکت ها از این پردازنده برای تولید مدل های مختلف میکروکنترلر خود استفاده میکنند. این رشد انفجاری در میکروکنترلرهای مبتنی بر Cortex-M باعث شده است که پردازنده Cortex-M به استاندارد صنعتی برای میکروکنترلر های 32 بیتی تبدیل شود.
CMSIS چیست؟

این امکان برای یک شرکت طراحی میکروکنترلر وجود دارد که پردازنده 32 بیتی اختصاصی خود را طراحی کند. با این حال، انجام این کار گران است و همچنین به اکوسیستمی از ابزارها و نرم افزارهای مقرون به صرفه برای دستیابی به پذیرش انبوه نیاز دارد. مقرون به صرفه تر است که پردازنده Cortex-M با لایسنس ARM ایجاد شود و سپس از تخصص هر شرکت برای ایجاد یک میکروکنترلر با تجهیزات جانبی نوآورانه استفاده شود.
10 ها مدل میکروکنترلر مبتنی بر Cortex-M وجود دارد. شما میتوانید رجیستر های مربوط به هر میکروکنترلر را مطالعه کنید و یاد بگیرید یا از توابع CMSIS استفاده کنید که در بین تمامی مدل های میکروکنترلر مبتنی بر پردازنده Cortex-M مشترک هستند.
در حال حاضر بیشتر از 10 شرکت میکروکنترلر ها را مبتنی بر Cortex-M طراحی میکنند. در هر دستگاه پردازنده Cortex-M یکسان است، هر سازنده سیلیکون به دنبال ارائه مجموعه ای منحصر به فرد از لوازم جانبی کاربر برای طیف معینی از کاربرد ها است.

این عوامل دوگانه منجر به ایجاد یک ابر بزرگ از میکروکنترلرهای استاندارد با تجهیزات جانبی پیچیده تر و همچنین میکروکنترلرهایی با تجهیزات جانبی معمولی مثل USART، I2C، ADC و DAC شده است. یک میکروکنترلر پیشرفته مدرن به خوبی می تواند یک کنترلر USB HostDevice، Ethernet MAC، کنترلر SDIO و رابط LCD داشته باشد.
برای راه اندازی هر کدام از این تجهیزات جانبی نیاز به ایجاد کد های طولانی برای میکروکنترلر های مختلف است. با توجه به اینکه این کار وقت بسیار زیادی را میطلبد و همچنین نیاز به مطالعه زیاد دارد، توسعه دهندگان و شرکت های فروشنده میکروکنترلر ها، CMSIS را توسعه دادند. با استفاده از توابع CMSIS میتوانید همزمان برای میکروکنترلر های مختلف به یک شکل برنامه نویسی کنید.
مشخصات CMSIS
هدف اصلی CMSIS (مخفف Cortex Microcontroller Software Interface Standard به معنی استاندارد رابط نرم افزاری میکروکنترلر کورتکس) بهبود قابلیت حمل و استفاده مجدد نرم افزار در میان میکروکنترلرها و زنجیره های ابزاری مختلف است. در حقیقت CMSIS اجازه می دهد تا نرم افزار ها از منابع مختلف به طور یکپارچه با یکدیگر ادغام شوند. پس از یادگیری CMSIS شما میتوانید به سرعت کد ها و نرم افزار ها را برای میکروکنترلر های مختلف بنویسید.
CMSIS شامل چهار مشخصه به هم پیوسته است که از توسعه کد در همه میکروکنترلرهای مبتنی بر Cortex-M پشتیبانی می کند. چهار مشخصه به شرح زیر است: CMSIS core، CMSIS RTOS، CMSIS DSP، CMSIS SVD و CMSIS DAP.

CMSIS یک لایه انتزاعی پیچیده نیست که شما را مجبور به استفاده از یک کتابخانه پیچیده و حجیم کند. CMSIS سعی نمیکند با ارائه پروفایل های استانداردی که باعث میشود لوازم جانبی سازندههای مختلف یکسان کار کنند، دستگاههای جانبی را شبیه به هم کند.
در حقیقت هسته CMSIS مقدار بسیار کمی از منابع را مصرف میکنند (حدود 1 هزار کد و فقط 4 بایت رم) و روش دسترسی شما به رجیسترهای پردازنده و میکروکنترلر Cortex-M را استاندارد می کند.
علاوه بر این، CMSIS واقعاً بر نحوه توسعه کد تأثیر نمی گذارد یا شما را مجبور به اتخاذ یک روش خاص نمی کند. CMSIS به سادگی چهارچوبی را ارائه می دهد که به شما کمک می کند کدهای شخص ثالث را ادغام کنید و از کدها در پروژه های آینده مجددا استفاده کنید. هر یک از مشخصات CMSIS چندان پیچیده نیستند و به راحتی قابل یادگیری هستند. مشخصات کامل CMSIS را می توان از آدرس www.onarm.com دانلود کرد. هر یک از مشخصات CMSIS در زنجیره ابزار MDK-ARM یکپارچه شده است و اسناد CMSIS از طریق راهنما آنلاین در دسترس است.

هسته CMSIS core
مشخصات هسته مجموعه ای از توابع و ماکروها را برای دسترسی به رجیسترهای کلیدی پردازنده Cortex-M فراهم می کند. مشخصات هسته همچنین تابعی را برای پیکربندی نوسانگر های میکروکنترلر و کلاک در کد راهاندازی تعریف میکند تا وقتی به main() رسیدید دستگاه آماده استفاده باشد. مشخصات اصلی همچنین نامگذاری رجیستر های جانبی دستگاه را استاندارد می کند.
CMSIS RTOS
مشخصات CMSIS RTOS یک API استاندارد برای RTOS فراهم می کند. این در واقع مجموعه ای از توابع پوشش است که CMSIS RTOS API را به API RTOS خاصی که شما استفاده می کنید ترجمه می کند. Keil RTX RTOS اولین RTOS بود که از CMSIS RTOS API پشتیبانی کرد و به عنوان یک پیاده سازی مرجع Open Source منتشر شد. RTX را می توان با هر دو کامپایلر GCC و IAR کامپایل کرد. این در حقیقت دارای لایسنس سه بند توزیع نرم افزار برکلی (BSD) است که امکان استفاده نامحدود از آن را در برنامه های تجاری و غیرتجاری فراهم می کند.
CMSIS DSP
Cortex-M4 یک “کنترل کننده سیگنال دیجیتال” با تعدادی پیشرفت برای پشتیبانی از الگوریتم های DSP است. توسعه یک سیستم DSP به بهترین وجه به عنوان یک “سرگرمی غیرمعمول” توصیف می شود و می تواند برای همه به جز ساده ترین سیستم ها بسیار دلهره آور باشد. برای کمک به انسان های ساده که الگوریتمهای DSP را در پروژههای Cortex-M4 و Cortex-M3 بگنجانند، CMSIS شامل یک کتابخانه DSP است که بیش از 60 مورد از متداولترین توابع ریاضی DSP را ارائه میکند. این توابع برای اجرا در Cortex-M4 بهینه شده اند اما می توانند برای اجرا در Cortex-M3 نیز کامپایل شوند.
CMSIS SVD و DAP
یکی از مشکلات کلیدی برای فروشندگان ابزار، ارائه پشتیبانی از اشکال زدایی برای دستگاه های جدید به محض عرضه آنها است. دیباگر باید پنجره های نمای محیطی را ارائه دهد که وضعیت فعلی رجیستر های محیطی میکروکنترلر را به توسعه دهنده نشان دهد. با رشد تعداد شرکت های فروشندگان Cortex-M و همچنین افزایش تعداد و پیچیدگی تجهیزات جانبی تراشه، برای هر شرکت فروشنده غیرممکن است که از همه میکروکنترلر های ممکن پشتیبانی کند.
برای غلبه بر این مانع، مشخصات اشکال زدایی CMSIS یک فایل «شرح نمایشگر سیستم» (SVD) را تعریف می کند. این فایل توسط شرکت فروشنده میکروکنترلر تهیه و نگهداری می شود و حاوی توضیحات کاملی از رجیسترهای جانبی میکروکنترلر در قالب XML می باشد. سپس این فایل توسط ابزار توسعه وارد میشود، که از آن برای ایجاد خودکار پنجرههای اشکال زدایی محیطی برای میکروکنترلر استفاده میکند. این رویکرد اجازه می دهد تا با انتشار میکروکنترلر های جدید، پشتیبانی کامل از دیباگر در دسترس باشد.

مشخصات CMSIS DAP پروتکل رابط را برای واحد اشکال زدایی سخت افزاری تعریف می کند که بین کامپیوتر میزبان و پورت دسترسی اشکال زدایی (DAP) میکروکنترلر قرار می گیرد. این به هر زنجیره ابزار نرم افزاری که از CMSIS DAP پشتیبانی می کند اجازه می دهد تا به هر واحد اشکال زدایی سخت افزاری که از CMSIS DAP نیز پشتیبانی می کند متصل شود. تعداد فزایندهای از برد های ارزیابی بسیار ارزان وجود دارد که دارای یک اشکال زدای یکپارچه هستند. اغلب این دیباگر از یک زنجیره ابزار انتخاب شده پشتیبانی می کند. با CMSIS DAP چنین بردی می تواند با هر ابزار توسعه سازگار استفاده شود. مبانی CMSIS
مشخصات هسته CMSIS مجموعه استانداردی از توابع سطح پایین، ماکروها و تعاریف رجیستر جانبی را ارائه می دهد که به کد برنامه شما اجازه می دهد به راحتی به رجیسترهای جانبی پردازنده Cortex-M و میکروکنترلر دسترسی پیدا کند. این چهارچوب باید در شروع پروژه به کد شما اضافه شود. انجام این کار در واقع بسیار آسان است زیرا توابع اصلی CMSIS بسیار جدا از زنجیره ابزار کامپایلر هستند.
داده ها در CMSIS
Thetypedefs اطمینان حاصل می کند که اندازه داده مورد انتظار برای یک کامپایلر به نوع ANSI صحیح نگاشت می شود. استفاده از تایپدفهایی مانند این، عمل خوبی است، زیرا از هرگونه ابهام در مورد اندازه متغیر جلوگیری میکند که ممکن است بین کامپایلرها متفاوت باشد، بهویژه اگر در حال انتقال کد بین معماری های پردازنده مختلف و ابزار های کامپایلر مختلف هستید.
تصویر زیر انواع داده را نشان میدهد.

نحوه دسترسی به داده تعریف شده
نحوه دسترسی به داده هایی که تعریف شده اند به شکل زیر است:
- I__ برای دسترسی به رجیستر و حافظه Read only (فقط خواندنی) است
- O__ برای دسترسی به رجیستر و حافظه Write only (فقط نوشتنی) است.
- IO__ برای دسترسی به رجیستر ها و حافظه Read & Write (خواندنی و نوشتنی) است.
استفاده از CMSIS در پروژه
عملکردهای مشترک CMSIS را می توان از طریق افزودن سه فایل در پروژه شما گنجاند. این سه فایل startup code ، system_<device>.c و main.c هستند. این فایل ها در حقیقت شامل کد های لازم برای جدول بردار استاندارد CMSIS، کد های لازم برای مقدار دهی اولیه تجهیزات جانبی و فایل های هدر مربوط به توابع و ماکرو های اصلی CMSIS هستند.
حالا موارد تصویر بالا را بررسی میکنیم و توضیح میدهیم.
- startup_<device>.s: این فایل در زمان ساخت پروژه و بعد از انتخاب میکروکنترلر ایجاد میشود. این فایل توسط کامپایلر ساخته میشود و در حقیقت جدول بردار مربوط به میکروکنترلر را شامل میشود.
- system_<device>.c: این فایل دارای توابع مربوط به زمانی است که میکروکنترلر از حالت ریست بیرون می آید و در حال مقدار دهی اولیه است. مثلا مقدار دهی کلاک، باس و …
- main.c : این فایل در حقیقت همان کدی است که برنامه نویس برای پروژه مینویسد.
نحوه دسترسی به رجیستر ها
اول از همه رجیستر های موجود در فایل system_<device>.c را بررسی میکنیم. دقت کنید که برای مثلا اگر میکروکنترلر مورد استفاده شما stm32f746 باشد، نام فایل system_stm32f7xx.c میشود. کافی است وارد این فایل شوید تا رجیستر های مربوطه را مشاهده کنید. مثلا میتوانید کلمه SPI را سرچ کنید تا به قسمت مربوط به توابع SPI برسید.
در این کد ها مشاهده میکنید که مثلا بعضی از رجیستر ها با IO__ معرفی شده اند و سپس نوع داده آنها مشخص میشود. در ادامه میبینید که نام رجیستر نوشته شده و به صورت کامنت توضیحات هر رجیستر به علاوه آدرس آفست آن ها نوشته شده است.
برای کسب اطلاعات بیشتر میتوانید فایل دیتاشیت میکروکنترلر خود و همچنین فایل های CMSIS مربوطه را بررسی کنید.