ARM, Cute, RTOS, توصیه شده, مقاله

آموزش RTOS قسمت سوم : درک عملکرد CPU

آموزش RTOS بخش سوم

با توجه به زمان زیادی که از انتشار دو قسمت قبل آموزش RTOS گذشته است، توصیه می‌کنم قسمت های قبل مقاله رو بخوانید حتی به شکل مرور تیتروار ( آشنایی با مفهوم چندوظیفه‌گی)! در قسمت قبلی همونطور که از عنوان نوشته بر می‌آید، توضیح دادیم که چند وظیفه‌گی چطور می‌تواند توی خرد کردن یک پروژه بزرگ به بخش‌های کوچک به ما کمک کنه و چطور میتواند با مدیریت منابع باعث سادگی در ساختار کد شود، اما سوال اساسی که مطرح می‌شود این است که چطور باید چند وظیفه مختلف را به یک پردازنده (CPU) بسپاریم؟ مگر این نیست که تمام پردازنده‌ها تنها یک نقطه شروع بعد از ریست دارند پس چطور می‌توان چند کار مختلف را به یک پردازنده سپرد! در این قسمت مقاله سعی می‌کنیم به این سوال کلیدی پاسخ بدهیم، با سیسوگ همراه باشید.

آشنایی با ساختار CPU

 

ساختار cpu

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

همانطور که احتمالا می‌دانید cpu برای این که بتواند دستورات را اجرا کند لازم است آنها را از محلی بخواند، بسته به ساختار سخت‌افزار این محل می‌تواند حافطه RAM یا flash یا دیسک یا هر نوع حافظه دیگری باشد اما نکته‌ای که در این گفتمان وجود دارد این که است که cpu چگونه می‌تواند بفهمد تا کجای برنامه را خوانده است؟

 

رجیستر PC

رجیستر PC در cpu

برای این کار رجیستر منحصر بفردی در cpu وجود دارد که وظیفه آن شمارش دستورات خوانده شده است یا به صورت دقیق‌تر وظیفه آن نگهداری آدرسی است که قرار است دستور بعدی از آنجا خوانده شود. احتمالا شنیده باشید که فلان cpu قادر به آدرس‌دهی فلان مقدار حافظه است، این گفته دقیقا اشاره به تعداد بیت‌های در نظر گرفته شده برای این رجیستر دارد. برای مثال وقتی می‌گوییم که میکروکنترلر AVR قادر به آدرس دهی ۶۴ کیلو بایت حافظه است یعنی رجیستر شمارنده برنامه ۱۶ بیت است و یا وقتی می‌گوییم که میکروکنترلر ARM قادر به آدرس‌دهی ۴ گیگابایت حافظه است یعنی طول این رجیستر در این مدل میکروکنترلر ۳۲ بیت است (البته با ملاحظاتی که بعدا به آن اشاره خواهیم کرد).

احتمالا حدس زده‌اید که اسم اختصاری این رجیستر PC است به معنی program counter و احتمالا به وفور با آن در عکس‌ها و شماتیکال‌های CPU برخورد کرده باشید.

عملکرد PC در CPU

بعد از ریست، این رجیستر با مقدار صفر بارگذاری می‌شود و پردازنده با مراجعه به آدرس صفر حافظه (دقت داشته باشید این آدرس میتواند مقدار دیگری هم باشد) سعی در واکشی و اجرای دستورات اسمبلی دارد. بعد از واکشی و اجرای اولین دستور مقدار این رجیستر اضافه می‌شود تا دستور بعد را اجرا کند این روند تا وقتی که رجیستر سر‌ریز کند ادامه پیدا می‌کند.

