% 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}{11}
\newcommand{\CardCount}{13}
\newcommand{\CardSlug}{machine-timer}
\newcommand{\CardVersion}{v00.01}
\newcommand{\DocumentUUID}{45f57fde-fc7b-5f41-a3af-f153202dff0f}

\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-machine-timer}{\qrcode[level=L,height=22mm]{https://zsl-gitea.mpabi.pl/edu-inf/lab-rv32i-c-machine-timer}}%
      \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 Machine timer: od mtime do okresowego deadline'u}\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 11/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 45f57fde-fc7b-5f41-a3af-f153202dff0f}\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 f37170be-e988-5f5d-b3cf-6ea179a9cd54}\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-machine-timer}{\nolinkurl{https://zsl-gitea.mpabi.pl/edu-inf/lab-rv32i-c-machine-timer}}}} \\%
        \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/f37170be-e988-5f5d-b3cf-6ea179a9cd54}{\nolinkurl{https://dce7fb9d-7b2f-5d49-96a2-3a30d3070b84.mpabi.pl/f37170be-e988-5f5d-b3cf-6ea179a9cd54}}}} \\%
        \end{tabularx}%
      \end{minipage}%
      \vrule width0.35pt%
      \begin{minipage}[c][23mm][c]{24mm}\centering%
        \href{https://dce7fb9d-7b2f-5d49-96a2-3a30d3070b84.mpabi.pl/f37170be-e988-5f5d-b3cf-6ea179a9cd54}{\qrcode[level=L,height=22mm]{https://dce7fb9d-7b2f-5d49-96a2-3a30d3070b84.mpabi.pl/f37170be-e988-5f5d-b3cf-6ea179a9cd54}}%
      \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ń buduje obrazy RV32I, uruchamia je z limitem cykli i sprawdza raport MMIO, mcause,\textCR liczbę ISR, powrót z pułapki oraz arytmetykę deadline'ów.}}\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 zachowania wskazuje osobno source, pending, enabled, decyzję dispatchera i\textCR efekt handlera, zamiast nazywać cały łańcuch jednym słowem timer.}}\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 źródło czasu, warunek pending, dwa poziomy enable, wybór handlera i jego efekt. Potrafi spójnie odczytać 64-bitowy licznik na RV32, uruchomić jednorazowe przerwanie oraz utrzymać fazę okresowego zegara przez deadline += period.

\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 przykłady wykonują się na rzeczywistym modelu RTL Hazard3. Task01 wymusza rollover dolnego słowa mtime. Task02 dowodzi wejścia przez slot 7 wektora, skasowania poziomowego źródła przez przesunięcie mtimecmp i wznowienia po mret. Task03 zapisuje cztery planowane i obserwowane czasy oraz spóźnienia. Host nie jest używany jako substytut urządzenia MMIO i przerwań.\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{MMIO}} & \textbf{\texttt{Task01}} & \textbf{RV32 split-register MMIO i high--low--high} & \textbf{kluczowe} \\ \hline
\hline
\textbf{\texttt{IRQ}} & \textbf{\texttt{Task02}} & \textbf{mtimecmp, pending, MTIE/MIE, mtvec, mret i rearm} & \textbf{kluczowe} \\ \hline
\hline
\textbf{\texttt{TICK}} & \textbf{\texttt{Task03}} & \textbf{deadline += period, tick sequence i lateness} & \textbf{kluczowe} \\ \hline
\end{tabularx}
\normalsize


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

\clearpage

\ESCSectionBlockStart
\section{1 — Jeden timer, pięć różnych ról}
\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{mtime} jest źródłem rosnącego czasu, a relacja \texttt{mtime >= mtimecmp} wytwarza poziomowy stan pending. \texttt{mie.MTIE} dopuszcza tę klasę przerwań lokalnie, \texttt{mstatus.MIE} dopuszcza przerwania globalnie, a \texttt{mtvec} wybiera kod według przyczyny. Dopiero handler zmienia stan programu i przesuwa komparator. Żaden z bitów enable nie kasuje źródła.

W testbenchu Hazard3 \texttt{mtime} rośnie raz na krok, a linia timera jest aktywna tak długo, jak licznik nie jest mniejszy od komparatora. Dlatego powrót bez zapisu przyszłego \texttt{mtimecmp} wywołałby następną pułapkę niemal natychmiast.
\ESCSectionBlockEnd

\ESCSectionBlockStart
\section{2 — 64 bity urządzenia na 32-bitowym rdzeniu}
\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]


Dwa odczyty 32-bitowe nie tworzą automatycznie spójnego odczytu 64-bitowego MMIO. Sekwencja high--low--high akceptuje parę dopiero wtedy, gdy oba odczyty high są równe; zmiana high oznacza rollover między transakcjami i wymusza powtórzenie. Przy zapisie komparatora kolejność high=UINT32\_MAX, low, docelowe high usuwa niebezpieczne okno z przejściowo zbyt małym \texttt{mtimecmp}.

Task01 zapisuje \texttt{mtime} tylko po to, aby fixture testbencha deterministycznie doprowadził do rolloveru. Nie jest to obietnica, że licznik czasu będzie zapisywalny w innym SoC.
\ESCSectionBlockEnd

\ESCSectionBlockStart
\section{3 — Okres to oś czasu, nie odstęp od spóźnionego now}
\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]


Dla periodycznego zegara handler wykonuje \texttt{deadline += period}. Wtedy planowana sekwencja zachowuje fazę nawet wtedy, gdy wejście do ISR następuje później niż deadline. Reguła \texttt{now + period} użyta jako jedyny model przenosi aktualne spóźnienie do następnego terminu i tworzy dryf.

Karta mierzy \texttt{lateness = observed - scheduled}; nie obiecuje stałej wartości opóźnienia. Bieżący RTL i build dają 40 taktów, lecz wynik zależy od magistrali, prologu ISR i punktu próbkowania. Przykład nie definiuje jeszcze polityki nadrabiania wielu całkowicie pominiętych okresów.
\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 · Spójny odczyt mtime przez rollover}
{\scriptsize\ttfamily c33548e4-07c8-599c-9457-8ba457701659}\par
\begin{ESCBlockFrame}{A1 CONTEXT · AKTYWNE — atomowość C nie jest atomowością MMIO}
\textbf{Zachowany przykład:} \nolinkurl{src/tasks/task01_mtime_consistent_read.c}.\par Urządzenie ma 64-bitowy licznik, lecz RV32 wykonuje trzy jawne odczyty 32-bitowych rejestrów. Typ \texttt{uint64\_t} służy do złożenia zaakceptowanych połówek; nie zamienia dwóch transakcji magistrali w jeden atomowy odczyt.
\end{ESCBlockFrame}
\begin{ESCBlockFrame}{A2 STRUCTURE · AKTYWNE — dwa słowa jednego licznika}
\texttt{timer\_hw\_t} mapuje kolejno \texttt{mtime}, \texttt{mtimeh}, \texttt{mtimecmp} i \texttt{mtimecmph} od adresu 0xc0000100. \texttt{volatile} wymusza obserwowalne dostępy C, ale regułę spójności dostarcza dopiero algorytm.
\end{ESCBlockFrame}
\begin{ESCBlockFrame}{A3 DISPATCH · N/D}
\textbf{N/D.} Task01 ma wyłączone przerwania i wykonuje bezpośredni odczyt MMIO; nie ma ISR, callbacku, tablicy funkcji ani wyboru odbiorcy.
\end{ESCBlockFrame}
\begin{ESCBlockFrame}{A4 APPLICATION · AKTYWNE — kontrolowane przejście przez 0xffffffff}
Fixture ustawia high=0 i low blisko \texttt{UINT32\_MAX}, a następnie wyszukuje małe okno, w którym high zmieni się między pierwszym i drugim odczytem. Zaakceptowany wynik musi pochodzić już z epoki high=1; kolejny odczyt nie może być mniejszy.
\end{ESCBlockFrame}
\begin{ESCBlockFrame}{A5 FLOW · AKTYWNE — read, validate, retry}
Jedna próba czyta \texttt{high\_before}, \texttt{low}, \texttt{high\_after}. Równość high kończy pętlę i pozwala złożyć wynik. Nierówność odrzuca low należące do niejednoznacznej granicy epok i powtarza wszystkie trzy transakcje.
\end{ESCBlockFrame}
\begin{ESCBlockFrame}{A6 STATE · AKTYWNE — epoka 0, rollover, epoka 1}
Stan urządzenia przechodzi z high=0 i low blisko maksimum przez rollover do high=1 i małego low. Pierwsza para high opisuje zmianę stanu, więc nie wolno do niej przypisać jednego snapshotu; druga próba stabilizuje się w epoce 1.
\end{ESCBlockFrame}
\begin{ESCBlockFrame}{A7 RUNTIME · AKTYWNE — dwa dostępy high są widocznym dowodem}
Oracle raportuje offset, liczbę prób, retry, high wyniku i monotoniczność. Bieżący RTL daje offset 0x13 i attempts=2. Listing ma pokazać dwa osobne \texttt{lw} z rejestru high, rozdzielone odczytem low, oraz gałąź powrotną przy nierówności.
\end{ESCBlockFrame}
\begin{ESCBlockFrame}{A8 PATTERNS · AKTYWNE — stabilny snapshot z licznika split-register}
Wzorzec high--low--high stosuj, gdy dokumentacja urządzenia gwarantuje monotoniczny licznik i zgodne zachowanie połówek. Fixture zapisujący czas pozostaje poza produkcyjnym API odczytu.
\end{ESCBlockFrame}
\begin{ESCBlockFrame}{Ćwiczenie · Przewidywanie → wykonanie → wniosek}
Wyjaśnij, jaki błędny 64-bitowy wynik może utworzyć pojedyncze low--high podczas rolloveru. Następnie wskaż w raporcie próbę odrzuconą przez high--low--high i rozdziel kod produkcyjnego odczytu od zapisywalnego fixture'u testbencha.
\par\textbf{Evidence:} Przewidywany błąd na granicy rolloveru, log z RTL Hazard3 z kodem wyjścia i limitem cykli, fragment listingu z dwoma odczytami high oraz wniosek o spójności zaakceptowanego snapshotu.
\par\textbf{Acceptance:} Oracle Hazard3: retry=1, attempts > 1, value\_high=1, monotonic=1, pass=1 i kod wyjścia 0. W bieżącym buildzie okno znaleziono dla offsetu 0x13 i po dwóch próbach; sam offset nie jest kontraktem architektury.
\end{ESCBlockFrame}
\begin{ESCBlockFrame}{TASK01 · Zapis dowodu ucznia}
\textbf{1. Przewidywanie przed uruchomieniem}\par\noindent\dotfill\par\noindent\dotfill\par\textbf{2. Log wykonania RTL Hazard3 i kod wyjścia}\par\noindent\dotfill\par\noindent\dotfill\par\textbf{3. Dowód w listingu: high--low--high i retry}\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 · Jednorazowe przerwanie machine timer}
{\scriptsize\ttfamily dc7f8696-19db-55b6-8fd9-cb676b399ec7}\par
\begin{ESCBlockFrame}{A1 CONTEXT · AKTYWNE — enable nie jest źródłem}
\textbf{Zachowany przykład:} \nolinkurl{src/tasks/task02_oneshot_timer_irq.c}.\par Źródłem jest relacja \texttt{mtime >= mtimecmp}; \texttt{mip.MTIP} reprezentuje pending. \texttt{mie.MTIE} i \texttt{mstatus.MIE} są dwiema bramkami. Program najpierw ustawia przyszły komparator, a dopiero potem otwiera obie bramki.
\end{ESCBlockFrame}
\begin{ESCBlockFrame}{A2 STRUCTURE · AKTYWNE — wspólny driver i stan dowodowy}
Wspólny nagłówek zawiera dostęp MMIO, bezpieczny zapis komparatora i operacje CSR. Task przechowuje osobno deadline, czas zaobserwowany, mcause, liczbę ISR, pending przed i po oraz znacznik wznowienia.
\end{ESCBlockFrame}
\begin{ESCBlockFrame}{A3 DISPATCH · AKTYWNE — przyczyna 7 wybiera handler timera}
Startup zapisuje do \texttt{mtvec} adres tablicy z bitem trybu vectored. Machine timer ma cause=7, więc rdzeń wybiera slot 7, którego skok wiąże się z silnym symbolem \texttt{isr\_machine\_timer} zamiast słabego handlera domyślnego. Atrybut GCC kończy funkcję instrukcją \texttt{mret}.
\end{ESCBlockFrame}
\begin{ESCBlockFrame}{A4 APPLICATION · AKTYWNE — one-shot z jawnym kryterium zakończenia}
Main planuje deadline 1200 taktów po spójnym odczycie. Sukces wymaga dokładnie jednego wejścia, poprawnego mcause, obserwacji nie wcześniejszej niż deadline, skasowanego pending po rearmie i wykonania instrukcji po \texttt{wfi}.
\end{ESCBlockFrame}
\begin{ESCBlockFrame}{A5 FLOW · AKTYWNE — source → pending → enable → handler → effect}
Rosnące mtime osiąga comparator i ustawia pending. Otwarty MTIE oraz MIE pozwalają wejść do wektora. Handler zapisuje obserwację i mcause, przesuwa comparator na \texttt{UINT64\_MAX}, publikuje count, a \texttt{mret} przywraca przerwany przepływ. Main ustawia resumed i zamyka maski.
\end{ESCBlockFrame}
\begin{ESCBlockFrame}{A6 STATE · AKTYWNE — DISARMED, ARMED, PENDING, HANDLED, RESUMED}
Komparator maksimum reprezentuje DISARMED. Przyszły deadline tworzy ARMED. Po osiągnięciu terminu urządzenie jest PENDING, handler ponownie zapisuje maksimum i publikuje HANDLED, a kod po pętli \texttt{wfi} potwierdza RESUMED.
\end{ESCBlockFrame}
\begin{ESCBlockFrame}{A7 RUNTIME · AKTYWNE — mcause, mip i mret}
Raport z RTL ma: count=1, mcause=0x80000007, pending 0/0, resumed=1 i deadline\_reached=1. Objdump ma pokazać zapis trzech połówek mtimecmp w handlerze oraz końcowe \texttt{mret}; zwykłe \texttt{ret} nie byłoby poprawnym powrotem z pułapki.
\end{ESCBlockFrame}
\begin{ESCBlockFrame}{A8 PATTERNS · AKTYWNE — arm before unmask, clear source before publish}
Najpierw ustaw bezpieczny stan urządzenia, potem włącz źródło w \texttt{mie}, na końcu globalne MIE. W ISR usuń poziomowe źródło przed opublikowaniem zakończenia; inaczej powrót może natychmiast wejść ponownie.
\end{ESCBlockFrame}
\begin{ESCBlockFrame}{Ćwiczenie · Przewidywanie → wykonanie → wniosek}
Ułóż w poprawnej kolejności: wyłącz maski, ustaw przyszły mtimecmp, sprawdź pending, włącz MTIE i MIE, czekaj w wfi, przesuń komparator w ISR, wróć przez mret. Dla każdego kroku nazwij source, pending, enable, decyzję dispatchera albo efekt.
\par\textbf{Evidence:} Przewidywana sekwencja source--pending--enable--dispatch--effect, log RTL Hazard3 z mcause i kodem wyjścia, fragment listingu z wektorem oraz mret i wniosek o skasowaniu poziomowego źródła.
\par\textbf{Acceptance:} Oracle Hazard3: count=1, mcause=0x80000007, pending\_before=0, pending\_after=0, resumed=1, deadline\_reached=1, pass=1 i kod wyjścia 0. Listing ISR kończy się mret.
\end{ESCBlockFrame}
\begin{ESCBlockFrame}{TASK02 · Zapis dowodu ucznia}
\textbf{1. Przewidywanie przed uruchomieniem}\par\noindent\dotfill\par\noindent\dotfill\par\textbf{2. Log wykonania RTL: mcause, pending i resume}\par\noindent\dotfill\par\noindent\dotfill\par\textbf{3. Dowód w CSR i listingu: slot 7 oraz mret}\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 · Okresowe deadline'y bez dryfu fazy}
{\scriptsize\ttfamily 6c330959-1a78-5068-8c59-6b18f712122c}\par
\begin{ESCBlockFrame}{A1 CONTEXT · AKTYWNE — harmonogram i wykonanie to dwie osie}
\textbf{Zachowany przykład:} \nolinkurl{src/tasks/task03_periodic_absolute_deadline.c}.\par Scheduled opisuje idealną oś czasu usługi, observed chwilę rzeczywistego wejścia do pomiaru w ISR, a lateness ich różnicę. Okres ma aktualizować harmonogram, nie kopiować opóźnienia wykonania do przyszłej fazy.
\end{ESCBlockFrame}
\begin{ESCBlockFrame}{A2 STRUCTURE · AKTYWNE — cztery rekordy ticków}
Trzy tablice po cztery elementy zapisują deadline, obserwację i lateness. \texttt{g\_task03\_next\_deadline} jest stanem planisty, a count publikuje liczbę kompletnych rekordów. Stała period wynosi 1600 taktów modelu.
\end{ESCBlockFrame}
\begin{ESCBlockFrame}{A3 DISPATCH · AKTYWNE — każdy MTIP trafia przez slot 7}
Dla każdego z czterech terminów rdzeń koduje interrupt bit i cause=7 w mcause, a tryb vectored wybiera ten sam \texttt{isr\_machine\_timer}. Handler sprawdza mcause przy każdym wejściu; licznik causes=4 dowodzi czterech decyzji dispatchera.
\end{ESCBlockFrame}
\begin{ESCBlockFrame}{A4 APPLICATION · AKTYWNE — stała faza i zmierzone spóźnienie}
Dla i>0 musi zachodzić \texttt{scheduled[i]-scheduled[i-1]=1600}. Dla każdego rekordu observed nie może być wcześniejsze od scheduled, a lateness musi być dokładnie ich różnicą. Po czwartym ticku comparator wraca do maksimum.
\end{ESCBlockFrame}
\begin{ESCBlockFrame}{A5 FLOW · AKTYWNE — sample, record, advance, rearm, publish}
ISR najpierw pobiera indeks i aktualny deadline, potem czyta czas oraz zapisuje rekord. Następnie oblicza deadline+period, uzbraja ten bezwzględny termin albo rozbraja po ostatnim ticku, a count publikuje dopiero na końcu. Main czeka w \texttt{wfi} do czterech rekordów.
\end{ESCBlockFrame}
\begin{ESCBlockFrame}{A6 STATE · AKTYWNE — TICK0 → TICK4 i niezmienna faza}
Stan count przechodzi 0,1,2,3,4; razem z każdym przejściem next\_deadline rośnie dokładnie o period. Po count=4 urządzenie jest DISARMED. Tablice pozostają historią czterech zakończonych przejść i są analizowane dopiero po zamknięciu masek.
\end{ESCBlockFrame}
\begin{ESCBlockFrame}{A7 RUNTIME · AKTYWNE — cztery terminy i 40 taktów bieżącego RTL}
Bieżący raport podaje deadline low 0x96b, 0xfab, 0x15eb, 0x1c2b; obserwacje są o 0x28 późniejsze. Ważne są relacje step\_ok, ordered i late\_math, ponieważ absolutne wartości oraz 40 taktów mogą się zmienić po zmianie RTL, optymalizacji lub prologu ISR.
\end{ESCBlockFrame}
\begin{ESCBlockFrame}{A8 PATTERNS · AKTYWNE — absolute periodic deadline}
\texttt{deadline += period} zachowuje fazę. Gdyby następny termin powstał wyłącznie jako \texttt{observed + period}, jego przesunięcie względem osi absolutnej byłoby równe bieżącemu lateness; powtarzanie tej reguły kumuluje dryf. Osobna polityka musi zdecydować, czy po dużym opóźnieniu nadrabiać, pomijać, czy zgłaszać błąd.
\end{ESCBlockFrame}
\begin{ESCBlockFrame}{Ćwiczenie · Przewidywanie → wykonanie → wniosek}
Dla czterech ticków porównaj scheduled, observed i lateness. Udowodnij stały krok 1600 oraz wyprowadź, o ile przesunąłby następną fazę model now+period. Wyjaśnij granicę: przykład nie nadrabia dowolnej liczby całkowicie pominiętych okresów.
\par\textbf{Evidence:} Przewidywana sekwencja czterech deadline'ów, log RTL Hazard3 z planowanymi i obserwowanymi czasami, kontrola różnic i kodu wyjścia oraz wniosek porównujący deadline+period z now+period.
\par\textbf{Acceptance:} Oracle Hazard3: count=causes=4, period=1600, step\_ok=ordered=late\_math=naive\_shift\_ok=pass=1. Bieżący pomiar daje cztery lateness po 40 taktów, ale test nie uznaje liczby 40 za kontrakt sprzętowy.
\end{ESCBlockFrame}
\begin{ESCBlockFrame}{TASK03 · Zapis dowodu ucznia}
\textbf{1. Przewidywanie przed uruchomieniem}\par\noindent\dotfill\par\noindent\dotfill\par\textbf{2. Log RTL: deadline, observed i lateness}\par\noindent\dotfill\par\noindent\dotfill\par\textbf{3. Dowód stałego kroku i braku dryfu fazy}\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}
