Перейти к содержанию
    

STR71xF and access to External memory

Устройство состоит из 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:

 

P.S используется RealView® Developer Kit V2.1

Изменено пользователем Странник

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вопрос первый - какой компилятор?

Вопрос второй - как выровнена внешняя память?

Что происходит во внешней памяти в районе указателя ext_array? Причем, если там выравнивание 2, а во внутренней - 4, то с выравниванием 4 байта.

Может быть, компилер считает, что там выравнивание 4 и прибавляет 4, а там всего 2 - вот двойка и перетирается. Тогда надо насильственно указать pack(4) или что-то в этом духе.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вопрос первый - какой компилятор?

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

 

Вопрос второй - как выровнена внешняя память?

Не до конца понимаю по какому принципу это работает.

Т.е. никаких указаний компилятору не давалось (типа pragma pack(..))

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

у него вроде только __packed. Попробуйте объявить так:

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

и посмотреть в дизассемблере, что делается в мемкопи.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

у него вроде только __packed. Попробуйте объявить так:

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

и посмотреть в дизассемблере, что делается в мемкопи.

 

Тут обнаружилась вот ещё какая штука:

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

Это может на что то говорить?

 

По поводу _packed:

действительно есть такая штука, но как то результатов не получил :(

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Тут обнаружилась вот ещё какая штука:

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

Как у вас подключена внешняя память? У вас ведь 16-битная микросхема, обычно при подключении 16-битных памятей ее вывод A0 идет на A1 процессора, A1 на A2 и т.д, вывод A0 процессора остается свободным, а выбор младшего/старшего осуществляется линиями UB/LB. Не знаю, как реализован интерфейс внешней памяти у STR, в даташите должны быть схемы.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Как у вас подключена внешняя память? У вас ведь 16-битная микросхема, обычно при подключении 16-битных памятей ее вывод A0 идет на A1 процессора, A1 на A2 и т.д, вывод A0 процессора остается свободным, а выбор младшего/старшего осуществляется линиями UB/LB. Не знаю, как реализован интерфейс внешней памяти у STR, в даташите должны быть схемы.

 

Так и есть, только UB/LB сидят на земле

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Так и есть, только UB/LB сидят на земле

К чему подключены выходы микроконтроллера WE.0 и WE.1?

Возможно, у Вас при подключении памяти не была предусмотрена побайтовая запись. С этим, конечно, можно жить, просто в программе геморроя добавится.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Так и есть, только UB/LB сидят на земле
Так вы себя ограничили только 16-битным доступом. Естественно, при попытке 8-битного доступа неиспользуемый байт портится. Выходов, как всегда, два:

1) Если это прототип - повесить UB/LB проводками куда надо.

2) Использовать плюсы, написать класс-обертку, который при байтовом доступе будет считывать и восстанавливать неиспользуемый байт. Но это тупиковый путь - библиотечные функци работать не будут, да и обязательно где-нибудь забудете и обратитесь напрямую со всеми вытекающими.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Рад что разобрался.

делали устройство на STR710 он нормально не работал с 16 бит памятью.

пришлось поставить две по 8 бит.

там вся времянка под две микросхемы заточена.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

делали устройство на STR710 он нормально не работал с 16 бит памятью.

пришлось поставить две по 8 бит.

там вся времянка под две микросхемы заточена.

 

Прошу пояснить, в чем проблемы с 16-битной памятью у этих чипов?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...