ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Воскресенье
22 декабря
467695 Топик полностью
fk0легенда (26.11.2013 18:13, просмотров: 971) ответил aoreh на Похоже... Ну, честно говоря, я бы не сказал, что без этого прям невозможно использовать FreeRTOS
Есть два подхода к многозадачности. Полная изоляция процессов -- у каждого свой контекст, свой набор переменных, стек и т.п. Это реализуется в unix и там ничего не нужно. Среди RTOS для МК можно отметить nuttx. Есть подход ecos-style практикуемый чаще: процессов а-ля юникс нет, есть потоки, которые запросто имеют общее адресное пространство, переменные. Разный только стек. И общая у них оказывается (её переменные) C-библиотека, да и вообще все библиотеки, функции программы со статическими переменными и т.п. Это ведёт к неприятным последствиям: если кто-то один вызвал, в C-библиотеке например, malloc, то до завершения его (malloc) исполнения другим потокам нельзя вызывать malloc, иначае две функции одновременно начнут портить один набор переменных и всё будет испорчено. Поэтому в "больших ОС" и даже в eCOS есть понятие TLS и библиотека C, а также другие библиотеки и функции которым оно необходимо, могут хранить для каждого потока свой набор переменных в своём "thread local storage". И, кроме того, если планируется изменение общих переменных, то оно обставляется какими-то примитивами синхронизации, чтоб не допустить порчи. А теперь представим случай, когда берём типичный C-компилятор для МК, в его составе библиотека (без связки с ОС, без TLS). И поверх прикручиваем ОС. Будет работать? Нет. Точней так, в каких-то простых случаях будет, а дальше будет глючить загадочно и в произвольных местах. Либо не использовать C-библиотеку. Да и свой код без TLS не всегда можно писать (как отличать два экземпляра одинакового процесса, переменные для них?) Для поморгать двумя диодиками впраллель -- годится. Для сколько-нибудь больших проектов -- нет.
[ZX]