اطلاعیه

Collapse
No announcement yet.

نحوه ی ارتباط سی پی یو و حافظه

Collapse
X
 
  • فیلتر
  • زمان
  • Show
Clear All
new posts

    نحوه ی ارتباط سی پی یو و حافظه

    دوستان تو میکرو ما حافظه فلش داریم و رم داریم و حالا رجیستر ها . خوب وقتی برنامه مینویسیم و کامئایلش میکنیم لینکر میآد کد ها رو توی حافظه های خودشون میریزه .
    میخواستم بدونم چطور سی پی یو میفهمه از کجا باید بخونه و فلان متغییر رو تو رم بریزه و دوباره ازش بخونه - یعنی چطور بین حافظه ها سوییچ میکنه !؟
    سوالم یکم گنگه - چون نمیدونم دقیقا چیو باید بپرسم در این مورد - اگر چیز خاصی مطلبی لینکی هست لطف کنید بفرمایید تا موضوع روشن بشه برام.
    به سمت نور خورشيد حرکت کن،تو ميتوني تابش خورشيد رو حس کني ،حتي اگه کور باشي.
    (پيش به سوي هدف)

    #2
    پاسخ : نحوه ی ارتباط سی پی یو و حافظه

    نوشته اصلی توسط hosseinam نمایش پست ها
    دوستان تو میکرو ما حافظه فلش داریم و رم داریم و حالا رجیستر ها . خوب وقتی برنامه مینویسیم و کامئایلش میکنیم لینکر میآد کد ها رو توی حافظه های خودشون میریزه .
    میخواستم بدونم چطور سی پی یو میفهمه از کجا باید بخونه و فلان متغییر رو تو رم بریزه و دوباره ازش بخونه - یعنی چطور بین حافظه ها سوییچ میکنه !؟
    سوالم یکم گنگه - چون نمیدونم دقیقا چیو باید بپرسم در این مورد - اگر چیز خاصی مطلبی لینکی هست لطف کنید بفرمایید تا موضوع روشن بشه برام.
    با سلام
    اولا توجه داشته باشین که تو هر سیستم دیجیتالی تمام فضای حافظه و رجیسترها، مپ شده هست یعنی در واقع هر بایت از هر نوع حافظه یا رجیستر یه آدرس منحصر بفرد داره، پس هر بخش حافظه یه رنج آدرس مخصوص داره که به اینصورت از سایر بخشها منفک میشه. پریفرالها هم که ارتباطشون با باس داخلی از طریق رجیسترهاست همینطور آدرسهای مشخص و انحصاری دارن. شما اگه با میکروپروسسورهای قدیمی کار کنین باید تمام این آدرس مپینگها رو خودتون بصورت دستی انجام بدین و سخت افزارباس دیتا و آدرس داخلی (اونجا خارجی!) دیکدینگ آدرس رو هم خودتون طراحی کنین تا سی پی یو قادر باشه با جهان خارج ارتباط برقرار کنه.
    توی هر میکرو بنا به نیاز و نوع طراحی یه سری بردارهای آدرس ثابت هم بطور سخت افزاری وجود داره که خارج از کنترل کاربر هستن و در صورت وقوع شرایط خاص تعریف شده که سی پی یو به اونها منتقل بشه و عملیات رو از اونجا ادامه بده و در واقع از اونجا هم میتونه به جای دیگه پاس داده بشه. ساده ترینش آدرس های استارت برنامه میکرو هست یا مثلا اگه درست یادم مونده باشه تو Z80 وقفه ی غیر قابل چشم پوشی NMI برای خودش یه آدرس ثابت داشت که در صورت وقوع PC به اونجا می پرید و در اون آدرس با توجه به شرایطی که چک می شدتصمیم گیری می شد که چه سابروتینی اجرا و چه پاسخی به وقفه داده بشه.
    وقتی شما برنامه رو کامپایل میکنین کامپایلر خودش به متغیرها بر حسب نوع و تعریفشون آدرسهای حافظه اختصاص میده و از اون به بعد متغیرها تنها با آدرسشون برای میکرو شناخته میشن و انجام هر عملیاتی با اونها بر اساس آدرس و در واقع پوینترشون انجام میشه و چون همونطور که گفتم آادرسها همیشه منحصر بفرد هستن عملا تداخلی اتفاق نمیفته و میکرو براحتی با هر آدرسی که تو برنامه باشه ارتباط برقرار و دیتا رد و بدل میکنه. در واقع تمام انواع حافظه و رجیستر هایی که ما می بینیم، از دید میکرو فقط یه آدرس هستن.
    کمترین توقع از یک فرد تحصیلکرده، دانستن املای صحیح کلمات است.

    دیدگاه


      #3
      پاسخ : نحوه ی ارتباط سی پی یو و حافظه

      نوشته اصلی توسط نو رسیده نمایش پست ها
      با سلام
      اولا توجه داشته باشین که تو هر سیستم دیجیتالی تمام فضای حافظه و رجیسترها، مپ شده هست یعنی در واقع هر بایت از هر نوع حافظه یا رجیستر یه آدرس منحصر بفرد داره، پس هر بخش حافظه یه رنج آدرس مخصوص داره که به اینصورت از سایر بخشها منفک میشه. پریفرالها هم که ارتباطشون با باس داخلی از طریق رجیسترهاست همینطور آدرسهای مشخص و انحصاری دارن. شما اگه با میکروپروسسورهای قدیمی کار کنین باید تمام این آدرس مپینگها رو خودتون بصورت دستی انجام بدین و سخت افزارباس دیتا و آدرس داخلی (اونجا خارجی!) دیکدینگ آدرس رو هم خودتون طراحی کنین تا سی پی یو قادر باشه با جهان خارج ارتباط برقرار کنه.
      توی هر میکرو بنا به نیاز و نوع طراحی یه سری بردارهای آدرس ثابت هم بطور سخت افزاری وجود داره که خارج از کنترل کاربر هستن و در صورت وقوع شرایط خاص تعریف شده که سی پی یو به اونها منتقل بشه و عملیات رو از اونجا ادامه بده و در واقع از اونجا هم میتونه به جای دیگه پاس داده بشه. ساده ترینش آدرس های استارت برنامه میکرو هست یا مثلا اگه درست یادم مونده باشه تو Z80 وقفه ی غیر قابل چشم پوشی NMI برای خودش یه آدرس ثابت داشت که در صورت وقوع PC به اونجا می پرید و در اون آدرس با توجه به شرایطی که چک می شدتصمیم گیری می شد که چه سابروتینی اجرا و چه پاسخی به وقفه داده بشه.
      وقتی شما برنامه رو کامپایل میکنین کامپایلر خودش به متغیرها بر حسب نوع و تعریفشون آدرسهای حافظه اختصاص میده و از اون به بعد متغیرها تنها با آدرسشون برای میکرو شناخته میشن و انجام هر عملیاتی با اونها بر اساس آدرس و در واقع پوینترشون انجام میشه و چون همونطور که گفتم آادرسها همیشه منحصر بفرد هستن عملا تداخلی اتفاق نمیفته و میکرو براحتی با هر آدرسی که تو برنامه باشه ارتباط برقرار و دیتا رد و بدل میکنه. در واقع تمام انواع حافظه و رجیستر هایی که ما می بینیم، از دید میکرو فقط یه آدرس هستن.

      ممنونم از توضیحاتتون چند باری خوندم مطالب شما رو .
      پس اینطور شد که سی پی یو آدرس میگیره و میره همونجا دیتا رو یا میخونه یا مینویسه - اصلا براش مهم نیست که رم باشه رجیستر باشه فلش باشه یا هرچی دیگه.
      حالا وقتی که میگن سی پی یو 8 بیت هست یعنی آنی میتونه 8 بیت و بخونه یا 32 بیت یعنی آنی 32 بیت رو بخونه. حالا سی پی یو از کجا میفهمه که از کجای فلش باید شروع کنه و تا کجای فلش رو باید بخونه؟
      یه سوال اینکه چجوریه که سرعت رم بیشتره ولی سرعت فلش کمتر از رم - خوب برنامه ی ما تو فلش هست ولی میگن برای سرعت بیشتر متغییر ها رو توی رم بریزیم ؟مگه برنامه با سرعت فلش اجرا نمیشه؟حالا سرعت رم هرچی که میخواد باشه و باید سرعت پایین باشه دیگه.

      بازم ممنونم.
      به سمت نور خورشيد حرکت کن،تو ميتوني تابش خورشيد رو حس کني ،حتي اگه کور باشي.
      (پيش به سوي هدف)

      دیدگاه


        #4
        پاسخ : نحوه ی ارتباط سی پی یو و حافظه

        نوشته اصلی توسط hosseinam نمایش پست ها
        ممنونم از توضیحاتتون چند باری خوندم مطالب شما رو .
        پس اینطور شد که سی پی یو آدرس میگیره و میره همونجا دیتا رو یا میخونه یا مینویسه - اصلا براش مهم نیست که رم باشه رجیستر باشه فلش باشه یا هرچی دیگه.
        حالا وقتی که میگن سی پی یو 8 بیت هست یعنی آنی میتونه 8 بیت و بخونه یا 32 بیت یعنی آنی 32 بیت رو بخونه. حالا سی پی یو از کجا میفهمه که از کجای فلش باید شروع کنه و تا کجای فلش رو باید بخونه؟
        یه سوال اینکه چجوریه که سرعت رم بیشتره ولی سرعت فلش کمتر از رم - خوب برنامه ی ما تو فلش هست ولی میگن برای سرعت بیشتر متغییر ها رو توی رم بریزیم ؟مگه برنامه با سرعت فلش اجرا نمیشه؟حالا سرعت رم هرچی که میخواد باشه و باید سرعت پایین باشه دیگه.

        بازم ممنونم.
        خواهش میکنم.
        اینکه سی پی یو چطور می فهمه که از کجا باید شروع کنه بر میگرده به همون بردار های ثابت آدرس. فرض کنین آدرس استارت صفر تعریف شده باشه. برنامه ای که شما مینویسین هم میره از آدرس صفر می شینه تو فلش.
        وقتی تغذیه وصل میشه و میکرو میاد بالا آدرس صفر تو پروگرام کانتر (PC) قرار میگیره و میکرو میره دستور موجود تو اون آدرس رو اجرا میکنه و عملا از اون به بعد کنترل میکرو کاملا تحت اختیار برنامه ی شماست و برنامه بهش میگه کجا بره و چیکار بکنه.
        اگه برنامه آدرس پرت یا دستور نامفهومی بهش بده هنگ میکنه و اگه دستورات و آدرسها درست باشن ادامه میده.
        پروسسورها همه شون یه رجیستر اصلی و همه کاره دارن که اصطلاحا بهشون آکومولاتور گفته میشه و عملا هسته ی پردازشی میکرو هست. اینکه یه میکرو چند بیتیه رو تعداد بیتهای این رجیستر تعیین میکنه که معمولا 8، 16 یا 32 بیتی هستن. اگه دستوری متناسب با تعداد بیتهای آکومولاتور باشه بسته به نوعش معمولا تو یه سیکل اجرا میشه. اما اگه طول دستور یا عملوندهاش بیش از تعداد بیتهای آکومولاتور باشه عملا برای لود و اجراش نیاز به سیکلهای بیشتری هست بعضی دستورها هم ذاتا نیاز به "ویت استیت" دارن که اینم سرعت رو پائین میاره. جزئیات اجرای دستورهای اسمبلی رو شرکت سازنده ی میکرو مشخص میکنه و کامپایلر نویس موظفه دستورات برنامه ی سطح بالای کاربر رو طوری به اسمبلی تبدیل کنه که حداقلهای مورد نیاز برای اجرای صحیح دستورات حفظ بشه، ضمن اینکه بهینه سازی کد از لحاظ حجم و سرعت هم انجام میشه.
        اونکه گفتم از دید سی پی یو فقط یه سری آدرس وجود داره یه نگاه کلیه. اما با در نظر گرفتن جزئیات و الزامات سازنده، از نظر سرعت معمولا بالاترین سرعت خوندن و نوشتن مربوط به رجیسترهاست بعدش آدرسهای مربوط به رم داخلی. برای دسترسی به فلش داخلی بعیده دستور مستقیم اسمبلی وجود داشته باشه، و برای خوندن یا نوشتن از برنامه روی فلش داخلی حتما نیاز به یه سابروتین بسیار بسیار زمانبرتر در مقایسه با دستورات رم هست.
        اصولا مجموعه ی دستورات اسمبلی هر میکرو تعیین میکنه که دسترسی هاش چطور باشه. چون اجرای دستورات اسمبلی رو سخت افزارهای موجود در میکرو انجام میدن عملا دستورات اسمبلی متنوعتر نیاز به سخت افزارهای داخلی بیشتری داره که سبب پیچیده تر شدن فرآیند طراحی و تولید میکرو و گرونتر شدنش میشه که بصرفه نیست. بنا بر این استراتژی طراحی میکروهای عمومی فعلی اغلب بر اساس کاهش دستورالعملهای اسمبلی هست که اصطلاحا به RISC معروفه.
        کمترین توقع از یک فرد تحصیلکرده، دانستن املای صحیح کلمات است.

        دیدگاه


          #5
          پاسخ : نحوه ی ارتباط سی پی یو و حافظه

          نوشته اصلی توسط نو رسیده نمایش پست ها
          خواهش میکنم.
          اینکه سی پی یو چطور می فهمه که از کجا باید شروع کنه بر میگرده به همون بردار های ثابت آدرس. فرض کنین آدرس استارت صفر تعریف شده باشه. برنامه ای که شما مینویسین هم میره از آدرس صفر می شینه تو فلش.
          وقتی تغذیه وصل میشه و میکرو میاد بالا آدرس صفر تو پروگرام کانتر (PC) قرار میگیره و میکرو میره دستور موجود تو اون آدرس رو اجرا میکنه و عملا از اون به بعد کنترل میکرو کاملا تحت اختیار برنامه ی شماست و برنامه بهش میگه کجا بره و چیکار بکنه.
          اگه برنامه آدرس پرت یا دستور نامفهومی بهش بده هنگ میکنه و اگه دستورات و آدرسها درست باشن ادامه میده.
          پروسسورها همه شون یه رجیستر اصلی و همه کاره دارن که اصطلاحا بهشون آکومولاتور گفته میشه و عملا هسته ی پردازشی میکرو هست. اینکه یه میکرو چند بیتیه رو تعداد بیتهای این رجیستر تعیین میکنه که معمولا 8، 16 یا 32 بیتی هستن. اگه دستوری متناسب با تعداد بیتهای آکومولاتور باشه بسته به نوعش معمولا تو یه سیکل اجرا میشه. اما اگه طول دستور یا عملوندهاش بیش از تعداد بیتهای آکومولاتور باشه عملا برای لود و اجراش نیاز به سیکلهای بیشتری هست بعضی دستورها هم ذاتا نیاز به "ویت استیت" دارن که اینم سرعت رو پائین میاره. جزئیات اجرای دستورهای اسمبلی رو شرکت سازنده ی میکرو مشخص میکنه و کامپایلر نویس موظفه دستورات برنامه ی سطح بالای کاربر رو طوری به اسمبلی تبدیل کنه که حداقلهای مورد نیاز برای اجرای صحیح دستورات حفظ بشه، ضمن اینکه بهینه سازی کد از لحاظ حجم و سرعت هم انجام میشه.
          اونکه گفتم از دید سی پی یو فقط یه سری آدرس وجود داره یه نگاه کلیه. اما با در نظر گرفتن جزئیات و الزامات سازنده، از نظر سرعت معمولا بالاترین سرعت خوندن و نوشتن مربوط به رجیسترهاست بعدش آدرسهای مربوط به رم داخلی. برای دسترسی به فلش داخلی بعیده دستور مستقیم اسمبلی وجود داشته باشه، و برای خوندن یا نوشتن از برنامه روی فلش داخلی حتما نیاز به یه سابروتین بسیار بسیار زمانبرتر در مقایسه با دستورات رم هست.
          اصولا مجموعه ی دستورات اسمبلی هر میکرو تعیین میکنه که دسترسی هاش چطور باشه. چون اجرای دستورات اسمبلی رو سخت افزارهای موجود در میکرو انجام میدن عملا دستورات اسمبلی متنوعتر نیاز به سخت افزارهای داخلی بیشتری داره که سبب پیچیده تر شدن فرآیند طراحی و تولید میکرو و گرونتر شدنش میشه که بصرفه نیست. بنا بر این استراتژی طراحی میکروهای عمومی فعلی اغلب بر اساس کاهش دستورالعملهای اسمبلی هست که اصطلاحا به RISC معروفه.
          ممنونم از شما.
          پس اینطور شد که برنامه نویس تقریبا کاری به جزییات ریز نداشته باشه و همینقدر حافظه هارو بشناسه از لحاظ سرعت و تعداد رایت و رید کفایت میکنه.
          خوب الان فرضا من از کجا باید بدونم که سرعت فلش چقدر کمتر از رم هست تا متغییری که نیاز به سرعت بیشتری داره رو در اون ذخیره کنم تا سی پی یو از اون بخونه؟
          منظورم اینه که از کجا میشه سرعت حافظه ها رو فهمید ؟
          به سمت نور خورشيد حرکت کن،تو ميتوني تابش خورشيد رو حس کني ،حتي اگه کور باشي.
          (پيش به سوي هدف)

          دیدگاه


            #6
            پاسخ : نحوه ی ارتباط سی پی یو و حافظه

            نوشته اصلی توسط hosseinam نمایش پست ها
            ممنونم از شما.
            پس اینطور شد که برنامه نویس تقریبا کاری به جزییات ریز نداشته باشه و همینقدر حافظه هارو بشناسه از لحاظ سرعت و تعداد رایت و رید کفایت میکنه.
            خوب الان فرضا من از کجا باید بدونم که سرعت فلش چقدر کمتر از رم هست تا متغییری که نیاز به سرعت بیشتری داره رو در اون ذخیره کنم تا سی پی یو از اون بخونه؟
            منظورم اینه که از کجا میشه سرعت حافظه ها رو فهمید ؟
            خب اینها یه بخش زیادیش تجربی هست.
            اولا توی لیست دستورالعملهای اسمبلی هر میکرو همیشه نوع دستور، فرمتش، تعداد عملوندهاش، تعداد سیکلهای کاری مورد نیاز برای اجراش، رجیسترهایی که استفاده میکنه و تمام جزئیات عملکردی هر دستور اسمبلی توسط کارخونه سازنده مشخص شده و در صورتیکه خیلی دقیق بخواید بدونید باید به اون مراجعه کنین.
            ولی معمولا نیازی نیست. چون در واقع هم احتمال اشتباه هست و هم اینکه هر دستور ساده ای که شما تو یه IDE سطح بالا مینویسین بعد از کامپایل شده تبدیل به چندین دستور اسمبلی میشه که محاسبه ی تایم همه اونها کارو پیچیده میکنه.
            بنا بر این ما معمولا برای اندازه گیری زمان اجرای یک دستور یا سابروتین یا مجموعه ای از دستورات، میایم یه GPIO رو قبل و بعد از اون دستور یا تابع، تاگل میکنیم و تایم کل استفاده شده رو با دقت خوبی روی اسکوپ می بینیم.
            این روش روش خیلی خوب و دقیقیه و باهاش تایمهای مرده و پرت و هر نوع لگ سخت افزاری یا نرم افزاری که تو سیستم باشه رو با تقریب مناسبی میشه دید،
            کمترین توقع از یک فرد تحصیلکرده، دانستن املای صحیح کلمات است.

            دیدگاه


              #7
              پاسخ : نحوه ی ارتباط سی پی یو و حافظه

              خیلی ممنون، به کمکم اومد

              دیدگاه

              لطفا صبر کنید...
              X