Jump to content

    
Sign in to follow this  
Странник

STR71xF and access to External memory

Recommended Posts

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

Edited by Странник

Share this post


Link to post
Share on other sites

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

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

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

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

Share this post


Link to post
Share on other sites
Вопрос первый - какой компилятор?

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

 

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

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

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

Share this post


Link to post
Share on other sites

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

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

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

Share this post


Link to post
Share on other sites
у него вроде только __packed. Попробуйте объявить так:

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

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

 

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

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

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

 

По поводу _packed:

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

Share this post


Link to post
Share on other sites
Тут обнаружилась вот ещё какая штука:

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

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

Share this post


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

 

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

Share this post


Link to post
Share on other sites
Так и есть, только UB/LB сидят на земле

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

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

Share this post


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

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

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

Share this post


Link to post
Share on other sites

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

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

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

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

Share this post


Link to post
Share on other sites
делали устройство на STR710 он нормально не работал с 16 бит памятью.

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

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

 

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

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this