Баги с 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

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

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

Реалити-шоу «КБ13 и АЦП». День 5

Сегодня непроверенным остался только rs — из-за отсутствия нужных железок.

И АЦП и память заставили немного повозиться — при разогнанном проце их работа, так сказать, немного отличалась от эталонной.
Читать далее

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

Реалити-шоу «КБ13 и АЦП». День 2.

Мы снова в эфире и снова рассказываем о процессе боевых действий КБ13 против платы АЦП.

Борьба со временем.

С утра пришлось взять в руки секундомер — время снятия замеров всех 16 каналов АЦП не соответсвовало заявленным 10 мкс, а занимало где-то 60-70 мкс, что, конечно же, многовато при наших возможностях.

Оптимизация времени считывания пошла несколькими путями:

  • разгон процессора;
  • уменьшение таймингов на сигналы чипселекта, рида и пульса;
  • увеличение частоты выдачи чипселекта и рида контроллером.

Читать далее

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

Реалити-шоу «КБ13 и АЦП». День 1.

Намигавшись диодами (инсталляция «я и диод») в течение получаса, мы получили полное моральное право перейти к отработке действительно нужных вещей.

Случайным образом из кучи задач была выбрана одна — заполнение и чтение FIFO буферов, то есть запись и чтение внешней SDRAM-памяти.

Памяти у нас в распоряжении оказалось 8 МБ (ровно по 512 КБ на каждый канал), sdram, согласно даташиту поддерживает запись как слов (32 бита), так и полуслов (16 бит) и четверть-слов (8 бит).

АЦП при чтении возвращает с каждого канала signed short значение оцифрованного напряжения. Т.е. 16 бит. Значит, если мы хотим прожигать в память данные длинной в слово, сбрасывать буфера нужно каждые два чтения.

Простая тестовая программа суть должна делать следующее — инициализация памяти, подсчет количества слов, которые мы имеем в памяти, два чтения ацп с записью результатов в буфер типа long (соответсвующий слову памяти), сброс буфера в память, чтение из памяти и сравнение значений — все ли правильно.

Для простоты будем писать все каналы подряд, а не в отдельные буферы — т.е. не будем смещаться на 512 КБ, когда пишем другой канал.

Отбрасывая функции инициализации железа, установки прерываний и т.п., на скорую руку вышла вот такая main():
Читать далее

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

Реалити-шоу «КБ13 и АЦП». День 0.

Борьба КБ 13 с платой АЦП началась с непокорной AVR32 Studio, которая никак не желала нормально компилить ассемблерный файл trampoline.s из uc3a0256-software-framework. Об этом было написано ранее.

В принципе, у нас был makefile, и программа собиралась и без всяких студий. Прожечь бинарник в плату также должно было быть несложно. Но не тут-то было.

Фирменный атмелевский эмулятор mkiceII моментально подцепился все той же студией, но вот заливать проект упорно не желал.
Чтение регистров, фьюзов, информации о mcu, ресет процессора — все работало. А вот записать бинарник на флэш — ни в какую.
Шаманство со фьюзами, настройками эмулятора, ресетами шло полным ходом, когда совершенно неожиданно программа-таки записалась куда надо. Но — мистика — только один раз. Больше не пожелала. Прошло еще некоторое время бесплодных попыток, и все заработало стабильно. Подозреваю, волшебное воздействие оказало стирание флэш памяти и полный сброс всех настроек. Хотя сброс делали и до этого — не помогало.

Дальше надо было решать что-то с отладкой. Хотя решать тут было нечего — отлаживаться в привычном и родном по QNX Momentics IDE Eclipse явно удобнее, чем не отлаживаться вовсе или извращаться и тратить время на отладку через spi или usb.

В конце концов, проект вместе со своим мэйкфайлом был запихан в студию, и стало можно приступить к отработке основного функционала платы, который нам нужен для написания прошивки — чтение ацп, чтение/запись внешней SDRAM, запись в статическую флэш-память, прием/передача по последовательному порту.

Но тут рабочий день неожиданно закончился.

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

AVR32 Studio и .s-файлы

Как выяснилось, стандартные проекты в AVR32 Studio не сильно дружат с ассемблерными исходниками.
То есть просто кинуть ассемблерный файл в проект и скомпилировать может быть целой проблемой. Компилятор может упорно выдавать ошибку на ровном месте, например, в файле из поставляемого самой Atmel фреймворка для работы с AT32UC3A.

Есть решение в виде создания make-проекта ( AVR32 C Project (Make) ) и написания собственного make-файла.

Недостаток этого способа, что приходится вручную писать makefile и править его при добавлении новых исходников или удалении старых.

Но лучше так, чем никак — AVR32 Studio сделана на основе eclipse, и работать в ней весьма приятно…

Скриншот…

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