|
|
  |
STR71xF and access to External memory, Некоректная запись... |
|
|
|
Nov 12 2007, 09:43
|

Участник

Группа: Участник
Сообщений: 25
Регистрация: 10-05-06
Из: Киев
Пользователь №: 16 944

|
Устройство состоит из 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
Сообщение отредактировал Странник - Nov 12 2007, 09:56
|
|
|
|
|
Nov 12 2007, 10:13
|

Участник

Группа: Участник
Сообщений: 25
Регистрация: 10-05-06
Из: Киев
Пользователь №: 16 944

|
Цитата(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(..))
|
|
|
|
|
Nov 12 2007, 10:32
|
Частый гость
 
Группа: Свой
Сообщений: 172
Регистрация: 5-08-06
Из: Владивосток
Пользователь №: 19 343

|
у него вроде только __packed. Попробуйте объявить так: Код __packed char ext_array[5]; // ext. memory __packed char intern_array[3]={1,2,3}; //internal memory и посмотреть в дизассемблере, что делается в мемкопи.
|
|
|
|
|
Nov 12 2007, 12:29
|

Участник

Группа: Участник
Сообщений: 25
Регистрация: 10-05-06
Из: Киев
Пользователь №: 16 944

|
Цитата(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: действительно есть такая штука, но как то результатов не получил
|
|
|
|
|
Nov 12 2007, 12:34
|

Гуру
     
Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095

|
Цитата(Странник @ Nov 12 2007, 14:29)  Тут обнаружилась вот ещё какая штука: когда в дебагере меняешь значение четного адреса ext. memory то автоматически меняется значение следующего нечетного. Как у вас подключена внешняя память? У вас ведь 16-битная микросхема, обычно при подключении 16-битных памятей ее вывод A0 идет на A1 процессора, A1 на A2 и т.д, вывод A0 процессора остается свободным, а выбор младшего/старшего осуществляется линиями UB/LB. Не знаю, как реализован интерфейс внешней памяти у STR, в даташите должны быть схемы.
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
Nov 12 2007, 13:07
|

Участник

Группа: Участник
Сообщений: 25
Регистрация: 10-05-06
Из: Киев
Пользователь №: 16 944

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

Гуру
     
Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095

|
Цитата(Странник @ Nov 12 2007, 15:07)  Так и есть, только UB/LB сидят на земле Так вы себя ограничили только 16-битным доступом. Естественно, при попытке 8-битного доступа неиспользуемый байт портится. Выходов, как всегда, два: 1) Если это прототип - повесить UB/LB проводками куда надо. 2) Использовать плюсы, написать класс-обертку, который при байтовом доступе будет считывать и восстанавливать неиспользуемый байт. Но это тупиковый путь - библиотечные функци работать не будут, да и обязательно где-нибудь забудете и обратитесь напрямую со всеми вытекающими.
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
Nov 3 2008, 15:21
|
Участник

Группа: Участник
Сообщений: 51
Регистрация: 12-03-08
Из: Краснодар
Пользователь №: 35 832

|
Цитата(KA_ru @ Nov 13 2007, 01:20)  делали устройство на STR710 он нормально не работал с 16 бит памятью. пришлось поставить две по 8 бит. там вся времянка под две микросхемы заточена. Прошу пояснить, в чем проблемы с 16-битной памятью у этих чипов?
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|