Как использовать функции доступа к атомарной памяти GNU в keil - PullRequest
0 голосов
/ 15 апреля 2019

Я хочу использовать встроенные функции GCC, такие как __sync_fetch_and_add, но я компилирую свой код с помощью Keil. Если я использую эти функции в своем коде, он будет отображаться с ошибкой следующим образом:

Error: L6218E: Undefined symbol __sync_fetch_and_add_4 (referred from XXXX.o).

Я обнаружил, что есть некоторые описания с GNU atomic memory access functions в документах Keil , поэтому я предполагаю, что keil может поддерживать эти функции, но я не знаю, как их использовать. Должен ли я включить некоторые заголовочные файлы или добавить некоторые настройки в keil?

1 Ответ

0 голосов
/ 15 апреля 2019

Я не эксперт, но, похоже, ссылка на ARM DS-5, который является отдельным компилятором, то есть не таким, как MDK Кейла. Таким образом, документация не применяется.

Реализация этих функций не супер сложна; если все остальное терпит неудачу, я смотрю на вывод компилятора из GCC и просто повторно реализую его.

В качестве альтернативы прочитайте инструкции LDREX / STREX и инструкции по защите памяти и получайте удовольствие! :)

ОБНОВЛЕНИЕ : Я думаю, что __sync_fetch_and_add_4() является новым, но Keil поддерживает только более старый набор встроенных программ GCC. Обратите внимание, что __sync_fetch_and_add_4 не отображается в списке функций, которые они поддерживают. На этой странице руководства GCC написано:

До GCC 4.7 использовались более старые __sync встроенные функции. Примером неопределенного символа от использования __sync_fetch_and_add на неподдерживаемом хосте является отсутствующая ссылка на __sync_fetch_and_add_4.

Так, похоже, Кейл отслеживает довольно старую версию GCC? С другой стороны, я вижу __sync_fetch_and_add() в списке, и я предполагаю, что «магическим образом» генерирует вызов __sync_fetch_and_add_4(), если он используется на 32-битном количестве. Weird.

...