-
- Это зависит не столько от компилятора или его конкретной реализации, сколько от архитектуры процессора. В данном случае операнды типа float невозможно разместить в регистрах процессора, поэтому они размещаются в ОЗУ. Отсюда и все проблемы. Так что Bill(65 знак., 11.05.2009 12:12)
- ИМХО, нет. Вопрос использует ли мат-либа глобальные переменные. - Vit(11.05.2009 12:37)
- Переменные могут либо глобальными, либо локальными. Это не суть важно. Главное - они расположены в ОЗУ, что не дает сделать функции плавающей арифметики реентерабельными. Другое дело - как они в действительности реализованы. И здесь все упирается Bill(258 знак., 11.05.2009 12:50)
- Не совсем. Есть 4 банка по 8 регистров R0-R7, которые могут переключаться в прерываниях. Еще есть возможность сбрасывать промежуточные результаты на стек. Регистры очень активно используются для передачи контекста и в разных мат. вычислениях. - bialix2(11.05.2009 13:17)
- К одним переменным доступ из обработчика прерывания есть, к другим нет. Если функция использует статические переменные (глобальные или локальные статические) и при двух вызовах функции эти переменные используются, то реентерабельности нет. А как устроена Vit(78 знак., 11.05.2009 12:59)
- Ну, так и я о том же. - Bill(11.05.2009 13:09)
- А причём тут архитектура? - Vit(11.05.2009 13:13)
- Возможно, именно в данном случае, ни причем. Только BK(197 знак., 11.05.2009 14:20, )
- А причём тут архитектура? - Vit(11.05.2009 13:13)
- Ну, так и я о том же. - Bill(11.05.2009 13:09)
- Так - с тем дополнением, что по умолчанию так, ибо иначе дорого (копировать указатель стека в R0, вместо прямых обращений к памяти использовать косвенные с отдельными инкрементами/декрементами указательного регистра). Можно попросить свою функцию ReAl(87 знак., 11.05.2009 12:58)
- Я не очень знаком с Keil-51, поэтому судил по частным примерам, и о такой возможности не догадался. Хотя все равно вопрос остается - как именно реализованы библиотечные функции "плавучки"? - Bill(11.05.2009 13:09)
- А вот что говорит официальный источник: "Floating point operations the compiler generates code for (+ - * /) are fully reentrant. But only a few functions in math.h are reentrant." - bialix2(11.05.2009 13:35, ссылка)
- Надеюсь это достаточное доказательство? - bialix2(11.05.2009 13:36)
- Вполне!!! - BK(11.05.2009 13:41, )
- Надеюсь это достаточное доказательство? - bialix2(11.05.2009 13:36)
- У меня нет исходников, им стоит только 7й кейл, но в наборе имеющихся библиотек математики с плавающей точкой для линковки доступны только варианты оптимизированные под различные конфигурации памяти (программы и данных), а также с поддержкой банков bialix2(259 знак., 11.05.2009 13:27)
- Спасибо, конечно, за информацию, только ... BK(263 знак., 11.05.2009 13:48, )
- зависит от обстоятельств. - bialix2(11.05.2009 14:02)
- Например? - BK(11.05.2009 14:43, )
- зависит от обстоятельств. - bialix2(11.05.2009 14:02)
- Спасибо, конечно, за информацию, только ... BK(263 знак., 11.05.2009 13:48, )
- А вот что говорит официальный источник: "Floating point operations the compiler generates code for (+ - * /) are fully reentrant. But only a few functions in math.h are reentrant." - bialix2(11.05.2009 13:35, ссылка)
- Я не очень знаком с Keil-51, поэтому судил по частным примерам, и о такой возможности не догадался. Хотя все равно вопрос остается - как именно реализованы библиотечные функции "плавучки"? - Bill(11.05.2009 13:09)
- Переменные могут либо глобальными, либо локальными. Это не суть важно. Главное - они расположены в ОЗУ, что не дает сделать функции плавающей арифметики реентерабельными. Другое дело - как они в действительности реализованы. И здесь все упирается Bill(258 знак., 11.05.2009 12:50)
- ИМХО, нет. Вопрос использует ли мат-либа глобальные переменные. - Vit(11.05.2009 12:37)
- Могу ошибаться, но, насколько знаю, обычно с фабричными настройками имеет место компиляция/линковка с нереенетрабельными либами, потому как они практически всегда быстрее и меньше по размеру. В нормальных компилерах в поставку входят и реентерабельные Vit(149 знак., 08.05.2009 23:37)
- угу - POV(09.05.2009 00:03)
- Это зависит не столько от компилятора или его конкретной реализации, сколько от архитектуры процессора. В данном случае операнды типа float невозможно разместить в регистрах процессора, поэтому они размещаются в ОЗУ. Отсюда и все проблемы. Так что Bill(65 знак., 11.05.2009 12:12)