Це домашнє завдання поєднує елементи з декількох попередніх. В L04 ви працювали зі списками, в L06 — з таймерами і в L07 з перериваннями.
Тепер:
Створіть тип (структуру) даних для збереження у спискові, яка включає послідовний номер та час ktime.
Створіть тип даних для голови списка, яка включає спінлок для обмеження доступу до списку. Також тут буде поле поточного номера для запису у структуру даних списку. Статично створіть екземпляр такої структури. Бажано і спінлок, і голову списку проініціалізувати статично в C99-стилі відповідними макросами, але можна і викликами з init-функції.
Подібно до L04 на етапі цініціалізації виділіть пам'ять для п'яти елементів списку, проініціалізуйте поля номера та часу нулями і розмістіть їх у списку (друкувати нічого не треба). Це буде кільцевий список подій.
Ініціалізуйте переривання, як в L07, та за зразком L06 періодичний таймер (jiffies) з періодом одна секунда.
У таймерній функції Інкрементуйте поточний номер і отримайте поточний час. Отримайте вказівник на перший елемент (не вилучаючи його зі списку), і якщо поточний номер у структурі нульовий, то * занесіть в його поля новий поточний номер та час (ktime). * проверність список (list_rotate_left()), таким чином роблячи щойно заповнений елемент останнім інакше надрукуйте повідомлення про переповнення списку з номером, який не вдалося розмістити.
У thread_fn обробника переривання Пройдіть по списку (safe тут непотрібне) з голови до першого елемента, у якого поточний номер не нульовий. Якщо такий елемент є, скопіюйте значення полів у локальні змінні, зануліть поля елемента і вийдіть з циклу. Після розблокування списку (лок ми стараємося зайняти на якомога малий час) надрукуйте номер і час, або повідомлення, що у списку не було заповненого елемента.
Не забудьте заблокувати доступ до списку відповідними спінлоком (у вас зі списком працює таймерна bh функція і thread обробника переривань).
В exit все звільніть у правильному порядку.
Залежно від співвідношення періода таймера та частоти натискання кнопки можна отримати різний друк. Для полегшення отримання вищої частоти можна переривання від кнопки зробити по обох перепадах.