% 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}{13}
\newcommand{\CardCount}{13}
\newcommand{\CardSlug}{gpio-edges-debounce}
\newcommand{\CardVersion}{v00.01}
\newcommand{\DocumentUUID}{72e2cbba-4658-5de2-a0dc-8b600ee3f7b0}

\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-gpio-edges-debounce}{\qrcode[level=L,height=22mm]{https://zsl-gitea.mpabi.pl/edu-inf/lab-rv32i-c-gpio-edges-debounce}}%
      \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 GPIO, zbocza i quiet-window debounce}\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 13/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 72e2cbba-4658-5de2-a0dc-8b600ee3f7b0}\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 29e6021a-d033-5fbe-a5fc-ec03442ac68a}\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-gpio-edges-debounce}{\nolinkurl{https://zsl-gitea.mpabi.pl/edu-inf/lab-rv32i-c-gpio-edges-debounce}}}} \\%
        \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/29e6021a-d033-5fbe-a5fc-ec03442ac68a}{\nolinkurl{https://dce7fb9d-7b2f-5d49-96a2-3a30d3070b84.mpabi.pl/29e6021a-d033-5fbe-a5fc-ec03442ac68a}}}} \\%
        \end{tabularx}%
      \end{minipage}%
      \vrule width0.35pt%
      \begin{minipage}[c][23mm][c]{24mm}\centering%
        \href{https://dce7fb9d-7b2f-5d49-96a2-3a30d3070b84.mpabi.pl/29e6021a-d033-5fbe-a5fc-ec03442ac68a}{\qrcode[level=L,height=22mm]{https://dce7fb9d-7b2f-5d49-96a2-3a30d3070b84.mpabi.pl/29e6021a-d033-5fbe-a5fc-ec03442ac68a}}%
      \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 obrazy RV32I z limitem cykli, odczytuje rejestry MMIO i kontrolera przerwań,\textCR przelicza czasy bounce i sprawdza, że main, a nie ISR, wykonuje politykę debounce oraz\textCR aktualizuje wyjścia.}}\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ń dla każdego zdarzenia wskazuje osobno source, pending, enable, decyzję dispatchera,\textCR minimalny efekt ISR i późniejszy efekt normalnego kodu.}}\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ń rozdziela fizyczny lub modelowany poziom wejścia, detekcję zbocza, zatrzaśnięty pending, maskowanie kontrolera, wybór handlera i efekt wykonywany później przez main. Potrafi zrealizować quiet-window debounce oraz połączyć timer, UART i GPIO w końcowym superloop bez RTOS.

\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}
Cztery przykłady wykonują się na centralnym modelu RTL Hazard3. TEST\_IN i UART TEST\_RX są jawnie wyłącznie bodźcami testbencha. Karta nie udaje modelu RP2350 ani fizycznego pinu. Task01 dowodzi DIR/OUT/IN przez polling, Task02 pełnej ścieżki rising-edge IRQ18 z W1C, Task03 krótkiego ISR i decyzji debounce w main, a Task04 współpracy machine timer, UART IRQ16 i GPIO IRQ18.\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{POLL}} & \textbf{\texttt{Task01}} & \textbf{kierunek, latch wyjścia i testbench-only bodziec wejścia} & \textbf{kluczowe} \\ \hline
\hline
\textbf{\texttt{IRQ18}} & \textbf{\texttt{Task02}} & \textbf{zbocze, pending peryferium, kontroler i resume} & \textbf{kluczowe} \\ \hline
\hline
\textbf{\texttt{DBNC}} & \textbf{\texttt{Task03}} & \textbf{krótki ISR, mtime i decyzja stabilności w main} & \textbf{kluczowe} \\ \hline
\hline
\textbf{\texttt{LOOP}} & \textbf{\texttt{Task04}} & \textbf{trzy źródła, dwa dispatchery, flagi i efekty main} & \textbf{kluczowe} \\ \hline
\end{tabularx}
\normalsize


