stl — Потокобезопасность C ++ на MicroBlaze

Кто-нибудь когда-либо писал многопоточное приложение C ++ для MicroBlaze? В документации Xilinx говорится, что:

Стандартная библиотека C, поставляемая с EDK, не предназначена для многопоточной среды. Функции STDIO, такие как printf (), scanf () и функции управления памятью, такие как malloc () и
free () — это типичные примеры функций, которые не являются поточно-ориентированными. При использовании библиотеки C
в многопоточной среде надлежащие методы взаимного исключения должны использоваться для защиты
небезопасные функции.

Кроме того, MicroBlaze GCC сообщает, что модель потока «одиночная».

Если я использую стандартные библиотечные контейнеры C ++, это, безусловно, небезопасно, верно?

У меня есть куча времени, даже когда я получаю ответ на этот простой вопрос от Xilinx, не говоря уже о способе его исправить. Похоже, что это основной недостаток системы сборки, предоставляемой Xilinx.

4

Решение

Ответ от Xilinx (по электронной почте) ниже. Он не упоминает о многопоточности. Он также ссылается на их программный инструмент 8.2i, выпущенный в 2006 году (6 лет назад !!!). Короче говоря, это не имеет смысла.

Уроки выучены:

  • Поддержка Xilinx ужасна.
  • Программные инструменты Xilinx являются запоздалой мыслью для них.
  • Я могу только предположить, что то, что изложено в документации, правильно, в частности, что вы не можете использовать динамическое выделение памяти в многопоточной среде. Это означает отсутствие стандартных библиотечных контейнеров c ++.
  • Если вы аппаратный человек, который собирается выбрать программный процессор MicroBlaze, обратитесь к специалисту по прошивке, прежде чем сделать это. Какие приложения он ожидает написать? Убедитесь, что он знает, что он не может написать многопоточное приложение на C ++.

таНос ()

Библиотека Microblaze C поставляется с небольшой минимальной функциональностью
таНос (). При использовании память не может быть освобождена. Другие функции такие
as calloc, realloc и т. д. не поддерживаются. Были и ошибки
при использовании как malloc (), так и таких подпрограмм, как printf, scanf и т. д.
исправить это, минимальная функциональность malloc () была удалена. Она имеет
был заменен оригинальным NewLib Malloc (). В результате вы должны увидеть
НИКАКИХ проблем с функциональностью. Вы можете увидеть увеличение размера кода примерно на
4K. Из-за различий, в которых новый полный функционал
malloc () запрашивает память, пользовательским программам может понадобиться просмотреть их
Настройки размера кучи. Если вы видите, что ваши вызовы malloc () возвращают NULL,
где они работали, попробуйте увеличить размер кучи. Это изменение
было важно исправить сломанную функциональность.

Для редких случаев, когда вы все еще хотите оригинальный легкий, но
нарушена функциональность malloc (), исходный код (malloc.S) может быть
включены в качестве одного из исходных файлов, которые будут скомпилированы для создания вашего
приложение. Это сохранит старый функционал, размер кода
требования и требования к динамической памяти до EDK 8.2i.

xil_malloc ()

Библиотека MicroBlaze C поставляется с альтернативной реализацией
динамическое выделение памяти называется xil_malloc (). Эта рутина имеет некоторые
ограничения; он не выделяет память из кучи, а скорее
из фиксированного буфера 64К. Эта рутина теперь устарела. Хоть
эта процедура все еще доступна для связи, ее использование настоятельно
не рекомендуется. Пожалуйста, используйте malloc (); это меньше, чем xil_malloc () и
обеспечивает лучшую функциональность. При использовании malloc () обязательно
просмотрите ваши настройки размера кучи, чтобы удовлетворить вашу динамическую память
требования.

Автономный BSP содержит параметр «need_xil_malloc». это
Параметр был предназначен, чтобы позволить вам написать код, который содержит
malloc (), но подключите его к реализации xil_malloc (). Из-за ошибок
в реализации параметра и из-за износа
xil_malloc (), этот параметр также устарел.

Xilkernel содержит параметр «use_xil_malloc». Этот параметр был
предназначен для того, чтобы позволить реализациям очереди сообщений ядра использовать
xil_malloc () вместо malloc (). Из-за обесценивания
xil_malloc (), этот параметр также устарел.

Если вам все еще нужен исходный код xil_malloc () по старым причинам,
Файлы «xil_malloc.c» и «xil_sbrk.c» могут быть загружены и использованы.

Приложения C ++

До EDK 8.2i приложения C ++ могли демонстрировать необычное поведение,
повреждение памяти и т. д. Чтобы устранить эти проблемы, включите прилагаемый
исходный файл (newlib_malloc.c) как часть вашей компиляции приложения.
Это исправит необъяснимые сбои. Этот обходной путь исправляет ошибки в
реализация malloc () в библиотеке MicroBlaze C. это
Обход был включен в библиотеку C, начиная с EDK
8.2i.

Эта информация также доступна по адресу: http://www.xilinx.com/support/answers/23345.html

4

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]