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

 
 
 
Reply to this topicStart new topic
> Массивы в Keil, Есть ли ограничение на размер?
-= Александр =-
сообщение Nov 17 2011, 11:34
Сообщение #1


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

Группа: Свой
Сообщений: 123
Регистрация: 15-10-07
Из: Санкт-Петербург
Пользователь №: 31 370



Есть LPC2478 и 32 мб внешней памяти. Хочу создать массив на весь ее размер.

#define ARRAY_SIZE 0x1000000
volatile unsigned short int Array[ARRAY_SIZE] __attribute__((at(0xA0000000)));

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

Сразу вопрос в догонку - если делать так:
volatile unsigned short int * FIFO_Array=(unsigned short int *)0xA0000000;
То как застолбить следующие байты под массив, чтоб компилер туда ничего не запихнул?


--------------------
Ниндзя - круче всех. Они умеют ходить по воде, делить на ноль и угадывать шаффл в АйПоде.
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Nov 17 2011, 11:51
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(-= Александр =- @ Nov 17 2011, 15:34) *
Может нельзя такой размер массива делать?

Можно.

Цитата(-= Александр =- @ Nov 17 2011, 15:34) *
То как застолбить следующие байты под массив, чтоб компилер туда ничего не запихнул?

Лучше сделать все по правилам: #pragma arm section, scatter.
Go to the top of the page
 
+Quote Post
-= Александр =-
сообщение Nov 17 2011, 11:55
Сообщение #3


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

Группа: Свой
Сообщений: 123
Регистрация: 15-10-07
Из: Санкт-Петербург
Пользователь №: 31 370



Где бы почитать про этот scatter? Я вообще мало понимаю как там линковщик память распределяет...


--------------------
Ниндзя - круче всех. Они умеют ходить по воде, делить на ноль и угадывать шаффл в АйПоде.
Go to the top of the page
 
+Quote Post
kovigor
сообщение Nov 17 2011, 12:05
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 5 273
Регистрация: 30-03-10
Пользователь №: 56 295



Цитата(-= Александр =- @ Nov 17 2011, 15:34) *
Вроде не ругается, но в процессе работы вылазят странные глюки. Может нельзя такой размер массива делать?


У вас, похоже, динамическое ОЗУ на плате неправильно настроено или плохо работает из-за проблем с разводкой ...
Go to the top of the page
 
+Quote Post
-= Александр =-
сообщение Nov 17 2011, 12:10
Сообщение #5


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

Группа: Свой
Сообщений: 123
Регистрация: 15-10-07
Из: Санкт-Петербург
Пользователь №: 31 370



Сразу после инициализации пишется/читается весь диапазон без проблем. А уже в процессе работы там обнаруживается всякий мусор. Вот пытаюсь понять откуда он там берется. Может там вообще какие-то переменные висят или кусок стека попадает...

Сообщение отредактировал -= Александр =- - Nov 17 2011, 12:11


--------------------
Ниндзя - круче всех. Они умеют ходить по воде, делить на ноль и угадывать шаффл в АйПоде.
Go to the top of the page
 
+Quote Post
kovigor
сообщение Nov 17 2011, 12:27
Сообщение #6


Гуру
******

Группа: Свой
Сообщений: 5 273
Регистрация: 30-03-10
Пользователь №: 56 295



Цитата(-= Александр =- @ Nov 17 2011, 16:10) *
Сразу после инициализации пишется/читается весь диапазон без проблем. А уже в процессе работы там обнаруживается всякий мусор. Вот пытаюсь понять откуда он там берется. Может там вообще какие-то переменные висят или кусок стека попадает...


Плата самодельная ? Не думаю, что дело в стеке. Откройте .map - файл и посмотрите, как распределена память и куда пишется стек. Вообще, прохождение простейшего теста вроде записи/чтения бегущего нуля - еще не показатель исправности памяти. Я лично видел множество случаев, когда динамическое ОЗУ проходило простейшие тесты, но при настоящей работе сбоило.
Про скаттер см. материалы у Кейла на сайте (www.keil.com; введите там в строке поиска слово "scatter"). Но едва ли дело в этом. Сначала нужно добиться устойчивой работы без скаттера. Благо, для не слишком сложных проектов обычно можно обойтись и без него ...

P.S. А вы в курсе, что своим массивом вы забили все 32 МБ ? Если да, то указали ли вы компилятору, что объем этого ОЗУ - 32 МБ ?
Go to the top of the page
 
+Quote Post
-= Александр =-
сообщение Nov 17 2011, 12:44
Сообщение #7


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

Группа: Свой
Сообщений: 123
Регистрация: 15-10-07
Из: Санкт-Петербург
Пользователь №: 31 370



Плата нормальная промышленного изготовления. Разводил сам, все там нормально.
Писал и ноль и не ноль и порядковые номера - все пишется и читается.

Из того что я сделал:
В настройке таргета ввел адрес и размер для RAM1.
Поставил галку noinit.
Галку default не ставил.
Ну и объявил таким образом массив.

Что еще нужно сделать?

Сообщение отредактировал -= Александр =- - Nov 17 2011, 12:48


