-
- Не изменил ни байта кода - все считаться начало нормально: 2.499048 - POV(06.05.2009 21:15)
- Я бы тревогу поднял. Необходимо обеспечивать идентичность бинарников на основе одних и тех же исходников. - amusin(07.05.2009 07:33)
- Всё еще хуже. Один и тот же кусок кода в дает разный результат в разных местах! - POV(08.05.2009 21:46)
- может, ты плавучку в обработчиках прерываний юзаешь? - Vit(08.05.2009 21:55)
- хм, ну да. А шо? Локальные переменные пробовал и глобальные. Один хрен. Результат смотрю не в майне, а прям в обработчике. - POV(08.05.2009 22:23)
- ладно с быстродействием и стеками твоё личное дело, но чтобы и в фоне и в прерываниях юзать флоат, мат-либа должна быть реентерабельной. Выкрутасы с такой фигней ведутся со времен первых сопроцессоров - там ещё веселее - Vit(08.05.2009 22:29, ссылка)
- базовые операции там реентерабельные - bialix2(11.05.2009 13:37, ссылка)
- Вижу. Но Last Reviewed: Friday, July 15, 2005. Их rvdmk так колбасит, что это вполне может не соответствовать настоящему моменту. Сначала в текущую доку смотреть надо. Мне облом;) - Vit(11.05.2009 13:51)
- что там такого можно наменять в библиотеке плавающей точки? и нужно ли??? - bialix2(11.05.2009 14:03)
- А что они с no_init, volatile и прочая творят? в каждой версии чего-нить рихтуют - Vit(11.05.2009 14:05)
- а что они собственно творят с no_init и volatile? я даже и не знаю, расскажите, пожалуйста. - bialix2(11.05.2009 14:34)
- из-за no_init проект из 3.20 не может работать в 3.50 - слова опять другие - нужно по-новому объяснять компилеру и линкеру, что от него просят просто no_init. А с volatile там кочующая трабла - периодически отваливается нормальная работа в самых разных Vit(226 знак., 11.05.2009 16:26)
- 3.20 и 3.50 -- это что за версии? Для ARM? - bialix2(11.05.2009 17:58)
- угу. писал же rvdmk - Vit(11.05.2009 18:20)
- rvmdk. :-) - VAI(12.05.2009 06:53)
- ;) у мну эта апшипка систематическая - Vit(12.05.2009 08:35)
- rvmdk. :-) - VAI(12.05.2009 06:53)
- угу. писал же rvdmk - Vit(11.05.2009 18:20)
- 3.20 и 3.50 -- это что за версии? Для ARM? - bialix2(11.05.2009 17:58)
- из-за no_init проект из 3.20 не может работать в 3.50 - слова опять другие - нужно по-новому объяснять компилеру и линкеру, что от него просят просто no_init. А с volatile там кочующая трабла - периодически отваливается нормальная работа в самых разных Vit(226 знак., 11.05.2009 16:26)
- не вижу взаимосвязи базовых алгоритмов с плюшками языка - bialix2(11.05.2009 14:09)
- Какие-такие базовые алгоритмы без их реализации? Что за плюшки? - Vit(11.05.2009 14:12)
- речь о базовых операциях для плавающей точки (+ - * /). Реализованы они в виде жестко оптимизированных ассемблерных подпрограмм. ЧтО такаого глобального должно было произойти в мире, чтобы ИХ начали радикально менять и разрушать обратную совместимость bialix2(251 знак., 11.05.2009 14:38)
- Да согласен, но если no_init то работает, то нужно писать мульён вариаций другими словами, чтоб хоть как-то заставить работать, то опять работает, но не просто так, а мы должны знать, что компилятор может нам не поверить, потому что индус не позаботился Vit(475 знак., 11.05.2009 15:09)
- я стараюсь работать по правилу, которое прочитал еще в юности bialix2(164 знак., 11.05.2009 15:31)
- Да согласен, но если no_init то работает, то нужно писать мульён вариаций другими словами, чтоб хоть как-то заставить работать, то опять работает, но не просто так, а мы должны знать, что компилятор может нам не поверить, потому что индус не позаботился Vit(475 знак., 11.05.2009 15:09)
- речь о базовых операциях для плавающей точки (+ - * /). Реализованы они в виде жестко оптимизированных ассемблерных подпрограмм. ЧтО такаого глобального должно было произойти в мире, чтобы ИХ начали радикально менять и разрушать обратную совместимость bialix2(251 знак., 11.05.2009 14:38)
- Какие-такие базовые алгоритмы без их реализации? Что за плюшки? - Vit(11.05.2009 14:12)
- а что они собственно творят с no_init и volatile? я даже и не знаю, расскажите, пожалуйста. - bialix2(11.05.2009 14:34)
- А что они с no_init, volatile и прочая творят? в каждой версии чего-нить рихтуют - Vit(11.05.2009 14:05)
- что там такого можно наменять в библиотеке плавающей точки? и нужно ли??? - bialix2(11.05.2009 14:03)
- Вижу. Но Last Reviewed: Friday, July 15, 2005. Их rvdmk так колбасит, что это вполне может не соответствовать настоящему моменту. Сначала в текущую доку смотреть надо. Мне облом;) - Vit(11.05.2009 13:51)
- Нах это надо. Вхожу в прерывания и прочие прерывания такого же приоритета (а других нет) запрещаются. - POV(08.05.2009 23:12)
- Кажется не понимаешь. Выполнение в "основном цикле"(я назвал фоном) действий с флоатом выполняется либой, которая требует временных переменных, но они для нереентерабельной либы вполне обычно глобальные. Другое дело, что достаточно стабильная фигня Vit(197 знак., 08.05.2009 23:19)
- Это общее впечатление от компиляторов или и для Кейл51 имеет место? - POV(08.05.2009 23:26)
- Это зависит не столько от компилятора или его конкретной реализации, сколько от архитектуры процессора. В данном случае операнды типа 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)
- Это общее впечатление от компиляторов или и для Кейл51 имеет место? - POV(08.05.2009 23:26)
- Тем более что в моем случае эти данные используются либо основным циклом с контролем прерывания либо самой прерывающей процедурой. - POV(08.05.2009 23:13)
- Кажется не понимаешь. Выполнение в "основном цикле"(я назвал фоном) действий с флоатом выполняется либой, которая требует временных переменных, но они для нереентерабельной либы вполне обычно глобальные. Другое дело, что достаточно стабильная фигня Vit(197 знак., 08.05.2009 23:19)
- базовые операции там реентерабельные - bialix2(11.05.2009 13:37, ссылка)
- ладно с быстродействием и стеками твоё личное дело, но чтобы и в фоне и в прерываниях юзать флоат, мат-либа должна быть реентерабельной. Выкрутасы с такой фигней ведутся со времен первых сопроцессоров - там ещё веселее - Vit(08.05.2009 22:29, ссылка)
- хм, ну да. А шо? Локальные переменные пробовал и глобальные. Один хрен. Результат смотрю не в майне, а прям в обработчике. - POV(08.05.2009 22:23)
- может, ты плавучку в обработчиках прерываний юзаешь? - Vit(08.05.2009 21:55)
- Всё еще хуже. Один и тот же кусок кода в дает разный результат в разных местах! - POV(08.05.2009 21:46)
- Я бы тревогу поднял. Необходимо обеспечивать идентичность бинарников на основе одних и тех же исходников. - amusin(07.05.2009 07:33)
- Я бы здесь вообще не стала прользоваться float-арифметикой, а на ассемблере вычислила в целых числах. Получилось бы абсолютно точно. Дело в том, что значение от АЦП умещается в 3 байта (у кого у 2 байт, тому еще проще). А это значит, что это число Ксения(1470 знак., 05.05.2009 17:23)
- И? А флоат-то где, который надо на экран вывести? Без плавучки кейловской все равно не обойтись. - POV(06.05.2009 21:59)
- А по-моему можно. - Bill(07.05.2009 21:07)
- Я не совсем полно Ксении реплику дал... POV(219 знак., 08.05.2009 08:20)
- Имеете ввиду преобразование в десятичный вид? Это тоже не проблема: на "электрониксе" программку на ассемблере долго сочиняли (оптимизируя) превращения длинного двоичного числа в 10-ю форму. Если не гнаться за компактностью, то тут достаточно записать Ксения(307 знак., 06.05.2009 22:38)
- А по-моему можно. - Bill(07.05.2009 21:07)
- И? А флоат-то где, который надо на экран вывести? Без плавучки кейловской все равно не обойтись. - POV(06.05.2009 21:59)
- Попробовал этот проект на рабочей машине. Кейл 8.16 (дома 8.16а). Результат - 2.499048. О как! - POV(05.05.2009 10:19)
- Ну вот, опять шел мимо и опять не удержался. Bill(355 знак., 05.05.2009 09:56)
- Не обязательно. В общем случае при измерении униполярного сигнала относительно общего провода без использования к-либо PGA Vin=(VREF(max)-VREF(min))/(ADCmax-ADCmin)*ADCx+VREF(min), если VREF(min)=0, ADCmin=0 и ADCmax=4095, то Vin=VREF/4095*ADCx. rezident(43 знак., 05.05.2009 18:36)
- Лучше, всё-таки, уточнить в даташите. Палыч(273 знак., 06.05.2009 10:22)
- А мне казалось, что именно так обычно и есть. Цена деления АЦП вроде бы всегда есть "забаненное слово", делённое на 2**N. Заглядываем в документацию от Atmel ReAl(4111 знак., 09.05.2009 13:00)
- Что вы так волнуетесь? Никто не спорит, что в даташите или юзергайде справляться нужно. Вот выдержка из User's Manual про ADC10 и ADC12 MSP430. rezident(09.05.2009 19:49)
- Хорошо, хорошо, не волнуйтесь, в общем случае пусть будет 1023 и 4095. А то всё частности. Просто я именно с ними имел дело и потому и написал - а мне казалось, что обычно так и есть. И привёл примеры. - ReAl(10.05.2009 01:05)
- Зато теперь вы знаете, что бывает и так и этак ;-) - rezident(10.05.2009 01:44)
- Вы тоже :-). А если бы было написано "в общем случае надо смотреть документацию, при этом часто бывает, что надо делить на 4095" - я бы и руки над клавиатурой не поднял :-) ReAl(822 знак., 10.05.2009 11:31)
- Согласен. В общем случае нужно смотреть даташит. Консенсус? :) - rezident(10.05.2009 16:28)
- Ага! - ReAl(11.05.2009 00:59)
- Согласен. В общем случае нужно смотреть даташит. Консенсус? :) - rezident(10.05.2009 16:28)
- Вы тоже :-). А если бы было написано "в общем случае надо смотреть документацию, при этом часто бывает, что надо делить на 4095" - я бы и руки над клавиатурой не поднял :-) ReAl(822 знак., 10.05.2009 11:31)
- Зато теперь вы знаете, что бывает и так и этак ;-) - rezident(10.05.2009 01:44)
- Хорошо, хорошо, не волнуйтесь, в общем случае пусть будет 1023 и 4095. А то всё частности. Просто я именно с ними имел дело и потому и написал - а мне казалось, что обычно так и есть. И привёл примеры. - ReAl(10.05.2009 01:05)
- Что вы так волнуетесь? Никто не спорит, что в даташите или юзергайде справляться нужно. Вот выдержка из User's Manual про ADC10 и ADC12 MSP430. rezident(09.05.2009 19:49)
- "должен быть 1 и двенадцать нулей" - то есть старший бит добавили лишь для того, чтобы представить одно, четыре тысячи девяносто седьмое значение? - Сергей Борщ(09.05.2009 12:34)
- А мне казалось, что именно так обычно и есть. Цена деления АЦП вроде бы всегда есть "забаненное слово", делённое на 2**N. Заглядываем в документацию от Atmel ReAl(4111 знак., 09.05.2009 13:00)
- Всегда делю (точнее сдвигаю) на 2^N, т.к. быстрее. Точность не страдает - все равно есть регулировка усиления ("калибровка"). - amusin(05.05.2009 19:07)
- Лучше, всё-таки, уточнить в даташите. Палыч(273 знак., 06.05.2009 10:22)
- На какое число нужно делить - смотреть нужно в DS (обычно, для 12-разрядного АЦП - это, действительно 4096). Палыч(183 знак., 05.05.2009 10:13)
- Я изначально дефайнами ему и дал все константы. Точность никакая :( - POV(05.05.2009 10:04)
- Да, хоть - дефайнами, хоть - нет. Результат тот же самый temp=2.499048 Палыч(146 знак., 05.05.2009 10:22)
- Не обязательно. В общем случае при измерении униполярного сигнала относительно общего провода без использования к-либо PGA Vin=(VREF(max)-VREF(min))/(ADCmax-ADCmin)*ADCx+VREF(min), если VREF(min)=0, ADCmin=0 и ADCmax=4095, то Vin=VREF/4095*ADCx. rezident(43 знак., 05.05.2009 18:36)
- для dspic33 C30 x=2.499048, для пик18 htpicc18std 9.51pl1 x=2.499023438 - правильные компиляторы :) код
нижевнутри: AVF(153 знак., 05.05.2009 08:41) - Ога, для масштабирования 12-битных отсчетов АЦП без плавучки ну просто никак. Пешы есчо, афтар :)) - MBedder(05.05.2009 00:29)
- Я предпочитаю сначала коэффициент присвоить временной переменной, а потом умножить ее на код АЦП. Написать две строки вместо одной нисколько не ломает. rezident(118 знак., 04.05.2009 23:09)
- а кто показывает? может printf не окучен? - Vit(04.05.2009 21:29)
- В отладчике смотрю прям float-переменную. Также преобразую в текст и вывожу на семисегментник. Соответствует величине в плавучке. - POV(04.05.2009 21:53)
- А, не затерается ли один байтик Вашей переменной temp посторонними процедурами? Попробуйте оставить только вычисление этой переменной, а всё остальное временно убрать. Что получится? - Палыч(05.05.2009 09:45)
- Не, еще однутакую процедуру сделал в другом место программы. То же самое. - POV(05.05.2009 10:04)
- Сейчас оттранслировал Ваш пример и посмотрел значение temp = 2.499048 Как-то у Вас странно выходит... - Палыч(05.05.2009 09:24)
- Попробовал этот проект на рабочей машине. Кейл 8.16 (дома 8.16а). Результат - 2.499048!! - POV(05.05.2009 10:18)
- Вот, тебе - на! Интересно было бы определить причину странного результата на версии 8.16а - Палыч(05.05.2009 10:26)
- Вечером еще попробую разные варианты дома. - POV(05.05.2009 10:29)
- Вот, тебе - на! Интересно было бы определить причину странного результата на версии 8.16а - Палыч(05.05.2009 10:26)
- Попробовал этот проект на рабочей машине. Кейл 8.16 (дома 8.16а). Результат - 2.499048!! - POV(05.05.2009 10:18)
- Мож, симулятор? всмысле глючит - Vit(04.05.2009 22:05)
- А, не затерается ли один байтик Вашей переменной temp посторонними процедурами? Попробуйте оставить только вычисление этой переменной, а всё остальное временно убрать. Что получится? - Палыч(05.05.2009 09:45)
- В отладчике смотрю прям float-переменную. Также преобразую в текст и вывожу на семисегментник. Соответствует величине в плавучке. - POV(04.05.2009 21:53)
- Не изменил ни байта кода - все считаться начало нормально: 2.499048 - POV(06.05.2009 21:15)