\vspace{0.8em}
\noindent\textcolor{black!25}{\rule{\textwidth}{0.35pt}}

\clearpage

\ESCSectionBlockStart
\section{1 — Rejestr modelu nie jest fizycznym pinem}
\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]


GPIO modelu zaczyna się pod adresem \texttt{0xc0000300}. \texttt{DIR} wybiera kierunek, \texttt{OUT/OUT\_SET/OUT\_CLR} sterują zatrzaśnięciem wyjściowym, a \texttt{IN} pokazuje wyjścia dla pinów ustawionych jako output i bodziec zewnętrzny dla pinów input. \texttt{RISE\_EN} i \texttt{FALL\_EN} wybierają wykrywane zbocza, a \texttt{PENDING} zatrzaskuje je do zapisu W1C.

\texttt{TEST\_IN} istnieje tylko po stronie laboratorium. Pozwala programowi testowemu wywołać zmianę otoczenia bez fizycznego przewodu. Produkcyjny sterownik czyta \texttt{IN}; nie powinien zawierać zapisu do takiego fixture'u.
\ESCSectionBlockEnd

\ESCSectionBlockStart
\section{2 — Source, pending i enable to trzy różne fakty}
\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]


Zmiana 0 na 1 jest source dla detektora rising edge. Włączony bit \texttt{RISE\_EN} pozwala zatrzasnąć bit w \texttt{PENDING}; ten bit utrzymuje poziomową linię GPIO external IRQ18. Kontroler Hazard3 osobno ma per-line enable, priorytet oraz globalne bramki \texttt{mie.MEIE} i \texttt{mstatus.MIE}. Dispatcher odczytuje aktywny numer i wywołuje handler z tablicy.

W1C usuwa źródło poziomowego żądania po stronie peryferium. Sam powrót z handlera, odczyt \texttt{PENDING} ani zamknięcie maski nie potwierdzają zdarzenia.
\ESCSectionBlockEnd

\ESCSectionBlockStart
\section{3 — Debounce jest decyzją czasu w main}
\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]


ISR Task03 robi tylko trzy rzeczy: zapisuje czas i poziom, potwierdza pending przez W1C oraz na końcu publikuje licznik. Main obserwuje kandydata i akceptuje go dopiero wtedy, gdy od ostatniego zbocza minęło quiet window oraz bieżący poziom nadal odpowiada kandydatowi. Każde nowe zbocze przesuwa początek okna.

Sekwencja \texttt{1--0--1} jest kontrolowanym bounce. Oba odstępy są krótsze od 2000 taktów, dlatego żaden z trzech bezpośrednich odczytów nie może zaakceptować stanu. To polityka aplikacji, nie funkcja kontrolera przerwań.
\ESCSectionBlockEnd

\ESCSectionBlockStart
\section{4 — Superloop jest granicą serii raw C}
\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]


