реклама на сайте
подробности

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


Участник
*

Группа: Участник
Сообщений: 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 затирается.
Проблема в том что переконфигурировать память нельзя (заказчик не согласен).

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


help.gif

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

Сообщение отредактировал Странник - Nov 12 2007, 09:56
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов (1 - 11)
Leen
сообщение Nov 12 2007, 09:57
Сообщение #2


Частый гость
**

Группа: Свой
Сообщений: 172
Регистрация: 5-08-06
Из: Владивосток
Пользователь №: 19 343



Вопрос первый - какой компилятор?
Вопрос второй - как выровнена внешняя память?
Что происходит во внешней памяти в районе указателя ext_array? Причем, если там выравнивание 2, а во внутренней - 4, то с выравниванием 4 байта.
Может быть, компилер считает, что там выравнивание 4 и прибавляет 4, а там всего 2 - вот двойка и перетирается. Тогда надо насильственно указать pack(4) или что-то в этом духе.
Go to the top of the page
 
+Quote Post
Странник
сообщение Nov 12 2007, 10:13
Сообщение #3


Участник
*

Группа: Участник
Сообщений: 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(..))
Go to the top of the page
 
+Quote Post
Leen
сообщение Nov 12 2007, 10:32
Сообщение #4


Частый гость
**

Группа: Свой
Сообщений: 172
Регистрация: 5-08-06
Из: Владивосток
Пользователь №: 19 343



у него вроде только __packed. Попробуйте объявить так:
Код
__packed char ext_array[5]; // ext. memory
__packed char intern_array[3]={1,2,3}; //internal memory
и посмотреть в дизассемблере, что делается в мемкопи.
Go to the top of the page
 
+Quote Post
Странник
сообщение Nov 12 2007, 12:29
Сообщение #5


Участник
*

Группа: Участник
Сообщений: 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:
действительно есть такая штука, но как то результатов не получил sad.gif
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Nov 12 2007, 12:34
Сообщение #6


Гуру
******

Группа: Модераторы
Сообщений: 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)
Go to the top of the page
 
+Quote Post
Странник
сообщение Nov 12 2007, 13:07
Сообщение #7


Участник
*

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



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


Так и есть, только UB/LB сидят на земле
Go to the top of the page
 
+Quote Post
scifi
сообщение Nov 12 2007, 13:20
Сообщение #8


Гуру
******

Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136



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

К чему подключены выходы микроконтроллера WE.0 и WE.1?
Возможно, у Вас при подключении памяти не была предусмотрена побайтовая запись. С этим, конечно, можно жить, просто в программе геморроя добавится.
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Nov 12 2007, 13:52
Сообщение #9


Гуру
******

Группа: Модераторы
Сообщений: 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)
Go to the top of the page
 
+Quote Post
Странник
сообщение Nov 12 2007, 20:04
Сообщение #10


Участник
*

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



Большое спасибо всем кто откликнулся
beer.gif
Go to the top of the page
 
+Quote Post
KA_ru
сообщение Nov 12 2007, 20:20
Сообщение #11


Профессионал
*****

Группа: Свой
Сообщений: 1 424
Регистрация: 4-10-04
Из: Berlin
Пользователь №: 775



Рад что разобрался.
делали устройство на STR710 он нормально не работал с 16 бит памятью.
пришлось поставить две по 8 бит.
там вся времянка под две микросхемы заточена.
Go to the top of the page
 
+Quote Post
bigmaxtor
сообщение Nov 3 2008, 15:21
Сообщение #12


Участник
*

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



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


Прошу пояснить, в чем проблемы с 16-битной памятью у этих чипов?
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 19th July 2025 - 14:17
Рейтинг@Mail.ru


Страница сгенерированна за 0.01438 секунд с 7
ELECTRONIX ©2004-2016