Сьогодні якраз була задачка куди можна припхати RTOS. Значить дано: датчик, шось він ловить і має дьорнути якусь іншу залізяку.
Найпростіший і найтупіший спосіб це зробити — забити на RTOS, і постійно перевіряти датчик на наявність показників, тобто:
while (1)
{
if (data_ready())
{
// read data do stuff
}
}
Аднааака, ходити туди сюди по дротам 100500 разів на секунду це теж недешева забава, може зайняти десь 100 мікросекунд. Тобто потенційно затримка на отримування показників може бути 100+ мкс.
Сенсор віддає дані наприклад з частотою в 60Гц, тому нема сенсу перевіряти його частіше ніж кожні 16.666мс. Отже можна скористатись FreeRTOS і винести функцію яка працює з показниками у окремий таск який буде викликатись 60 разів на секунду. Таким чином ми ще й розвантажуємо ядро, щоб можна було робити іншу роботу, за потреби. Кількість вказаних мілісекунд конвертується в кроки процесору, таким чином досягається приблизна точність в часі.
Тепер виходить, що в нас і сенсор і контроллер працюють на 60Гц, але вони при цьому не синхронізовані. Тобто є дві доріжки, на кожній шось відбувається приблизно кожні 16.666мс, але зі зсувом. Це як два годинники які запустили неодночасно. Таким чином все одно маємо затримку, яка ще і гуляє по часу.
Покращити це можна використавши приривання, якщо в сенсорі є такий інтерфейс. По суті, замість того щоб перевірять датчик на наявність даних, ми чекаємо від нього сигналу. А щоб впевнитись, що реакція на сигнал буде якомога швидшою, функція реєструється як обробник преривання, тобто такою що буде викликана з високим пріорітетом. Тут все одно буде якась затримка, але хоча б стабільна, бо тепер контролер синхронізований з датчиком.
Далі є DMA (direct memory access), але для моїх задач навіть вищеописаного забагато, достатньо безкінченого циклу)
Post #853
1.1K
- 👍 12