% Generated from json/card_source.json by tools/render_card.py. % Do not edit manually; update the JSON and regenerate. \documentclass[12pt,a4paper]{article} \usepackage[T1]{fontenc} \usepackage{lmodern} \usepackage[utf8]{inputenc} \usepackage[polish]{babel} \usepackage{csquotes} \usepackage{amsmath} \usepackage{amssymb} \usepackage{xcolor} \usepackage[a4paper,left=2.15cm,right=2.15cm,top=0.5cm,bottom=0.5cm,headheight=24mm,headsep=3mm,includehead]{geometry} \usepackage{eso-pic} \usepackage{marginnote} \usepackage{array} \usepackage{tabularx} \usepackage{graphicx} \usepackage{pdflscape} \usepackage{float} \usepackage{silence} \WarningFilter{soulutf8}{This package is obsolete} \usepackage{pdfcomment} \usepackage{enumitem} \usepackage{needspace} \usepackage{fancyhdr} \usepackage{lastpage} \usepackage{microtype} \usepackage[most]{tcolorbox} \usepackage{qrcode} \IfFileExists{references.bib}{% \usepackage[backend=biber,style=numeric,sorting=none]{biblatex}% \addbibresource{references.bib}% }{} \hypersetup{hidelinks} \IfFileExists{build-meta.tex}{% \input{build-meta.tex}% }{% \newcommand{\BuildCommit}{lokalna}% } \newcommand{\DocumentAuthor}{M. Pabiszczak} \newcommand{\DocumentYear}{2026} \newcommand{\CardSeries}{c} \newcommand{\CardNumber}{10} \newcommand{\CardCount}{13} \newcommand{\CardSlug}{traps-interrupt-control} \newcommand{\CardVersion}{v00.01} \newcommand{\DocumentUUID}{ec04ecee-1c4d-529a-a4e2-d3f9b40700ec} \newcommand{\EmptyCheck}{\(\square\)} \newcommand{\EscAnswerLines}[1][3]{\par\noindent\dotfill\par\noindent\dotfill\par\noindent\dotfill} \newcommand{\EscWriteRow}[1][2.8em]{\rule{0pt}{#1}} \setlength{\parindent}{0pt} \setlength{\parskip}{0.45em} \setlength{\headheight}{24mm} \setlength{\headsep}{3mm} \setlength{\footskip}{8mm} \setlength{\marginparwidth}{1.5cm} \setlength{\marginparsep}{0.25cm} \renewcommand{\arraystretch}{1.22} % Margin separator lines disabled for layout trial. \newcommand{\ESCPageResourceHeader}{% \begingroup% \setlength{\parskip}{0pt}% \setlength{\fboxsep}{0pt}% \setlength{\fboxrule}{0.35pt}% \setlength{\arrayrulewidth}{0.35pt}% \noindent\fbox{% \begin{minipage}[c][23.5mm][c]{\dimexpr\textwidth-2\fboxrule\relax}% \begin{minipage}[c][23mm][c]{24mm}\centering% \href{https://zsl-gitea.mpabi.pl/edu-inf/lab-rv32i-c-interrupts}{\qrcode[level=L,height=22mm]{https://zsl-gitea.mpabi.pl/edu-inf/lab-rv32i-c-interrupts}}% \end{minipage}% \vrule width0.35pt% \begin{minipage}[c][23mm][c]{\dimexpr\linewidth-48mm-0.7pt\relax}% \setlength{\tabcolsep}{0pt}% \renewcommand{\arraystretch}{0}% \begin{tabularx}{\linewidth}{@{}p{\dimexpr0.50000000\linewidth-\arrayrulewidth\relax}|p{\dimexpr0.15126050\linewidth-\arrayrulewidth\relax}|X@{}}% \parbox[c][5.19414mm][c]{\linewidth}{\hspace{0.45mm}{\fontsize{3.2}{3.4}\selectfont\ttfamily\bfseries TITLE}\par\nointerlineskip\vspace{0.12mm}\noindent\makebox[\linewidth][r]{{\fontsize{7.7}{7.9}\selectfont\ttfamily\bfseries Pułapki i sterowanie przerwaniami RV32I}\hspace{0.45mm}}\par} & \parbox[c][5.19414mm][c]{\linewidth}{\hspace{0.45mm}{\fontsize{3.2}{3.4}\selectfont\ttfamily\bfseries VER.}\par\nointerlineskip\vspace{0.12mm}\noindent\makebox[\linewidth][r]{{\fontsize{6.6}{6.8}\selectfont\ttfamily\bfseries v00.01}\hspace{0.45mm}}\par} & \parbox[c][5.19414mm][c]{\linewidth}{\hspace{0.45mm}{\fontsize{3.2}{3.4}\selectfont\ttfamily\bfseries DATETIME}\par\nointerlineskip\vspace{0.12mm}\noindent\makebox[\linewidth][r]{{\fontsize{6.4}{6.6}\selectfont\ttfamily\bfseries 2026-07-20T00:00:00+02:00}\hspace{0.45mm}}\par} \\% \end{tabularx}% \par\nointerlineskip% \hrule height0.35pt% \nointerlineskip% \begin{tabularx}{\linewidth}{@{}p{\dimexpr0.50000000\linewidth-\arrayrulewidth\relax}|p{\dimexpr0.25210084\linewidth-\arrayrulewidth\relax}|p{\dimexpr0.14285714\linewidth-\arrayrulewidth\relax}|X@{}}% \parbox[c][5.19414mm][c]{\linewidth}{\hspace{0.45mm}{\fontsize{3.2}{3.4}\selectfont\ttfamily\bfseries PROJECT}\par\nointerlineskip\vspace{0.12mm}\noindent\makebox[\linewidth][r]{{\fontsize{7.7}{7.9}\selectfont\ttfamily\bfseries Freestanding C na RV32I}\hspace{0.45mm}}\par} & \parbox[c][5.19414mm][c]{\linewidth}{\hspace{0.45mm}{\fontsize{3.2}{3.4}\selectfont\ttfamily\bfseries SERIES}\par\nointerlineskip\vspace{0.12mm}\noindent\makebox[\linewidth][r]{{\fontsize{6.4}{6.6}\selectfont\ttfamily\bfseries C · Freestanding RV32I and K\&R}\hspace{0.45mm}}\par} & \parbox[c][5.19414mm][c]{\linewidth}{\hspace{0.45mm}{\fontsize{3.2}{3.4}\selectfont\ttfamily\bfseries CARD}\par\nointerlineskip\vspace{0.12mm}\noindent\makebox[\linewidth][r]{{\fontsize{6.4}{6.6}\selectfont\ttfamily\bfseries 10/13}\hspace{0.45mm}}\par} & \parbox[c][5.19414mm][c]{\linewidth}{\hspace{0.45mm}{\fontsize{3.2}{3.4}\selectfont\ttfamily\bfseries SHEET}\par\nointerlineskip\vspace{0.12mm}\noindent\makebox[\linewidth][r]{{\fontsize{6.4}{6.6}\selectfont\ttfamily\bfseries \thepage/\pageref{LastPage}}\hspace{0.45mm}}\par} \\% \end{tabularx}% \par\nointerlineskip% \hrule height0.35pt% \nointerlineskip% \begin{tabularx}{\linewidth}{@{}p{\dimexpr0.05882353\linewidth-\arrayrulewidth\relax}|p{\dimexpr0.05042017\linewidth-\arrayrulewidth\relax}|p{\dimexpr0.14705882\linewidth-\arrayrulewidth\relax}|p{\dimexpr0.09243697\linewidth-\arrayrulewidth\relax}|p{\dimexpr0.07563025\linewidth-\arrayrulewidth\relax}|p{\dimexpr0.07563025\linewidth-\arrayrulewidth\relax}|X@{}}% \parbox[c][5.19414mm][c]{\linewidth}{\hspace{0.15mm}{\fontsize{2.85}{3}\selectfont\ttfamily\bfseries SUBJ.}\par\nointerlineskip\vspace{0.12mm}\noindent\makebox[\linewidth][r]{{\fontsize{4.45}{4.65}\selectfont\ttfamily\bfseries Inf.}\hspace{0.15mm}}\par} & \parbox[c][5.19414mm][c]{\linewidth}{\hspace{0.15mm}{\fontsize{2.85}{3}\selectfont\ttfamily\bfseries PROG.}\par\nointerlineskip\vspace{0.12mm}\noindent\makebox[\linewidth][r]{{\fontsize{4.45}{4.65}\selectfont\ttfamily\bfseries —}\hspace{0.15mm}}\par} & \parbox[c][5.19414mm][c]{\linewidth}{\hspace{0.15mm}{\fontsize{2.85}{3}\selectfont\ttfamily\bfseries CORE}\par\nointerlineskip\vspace{0.12mm}\noindent\makebox[\linewidth][r]{{\fontsize{4.45}{4.65}\selectfont\ttfamily\bfseries —}\hspace{0.15mm}}\par} & \parbox[c][5.19414mm][c]{\linewidth}{\hspace{0.15mm}{\fontsize{2.85}{3}\selectfont\ttfamily\bfseries SCOPE}\par\nointerlineskip\vspace{0.12mm}\noindent\makebox[\linewidth][r]{{\fontsize{4.45}{4.65}\selectfont\ttfamily\bfseries —}\hspace{0.15mm}}\par} & \parbox[c][5.19414mm][c]{\linewidth}{\hspace{0.15mm}{\fontsize{2.85}{3}\selectfont\ttfamily\bfseries LEVEL}\par\nointerlineskip\vspace{0.12mm}\noindent\makebox[\linewidth][r]{{\fontsize{4.45}{4.65}\selectfont\ttfamily\bfseries —}\hspace{0.15mm}}\par} & \parbox[c][5.19414mm][c]{\linewidth}{\hspace{0.15mm}{\fontsize{2.85}{3}\selectfont\ttfamily\bfseries POS.}\par\nointerlineskip\vspace{0.12mm}\noindent\makebox[\linewidth][r]{{\fontsize{4.45}{4.65}\selectfont\ttfamily\bfseries —}\hspace{0.15mm}}\par} & \parbox[c][5.19414mm][c]{\linewidth}{\hbox to\linewidth{\hspace{0.35mm}{\fontsize{3.4}{3.75}\selectfont\ttfamily\bfseries GITEA UUID}\hfill{\fontsize{3.4}{3.75}\selectfont\ttfamily ec04ecee-1c4d-529a-a4e2-d3f9b40700ec}\hspace{0.35mm}}\par\nointerlineskip\hbox to\linewidth{\hspace{0.35mm}{\fontsize{3.4}{3.75}\selectfont\ttfamily\bfseries CARD UUID} {\fontsize{3.4}{3.75}\selectfont\ttfamily 8fb9c110-557b-5081-8ae2-a56800f872e8}\hfill{\fontsize{3.4}{3.75}\selectfont\ttfamily\bfseries AUTHOR M. Pabiszczak}\hspace{0.35mm}}} \\% \end{tabularx}% \par\nointerlineskip% \hrule height0.35pt% \nointerlineskip% \begin{tabularx}{\linewidth}{@{}X@{}}% \parbox[c][3.46276mm][c]{\linewidth}{\hspace{0.45mm}{\fontsize{4.5}{4.85}\selectfont\ttfamily\bfseries GITEA} {\fontsize{4.5}{4.85}\selectfont\ttfamily\href{https://zsl-gitea.mpabi.pl/edu-inf/lab-rv32i-c-interrupts}{\nolinkurl{https://zsl-gitea.mpabi.pl/edu-inf/lab-rv32i-c-interrupts}}}} \\% \end{tabularx}% \par\nointerlineskip% \hrule height0.35pt% \nointerlineskip% \begin{tabularx}{\linewidth}{@{}X@{}}% \parbox[c][3.46276mm][c]{\linewidth}{\hspace{0.45mm}{\fontsize{4.5}{4.85}\selectfont\ttfamily\bfseries HTML} {\fontsize{4.5}{4.85}\selectfont\ttfamily\href{https://dce7fb9d-7b2f-5d49-96a2-3a30d3070b84.mpabi.pl/8fb9c110-557b-5081-8ae2-a56800f872e8}{\nolinkurl{https://dce7fb9d-7b2f-5d49-96a2-3a30d3070b84.mpabi.pl/8fb9c110-557b-5081-8ae2-a56800f872e8}}}} \\% \end{tabularx}% \end{minipage}% \vrule width0.35pt% \begin{minipage}[c][23mm][c]{24mm}\centering% \href{https://dce7fb9d-7b2f-5d49-96a2-3a30d3070b84.mpabi.pl/8fb9c110-557b-5081-8ae2-a56800f872e8}{\qrcode[level=L,height=22mm]{https://dce7fb9d-7b2f-5d49-96a2-3a30d3070b84.mpabi.pl/8fb9c110-557b-5081-8ae2-a56800f872e8}}% \end{minipage}% \end{minipage}% }% \endgroup% } \pagestyle{fancy} \fancyhf{} \fancyhead[C]{\ESCPageResourceHeader} \renewcommand{\headrulewidth}{0pt} \renewcommand{\footrulewidth}{0pt} \newcommand{\ESCMarginTag}[4]{% \hspace*{#1}\textcolor{#2}{#3~#4}% } \newcommand{\ESCSectionBlockStart}{% \Needspace{8\baselineskip}% \par\vspace{0.35em}% \noindent\textcolor{black!28}{\rule{\textwidth}{0.35pt}}% \par\vspace{0.15em}% } \newcommand{\ESCSectionBlockEnd}{% \par\vspace{0.45em}% } \newcommand{\ESCTinyStepSeparator}{% \par\vspace{0.10em}% \noindent{\color{black!18}\leaders\hbox{\rule{0.60em}{0.22pt}\hspace{0.38em}}\hfill\kern0pt}% \par\vspace{0.10em}% } \newtcolorbox{ESCTaskFrame}[1]{enhanced,breakable,arc=0pt,boxrule=0.35pt,colback=white,colframe=black,boxsep=0pt,left=1.4mm,right=1.4mm,top=0.8mm,bottom=0.8mm,colbacktitle=black!7,coltitle=black,title={\ttfamily\bfseries TASK\quad #1}} \newtcolorbox{ESCBlockFrame}[1]{enhanced,breakable,arc=0pt,boxrule=0.35pt,colback=white,colframe=black!55,boxsep=0pt,left=1.0mm,right=1.0mm,top=0.6mm,bottom=0.6mm,colbacktitle=black!4,coltitle=black,title={\ttfamily\bfseries BLOCK\quad #1}} \newtcolorbox{ESCStepFrame}[1]{enhanced,breakable,arc=0pt,boxrule=0.35pt,colback=white,colframe=black!28,boxsep=0pt,left=0.8mm,right=0.8mm,top=0.45mm,bottom=0.45mm,colbacktitle=black!2,coltitle=black,title={\ttfamily STEP\quad #1}} \newtcolorbox{ESCConclusionFrame}{enhanced,breakable,arc=0pt,boxrule=0.45pt,colback=blue!2,colframe=blue!45!black,boxsep=0pt,left=1.2mm,right=1.2mm,top=0.7mm,bottom=0.7mm,colbacktitle=blue!7,coltitle=black,title={\ttfamily\bfseries WNIOSEK}} \newcommand{\ESCLearningTreeWidget}{% \reversemarginpar \marginnote[% \begin{minipage}{\marginparwidth}% \raggedright {\fontsize{3.55}{3.95}\selectfont\ttfamily \begin{minipage}[t]{\marginparwidth}% \raggedright {\bfseries\textcolor{black!65}{TECH}\par}% \vspace{0.08em}% \hspace*{0.00em}\textcolor{red}{WE~01}\textcolor{black!48}{}\par% \hspace*{0.28em}\textcolor{orange!85!black}{EK~LOCAL~C}\textcolor{black!48}{\pdftooltip[width=\textwidth]{.01}{Uczeń uruchamia trzy obrazy Hazard3 i wiąże raporty runtime z instrukcjami ecall, CSR,\textCR wektorami i mret.}}\par% \hspace*{0.54em}\textcolor{blue!70!black}{KW~LOCAL~C}\textcolor{black!48}{\pdftooltip[width=\textwidth]{.01}{Kod, przewidywanie i pomiar tworzą jeden dowód.}}\par% \end{minipage}% }% \end{minipage}% ]{} \normalmarginpar \marginnote{% \begin{minipage}{\marginparwidth}% \raggedright {\fontsize{3.55}{3.95}\selectfont\ttfamily \hspace*{0.06cm}% \begin{minipage}[t]{\dimexpr\marginparwidth-0.06cm\relax}% \raggedright {\bfseries\textcolor{black!65}{OG}\par}% \vspace{0.08em}% \hspace*{0.00em}\textcolor{red}{WE~01}\textcolor{black!48}{}\par% \hspace*{0.28em}\textcolor{green!50!black}{EN~LOCAL~EN~C}\textcolor{black!48}{\pdftooltip[width=\textwidth]{.01}{Uczeń osobno zapisuje źródło zdarzenia, mcause, mepc, stan pending, obie bramki enable i\textCR efekt po mret.}}\par% \hspace*{0.54em}\textcolor{blue!70!black}{KW~LOCAL~KW~C}\textcolor{black!48}{\pdftooltip[width=\textwidth]{.01}{Kod, przewidywanie i pomiar tworzą jeden dowód.}}\par% \end{minipage}% }% \end{minipage}% } } \begin{document} \sloppy \vspace{1.0em} \noindent{\Large\bfseries Cel karty}\par \vspace{0.35em} Uczeń odróżnia synchroniczny wyjątek od asynchronicznego przerwania, wyprowadza adres wznowienia z mepc oraz dowodzi, że samo pending nie wystarcza bez indywidualnej i globalnej bramki enable. \vspace{0.8em} \noindent\textcolor{black!25}{\rule{\textwidth}{0.35pt}} \vspace{0.7em} \noindent{\Large\bfseries Zakres i zachowane przykłady}\par \vspace{0.35em} Trzy obrazy RV32I działają na rzeczywistym modelu Hazard3. Task01 wykonuje \texttt{ecall}; Task02 używa kontrolowanego machine software interrupt; Task03 mierzy macierz pending, \texttt{mie.MSIE} i \texttt{mstatus.MIE}. Peryferia pojawiają się dopiero w C12 i C13.\par\textbf{Układ każdego przykładu:} pełny profil A1--A8; widok N/D ma jawny powód, a diagram nie jest wymagany, gdy tekst daje lepszy dowód. \vspace{0.55em} \small\begin{tabularx}{\textwidth}{@{}>{\ttfamily\raggedright\arraybackslash}p{1.10cm}>{\ttfamily\raggedright\arraybackslash}p{1.45cm}X>{\raggedright\arraybackslash}p{2.50cm}@{}} \textbf{Typ} & \textbf{Task} & \textbf{Idea} & \textbf{Waga} \\ \hline \hline \textbf{\texttt{ECALL}} & \textbf{\texttt{Task01}} & \textbf{synchroniczny cause 11, mepc i mret} & \textbf{kluczowe} \\ \hline \hline \textbf{\texttt{MSIP}} & \textbf{\texttt{Task02}} & \textbf{MSIP, MSIE, MIE, vector 3 i mret} & \textbf{kluczowe} \\ \hline \hline \textbf{\texttt{GATE}} & \textbf{\texttt{Task03}} & \textbf{to samo źródło, dwie niezależne bramki} & \textbf{kluczowe} \\ \hline \end{tabularx} \normalsize \vspace{0.8em} \noindent\textcolor{black!25}{\rule{\textwidth}{0.35pt}} \clearpage \ESCSectionBlockStart \section{1 — Wyjątek synchroniczny wskazuje instrukcję} \reversemarginpar \marginnote[% \begin{minipage}{\marginparwidth}% \raggedright {\fontsize{3.55}{3.95}\selectfont\ttfamily \begin{minipage}[t]{\marginparwidth}% \raggedright {\bfseries\textcolor{black!65}{TECH}\par}% \vspace{0.08em}% \hspace*{0.00em}\textcolor{red}{WE~01}\textcolor{black!48}{}\par% \end{minipage}% }% \end{minipage}% ]{}[-3.1em] \normalmarginpar \marginnote{% \begin{minipage}{\marginparwidth}% \raggedright {\fontsize{3.55}{3.95}\selectfont\ttfamily \hspace*{0.06cm}% \begin{minipage}[t]{\dimexpr\marginparwidth-0.06cm\relax}% \raggedright {\bfseries\textcolor{black!65}{OG}\par}% \vspace{0.08em}% \hspace*{0.00em}\textcolor{red}{WE~01}\textcolor{black!48}{}\par% \end{minipage}% }% \end{minipage}% }[-3.1em] \texttt{ecall} jest wykonywany przez bieżący strumień instrukcji, więc \texttt{mcause=11} nie ma ustawionego bitu interrupt, a \texttt{mepc} wskazuje samo \texttt{ecall}. Handler Task01 świadomie zapisuje \texttt{mepc+4}; bez tego \texttt{mret} wykonałby ponownie tę samą instrukcję. Taka polityka jest poprawna dla tego kontrolowanego ECALL, ale nie wolno automatycznie pomijać instrukcji przy każdym błędzie. \ESCSectionBlockEnd \ESCSectionBlockStart \section{2 — Software IRQ jest asynchronicznym źródłem poziomowym} \reversemarginpar \marginnote[% \begin{minipage}{\marginparwidth}% \raggedright {\fontsize{3.55}{3.95}\selectfont\ttfamily \begin{minipage}[t]{\marginparwidth}% \raggedright {\bfseries\textcolor{black!65}{TECH}\par}% \vspace{0.08em}% \hspace*{0.00em}\textcolor{red}{WE~01}\textcolor{black!48}{}\par% \end{minipage}% }% \end{minipage}% ]{}[-3.1em] \normalmarginpar \marginnote{% \begin{minipage}{\marginparwidth}% \raggedright {\fontsize{3.55}{3.95}\selectfont\ttfamily \hspace*{0.06cm}% \begin{minipage}[t]{\dimexpr\marginparwidth-0.06cm\relax}% \raggedright {\bfseries\textcolor{black!65}{OG}\par}% \vspace{0.08em}% \hspace*{0.00em}\textcolor{red}{WE~01}\textcolor{black!48}{}\par% \end{minipage}% }% \end{minipage}% }[-3.1em] Testbench ustawia MSIP hart0, a rdzeń widzi \texttt{mip.MSIP}. Dostarczenie wymaga dodatkowo \texttt{mie.MSIE=1} i \texttt{mstatus.MIE=1}. Wektor 3 prowadzi do \texttt{isr\_machine\_softirq}; handler odczytuje \texttt{mcause=0x80000003}, usuwa źródło i dopiero potem publikuje licznik. \texttt{mret} wraca do przerwanego kodu, a nie do instrukcji wybranej ręcznie przez aplikację. \ESCSectionBlockEnd \ESCSectionBlockStart \section{3 — Pending i enable odpowiadają na inne pytania} \reversemarginpar \marginnote[% \begin{minipage}{\marginparwidth}% \raggedright {\fontsize{3.55}{3.95}\selectfont\ttfamily \begin{minipage}[t]{\marginparwidth}% \raggedright {\bfseries\textcolor{black!65}{TECH}\par}% \vspace{0.08em}% \hspace*{0.00em}\textcolor{red}{WE~01}\textcolor{black!48}{}\par% \end{minipage}% }% \end{minipage}% ]{}[-3.1em] \normalmarginpar \marginnote{% \begin{minipage}{\marginparwidth}% \raggedright {\fontsize{3.55}{3.95}\selectfont\ttfamily \hspace*{0.06cm}% \begin{minipage}[t]{\dimexpr\marginparwidth-0.06cm\relax}% \raggedright {\bfseries\textcolor{black!65}{OG}\par}% \vspace{0.08em}% \hspace*{0.00em}\textcolor{red}{WE~01}\textcolor{black!48}{}\par% \end{minipage}% }% \end{minipage}% }[-3.1em] Pending mówi, że źródło żąda obsługi. \texttt{mie.MSIE} dopuszcza konkretną klasę, a \texttt{mstatus.MIE} otwiera globalną bramkę machine mode. Task03 utrzymuje to samo pending i kolejno sprawdza dwa stany z jedną zamkniętą bramką oraz stan z obiema otwartymi. Dzięki temu kod 0 dowodzi całej macierzy, a nie tylko tego, że ISR kiedyś się wykonał. \ESCSectionBlockEnd \clearpage \ESCSectionBlockStart \section{Zadania — zachowane przykłady w profilu A1–A8} \reversemarginpar \marginnote[% \begin{minipage}{\marginparwidth}% \raggedright {\fontsize{3.55}{3.95}\selectfont\ttfamily \begin{minipage}[t]{\marginparwidth}% \raggedright {\bfseries\textcolor{black!65}{TECH}\par}% \vspace{0.08em}% \hspace*{0.00em}\textcolor{red}{WE~01}\textcolor{black!48}{}\par% \end{minipage}% }% \end{minipage}% ]{}[-3.1em] \normalmarginpar \marginnote{% \begin{minipage}{\marginparwidth}% \raggedright {\fontsize{3.55}{3.95}\selectfont\ttfamily \hspace*{0.06cm}% \begin{minipage}[t]{\dimexpr\marginparwidth-0.06cm\relax}% \raggedright {\bfseries\textcolor{black!65}{OG}\par}% \vspace{0.08em}% \hspace*{0.00em}\textcolor{red}{WE~01}\textcolor{black!48}{}\par% \end{minipage}% }% \end{minipage}% }[-3.1em] \begin{ESCTaskFrame}{TASK01 · ECALL i wznowienie pod mepc+4} {\scriptsize\ttfamily 2cd1da12-b916-5def-b868-da4b13ff9089}\par \begin{ESCBlockFrame}{A1 CONTEXT · AKTYWNE — kontrolowany wyjątek M-mode} \textbf{Zachowany przykład:} \nolinkurl{src/tasks/task01_ecall_resume.c}.\par Granica zaczyna się na instrukcji \texttt{ecall} w main i kończy po powrocie do kolejnej instrukcji. Nie ma zewnętrznego peryferium ani pending IRQ; rdzeń sam tworzy synchroniczną pułapkę. \end{ESCBlockFrame} \begin{ESCBlockFrame}{A2 STRUCTURE · AKTYWNE — mcause, mepc i mtvec} \texttt{mcause} zapisuje klasę 11 bez bitu interrupt, \texttt{mepc} zapisuje adres ECALL, a baza \texttt{mtvec} prowadzi wszystkie synchroniczne wyjątki do \texttt{handle\_exception}. Handler publikuje oryginał i osobny adres wznowienia. \end{ESCBlockFrame} \begin{ESCBlockFrame}{A3 DISPATCH · AKTYWNE — synchroniczny slot mtvec} Sprzęt wybiera bazowy slot wektora, ponieważ zdarzenie jest wyjątkiem, nie IRQ. \texttt{handle\_exception} odczytuje mcause i obsługuje jedyny dopuszczony przypadek ECALL. To granica trap dispatch, choć nie ma tablicy callbacków. \end{ESCBlockFrame} \begin{ESCBlockFrame}{A4 APPLICATION · AKTYWNE — cause 11 i stały krok 4} ECALL w RV32I jest instrukcją 32-bitową, dlatego dla tego przykładu poprawny resume ma wartość \texttt{mepc+4}. Gate wymaga jednego wejścia, cause 11, delty 4 i ustawienia resumed dopiero po mret. \end{ESCBlockFrame} \begin{ESCBlockFrame}{A5 FLOW · AKTYWNE — ecall, save, patch, mret} Normalny kod wykonuje ECALL. Rdzeń zapisuje mepc/mcause, skacze do wektora, handler odczytuje oba CSR i zapisuje nowe mepc. Epilog \texttt{interrupt("machine")} kończy się mret; dopiero potem main zapisuje resumed. \end{ESCBlockFrame} \begin{ESCBlockFrame}{A6 STATE · AKTYWNE — RUNNING, TRAP, RESUMED} Stan przechodzi \texttt{RUNNING -> TRAP(mepc=ecall,cause=11) -> RESUMED(pc=mepc+4)}. Licznik 1 odróżnia pojedyncze wznowienie od pętli ponownego wykonywania ECALL. \end{ESCBlockFrame} \begin{ESCBlockFrame}{A7 RUNTIME · AKTYWNE — ecall i mret w ELF} Oracle porównuje raportowane adresy i niezależnie wymaga różnicy 4. Objdump musi pokazać \texttt{ecall} w main oraz \texttt{mret} w handlerze. Segmenty LOAD pozostają rozdzielone R-X/R-W. \end{ESCBlockFrame} \begin{ESCBlockFrame}{A8 PATTERNS · AKTYWNE — explicit resume policy} Wzorzec handlera wyjątku obejmuje jawną decyzję: retry, skip albo terminate. Task01 wybiera skip tylko dla znanego ECALL. Dla faultu pamięci bezwarunkowe mepc+4 mogłoby ukryć błąd i jest niedozwolone. \end{ESCBlockFrame} \begin{ESCBlockFrame}{Ćwiczenie · Przewidywanie → wykonanie → wniosek} Przed uruchomieniem przewidź bit interrupt i kod mcause, wskaż wartość mepc oraz adres wznowienia. Wyjaśnij, co stałoby się bez zapisu mepc+4. \par\textbf{Evidence:} Adres ecall i dwa adresy mepc z raportu/listingu, cause 11, instrukcja mret oraz kod wyjścia Hazard3. \par\textbf{Acceptance:} Hazard3: count=1, mcause=0x0000000b, resume\_pc-mepc=4, resumed=1, pass=1 i kod 0. \end{ESCBlockFrame} \begin{ESCBlockFrame}{TASK01 · Zapis dowodu ucznia} \textbf{1. Przewidywanie przed uruchomieniem}\par\noindent\dotfill\par\noindent\dotfill\par\textbf{2. mcause, mepc i adres wznowienia}\par\noindent\dotfill\par\noindent\dotfill\par\textbf{3. ecall/mret w listingu i kod wyjścia}\par\noindent\dotfill\par\noindent\dotfill\par\textbf{4. Wniosek: reguła języka lub kontrakt targetu potwierdzony przez pomiar}\par\noindent\dotfill\par\noindent\dotfill \end{ESCBlockFrame} \end{ESCTaskFrame} \clearpage \begin{ESCTaskFrame}{TASK02 · Machine software IRQ i clear źródła} {\scriptsize\ttfamily a4b503ba-cacc-5af1-9ecd-31f51563ca76}\par \begin{ESCBlockFrame}{A1 CONTEXT · AKTYWNE — kontrolowane źródło bez peryferium} \textbf{Zachowany przykład:} \nolinkurl{src/tasks/task02_machine_software_irq.c}.\par \texttt{tb\_set\_softirq(0)} podnosi machine software interrupt hart0. Testbench jest źródłem, CSR są kontrolą rdzenia, ISR usuwa żądanie, a main ocenia wznowienie. UART/GPIO nie uczestniczą. \end{ESCBlockFrame} \begin{ESCBlockFrame}{A2 STRUCTURE · AKTYWNE — trzy bity i jeden wektor} Źródło jest widoczne jako \texttt{mip.MSIP}; indywidualna bramka to \texttt{mie.MSIE}, globalna to \texttt{mstatus.MIE}. Cause 3 w trybie vectored wybiera slot 3 i symbol \texttt{isr\_machine\_softirq}. \end{ESCBlockFrame} \begin{ESCBlockFrame}{A3 DISPATCH · AKTYWNE — sprzęt wybiera vector 3} Bit interrupt w mcause i kod 3 powodują sprzętowy wybór slotu machine software IRQ. Nie jest to statyczne jal z main. Po wejściu symbol handlera jest już określony przez wektor, a mret odtwarza przerwany kontekst. \end{ESCBlockFrame} \begin{ESCBlockFrame}{A4 APPLICATION · AKTYWNE — pending 1 do 0} Przy MSIE=1 i MIE=0 źródło jest już pending, lecz licznik wynosi 0. Po otwarciu MIE handler widzi \texttt{0x80000003} i pending=1, wykonuje clear, zwiększa licznik, a po mret main mierzy pending=0. \end{ESCBlockFrame} \begin{ESCBlockFrame}{A5 FLOW · AKTYWNE — configure, assert, observe, enable} Kolejność eliminuje wyścig pomiaru: najpierw wyłącz wszystko, ustaw MSIE, podnieś źródło, zmierz pending, dopiero potem ustaw MIE. Handler odczytuje cause/pending przed clear i publikuje licznik po clear. \end{ESCBlockFrame} \begin{ESCBlockFrame}{A6 STATE · AKTYWNE — MASKED\_PENDING, ACTIVE, CLEARED} Źródło przechodzi do \texttt{MASKED\_PENDING}, bo globalna bramka jest zamknięta. Po MIE staje się ACTIVE; clear w ISR tworzy CLEARED. Resumed=1 jest osobnym stanem normalnego kodu po mret. \end{ESCBlockFrame} \begin{ESCBlockFrame}{A7 RUNTIME · AKTYWNE — cause z bitem 31} Wartość \texttt{0x80000003} łączy bit interrupt i kod 3. Listing ma pokazać CSR dla mie/mstatus/mip, dostęp do testbench clear oraz mret. Oracle wymaga całego śladu, nie tylko pass. \end{ESCBlockFrame} \begin{ESCBlockFrame}{A8 PATTERNS · AKTYWNE — clear level source before publish} Źródło poziomowe usuwa się przed opublikowaniem ukończenia ISR. Gdyby licznik wzrósł bez clear, po mret żądanie pozostałoby aktywne i handler mógłby wejść ponownie. \end{ESCBlockFrame} \begin{ESCBlockFrame}{Ćwiczenie · Przewidywanie → wykonanie → wniosek} Zapisz stan pending przed globalnym enable, mcause w ISR i pending po clear. Rozdziel źródło MSIP od obu bramek oraz wskaż, dlaczego handler musi usunąć źródło przed mret. \par\textbf{Evidence:} Ślad źródło→pending→MSIE/MIE→vector 3→ISR→clear→mret, raport globali i kod wyjścia Hazard3. \par\textbf{Acceptance:} Hazard3: count=1, mcause=0x80000003, pending\_before=1, pending\_in\_handler=1, pending\_after=0, resumed=1, pass=1 i kod 0. \end{ESCBlockFrame} \begin{ESCBlockFrame}{TASK02 · Zapis dowodu ucznia} \textbf{1. Przewidywanie przed uruchomieniem}\par\noindent\dotfill\par\noindent\dotfill\par\textbf{2. Pending i bramki przed wejściem}\par\noindent\dotfill\par\noindent\dotfill\par\textbf{3. mcause, clear, mret i wznowienie}\par\noindent\dotfill\par\noindent\dotfill\par\textbf{4. Wniosek: reguła języka lub kontrakt targetu potwierdzony przez pomiar}\par\noindent\dotfill\par\noindent\dotfill \end{ESCBlockFrame} \end{ESCTaskFrame} \clearpage \begin{ESCTaskFrame}{TASK03 · Macierz pending, MSIE i MIE} {\scriptsize\ttfamily f56dba83-f7a9-5643-8f2e-84df1e8a2190}\par \begin{ESCBlockFrame}{A1 CONTEXT · AKTYWNE — jedna zmienna, dwie kontrolki} \textbf{Zachowany przykład:} \nolinkurl{src/tasks/task03_pending_enable_matrix.c}.\par Bodziec MSIP pozostaje ten sam podczas dwóch prób blokowanych i próby dostarczonej. Przykład zmienia wyłącznie bramki rdzenia, więc nie myli nowego zdarzenia z nową konfiguracją. \end{ESCBlockFrame} \begin{ESCBlockFrame}{A2 STRUCTURE · AKTYWNE — macierz 1×2×2} Oś danych to pending=1. Dwie osie sterujące to MSIE i MIE. Cztery kombinacje mają jeden stan dostarczalny: oba bity 1. Przykład mierzy trzy istotne wiersze przy utrzymanym pending. \end{ESCBlockFrame} \begin{ESCBlockFrame}{A3 DISPATCH · AKTYWNE — wejście dopiero dla 1/1} Sprzętowy dispatch do vector 3 nie zachodzi przy żadnej pojedynczej otwartej bramce. Dopiero MSIE=1 i MIE=1 pozwalają utworzyć trap, zapisać cause i wejść do ISR kończącego się mret. \end{ESCBlockFrame} \begin{ESCBlockFrame}{A4 APPLICATION · AKTYWNE — dwa razy blocked, raz delivered} Przy MIE=1/MSIE=0 licznik zostaje 0. Przy MIE=0/MSIE=1 również zostaje 0. Przy obu równych 1 rośnie dokładnie do 1, mcause ma wartość 0x80000003, a clear zeruje pending. \end{ESCBlockFrame} \begin{ESCBlockFrame}{A5 FLOW · AKTYWNE — nie zmieniaj źródła między próbami} Program podnosi MSIP raz, następnie testuje global-only, individual-only i both. Globalny bit jest zamykany przed zmianą MSIE, aby dostarczenie nie zaszło między pomiarem a zapisaniem wyniku. \end{ESCBlockFrame} \begin{ESCBlockFrame}{A6 STATE · AKTYWNE — P10, P01, P11, CLEAR} Skrót \texttt{Pxy} oznacza pending=1, MSIE=x, MIE=y. Ślad to \texttt{P01(blocked) -> P10(blocked) -> P11(active) -> CLEAR}. Licznik zmienia się tylko na trzeciej krawędzi. \end{ESCBlockFrame} \begin{ESCBlockFrame}{A7 RUNTIME · AKTYWNE — odczyt mip, zapisy mie/mstatus} Raport utrwala trzy decyzje i cause. Listing rozdziela \texttt{csrs/csrc mie}, \texttt{csrs/csrc mstatus} oraz odczyt mip. Objdump niezależnie potwierdza mret w ISR. \end{ESCBlockFrame} \begin{ESCBlockFrame}{A8 PATTERNS · AKTYWNE — source, individual, global gate} Trzywarstwowy model zapobiega typowemu błędowi: pending nie znaczy delivered. Ten sam wzorzec wróci dla MTIP/MTIE oraz external IRQ z enable peryferium, kontrolera i globalnym MIE. \end{ESCBlockFrame} \begin{ESCBlockFrame}{Ćwiczenie · Przewidywanie → wykonanie → wniosek} Wypełnij trzy wiersze: pending=1 z samym MIE, pending=1 z samym MSIE oraz pending=1 z obiema bramkami. Przewidź licznik ISR i końcowy pending. \par\textbf{Evidence:} Tabela prawdy dwóch bramek dla jednego utrzymywanego pending, licznik ISR, końcowy clear, mret i kod wyjścia Hazard3. \par\textbf{Acceptance:} Hazard3: pending=1, blocked\_no\_msie=1, blocked\_no\_mie=1, delivered\_both=1, count=1, mcause=0x80000003, pending\_after=0, pass=1 i kod 0. \end{ESCBlockFrame} \begin{ESCBlockFrame}{TASK03 · Zapis dowodu ucznia} \textbf{1. Przewidywanie przed uruchomieniem}\par\noindent\dotfill\par\noindent\dotfill\par\textbf{2. Macierz pending/MSIE/MIE}\par\noindent\dotfill\par\noindent\dotfill\par\textbf{3. Dostarczenie, clear i kod wyjścia}\par\noindent\dotfill\par\noindent\dotfill\par\textbf{4. Wniosek: reguła języka lub kontrakt targetu potwierdzony przez pomiar}\par\noindent\dotfill\par\noindent\dotfill \end{ESCBlockFrame} \end{ESCTaskFrame} \ESCSectionBlockEnd \end{document}