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 ==== | ||