|
|
  |
Массивы в Keil, Есть ли ограничение на размер? |
|
|
|
Nov 17 2011, 11:51
|
Гуру
     
Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448

|
Цитата(-= Александр =- @ Nov 17 2011, 15:34)  Может нельзя такой размер массива делать? Можно. Цитата(-= Александр =- @ Nov 17 2011, 15:34)  То как застолбить следующие байты под массив, чтоб компилер туда ничего не запихнул? Лучше сделать все по правилам: #pragma arm section, scatter.
|
|
|
|
|
Nov 17 2011, 12:27
|
Гуру
     
Группа: Свой
Сообщений: 5 273
Регистрация: 30-03-10
Пользователь №: 56 295

|
Цитата(-= Александр =- @ Nov 17 2011, 16:10)  Сразу после инициализации пишется/читается весь диапазон без проблем. А уже в процессе работы там обнаруживается всякий мусор. Вот пытаюсь понять откуда он там берется. Может там вообще какие-то переменные висят или кусок стека попадает... Плата самодельная ? Не думаю, что дело в стеке. Откройте .map - файл и посмотрите, как распределена память и куда пишется стек. Вообще, прохождение простейшего теста вроде записи/чтения бегущего нуля - еще не показатель исправности памяти. Я лично видел множество случаев, когда динамическое ОЗУ проходило простейшие тесты, но при настоящей работе сбоило. Про скаттер см. материалы у Кейла на сайте (www.keil.com; введите там в строке поиска слово "scatter"). Но едва ли дело в этом. Сначала нужно добиться устойчивой работы без скаттера. Благо, для не слишком сложных проектов обычно можно обойтись и без него ... P.S. А вы в курсе, что своим массивом вы забили все 32 МБ ? Если да, то указали ли вы компилятору, что объем этого ОЗУ - 32 МБ ?
|
|
|
|
|
Nov 17 2011, 12:56
|

Частый гость
 
Группа: Свой
Сообщений: 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
--------------------
Ниндзя - круче всех. Они умеют ходить по воде, делить на ноль и угадывать шаффл в АйПоде.
|
|
|
|
|
Nov 17 2011, 13:15
|
Гуру
     
Группа: Свой
Сообщений: 5 273
Регистрация: 30-03-10
Пользователь №: 56 295

|
Цитата(-= Александр =- @ Nov 17 2011, 16:06)  Да, там все сделано визардом. И тип и тайминги - все из даташита.
Вообще буду очень признателен если кто-нибудь по шагам распишет как в uVision4 грамотно прописать внешнюю память. Все что я делал - надергано из разных примеров и по большей части методом тыка. Да вроде все правильно у вас. Прописать настройки в .S - файле, затем указать компилятору адрес и размер памяти на вкладке "Tergat -> Options for target xxx", а затем с памятью можно работать. Сделайте простейший тестовый проект (отдельный) - заполняйте память случайными числами и их читайте. Только честно, все 32 метра. Будет сбоить ? Я почти уверен - да !!! P.S. Если вы используете режимы с экономией питания, то при входе в такие режимы регенерация памяти может останавливаться, в результате при пробуждении МК память оказывается разрушенной. Но это, похоже, не ваш случай ...
|
|
|
|
|
Nov 17 2011, 13:32
|
Знающий
   
Группа: Участник
Сообщений: 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 использовать. Почитайте тут.
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|