mret

mret

تجميع RISC-V مرجع

يغطي lyszt.net mret وتعليمات RISC-V الأخرى بمزيد من التفصيل.

الوصف

يعود mret من معالج الفخ. يحدث الفخ عندما يوقف المعالج البرنامج الذي يشغله كي يتولى معالج آخر المسؤولية. المعالج هو روتين عند عنوان ثابت. يرفع جهاز مقاطعة، مثل الزر الموجود على لوحة GPIO، فيبدأ ذلك فخًا. يرمز الاسم إلى machine-mode return.

mret

عند بدء فخ، يخزّن المعالج عنوان التعليمة المقاطَعة في mepc، ويسجّل السبب في mcause، ويمسح بت تمكين المقاطعة العام في mstatus، ويقفز إلى عنوان المعالج المحفوظ في mtvec. يلغي mret ذلك. فهو يحمّل عدّاد البرنامج بالعنوان الموجود في mepc ويستعيد بت تمكين المقاطعة الذي حفظه mstatus عند بداية الفخ. ثم يستأنف البرنامج المقاطَع عند التعليمة التي كان على وشك تنفيذها.

لا يأخذ mret أي معاملات. وبدونه يستمر المعالج بعد نهاية المعالج إلى أي شيفرة تليه.

يمكن أن تصل مقاطعة بين أي تعليمتين، ولم يتخذ البرنامج المقاطَع أي استعداد لها. لذلك يحفظ المعالج كل سجل يغيّره ويستعيدها قبل mret.

كما يمسح معالج الزر بت التعليق الخاص بالزر قبل mret. وإذا بقي ذلك البت مضبوطًا، فستُطلق المقاطعة نفسها مرة أخرى بمجرد أن يعيد mret تشغيل المقاطعات.

يكتب المثال عنوان target في mepc ويشغّل mret، الذي يقفز إلى هناك. خارج فخ حقيقي، يُظهر هذا القفز بمفرده. راجع csrw لكتابة CSR.

مثال

la t0, target
csrw mepc, t0
mret          # pc = mepc, so execution continues at target
target:
nop