--------------------
Ниндзя - круче всех. Они умеют ходить по воде, делить на ноль и угадывать шаффл в АйПоде.
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Nov 17 2011, 12:48
Сообщение #8


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(-= Александр =- @ Nov 17 2011, 16:44) *
Что еще нужно сделать?

С галками разбираться себе дороже. Покажите получившиеся scat и map.
Go to the top of the page
 
+Quote Post
-= Александр =-
сообщение Nov 17 2011, 12:56
Сообщение #9


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

Группа: Свой
Сообщений: 123
Регистрация: 15-10-07
Из: Санкт-Петербург
Пользователь №: 31 370



; *************************************************************
; *** Scatter-Loading Description File generated by uVision ***
; *************************************************************

LR_IROM1 0x00000000 0x00080000 { ; load region size_region
ER_IROM1 0x00000000 0x00080000 { ; load address = execution address
*.o (RESET, +First)
*(InRoot$$Sections)
.ANY (+RO)
}
RW_IRAM1 0x40000000 0x00010000 { ; RW data
.ANY (+RW +ZI)
}
}

Тут этой памяти вообще нету. Компилер его генерит сам и если я что-то меняю - перезаписывает как было.

Map здоровый как лошадь. Прикрепляю его целиком.
Прикрепленные файлы
Прикрепленный файл  PA_01.rar ( 9.8 килобайт ) Кол-во скачиваний: 15
 


--------------------
Ниндзя - круче всех. Они умеют ходить по воде, делить на ноль и угадывать шаффл в АйПоде.
Go to the top of the page
 
+Quote Post
kovigor
сообщение Nov 17 2011, 13:02
Сообщение #10


Гуру
******

Группа: Свой
Сообщений: 5 273
Регистрация: 30-03-10
Пользователь №: 56 295



Цитата(-= Александр =- @ Nov 17 2011, 16:44) *
Из того что я сделал:
В настройке таргета ввел адрес и размер для RAM1.
Поставил галку noinit.
Галку default не ставил.
Ну и объявил таким образом массив.

Что еще нужно сделать?


Я надеюсь, в .s - файле настройки контроллера памяти указаны (например, посредством Configuration wizard) ?
Go to the top of the page
 
+Quote Post
-= Александр =-
сообщение Nov 17 2011, 13:06
Сообщение #11


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

Группа: Свой
Сообщений: 123
Регистрация: 15-10-07
Из: Санкт-Петербург
Пользователь №: 31 370



Да, там все сделано визардом. И тип и тайминги - все из даташита.

Вообще буду очень признателен если кто-нибудь по шагам распишет как в uVision4 грамотно прописать внешнюю память.
Все что я делал - надергано из разных примеров и по большей части методом тыка.


--------------------
Ниндзя - круче всех. Они умеют ходить по воде, делить на ноль и угадывать шаффл в АйПоде.
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Nov 17 2011, 13:10
Сообщение #12


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(-= Александр =- @ Nov 17 2011, 16:56) *
Map здоровый как лошадь. Прикрепляю его целиком.

Во внешней памяти только ваш массив. Так что все претензии к железу и программе, никаких конфликтов нет.
Go to the top of the page
 
+Quote Post
kovigor
сообщение Nov 17 2011, 13:15
Сообщение #13


Гуру
******

Группа: Свой
Сообщений: 5 273
Регистрация: 30-03-10
Пользователь №: 56 295



Цитата(-= Александр =- @ Nov 17 2011, 16:06) *
Да, там все сделано визардом. И тип и тайминги - все из даташита.

Вообще буду очень признателен если кто-нибудь по шагам распишет как в uVision4 грамотно прописать внешнюю память.
Все что я делал - надергано из разных примеров и по большей части методом тыка.


Да вроде все правильно у вас. Прописать настройки в .S - файле, затем указать компилятору адрес и размер памяти на вкладке "Tergat -> Options for target xxx", а затем с памятью можно работать. Сделайте простейший тестовый проект (отдельный) - заполняйте память случайными числами и их читайте. Только честно, все 32 метра. Будет сбоить ? Я почти уверен - да !!!
P.S. Если вы используете режимы с экономией питания, то при входе в такие режимы регенерация памяти может останавливаться, в результате при пробуждении МК память оказывается разрушенной. Но это, похоже, не ваш случай ...
Go to the top of the page
 
+Quote Post
KnightIgor
сообщение Nov 17 2011, 13:32
Сообщение #14


Знающий
****

Группа: Участник
Сообщений: 643
Регистрация: 29-05-09
Из: Германия
Пользователь №: 49 725



Цитата(-= Александр =- @ Nov 17 2011, 13:34) *
Сразу вопрос в догонку - если делать так:
volatile unsigned short int * FIFO_Array=(unsigned short int *)0xA0000000;
То как застолбить следующие байты под массив, чтоб компилер туда ничего не запихнул?

Можно разместить ЗА границей памяти, которую разместил компилятор.

volatile unsigned short int * FIFO_Array= (unsigned short int *)&Image$$RW_IRAM1$$ZI$$Limit;

В данном случае речь о внутренней IRAM1 (см. опции проекта ->Target). Возможно, Вам надо будет RW_RAM1 использовать.
Почитайте тут.
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 21st July 2025 - 07:00
Рейтинг@Mail.ru


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