This shows you the differences between two versions of the page.
so2:laboratoare:lab06:exercitii [2018/03/27 22:49] ionel.ghita |
so2:laboratoare:lab06:exercitii [2018/03/28 09:17] (current) ionel.ghita [4. [1.5p] Operații blocante] |
||
---|---|---|---|
Line 96: | Line 96: | ||
===== [10.5p] Exerciții ===== | ===== [10.5p] Exerciții ===== | ||
+ | |||
+ | <note important> | ||
+ | Înainte de începerea rezolvării laboratorului, rulați comanda ''%%git pull --rebase%%'' in directorul ''~/so2/linux'', pentru a obține ultima versiune a scheletului de laborator. | ||
+ | </note> | ||
==== 1. [2p] Timer ==== | ==== 1. [2p] Timer ==== | ||
Line 189: | Line 193: | ||
Observați că programul cauzează eroare pentru că se apelează o funcție blocantă în context atomic (handler-ul de timer rulează în context amânabil/întrerupere). | Observați că programul cauzează eroare pentru că se apelează o funcție blocantă în context atomic (handler-ul de timer rulează în context amânabil/întrerupere). | ||
+ | <note tip> | ||
+ | Pentru a obține un pointer la datele private ale modulului (structura ''my_device_data''), puteți folosi macro-ul [[https://elixir.bootlin.com/linux/v4.15/source/include/linux/timer.h#L143|from_timer]], | ||
+ | care este similar cu [[https://elixir.bootlin.com/linux/v4.15/source/tools/include/linux/kernel.h#L26|container_of]]. | ||
+ | <code c> | ||
+ | static void timer_handler(struct timer_list *tl) | ||
+ | { | ||
+ | struct my_device_data *data = from_timer(data, tl, timer); | ||
+ | ... | ||
+ | } | ||
+ | </code> | ||
+ | </note> | ||
==== 5. [1.5p] Workqueues ==== | ==== 5. [1.5p] Workqueues ==== | ||