اما چرا برنامه‌های کوچک‌تر از مقدار آدرس‌دهی PC می‌توانند به خوبی و بدون مشکل اجرا شوند؟ بگذارید کمی واضح‌تر سوال را مطرح کنیم. فرض کنید برنامه چشمک‌زن در میکروکنترلر AVR نیاز به ۲۰ دستور اسمبلی دارد در حالی که PC برای سر‌ریز شدن باید ۶۴ هزار دستور را اجرا کند! پس چه می‌شود که برنامه‌های کوچک بدون مشکل اجرا می‌شوند‌؟

جواب سوال ساده است ، دستوراتی وجود دارند که می‌توانند مقدار PC را برنامه‌ریزی و طی برقرار بودن یا نبودن شرایط خاصی، آدرس دلخواهی را در آن بارگذاری کنند. این دقیقا همان اتفاقی است که در هنگام استفاده از شرط ها در برنامه نویسی می‌افتد یا هنگام صدا زدن یک فانکشن خاص.

 

رجیستر Link

لینک رجیستر در cpu

همانطور که در بخش قبل گفتیم دستوراتی وجود دارند که قادر هستند کنترل برنامه (PC) رو به آدرس دیگری منتقل کنند، وجود این دستورات برای پیاده سازی ساختار های شرطی، اساسی و لازم هستند اما فکر کنید قصد داشته باشیم در برنامه یک تابع را فراخوانی کنیم! اکنون چکار باید کرد؟

اگر از دستورات شرطی معمولی استفاده کنیم کنترل برنامه به محل تابع منتقل می‌شود و بعد از این که دستورات تابع اجرا شد باید به آدرس قبلی برگردد اما چطور این اتفاق می‌افتد؟ در استفاده از دستورات پرش شرطی این اتفاق نمی افتد! چرا که آدرس جاری برنامه در جایی ذخیره نمی‌شود. اما دستورهایی وجود دارند که هنگام پرش، آدرس جاری را در رجیستری تحت عنوان رجیستر LINK ذخیره می‌کنند تا بعد از اتمام کار تابع این آدرس در رجیستر PC قرار بگیرد و کنترل برنامه به محل قبل باز گردانده شود (منظور یک دستور بعد از آدرس پرش است).

رجیستر لینک بعد از رجیستر PC یکی از کلیدی‌ترین رجیسترهای هر پردازنده‌ای است چرا که برنامه‌نویسی به شکل زیر برنامه را در اختیار ما قرار می‌دهد و همه خوب میدانیم که این شکل از برنامه نویسی چقدر می‌تواند برنامه نویسی را ساده کند.

 

رجیستر SP

رجیستر استک پوینتر در cpu

بعد از رجیسترهای PC و Link یکی دیگر از رجیسترهای مهم CPU رجیستر SP که مخفف stack pointer است. کار این رجیستر در واقع نگه‌داری آدرس stack است. اما استک چیست و به چه دردی میخورد ؟ استک داخل ram پردازنده تعریف می‌شود و کار آن این است که متغییرهای محلی را در خودش ذخیره کند! خوب این یعنی چی! وقتی شما تابعی مینویسید و داخل تابع یک متغییر ایجاد می‌کنید، چون متغییر قرار نیست در دسترس همه قرار بگیرد و احتمالا چون بعد از اتمام تابع باید ازبین برود! به جای این که داخل رم اصلی قرار بگیرد، داخل استک قرار می‌گیرد! یا فرض کنید وقتی تابعی را داخل تایع دیگری صدا می‌زنیم چطور باید آدرس برگشت را ذخیره کنیم؟ مگر نه این که تنها یک رجیستر LINK وجود دارد؟! قبل از صدا زدن تابع جدید میتوانیم مقدار رجیستر لینک را داخل استک ذخیره کنیم! و به این شکل موقع برگشت از تابعی که صدا زده ایم مقدار رجیستر LINK را بازیابی کنیم.

تمام توضیحات بالا مربوط به استک بود، و اما رجیستر sp رجیستری است داخل cpu که به محل استک اشاره می‌کند. تنها نکته ای که باید به آن توجه داشت این است که با اضافه شدن مقدار استک مقدار sp کاهش پیدا می‌کند 🙂

چرا که همیشه استک از انتهای رم شروع به پرشدن می‎کند. برای همین آدرس آن باید با ذخیره متغییر داخل آن کاهش پیدا کند. در مورد استک احتمالا در قسمت‌های آینده بیشتر صحبت خواهیم کرد چرا که یکی از مفاهیم مهم برنامه‌نویسی است و البته برای مدیریت وظیفه‌ها در سیستم عامل زیاد با آن سر و کار پیدا خواهیم کرد.

 

رجیستر وضعیت

این رجیسترها معمولا برای انجام پرش‌های شرطی و پردازش حالت‌های خاص مورد استفاده قرار می‌گیرند! و با استفاده از آنها قادر به پیاده‌سازی انواع شرط‌های پیچیده هستیم البته در محاسبات ریاضی نیز می‌توانند کاربرد داشته باشند که زیاد مورد بحث ما نیست.

 

رجیسترهای عمومی

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

 

با توجه به اینکه رجیستر های موجود در میکروکنترلر های ARM و البته مدیریت آنها در مقایسه با پردازنده های جنرال متفاوت است در قسمت بعد به بررسی رجیسترهای Cortex-M3 و حالت‌های خاص آنها خواهیم پرداخت.


انتشار مطالب با ذکر نام و آدرس وب سایت سیسوگ، بلامانع است.

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

 

نوشته های مشابه

14 دیدگاه در “آموزش RTOS قسمت سوم : درک عملکرد CPU

  1. امیر گفت:

    لطفا سریعتر وارد قسمت rtos بشید
    ساختار cpu رو اجمالی تر توضیح بدین بهتره
    ممنون از آموزش این بخش و مطالب جالبی که در اختیارمون میذارید

    1. زئوس Zeus زئوس Zeus گفت:

      سلام و درود دوست عزیز
      در واقع توی این مقالات ما قصد داریم که یک RTOS از صفر برنامه نویسی کنیم برای این که قادر باشیم چنین کاری رو انجام بدیم لازم داریم که عملکرد CPU رو با جزییاتش بدونیم.

  2. علی گفت:

    سلام ممنون از زحماتتون بابت مطرح کردن چنین مباحثی.
    بی صبرانه منتظر قسمت های بعدی هستم.
    ازتون خواهش دارم که سریعتر قسمت های بعدی رو هم بنویسید و ما رو خیلی چشم انتظار نگه ندارید . بازم ممنون.

    1. زئوس Zeus زئوس Zeus گفت:

      سلام دوست عزیز – خواهش میکنم
      انشالله سعی میکنم زودتر منتشر کنم.

  3. noorsun0035 گفت:

    سلام جناب مهندس
    خیلی عالی است. امیدوارم که این مبحث پیوسته ادامه داشته باشد.

    1. زئوس Zeus زئوس Zeus گفت:

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

  4. کامران گفت:

    واقعا هیجان دارم ببینم که در قسمت ها بعد چه اتفاقی می افته

    1. زئوس Zeus زئوس Zeus گفت:

      متشکر از لطف شما 🙂

  5. Akam گفت:

    بسیار عالی
    مشتاقانه منتظر قسمت های بعدی هستم😀

    1. زئوس Zeus زئوس Zeus گفت:

      سلام و درود
      خواهش میکنم دوست عزیز انشالله بتونم منظم تر ادامه بدم این آموزش رو

    1. زئوس Zeus زئوس Zeus گفت:

      بله واقعا بعد از مدت ها …

  6. Hossein.M حسین گفت:

    جای خالی این چنین بحث ها در سایت های داخلی خیلی احساس میشه. امیدوارم همینطور با قدرت ادامه بدید.
    ممنون از وقتی که میذارید و این مقالات رو تهیه می کنید.

    1. زئوس Zeus زئوس Zeus گفت:

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

پاسخی بگذارید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *