2015-01-30 4 views
2

Существует библиотека ATMEL, которая не работает с моей инструментальной привязкой (инструменты GNU для ARM), и я знаю почему, но я не знаю, почему это работает для старого YAGARTO и я полагаю, что также для KEIL и IARРазличия в инструментальных элементах с выравниванием (почему это даже сработало)

Я работаю в процессоре ARMV5 (AT91SAM9), который не поддерживает неравномерный доступ к ints (4 байта).

есть глобальный буфер определяется как:

static unsigned char pPageBuffer[AT91C_IFLASH_PAGE_SIZE]; 

Буфер получает некоторые данные, а затем данные записываются на флэш, но данные должны быть приняты во флэш 4 байта, в то время, таким образом, есть int pointer, называемый pAlignedSource, для передачи данных по 4 байта за раз.

pAlignedSource = (unsigned int*)pPageBuffer; 

Но pPAgeBuffer не обязательно 4 байта выровнены, как это массив символов, и pAlignedSource не указывает на выровненной адрес. Как возможно, что этот код работает всегда в другой toolchain, но не в моем ?, я уже определил правильный процессор для компилятора, отличный от того, что оба компилятора получают одинаковые флаги кода.

Моя проблема заключается в том, что, когда получает данные копируется из буфера вспышки

*pAlignedDestination++ = *pAlignedSource++; 

Я оканчиваться зашифрованной версией данных: /, но я это исправил, определив буфер, как

static unsigned int pPageBuffer[AT91C_IFLASH_PAGE_SIZE/4]; 

И это было трюк, но мне все еще очень интересно. Почему он работал в другой инструментальной цепочке?

+0

Как это «не работает»? Вероятно, pPageBuffer начинается с байтового выровненного адреса, а затем писать слова должно быть хорошо. То, что я искал, нарушает строгие проблемы с псевдонимом и энтерианством с тем, что вы делаете, но мы знаем, что ваша проблема. – IdeaHat

+0

В случае, если вы попросите, вы можете получить библиотеку [здесь] (http://www.atmel.com/images/at91lib_20100901_softpack_1_5_svn_v8476.zip) в файле flashd_eefc.c function FLSHD_Write – LuisF

+0

Он получает данные с неглавного адреса, но заканчивается каким-то образом scrambled – LuisF

ответ

2

Письмо на неуказанные адреса определено на ARMv5. У вас может быть поведение CP15, чтобы изменить это. Например, он может ловить или сделать что-то непредсказуемое для режима большого пальца. В режиме ARM с STR нижние бит отбрасываются без захвата. С LDR нижние биты маскируются для формирования адреса, но данные затем поворачиваются в зависимости от младших бит.

Редактировать: Кроме того, для одного компилятора/инструментария вполне возможно использовать другое выравнивание для начала символьного буфера. Один инструмент может выровнять все, а другой - нет. С gcc вы могли бы аннотировать буфер attribute((aligned,4)) или что-то в этом роде.

Независимо от того, что вы делаете, он не переносится (и является undefined для 'C'), и вы просто не должны этого делать; который, кажется, является тем выходом, к которому вы пришли.

+0

Спасибо, я прочитаю о CP15. Фактически, это чтение с неравномерного адреса в ОЗУ, но я думаю, что это то же самое или очень похоже. Проблема в том, что это библиотека, которую предоставляет ATMEL, вы можете получить библиотеку [здесь] (http://www.atmel.com/images/at91lib_20100901_softpack_1_5_svn_v8476.zip) в файле flashd_eefc.c function FLSHD_Write – LuisF

+1

Ну, есть несколько вопросов. Каково состояние CP15 и бит «A» cr1 (бит 1)? Либо он может ловушку, либо нет. Затем вы используете код * thumb * или * ARM *? Если это * большой * код, то результат полностью * undefined/недокументированный *. Однако такой производитель, как Atmel, может знать свое конкретное поведение и полагаться на него. Также см. Мое редактирование для объяснения типа ** pure ** 'C'. –