Вы не можете (часто, без большого количества ноу-хау ядра для блокировки и сохранения этих регистров, не затрагивая другие критические разделы) использовать регистры с плавающей запятой в ядре, и, кроме того, конечно, неуместно выполнять «обработку» в ядре. Многие другие упоминали об этом. Производительность будет ужасной. Таким образом, math.h не предоставляется для модулей ядра. Принимаем это и идем дальше...
Однако, поскольку я также являюсь жертвой сумасшедших требований и совершенно безумных проектов, навязанных нам другими, это законный вопрос. После сокращения использования API math.h для минимизации влияния на производительность вы можете использовать эмуляцию с плавающей запятой (soft-float) с правильными настройками компилятора для реализации необходимых функций без использования регистров с плавающей запятой. Код ядра уже должен скомпилироваться с этими настройками soft-float.
Чтобы реализовать math.h
функциональность, вы можете просмотреть glibc или uClibc и, возможно, другие. Обе эти библиотеки имеют общие "C" реализации libm, которые реализуют math.h
без использования специальных встроенных функций или специфичных для платформы типов и поэтому должны прекрасно компилироваться в ядре.
uClibc: приведенная выше ссылка ведет прямо к разделу libm в uClibc.
glibc: После того, как вы напишете glibc с помощью «git», вы найдете то, что ищете, в glibc/sysdeps/ieee754/flt-32.
glibc может быть более сложным для понимания, потому что он более сложен и имеет больше взаимозависимостей внутри себя, но uClibc предоставляет (на данный момент) только C89 math.h. Если вам нужна одинарная точность (читай: быстрее) или сложная математическая функциональность, как в C99+, вам придется взглянуть на glibc.
person
Peter M
schedule
08.04.2015