Совместное использование сопрограмм и событий для программирования встроенных систем

Обложка

Полный текст

Открытый доступ Открытый доступ
Доступ закрыт Доступ предоставлен
Доступ закрыт Только для подписчиков

Аннотация

Предложена новая методология построения программ для встроенных систем реального времени. Программа, написанная на языке C/C++, исполняется без помощи операционной системы и позволяет реализовать как событийно-ориентированный подход, так и параллельное выполнение с помощью сопрограмм. Обработка событий и выполнение сопрограмм производится в ядре мягкого реального времени на уровне приоритета программных прерываний. Сопрограмма рассматривается как частный случай события, где возобновляемая функция сопрограммы выполняется в качестве обработчика события. Для возобновления сопрограммы после приостановки ее событие повторно отправляется на обработку, до тех пор пока возобновляемая функция не будет полностью выполнена. Таким образом, в ядре происходят как обработка простых событий, так и планирование выполнения сопрограмм. Событиям могут назначаться различные приоритеты обработки. Ядро мягкого реального времени может быть расширено для работы в симметричной многопроцессорной системе. Сочетание сопрограмм и простых событий позволяет реализовать технологию fork/join, а также средства параллельного программирования, сходные с инструментами языков Go и occam. Новая методология была воплощена на языке C++ в виде библиотеки DORSECC, адаптированной для различных процессоров ARM и Blackfin. С ее помощью были созданы встроенные вычислительные системы реального времени, применяемые в серийно выпускаемых машинах для сортировки банкнот. Эти системы используются как для распознавания образов методом каскада классификаторов, так и для управления датчиками и приводами механизма с применением автоматного программирования. Их общее количество в эксплуатации превысило 20000. Ядро мягкого реального времени в указанных системах обеспечивает среднюю длительность обработки события на уровне десятков микросекунд при субмикросекундных накладных затратах.

Полный текст

Доступ закрыт

Об авторах

П. В. Минин

ООО “КБ “ДОРС”

Автор, ответственный за переписку.
Email: p.minin@dors.ru
Россия, Москва