Task04 łączy machine timer, UART0 RX external IRQ16 i GPIO external IRQ18. ISR-y publikują flagi, a main konsumuje je i ustawia trzy różne bity wyjściowe. Flaga może skleić wiele produkcji, więc nie jest kolejką; zachowanie liczby i kolejności zdarzeń należy do następnej serii FreeRTOS.
\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 · Polling DIR, OUT i IN}
{\scriptsize\ttfamily 223fada6-43e4-532a-9c9b-e17445857214}\par
\begin{ESCBlockFrame}{A1 CONTEXT · AKTYWNE — dwa źródła widocznego IN}
\textbf{Zachowany przykład:} \nolinkurl{src/tasks/task01_gpio_polling.c}.\par Dla bitu z \texttt{DIR=1} widoczne \texttt{IN} pochodzi z latcha \texttt{OUT}; dla \texttt{DIR=0} pochodzi z modelowanego wejścia. \texttt{TEST\_IN} zmienia tylko tę drugą część i jest bodźcem laboratorium, nie pinem RP2350.
\end{ESCBlockFrame}
\begin{ESCBlockFrame}{A2 STRUCTURE · AKTYWNE — pin0 output, pin1 input}
Maska 0x1 wybiera pin wyjściowy, a 0x2 wejściowy. Rejestry SET i CLR modyfikują latch bez read--modify--write. Jeden odczyt \texttt{IN} składa oba widoki, dlatego przy obu stanach wysokich wynosi 0x3.
\end{ESCBlockFrame}
\begin{ESCBlockFrame}{A3 DISPATCH · N/D}
\textbf{N/D.} Task01 wyłącza detektory zboczy i przerwania; każdy krok jest bezpośrednim pollingiem MMIO, bez ISR, callbacku ani wyboru handlera.
\end{ESCBlockFrame}
\begin{ESCBlockFrame}{A4 APPLICATION · AKTYWNE — kontrolowany round trip poziomów}
Po external high program widzi 0x2. SET pinu0 daje OUT=0x1 i IN=0x3. CLR pinu0 oraz TEST\_IN=0 kończą sekwencję IN=0. Te liczby są bitowymi relacjami modelu, nie numerami pinów konkretnej płytki.
\end{ESCBlockFrame}
\begin{ESCBlockFrame}{A5 FLOW · AKTYWNE — configure, stimulate, sample, clear}
Program wyłącza edge enable, czyści pending, ustawia kierunek i stan początkowy. Następnie podaje bodziec wejściowy, próbkuje, ustawia output, próbkuje ponownie i zeruje oba źródła. Każdy pomiar następuje po odpowiadającym mu zapisie MMIO.
\end{ESCBlockFrame}
\begin{ESCBlockFrame}{A6 STATE · AKTYWNE — 0x2 → 0x3 → 0x0}
Widoczny stan portu przechodzi kolejno przez tylko input high, oba bity high i oba low. Kierunek pozostaje 0x1 przez cały eksperyment, a pending pozostaje pusty.
\end{ESCBlockFrame}
\begin{ESCBlockFrame}{A7 RUNTIME · AKTYWNE — rzeczywiste transakcje pod 0xc0000300}
Log RTL raportuje 1,2,1,3,0 i pass=1. Listing powinien pokazać osobne zapisy do offsetów DIR, TEST\_IN, OUT\_SET i OUT\_CLR oraz odczyty IN; nie ma wejścia do wspólnego dispatchera external IRQ.
\end{ESCBlockFrame}
\begin{ESCBlockFrame}{A8 PATTERNS · AKTYWNE — polling z jawną granicą fixture}
Wzorzec produkcyjny konfiguruje kierunek i czyta wejście lub steruje wyjściem. Warstwa testowa może dostarczyć osobny mechanizm wstrzyknięcia, ale jego nazwa, dokumentacja i lokalizacja muszą uniemożliwiać pomylenie z rejestrem sprzętu.
\end{ESCBlockFrame}
\begin{ESCBlockFrame}{Ćwiczenie · Przewidywanie → wykonanie → wniosek}
Przewidź cztery wartości: IN po ustawieniu zewnętrznego pinu 1, OUT po ustawieniu pinu 0, IN przy obu wysokich i IN po wyzerowaniu. Wyjaśnij, dlaczego zapis TEST\_IN jest dozwolony tylko w fixture testbencha.
\par\textbf{Evidence:} Tabela DIR/OUT/IN przed uruchomieniem, log wykonania RTL Hazard3 z kodem wyjścia, odczyt rejestrów MMIO i wniosek oddzielający fixture TEST\_IN od produkcyjnego API GPIO.
\par\textbf{Acceptance:} Oracle: dir=1, external\_high=2, out\_after\_set=1, both\_high=3, final\_in=0, pass=1 i kod wyjścia 0. PENDING pozostaje 0, ponieważ detektory zboczy są wyłączone.
\end{ESCBlockFrame}
\begin{ESCBlockFrame}{TASK01 · Zapis dowodu ucznia}
\textbf{1. Przewidywanie przed uruchomieniem}\par\noindent\dotfill\par\noindent\dotfill\par\textbf{2. Log RTL: DIR, OUT i kolejne wartości IN}\par\noindent\dotfill\par\noindent\dotfill\par\textbf{3. Granica modelu: TEST\_IN kontra fizyczny pin}\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 · Rising edge, IRQ18 i W1C}
{\scriptsize\ttfamily 93fb66db-d0ac-5fc2-811e-5b28e072a346}\par
\begin{ESCBlockFrame}{A1 CONTEXT · AKTYWNE — zbocze tworzy zatrzaśnięty fakt}
\textbf{Zachowany przykład:} \nolinkurl{src/tasks/task02_gpio_rising_irq.c}.\par Bodziec TEST\_IN zmienia pin2 z 0 na 1. Włączony bit RISE\_EN tworzy bit 0x4 w GPIO PENDING, a ten utrzymuje external IRQ18. TEST\_IN jest sztuczny, lecz dalsza ścieżka przez kontroler i rdzeń jest rzeczywistą ścieżką modelu RTL.
\end{ESCBlockFrame}
\begin{ESCBlockFrame}{A2 STRUCTURE · AKTYWNE — dwa pending i tablica handlerów}
Pierwszy pending leży w peryferium jako maska pinów. Drugi jest widokiem aktywnej linii 18 w kontrolerze Hazard3. Tablica \texttt{\_external\_irq\_table[18]} przechowuje adres zwykłej funkcji handlera.
\end{ESCBlockFrame}
\begin{ESCBlockFrame}{A3 DISPATCH · AKTYWNE — external vector wybiera linię 18}
\texttt{mtvec} wybiera wspólny vector machine external interrupt. \texttt{irq\_dispatch.S} odczytuje aktywną linię z \texttt{meinext}, indeksuje tablicę i wykonuje pośredni \texttt{jalr} do handlera GPIO. Handler potwierdza, że bieżący numer to 18.
\end{ESCBlockFrame}
\begin{ESCBlockFrame}{A4 APPLICATION · AKTYWNE — jedno zbocze, jedno wznowienie}
Program celowo generuje edge przy zamkniętym globalnym MIE. Dzięki temu może najpierw zmierzyć oba pending jako 1. Po otwarciu MIE oczekuje dokładnie jednego handlera, W1C, obu pending równych 0 i wykonania kodu resume.
\end{ESCBlockFrame}
\begin{ESCBlockFrame}{A5 FLOW · AKTYWNE — source → pending → enable → dispatch → W1C}
0→1 ustawia GPIO PENDING. Włączona linia18, MEIE i później MIE dopuszczają trap. Dispatcher wybiera handler18; ISR próbkuje maskę i poziom, zapisuje tę maskę do PENDING jako W1C, a dopiero potem publikuje count. Main wraca i mierzy stan 0.
\end{ESCBlockFrame}
\begin{ESCBlockFrame}{A6 STATE · AKTYWNE — IDLE, LATCHED, HANDLING, ACKED, RESUMED}
IDLE ma input low i pending 0. Rising edge tworzy LATCHED. Otwarcie MIE prowadzi do HANDLING. Zapis W1C tworzy ACKED, a powrót dispatchera RESUMED. Ponowne high pozostaje ACKED, ponieważ nie zaszła zmiana 0→1.
\end{ESCBlockFrame}
\begin{ESCBlockFrame}{A7 RUNTIME · AKTYWNE — 0x4 w GPIO i 18 w kontrolerze}
Raport daje count=1, irq=0x12, source/controller przed 1, pending w ISR 0x4, oba pending po 0 i same-level 0. Listing ma zawierać handler GPIO oraz wspólny dispatcher zakończony \texttt{mret}.
\end{ESCBlockFrame}
\begin{ESCBlockFrame}{A8 PATTERNS · AKTYWNE — acknowledge peripheral before publish}
Dla poziomowego IRQ najpierw ustal i usuń przyczynę po stronie peryferium, a dopiero potem publikuj zakończenie dla main. Zamknięcie maski może odłożyć obsługę, ale nie jest potwierdzeniem zdarzenia.
\end{ESCBlockFrame}
\begin{ESCBlockFrame}{Ćwiczenie · Przewidywanie → wykonanie → wniosek}
Rozpisz ścieżkę od zmiany TEST\_IN 0→1 do wznowienia main. Zaznacz GPIO PENDING, pending linii 18 w kontrolerze, dwa poziomy enable, decyzję dispatchera, zapis W1C i efekt ponownego podania tego samego poziomu.
\par\textbf{Evidence:} Przewidywany łańcuch source--pending--enable--dispatch--effect, log RTL z IRQ18 i stanami przed/po, listing wspólnego dispatchera oraz wniosek wyjaśniający W1C i brak drugiego zbocza dla high→high.
\par\textbf{Acceptance:} Jeden handler IRQ18 widzi PENDING=0x4 i poziom high. GPIO source oraz controller pending są 1 przed globalnym enable i 0 po W1C; high→high nie tworzy nowego pending, resume=1, pass=1.
\end{ESCBlockFrame}
\begin{ESCBlockFrame}{TASK02 · Zapis dowodu ucznia}
\textbf{1. Przewidywanie przed uruchomieniem}\par\noindent\dotfill\par\noindent\dotfill\par\textbf{2. Log RTL: pending GPIO i kontrolera przed/po ISR}\par\noindent\dotfill\par\noindent\dotfill\par\textbf{3. Dowód dispatchu IRQ18 i zapisu W1C}\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 · Quiet-window debounce po trzech zboczach}
{\scriptsize\ttfamily a2e3b023-04f1-5863-a4e0-360b5ec69b89}\par
\begin{ESCBlockFrame}{A1 CONTEXT · AKTYWNE — IRQ rejestruje zmianę, nie intencję użytkownika}
\textbf{Zachowany przykład:} \nolinkurl{src/tasks/task03_gpio_quiet_window.c}.\par Trzy przejścia TEST\_IN modelują bounce, nie trzy świadome naciśnięcia. Kontroler potrafi zgłosić rising i falling edge, lecz nie zna quiet window ani znaczenia stabilnego przycisku. Ta semantyka należy do kodu normalnego.
\end{ESCBlockFrame}
\begin{ESCBlockFrame}{A2 STRUCTURE · AKTYWNE — historia ISR i kandydat main}
ISR zapisuje trzy pary \texttt{level,time}, a osobno publikuje ostatni poziom, ostatni czas i count. Main utrzymuje seen count, candidate level oraz candidate time. Krytyczna sekcja chroni snapshot 64-bitowego czasu na RV32.
\end{ESCBlockFrame}
\begin{ESCBlockFrame}{A3 DISPATCH · AKTYWNE — każde włączone zbocze wybiera GPIO18}
RISE\_EN i FALL\_EN pozwalają trzem przejściom utworzyć pending. External dispatcher trzy razy wybiera wpis 18 i wywołuje ten sam krótki handler. Numer ostatniego handlera oraz count=3 są dowodem decyzji, nie sam fakt zapisu TEST\_IN.
\end{ESCBlockFrame}
\begin{ESCBlockFrame}{A4 APPLICATION · AKTYWNE — restart okna po każdym bounce}
Po każdym nowym count main zastępuje candidate time czasem ostatniego zbocza. Natychmiastowe próby dają early=0. Dopiero stabilny high utrzymany przez co najmniej 2000 taktów daje accepted=1.
\end{ESCBlockFrame}
\begin{ESCBlockFrame}{A5 FLOW · AKTYWNE — ISR publish, main observe, wait, validate}
ISR czyta pending, poziom i mtime, zapisuje rekord, wykonuje W1C i na końcu zwiększa count. Main atomowo pobiera publikację, aktualizuje kandydata, mierzy wiek oraz porównuje bieżący IN. Nowe zbocze wraca do początku okna.
\end{ESCBlockFrame}
\begin{ESCBlockFrame}{A6 STATE · AKTYWNE — HIGH?, LOW?, HIGH?, STABLE\_HIGH}
Pierwsze high jest kandydatem, low unieważnia go, a drugie high tworzy nowego kandydata. Żaden stan z wiekiem mniejszym niż quiet nie jest zaakceptowany. STABLE\_HIGH powstaje dopiero po pełnym oknie bez kolejnego IRQ.
\end{ESCBlockFrame}
\begin{ESCBlockFrame}{A7 RUNTIME · AKTYWNE — dwa bounce gapy krótsze od 0x7d0}
Bieżący RTL raportuje czasy low 0x591, 0x8ea, 0xc43, czyli oba gapy 0x359. Akceptacja następuje po 0x878 od ostatniego edge. Konkretne czasy zależą od buildu; oracle niezależnie sprawdza tylko relacje gap<quiet i accepted\_after>=quiet.
\end{ESCBlockFrame}
\begin{ESCBlockFrame}{A8 PATTERNS · AKTYWNE — timestamp in ISR, policy in consumer}
ISR powinien szybko potwierdzić sprzęt i opublikować minimalne dane. Konsument może wtedy zmieniać quiet window, politykę akceptacji lub raportowanie bez wydłużania czasu blokowania innych przerwań.
\end{ESCBlockFrame}
\begin{ESCBlockFrame}{Ćwiczenie · Przewidywanie → wykonanie → wniosek}
Dla sekwencji poziomów 1,0,1 oblicz oba odstępy i porównaj z quiet=2000. Wyjaśnij, dlaczego ISR publikuje czas, lecz nie akceptuje przycisku, oraz jak nowe zbocze restartuje okno ciszy.
\par\textbf{Evidence:} Przewidywana sekwencja kandydatów, log RTL z trzema czasami i poziomami, niezależne przeliczenie gapów oraz accepted\_after i wniosek przypisujący politykę debounce do main.
\par\textbf{Acceptance:} Poziomy 1,0,1, count=3 i IRQ18. Oba gapy są dodatnie i mniejsze od quiet=2000; early=0, accepted=1, zaakceptowany poziom high, accepted\_after >= quiet i pass=1.
\end{ESCBlockFrame}
\begin{ESCBlockFrame}{TASK03 · Zapis dowodu ucznia}
\textbf{1. Przewidywanie przed uruchomieniem}\par\noindent\dotfill\par\noindent\dotfill\par\textbf{2. Log RTL: trzy poziomy, czasy i gapy}\par\noindent\dotfill\par\noindent\dotfill\par\textbf{3. Dowód quiet window i miejsca decyzji w main}\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}{TASK04 · Timer + UART16 + GPIO18 bez RTOS}
{\scriptsize\ttfamily ebb18b6a-cf31-5595-9901-ac2ac870296f}\par
\begin{ESCBlockFrame}{A1 CONTEXT · AKTYWNE — trzy usługi, wspólny czas CPU}
\textbf{Zachowany przykład:} \nolinkurl{src/tasks/task04_raw_c_superloop.c}.\par Machine timer pochodzi z mtime>=mtimecmp, UART16 z niepustego RX FIFO przy włączonym RX IRQ, a GPIO18 z rising edge zatrzaśniętego w PENDING. TEST\_RX i TEST\_IN tworzą tylko bodźce; logika timer/UART/GPIO po nich jest rzeczywistym modelem RTL.
\end{ESCBlockFrame}
\begin{ESCBlockFrame}{A2 STRUCTURE · AKTYWNE — trzy publikacje i trzy bity efektu}
Każda usługa ma licznik ISR, payload i flagę. Main ma osobny licznik konsumpcji. Bity OUT 0,1,2 reprezentują odpowiednio efekt GPIO, UART i timera, więc końcowe 0x7 dowodzi wykonania trzech gałęzi bez ukrywania ich w jednej sumie.
\end{ESCBlockFrame}
\begin{ESCBlockFrame}{A3 DISPATCH · AKTYWNE — slot 7 oraz external 16/18}
Machine timer cause 7 trafia bezpośrednio do \texttt{isr\_machine\_timer} i wraca przez \texttt{mret}. Machine external vector trafia do wspólnego dispatchera; \texttt{meinext} wybiera wpis 16 dla UART albo 18 dla GPIO i wykonuje \texttt{jalr}.
\end{ESCBlockFrame}
\begin{ESCBlockFrame}{A4 APPLICATION · AKTYWNE — efekt dopiero po konsumpcji flagi}
UART handler publikuje U, GPIO handler high, a timer handler tick. Żaden ISR nie ustawia aplikacyjnego bitu OUT. Superloop atomowo zabiera flagę i dopiero jego trzy gałęzie ustawiają 0x2, 0x1 i 0x4.
\end{ESCBlockFrame}
\begin{ESCBlockFrame}{A5 FLOW · AKTYWNE — source → pending → dispatch → ISR → main}
Timer: comparator→MTIP→slot7→tick flag→bit2. UART: RX FIFO→IRQ16→external dispatcher→read DATA i flag→bit1. GPIO: edge→PENDING→IRQ18→dispatcher→W1C i flag→bit0. Main używa WFI tylko wtedy, gdy nadal brakuje któregoś efektu.
\end{ESCBlockFrame}
\begin{ESCBlockFrame}{A6 STATE · AKTYWNE — trzy niezależne PRODUCED/CONSUMED}
Każda usługa przechodzi IDLE→PRODUCED w ISR i PRODUCED→CONSUMED w main. Stan końcowy wymaga trzech liczników konsumpcji równych 1. Flaga wraca do 0, ale licznik zachowuje dowód przejścia.
\end{ESCBlockFrame}
\begin{ESCBlockFrame}{A7 RUNTIME · AKTYWNE — cause 7, linie 16/18 i OUT 0x7}
Raport daje timer count 1 i mcause 0x80000007, UART count 1/irq 0x10/byte 0x55, GPIO count 1/irq 0x12/high oraz trzy main actions po 1. OUT=0x7, a IN=0x17 dodaje widoczny wysoki pin wejściowy 0x10.
\end{ESCBlockFrame}
\begin{ESCBlockFrame}{A8 PATTERNS · AKTYWNE — ISR-to-main flags with an explicit ceiling}
Jednokomórkowa flaga jest poprawna tylko wtedy, gdy wystarcza informacja co najmniej jedno zdarzenie. Nie zachowuje liczby ani kolejności wielu produkcji. Ten sufit jest powodem przejścia do kolejek i tasków FreeRTOS, a nie pretekstem do nazywania flagi kolejką.
\end{ESCBlockFrame}
\begin{ESCBlockFrame}{Ćwiczenie · Przewidywanie → wykonanie → wniosek}
Dla timer tick, bajtu U i rising edge narysuj trzy osobne ścieżki source--pending--enable--dispatcher--ISR--flag--main effect. Wyjaśnij, dlaczego trzy flagi nie są kolejką i jakie ograniczenie przechodzi do serii FreeRTOS.
\par\textbf{Evidence:} Trzy przewidywane ścieżki zdarzeń, log RTL z numerami przerwań i licznikami, listing machine-timer oraz external dispatchera, końcowe OUT/IN i wniosek o granicy flag jednozdarzeniowych.
\par\textbf{Acceptance:} Po jednym timer IRQ z mcause=0x80000007, UART IRQ16 z bajtem 0x55 i GPIO IRQ18 z high. Main konsumuje każdą flagę raz, ustawia trzy bity, OUT=0x7, IN=0x17, pass=1.
\end{ESCBlockFrame}
\begin{ESCBlockFrame}{TASK04 · Zapis dowodu ucznia}
\textbf{1. Przewidywanie przed uruchomieniem}\par\noindent\dotfill\par\noindent\dotfill\par\textbf{2. Log RTL: timer, UART16, GPIO18 i efekty main}\par\noindent\dotfill\par\noindent\dotfill\par\textbf{3. Dowód dwóch dispatcherów i końcowego OUT/IN}\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}
