Странник 0 12 ноября, 2007 Опубликовано 12 ноября, 2007 (изменено) · Жалоба Устройство состоит из 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 затирается. Проблема в том что переконфигурировать память нельзя (заказчик не согласен). Может есть какие то опции компилятора для решения данного вопроса? P.S используется RealView® Developer Kit V2.1 Изменено 12 ноября, 2007 пользователем Странник Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
leen 0 12 ноября, 2007 Опубликовано 12 ноября, 2007 · Жалоба Вопрос первый - какой компилятор? Вопрос второй - как выровнена внешняя память? Что происходит во внешней памяти в районе указателя ext_array? Причем, если там выравнивание 2, а во внутренней - 4, то с выравниванием 4 байта. Может быть, компилер считает, что там выравнивание 4 и прибавляет 4, а там всего 2 - вот двойка и перетирается. Тогда надо насильственно указать pack(4) или что-то в этом духе. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Странник 0 12 ноября, 2007 Опубликовано 12 ноября, 2007 · Жалоба Вопрос первый - какой компилятор? ARM/Thumb C/C++ Compiler, RVCT2.1 [build 526] for ST [developer for ARM7/9] Вопрос второй - как выровнена внешняя память? Не до конца понимаю по какому принципу это работает. Т.е. никаких указаний компилятору не давалось (типа pragma pack(..)) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
leen 0 12 ноября, 2007 Опубликовано 12 ноября, 2007 · Жалоба у него вроде только __packed. Попробуйте объявить так: __packed char ext_array[5]; // ext. memory __packed char intern_array[3]={1,2,3}; //internal memory и посмотреть в дизассемблере, что делается в мемкопи. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Странник 0 12 ноября, 2007 Опубликовано 12 ноября, 2007 · Жалоба у него вроде только __packed. Попробуйте объявить так: __packed char ext_array[5]; // ext. memory __packed char intern_array[3]={1,2,3}; //internal memory и посмотреть в дизассемблере, что делается в мемкопи. Тут обнаружилась вот ещё какая штука: когда в дебагере меняешь значение четного адреса ext. memory то автоматически меняется значение следующего нечетного. Это может на что то говорить? По поводу _packed: действительно есть такая штука, но как то результатов не получил :( Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 119 12 ноября, 2007 Опубликовано 12 ноября, 2007 · Жалоба Тут обнаружилась вот ещё какая штука: когда в дебагере меняешь значение четного адреса ext. memory то автоматически меняется значение следующего нечетного. Как у вас подключена внешняя память? У вас ведь 16-битная микросхема, обычно при подключении 16-битных памятей ее вывод A0 идет на A1 процессора, A1 на A2 и т.д, вывод A0 процессора остается свободным, а выбор младшего/старшего осуществляется линиями UB/LB. Не знаю, как реализован интерфейс внешней памяти у STR, в даташите должны быть схемы. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Странник 0 12 ноября, 2007 Опубликовано 12 ноября, 2007 · Жалоба Как у вас подключена внешняя память? У вас ведь 16-битная микросхема, обычно при подключении 16-битных памятей ее вывод A0 идет на A1 процессора, A1 на A2 и т.д, вывод A0 процессора остается свободным, а выбор младшего/старшего осуществляется линиями UB/LB. Не знаю, как реализован интерфейс внешней памяти у STR, в даташите должны быть схемы. Так и есть, только UB/LB сидят на земле Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
scifi 1 12 ноября, 2007 Опубликовано 12 ноября, 2007 · Жалоба Так и есть, только UB/LB сидят на земле К чему подключены выходы микроконтроллера WE.0 и WE.1? Возможно, у Вас при подключении памяти не была предусмотрена побайтовая запись. С этим, конечно, можно жить, просто в программе геморроя добавится. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 119 12 ноября, 2007 Опубликовано 12 ноября, 2007 · Жалоба Так и есть, только UB/LB сидят на землеТак вы себя ограничили только 16-битным доступом. Естественно, при попытке 8-битного доступа неиспользуемый байт портится. Выходов, как всегда, два: 1) Если это прототип - повесить UB/LB проводками куда надо. 2) Использовать плюсы, написать класс-обертку, который при байтовом доступе будет считывать и восстанавливать неиспользуемый байт. Но это тупиковый путь - библиотечные функци работать не будут, да и обязательно где-нибудь забудете и обратитесь напрямую со всеми вытекающими. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Странник 0 12 ноября, 2007 Опубликовано 12 ноября, 2007 · Жалоба Большое спасибо всем кто откликнулся :beer: Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
KA_ru 0 12 ноября, 2007 Опубликовано 12 ноября, 2007 · Жалоба Рад что разобрался. делали устройство на STR710 он нормально не работал с 16 бит памятью. пришлось поставить две по 8 бит. там вся времянка под две микросхемы заточена. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
bigmaxtor 0 3 ноября, 2008 Опубликовано 3 ноября, 2008 · Жалоба делали устройство на STR710 он нормально не работал с 16 бит памятью. пришлось поставить две по 8 бит. там вся времянка под две микросхемы заточена. Прошу пояснить, в чем проблемы с 16-битной памятью у этих чипов? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться