Перейти к содержанию
    

Бес

Новичок
  • Постов

    2
  • Зарегистрирован

  • Посещение

Репутация

0 Обычный
  1. Правильно ли я понимаю, что возможно речь идет об этом? " On 23/06/11 03:37, Michael Bergandi wrote: > Hi all, > > I am hoping that someone can share some knowledge on thread stack > alignment requirements for ARM targets and how eCos is handling it. > > According to the ARM site, they say that stacks should be 16 byte > aligned. Then, they go on to say that there are a couple ways that > stack alignment requirement can be managed. One of which was if you > are running on an OS and the OS has taken steps to ensure the > requirement is met, then the application need not worry about it. I > don't think I fully understand what this means exactly. > > Our particular target is the mx27 (ARM9). Out of habit, we make all > the memory for the thread stacks in our applications 4 byte aligned. > Is this enough? Is it really necessary? > > I have found some packages in the kernel (specifically, bsd_tcpip) > that has thread stack memory allocated with no alignment attribute > set. This got me wondering how this all works. > > I would love to here from someone with a much better grasp on this. > The alignment of the pieces of memory that are used as stacks does not really matter. It is the alignment of the stack pointer that matters. This is handled in HAL_THREAD_INIT_CONTEXT() which ensures that the stack pointer is 16 byte aligned regardless of the alignment of the stack pointer passed to it. -- Nick Garnett eCos Kernel Architect eCosCentric Limited http://www.eCosCentric.com The eCos experts Barnwell House, Barnwell Drive, Cambridge, UK. Tel: +44 1223 245571 Registered in England and Wales: Reg No: 4422071 " взято с http://www.sourceware.org/ml/ecos-devel/20...6/msg00019.html
  2. Доброго времени суток. Полистал форум. Много чего для себя подчеркнул, но не на все вопросы нашел ответы. Достался мне на допиливание софт. Нужен совет знающих людей. Опишу вкратце, с чем пришлось столкнуться: Создавалось все на 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 – не помогло)? Где может быть трабл? Спасибо.
×
×
  • Создать...