ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Четверг
28 ноября
405611 Топик полностью
fk0, легенда (27.04.2013 16:47, просмотров: 185) ответил Mahagam на у меня 98% вызовов библиотечных функций - это тупо memcpy() да memset(). всё. остальное - свой код, который пишется вручную. а вы что? используете кодогенераторы? или как?
А malloc? rand? А errno, наконец? А на errno, между прочим, завязана масса функций из math.h -- всё это неиспользовать, написать своё? Уже маразм в полную силу, не кажется? И попрошу заметить, во вменяемых ОС с потокобезопасностью всего этого проблем нет благодаря тому, что: 1) есть TLS, 2) libc предусматривает его использование. И MMU тут притянут за уши. TLS -- это лишь способ понимать в каком ты потоке. В некоторых libc, например, newlib, эта проблема решена. И если libc позволяет многопоточность, если "ОС" имеет что-то вроде TLS -- нет проблем. А если нет ни того, ни другого, то не надо заниматься маразмом. Позарез нужно вытеснение: либо бери другие средства разработки, возможно другой MCU. Либо таки да, биглуп, кооперативные ОС и т.п. Вообще интересный вопрос, какие это такие задачи требуют "вызываться строго по времени". А если таки требуют то есть time triggered архитектура, без вытеснений. Или попросту таймеры и прерывания гарантируют вызов строго по времени. over9000 потоков не нужно. Т.е. нужно, но в невменяемых "фриртос", где нет ни механизма обработки событий, ни возможности одновременного ожидания более чем одного события, ни (возможно, не знаю) асинхронных сигналов (прерываний). В качестве примера можно привести linux -- у меня сейчас на десктопе всего 149 процессов и 259 потоков (всего). Какие тысячи? Причём многопоточные с очень большим числом потоков: firefox, его plugin-container и console-kit-daemon. Остальные процессы однопоточные, или есть несколько потоков (у единичных процессов), меньше десятка. И это всё работает и TLS там есть и нужен. Хороший пример программы сходной с типовыми embedded задачами -- любая GUI-программа. Которая обрабатывает одновременно большое количество событий. И что характерно, для этого достаточно одного потока. Потому, что есть механизм событийно-ориентированного программирования. Я не говорю, что вытесняющая многозадачность плохая и ненужная. Она дейстительно легко решает задачу медленных вычислений в одном потоке и необходимости быстрой реакции в другом. Но вытеснение -- это не серебрянная пуля в программировании и действительно нужно редко. Гораздо важней может быть какой-то мехазнизм обработки событий (вроде слотов и сигналов в QT, очередь событий наподобии таковой в GUI системах и т.п.) Потому, что сколько-нибудь большая программная система без такого механизма в виде big-loop существовать попросту не может (проверки условий в big loop займут 90% CPU). Проблема в том, что многие (кооперативные или вытесняющие) ОС такого механизма не предоставляют и более того, его невозможно построить на базе функций ОС. Верней можно и без ОС, можно в ОС, но в пределах одного процесса. А раз так, то возможно "таск-шедулер" а-ля freertos вовсе не нужен. Нужна примитивная unix-подобная ОС для задач требующих вытеснения (а их совсем не много и они вполне могут являться полностью изолированными процессами, тем более что те же примитивы синхронизации, предоставляемые freertos, доступны и для раздельных процессов, включая разделяемую память). Вот мои размышления на данный счёт.
[ZX]