Баги с memcpy в AVR32

В процессе игр с атмелевской новинкой at32uc3a натолкнулись на интересное.
При объявлении глобального массива (или структуры) в начале программы (где-нить в районе мэйна — т.е., в итоге, по небольшим адрискам) и последующей попытке с-memcpy-ать в нее что-нибудь, проц ведет себя малость неадекватно.
Либо виснет, либо контроллеры периферии начинают глючить — неправильное чтение сдрама, висы усарта…
Небольшое гугленье показало,что мы не первые с этой проблемой — на электрониксе о таком уже писали:

Ковыряя пример работы с Ethernet ’ом (macb_example.c) для AT32UC3A0512, столкнулся с зависанием программы на функциях memcpy и подобных.
При замене этих функций простыми циклами for – все начинает работать.

И даже описали решение проблемы:

После некоторых изысканий удалось выяснить, что для правильной работы этих функций необходимо указать опцию линкера -march=ucr2
(по-умолчанию было -march=ucr1 ).
В AVR32 Studio эта опция находится:
Project -> Properties -> C/C++Build -> Settings -> Tool Settings -> AVR32/GNU C Linker -> Miscellaneous -> Linker Flags

Мы, правда, просто избавились от глобальных переменных — до чего иначе руки бы, наверное, так и не дошли.

Похожий бред:

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Protected by WP Anti Spam