Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: STR71xF and access to External memory
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
Странник
Устройство состоит из STR71xF и CMOS Static RAM K6F8016V3A.
Доступ к SRAM отконфигурирован через 16 бит шину данных.
В программе инициализированно куча структур и масивов расположенных в этой памяти, в том числе и char типа.
Работа с memcpy затруднена, работает не так как надо

.....
char ext_array[5]; // ext. memory
char intern_array[3]={1,2,3}; //internal memory
.....
memcpy(ext_array,intern_array,3);

В результате копирования 2 затирается.
Проблема в том что переконфигурировать память нельзя (заказчик не согласен).

Может есть какие то опции компилятора для решения данного вопроса?


help.gif

P.S используется RealView® Developer Kit V2.1
Leen
Вопрос первый - какой компилятор?
Вопрос второй - как выровнена внешняя память?
Что происходит во внешней памяти в районе указателя ext_array? Причем, если там выравнивание 2, а во внутренней - 4, то с выравниванием 4 байта.
Может быть, компилер считает, что там выравнивание 4 и прибавляет 4, а там всего 2 - вот двойка и перетирается. Тогда надо насильственно указать pack(4) или что-то в этом духе.
Странник
Цитата(Leen @ Nov 12 2007, 13:57) *
Вопрос первый - какой компилятор?

ARM/Thumb C/C++ Compiler, RVCT2.1 [Build 526] for ST [developer for ARM7/9]

Цитата(Leen @ Nov 12 2007, 13:57) *
Вопрос второй - как выровнена внешняя память?

Не до конца понимаю по какому принципу это работает.
Т.е. никаких указаний компилятору не давалось (типа pragma pack(..))
Leen
у него вроде только __packed. Попробуйте объявить так:
Код
__packed char ext_array[5]; // ext. memory
__packed char intern_array[3]={1,2,3}; //internal memory
и посмотреть в дизассемблере, что делается в мемкопи.
Странник
Цитата(Leen @ Nov 12 2007, 14:32) *
у него вроде только __packed. Попробуйте объявить так:
Код
__packed char ext_array[5]; // ext. memory
__packed char intern_array[3]={1,2,3}; //internal memory
и посмотреть в дизассемблере, что делается в мемкопи.


Тут обнаружилась вот ещё какая штука:
когда в дебагере меняешь значение четного адреса ext. memory то автоматически меняется значение следующего нечетного.
Это может на что то говорить?

По поводу _packed:
действительно есть такая штука, но как то результатов не получил sad.gif
Сергей Борщ
Цитата(Странник @ Nov 12 2007, 14:29) *
Тут обнаружилась вот ещё какая штука:
когда в дебагере меняешь значение четного адреса ext. memory то автоматически меняется значение следующего нечетного.
Как у вас подключена внешняя память? У вас ведь 16-битная микросхема, обычно при подключении 16-битных памятей ее вывод A0 идет на A1 процессора, A1 на A2 и т.д, вывод A0 процессора остается свободным, а выбор младшего/старшего осуществляется линиями UB/LB. Не знаю, как реализован интерфейс внешней памяти у STR, в даташите должны быть схемы.
Странник
Цитата(Сергей Борщ @ Nov 12 2007, 16:34) *
Как у вас подключена внешняя память? У вас ведь 16-битная микросхема, обычно при подключении 16-битных памятей ее вывод A0 идет на A1 процессора, A1 на A2 и т.д, вывод A0 процессора остается свободным, а выбор младшего/старшего осуществляется линиями UB/LB. Не знаю, как реализован интерфейс внешней памяти у STR, в даташите должны быть схемы.


Так и есть, только UB/LB сидят на земле
scifi
Цитата(Странник @ Nov 12 2007, 16:07) *
Так и есть, только UB/LB сидят на земле

К чему подключены выходы микроконтроллера WE.0 и WE.1?
Возможно, у Вас при подключении памяти не была предусмотрена побайтовая запись. С этим, конечно, можно жить, просто в программе геморроя добавится.
Сергей Борщ
Цитата(Странник @ Nov 12 2007, 15:07) *
Так и есть, только UB/LB сидят на земле
Так вы себя ограничили только 16-битным доступом. Естественно, при попытке 8-битного доступа неиспользуемый байт портится. Выходов, как всегда, два:
1) Если это прототип - повесить UB/LB проводками куда надо.
2) Использовать плюсы, написать класс-обертку, который при байтовом доступе будет считывать и восстанавливать неиспользуемый байт. Но это тупиковый путь - библиотечные функци работать не будут, да и обязательно где-нибудь забудете и обратитесь напрямую со всеми вытекающими.
Странник
Большое спасибо всем кто откликнулся
beer.gif
KA_ru
Рад что разобрался.
делали устройство на STR710 он нормально не работал с 16 бит памятью.
пришлось поставить две по 8 бит.
там вся времянка под две микросхемы заточена.
bigmaxtor
Цитата(KA_ru @ Nov 13 2007, 01:20) *
делали устройство на STR710 он нормально не работал с 16 бит памятью.
пришлось поставить две по 8 бит.
там вся времянка под две микросхемы заточена.


Прошу пояснить, в чем проблемы с 16-битной памятью у этих чипов?
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.