Доброго времени суток.
Полистал форум. Много чего для себя подчеркнул, но не на все вопросы нашел ответы.
Достался мне на допиливание софт.
Нужен совет знающих людей.
Опишу вкратце, с чем пришлось столкнуться:
Создавалось все на eCose.
Железяка LPC3250 с периферией: АЦП, ЖКИ, клавиатурой, дискретными портами ввода/вывода.
Основная проблема – работа с float:
Замечено некорректное отображение нецелочисленных значений на ЖКИ – проскакивают огромные значения величин. Для вывода значений типа float на ЖКИ используется функция sprintf (возможно под eCos она не совсем корректно работает).
При передаче глобальных переменных (опять же float) от одной нити к другой выявляются непонятные значения, аналогично, как при использовании sprintf.
Как я понял (изучив некоторые темы форума), использование функции printf в терминале, для анализа нецелочисленных значений не вариант.
Для упрощения анализа была предпринята попытка выяснить, что вообще происходит с операциями для float. В одной из нитей создавался массив из 101 элемента типа float (значения 0,1,2,3,4,5…99,100 ) и переменная float, в которую записывался результат перемножения float k=1 на индекс дальнейшего цикла от 0 до 100. В цикле производилось сравнение значений элементов массива и вычисленной переменной. В случае несоответствия значений, в консоль выводилось сообщение о не равенстве значений. В итоге, в консоль вываливались сообщения о несовпадении значений (1-5 из 100 сравнений и портился элемент массива, а не переменная).
Следующей попыткой было отвязаться от операции сравнения и умножения float.
В этом же цикле был создан массив типа int в который записывались значения заполненного массива float, при этом было сделано «явное» преобразование типа (array_int =(int)array_float). Далее в цикле уже происходило сравнивание элементов массива int (элементы массива int должны были быть равны 0,1,2,3,4,5,…,99,100) со значением индекса (0,1,2,… 99,100). При несовпадении выводилось сообщение в консоль.
Результат остался тем же. 2-3 элемента несовпадения из 100.При не совпадении, значение элементов массива int выводилось в консоль как 1319630379 вместо 6,15 или допустим87. Вроде исключённая операция сравнения float тут не причём и значения портятся либо при заполнении массива float либо при присвоении элементам массива int элементов массива float.
Почему портятся? Смотреть опции компилятора? Проблемы с памятью(для нитей увеличивал размер используемого стека от 2400 до 9600 – не помогло)? Где может быть трабл?
Спасибо.