Printk для плавающих значений внутри ядра
Есть ли способ записать / распечатать плавающие значения внутри ядра. Зависит ли это от FPU, на котором работает ядро?
Во время компиляции printk(KERN_DEBUG "error = %f " ,floatvalue)
Я получаю сообщение об ошибке:
неопределенная ссылка на __aeabi_f2d
2 ответа
Использование любого вида арифметики с плавающей запятой внутри ядра Linux является ошибкой.
Если процессор, на котором вы работаете, не имеет FPU, то выполнять вычисления, которые вы пытаетесь выполнить, нечем (программные FPU приводятся в движение ядром и не работают внутри него).
Если процессор, на котором вы работаете, имеет FPU, ситуация еще хуже - поскольку ядро переключает контексты между задачами, которые ему необходимы для сохранения контекста (набора регистров) каждой задачи. Время, необходимое для переключения контекста, зависит от того, сколько контекста необходимо сохранить. В качестве оптимизации ядро сохраняет и восстанавливает контекст FPU только тогда, когда оно планирует и выполняет задачу, которая использовала PFU, но не тогда, когда системный вызов или прерывание вызвали переключение контекста в ядро, и та же задача остается текущей задача.
Это означает, что если вы пишете код, который использует FPU внутри ядра, вы потенциально повредили состояние FPU выполняемой в данный момент задачи пространства пользователя.
Раньше я так думал. Но на самом деле плавающая точка иногда поддерживается. Это зависит от архитектуры процессора и версии ядра. Например, ответ Линуса. Я не говорю, что вы должны использовать FP, но это возможно. Возможно, он пришел в ядро около 2.6.32, см. Lxr.free-электронов.
Рауль, ваша неопределенная ошибка ссылки выглядит так, как будто она пытается использовать подпрограмму lib. Это не сработает, Линус указывает на gcc in-line. Я не слишком знаком, но, возможно, вижу это или это.