Список литературы

  1. Knuth D. The Art of Computer Programming: Fundamental Algorithms. Addison-Wesley, Reading, Massachusetts, the USA. 1997. P. 193–200.
  2. Dunkels A., Schmidt O., Voigt T., Ali M. Protothreads: Simplifying Event-Driven Programming of MemoryConstrained Embedded Systems. Proceedings of the Fourth ACM Conference on Embedded Networked Sensor Systems (SenSys 2006), Boulder, Colorado, the USA, November 2006.
  3. Libtask: a Coroutine Library for C and Unix. https://swtch.com/libtask/. Accessed 21.03.2023.
  4. The Boost C++ Libraries. Chapter 51: Boost.Coroutine. https://theboostcpplibraries.com/boost.coroutine. Accessed 21.03.2023.
  5. The Boost C++ Libraries. Chapter 32: Boost.Asio. https://theboostcpplibraries.com/boost.asio. Accessed 21.03.2023.
  6. CO2 Coroutine. https://github.com/jamboree/co2. Accessed 21.03.2023.
  7. Goodspeed N. Stackful Coroutines and Stackless Resumable Functions. The C++ Standards Committee – ISOCPP Document N4232. December 13, 2014. https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2014/n4232.pdf.
  8. Belson B., Holdsworth J., Xiang W., Philippa B. A Survey of Asynchronous Programming Using Coroutines in the Internet of Things and Embedded Systems. ACM Transactions on Embedded Computer Systems. April 2019. V. 18. № 3. Article 21. https://doi.org/10.1145/3319618.
  9. Moskała M. Kotlin Coroutines: Deep Dive. Kt. Academy, Warsaw, Poland. 2022.
  10. FreeRTOS Kernel. Co-routines. https://www.freertos.org/croutine.html. Accessed 01.11.2023.
  11. Шалыто А.А. Парадигма автоматного программирования. Научно-Технический вестник ИТМО. 2008. Выпуск 53: Автоматное программирование.
  12. Ousterhout J. Why Threads are a Bad Idea (for most purposes). January 1996. USENIX Winter Technical Conference, San Diego, California, the USA.
  13. Lee E. The Problem with Threads. Computer. 2006. V. 39. P. 33–42.
  14. Samek M. Who Moved My State? Dr. Dobb’s (online). April 1, 2003. https://drdobbs.com/who-moved-my-state/184401643
  15. Samek M. Practical Statecharts in C/C++: Quantum Programming for Embedded Systems. CMP Books, San-Francisco, the USA. 2002.
  16. Gamma E., Helm R., Johnson R., Vlissides J. Design Patterns: Elements of Reusable Object-Oriented Software. Addison-Wesley, Reading, Massachusetts, the USA. 1995. P. 293.
  17. Kernel-Mode Driver Architecture Design Guide: Introduction to DPC Objects. https://learn.microsoft.com/en-us/windows-hardware/drivers/kernel/introduction-to-dpc-objects. Accessed 21.03.2023.
  18. Deferred Work – The Linux Kernel Documentation. https://linux-kernel-labs.github.io/refs/heads/master/labs/deferred_work.html. Accessed 21.03.2023.
  19. Nicholl R.A. A Specification of Modula-2 Process (Coroutine) Management. Journal of Pascal, Ada & Modula-2. 1988. V. 7. № 5. P. 16–22.
  20. Tatham S. Coroutines in C (online). https://www.chiark.greenend.org.uk/~sgtatham/coroutines.html. 2000.
  21. Dunkels A., Grönvall B., Voigt T. Contiki – A Lightweight and Flexible Operating System for Tiny Networked Sensors. Proceedings of the Conference on Local Computer Networks. 2004. P. 455–462. https://doi.org/10.1109/LCN.2004.38
  22. Barnett D., Massa A. Inside the uIP Stack. Dr Dobbs Journal (online). February 1, 2005. https://www.drdobbs.com/inside-the-uip-stack/184405971
  23. Dunkels A. Programming Memory-Constrained Networked Embedded Systems. Swedish Institute of Computer Science Doctoral Thesis (online). SICS Dissertation Series 47. February 2007. http://www.diva-potal.org/smash/get/diva2:1041306/FULLTEXT01.pdf
  24. Perlis A. Epigrams on programming. ACM SIGPLAN Notices. September 1982. V. 17. № 9. P. 7–13. https://doi.org/10.1145/947955.1083808
  25. McCool M., Reinders J., Robison A. Structured Parallel Programming: Patterns for Efficient Computation. Morgan Kaufmann, Burlington, Massachusetts, the USA. 2012. P. 209–252.
  26. Cox-Buday K. Concurrency in Go. O’Reily Media, Sebastopol, California, the USA. 2017.
  27. Roscoe A., Hoare C.A.R. The Laws of Occam Programming. Theoretical Computer Science. 1988. V. 60. P. 177–229. https://doi.org/10.1016/0304-3975(88)90049-7
  28. Hoare C.A.R. Communicating sequential processes. Prentice-Hall, Englewood Cliffs, New Jersey, the USA. 1985.
  29. Lampson B.W., Redell D.D. Experience with processes and monitors in Mesa. Comm. of the ACM. 1980. V. 23. № 2. P. 105–117.
  30. Love R. CPU Affinity. Linux Journal (online). July 1, 2003. https://www.linuxjournal.com/article/6799
  31. Gujarati A., Cerqueira F., Brandenburg B. Multiprocessor real-time scheduling with arbitrary processor affinities: from practice to theory. Real-Time Systems. 2015. V. 51. P. 440–483. https://doi.org/10.1007/s11241-014-9205-9
  32. Hoberock J., Garland M., Kohloff C. et al. A Unified Executors Proposal for C++. The C++ Standards Committee – ISOCPP Document P0443R14. September 15, 2020. https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2020/p0443r14.html
  33. Bell J. Threaded code. Communications of the ACM. 1973. V. 16. № 6. P. 370–372. https://doi.org/10.1145/362248.362270.
  34. Rather E., Colburn D., Moore C. The evolution of Forth. In: History of programming languages – II. ACM Other Books. 1 January 1996. P. 625–670. https://doi.org/10.1145/234286.1057832 ISBN 9780201895025
  35. Reid G. Thinking in PostScript. Addison-Wesley, Reading, Massachusets, the USA. 1990. P. 105–118.

Дополнительные файлы

Доп. файлы
Действие
1. JATS XML
2. Рис. 1. Система событий. Показана отправка события класса Event_3 в очередь FIFO (без заполнения события параметрами).

Скачать (292KB)
3. Рис. 2. Последовательность операторов возобновляемой функции сопрограммы.

Скачать (138KB)
4. Рис. 3. Обработка простых событий и сопрограмм в системе событий. Event_XX может быть классом как простого события, так и сопрограммы.

Скачать (389KB)

© Российская академия наук, 2024