Add FreeRTOS heap4 intro card
This commit is contained in:
+153
@@ -0,0 +1,153 @@
|
||||
\documentclass[12pt]{article}
|
||||
\usepackage[T1]{fontenc}
|
||||
\usepackage[utf8]{inputenc}
|
||||
\usepackage[polish]{babel}
|
||||
\usepackage[a4paper,margin=2.0cm]{geometry}
|
||||
\usepackage{array}
|
||||
\usepackage{tabularx}
|
||||
\usepackage{xcolor}
|
||||
\usepackage{listings}
|
||||
\usepackage{hyperref}
|
||||
\usepackage{fancyhdr}
|
||||
\usepackage{lastpage}
|
||||
\usepackage{enumitem}
|
||||
|
||||
\definecolor{accent}{HTML}{16324A}
|
||||
\definecolor{accentlight}{HTML}{EEF3F7}
|
||||
\definecolor{rulegray}{HTML}{D7DEE5}
|
||||
\hypersetup{colorlinks=true,linkcolor=blue,urlcolor=blue,citecolor=blue}
|
||||
\IfFileExists{build-meta.tex}{\input{build-meta.tex}}{\newcommand{\BuildCommit}{local}}
|
||||
\newcommand{\PublisherDomain}{mpabi}
|
||||
\newcommand{\DocumentAuthor}{M. Pabiszczak}
|
||||
\newcommand{\DocumentYear}{2026}
|
||||
\newcommand{\CardArea}{inf}
|
||||
\newcommand{\CardSeries}{rv32i-freertos}
|
||||
\newcommand{\CardNumber}{01}
|
||||
\newcommand{\CardCount}{??}
|
||||
\newcommand{\CardSlug}{heap4}
|
||||
\newcommand{\CardVersion}{v0.1}
|
||||
\newcommand{\DocumentKey}{\PublisherDomain/\CardArea/\CardSeries/\CardNumber/\CardSlug/\CardVersion}
|
||||
\newcommand{\DocumentUUID}{4654524c-73f2-46df-83a3-d448ba6d6c5a}
|
||||
\renewcommand{\lstlistingname}{Listing}
|
||||
\renewcommand{\lstlistlistingname}{Lista listingów}
|
||||
|
||||
\lstset{basicstyle=\ttfamily\small,columns=fullflexible,keepspaces=true,frame=single,breaklines=true,showstringspaces=false,numbers=left,numberstyle=\tiny\color{accent},stepnumber=1,numbersep=8pt,backgroundcolor=\color{accentlight},rulecolor=\color{rulegray},captionpos=b}
|
||||
\newcommand{\TaskSection}[4]{\section{Task #1: #3}#4\lstinputlisting[language=C,caption={Task #1: #3},label={lst:task#1-c}]{../src/tasks/#2.c}\lstinputlisting[basicstyle=\ttfamily\scriptsize,caption={ASM dla task #1},label={lst:task#1-asm}]{../build/#2/#2.s}}
|
||||
|
||||
\pagestyle{fancy}
|
||||
\fancyhf{}
|
||||
\lhead{\textbf{FreeRTOS: heap\_4}}
|
||||
\rhead{\small \DocumentAuthor, \DocumentYear}
|
||||
\lfoot{\scriptsize commit \BuildCommit}
|
||||
\cfoot{\scriptsize \thepage/\pageref{LastPage}}
|
||||
\rfoot{\scriptsize uuid \DocumentUUID}
|
||||
\renewcommand{\headrulewidth}{0.4pt}
|
||||
\setlength{\headheight}{18pt}
|
||||
\setlength{\footskip}{24pt}
|
||||
|
||||
\begin{document}
|
||||
\sloppy
|
||||
\noindent
|
||||
\begin{tabular}{@{}lp{0.72\textwidth}@{}}
|
||||
Project: & FreeRTOS: \texttt{heap\_4} \\
|
||||
Subject: & Informatyka \\
|
||||
Level: & 1, Zakres Podstawowy, PP \\
|
||||
Topic: & dynamiczna alokacja pamięci, lista wolnych bloków, scalanie bloków \\
|
||||
Revision date: & 02.05.2026 \\
|
||||
Status: & Draft \\
|
||||
Card in series: & \small\texttt{\CardNumber/\CardCount} \\
|
||||
Card version: & \small\texttt{\CardVersion} \\
|
||||
Card key: & \small\texttt{\DocumentKey} \\
|
||||
UUID: & \small\texttt{\DocumentUUID} \\
|
||||
Commit: & \small\texttt{\BuildCommit} \\
|
||||
Scope: & pierwsza karta serii FreeRTOS; model dydaktyczny mechaniki \texttt{heap\_4.c} \\
|
||||
Files used: & \small
|
||||
\begin{tabular}[t]{@{}l@{}}
|
||||
Task01: \texttt{task01\_heap\_map.c} \\
|
||||
Task02: \texttt{task02\_free\_list.c} \\
|
||||
Task03: \texttt{task03\_heap\_init.c} \\
|
||||
Task04: \texttt{task04\_alignment.c} \\
|
||||
Task05: \texttt{task05\_malloc\_first\_fit.c} \\
|
||||
Task06: \texttt{task06\_split\_block.c} \\
|
||||
Task07: \texttt{task07\_free\_insert.c} \\
|
||||
Task08: \texttt{task08\_coalescing.c} \\
|
||||
Task09: \texttt{task09\_config\_macros.c} \\
|
||||
Task10: \texttt{task10\_heap4\_demo.c} \\
|
||||
Common: \texttt{heap4\_common.h} \\
|
||||
Runtime: \texttt{memops.c} \\
|
||||
Startup: \texttt{crt0.S}
|
||||
\end{tabular}
|
||||
\end{tabular}
|
||||
|
||||
\vspace{0.8em}
|
||||
\noindent\rule{\textwidth}{0.5pt}
|
||||
|
||||
\section{Cel}
|
||||
Ta karta zaczyna serię FreeRTOS od \texttt{heap\_4}, ponieważ ten plik jest
|
||||
naturalnym pomostem po kartach z języka C. Wymaga wskaźników, tablic,
|
||||
struktur, listy jednokierunkowej, \texttt{static}, \texttt{typedef}, makr oraz
|
||||
arytmetyki adresów, ale nie wymaga jeszcze schedulera, przerwań ani
|
||||
uruchamiania tasków.
|
||||
|
||||
Przykłady są małym modelem edukacyjnym mechaniki \texttt{heap\_4.c}. Nie są
|
||||
kopią pliku upstream FreeRTOS. Na RV32I wyniki są zapisywane w globalnych
|
||||
zmiennych \texttt{volatile}; \texttt{printf} jest dostępny wyłącznie w wariancie
|
||||
hostowym przez flagę \texttt{-DHOST\_PRINTF=1}.
|
||||
|
||||
\lstinputlisting[language=C,caption={Wspólny nagłówek dla karty \texttt{heap\_4}},label={lst:common-h}]{../src/tasks/heap4_common.h}
|
||||
|
||||
\subsection{\texttt{static inline} w nagłówku}
|
||||
Helpery z Listingu~\ref{lst:common-h} są zapisane jako \texttt{static inline},
|
||||
bo każdy task jest osobnym programem i dołącza ten sam nagłówek. \texttt{static}
|
||||
daje prywatną kopię funkcji w każdym pliku \texttt{.c}, a \texttt{inline}
|
||||
pozwala kompilatorowi wstawić krótkie obliczenia, takie jak wyrównanie rozmiaru
|
||||
lub sprawdzenie bitu alokacji, bez kosztu zwykłego wywołania funkcji.
|
||||
|
||||
\section{Mapa karty}
|
||||
\begin{tabularx}{\textwidth}{|p{2.1cm}|X|}
|
||||
\hline
|
||||
Task & Temat \\
|
||||
\hline
|
||||
1 & Mapa pojęć: obszar sterty, nagłówek bloku i bit alokacji. \\
|
||||
\hline
|
||||
2 & Lista wolnych bloków jako lista jednokierunkowa. \\
|
||||
\hline
|
||||
3 & Inicjalizacja sterty, pierwszy wolny blok i wartownik końca listy. \\
|
||||
\hline
|
||||
4 & Wyrównanie rozmiarów żądań i adresu początku sterty. \\
|
||||
\hline
|
||||
5 & Pierwszy pasujący blok, czyli zasada \texttt{first fit}. \\
|
||||
\hline
|
||||
6 & Podział dużego bloku na część przydzieloną i pozostały blok wolny. \\
|
||||
\hline
|
||||
7 & Zwracanie bloku i wstawianie go do listy według adresu. \\
|
||||
\hline
|
||||
8 & Scalanie sąsiednich wolnych bloków. \\
|
||||
\hline
|
||||
9 & Makra konfiguracyjne oraz hostowy \texttt{TRACE\_PRINTF}. \\
|
||||
\hline
|
||||
10 & Mini-demonstracja sekwencji \texttt{malloc/free}. \\
|
||||
\hline
|
||||
\end{tabularx}
|
||||
|
||||
\TaskSection{01}{task01_heap_map}{mapa \texttt{heap\_4}}{Listing~\ref{lst:task01-c} pokazuje nagłówek bloku, wyrównanie rozmiaru i bit oznaczający blok zajęty.}
|
||||
\TaskSection{02}{task02_free_list}{lista wolnych bloków}{Listing~\ref{lst:task02-c} przechodzi po liście wolnych bloków i liczy sumę dostępnej pamięci.}
|
||||
\TaskSection{03}{task03_heap_init}{inicjalizacja sterty}{Listing~\ref{lst:task03-c} tworzy pierwszy wolny blok oraz końcowy znacznik listy.}
|
||||
\TaskSection{04}{task04_alignment}{wyrównanie}{Listing~\ref{lst:task04-c} pokazuje, dlaczego alokator zaokrągla rozmiary i adres początku sterty.}
|
||||
\TaskSection{05}{task05_malloc_first_fit}{\texttt{first fit}}{Listing~\ref{lst:task05-c} wybiera pierwszy wolny blok wystarczająco duży dla żądania.}
|
||||
\TaskSection{06}{task06_split_block}{podział bloku}{Listing~\ref{lst:task06-c} zostawia resztę dużego bloku na liście wolnych bloków.}
|
||||
\TaskSection{07}{task07_free_insert}{\texttt{free} i wstawianie}{Listing~\ref{lst:task07-c} zwraca blok do listy tak, aby lista pozostała posortowana po adresach.}
|
||||
\TaskSection{08}{task08_coalescing}{scalanie bloków}{Listing~\ref{lst:task08-c} scala blok z lewym i prawym sąsiadem, gdy adresy są ciągłe.}
|
||||
\TaskSection{09}{task09_config_macros}{makra konfiguracyjne}{Listing~\ref{lst:task09-c} pokazuje małe odpowiedniki makr konfiguracyjnych FreeRTOS-a.}
|
||||
\TaskSection{10}{task10_heap4_demo}{mini \texttt{heap\_4}}{Listing~\ref{lst:task10-c} łączy inicjalizację, alokację, zwalnianie i scalanie w jeden model.}
|
||||
|
||||
\section{Polecenia}
|
||||
\begin{enumerate}[leftmargin=1.6em]
|
||||
\item Zbuduj kartę dla RV32I poleceniem \texttt{make tasks}.
|
||||
\item Zbuduj wariant hostowy poleceniem \texttt{make host}; wypisywanie działa tylko przez \texttt{HOST\_PRINTF}.
|
||||
\item W tasku 6 zmień próg \texttt{MIN\_SPLIT\_SIZE} i sprawdź, kiedy blok nie jest dzielony.
|
||||
\item W tasku 8 zmień rozmiary bloków tak, aby scalanie działało tylko z prawym sąsiadem.
|
||||
\item W tasku 10 dodaj większą alokację, która ma się nie udać, i zapisz status w nowej zmiennej \texttt{volatile}.
|
||||
\end{enumerate}
|
||||
|
||||
\end{document}
|
||||
Reference in New Issue
Block a user