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

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> Не лезет массив во внешнюю память
ViKo
сообщение Feb 8 2011, 09:25
Сообщение #1


Универсальный солдатик
******

Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362



В тестовом проекте Keil создаю массив во внешней памяти
Код
uint16_t ExtDpyBuf[0x9600] __attribute__((at(0x64000000)));

и больше ничего не требуется - ни scatter файл править, ни свойства в визарде менять. Код генерируется. Хотя нигде даже не упоминается про этот регион.
В рабочем проекте задаю тот же массив, меняю свойства, и - никак! Выдает
Цитата
... Error: L6407E: Sections of aggregate size 0x6128 bytes could not fit into .ANY selector(s).

Уменьшаю массив до 0x2600 - пожалуйста! Все влазит.
Что делать? Кто съел мою память?

upd. Еще добавлю - если атрибут уберу, компилируется. Потому что не используется.
upd2. Еще. Имею 2 Project Targets - ROM и RAM. Во втором разделил ОЗУ на две части для кода и данных. Вот именно в нем и не работает. А в ROM - влазит. Как будто для инициализации массива используется память?
Go to the top of the page
 
+Quote Post
ViKo
сообщение Feb 8 2011, 18:45
Сообщение #2


Универсальный солдатик
******

Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362



Буду смотреть, что творится с массивом во внешней памяти при определении.
Но возникла идея побочная - а зачем мне именно массив определять. Буду по указателю гонять данные в ExtDpyBuf. Адрес и размер задам с помощью #define, компилятор во внешнюю память сам ничего не положит. Другие области этой памяти буду импользовать аналогично. Т.е. возьму роль линкера для внешней памяти на себя. sm.gif

Go to the top of the page
 
+Quote Post
sergeeff
сообщение Feb 8 2011, 19:07
Сообщение #3


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

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



Уважаемый ViKo!

Вы нам так все рассказываете, как будто мы сидим рядом с вами за столом, на котором лежит и не работает ваша плата. Что за процессор? Какого объема память. Сколько вы выделили под стеки? Под heap? Это все в той же памяти, или у вас еще какай есть? Почему адрес такой странный 0х64000000?

Вы уж поделитесь сокровенными знаниями, если просите совета.
Go to the top of the page
 
+Quote Post
ViKo
сообщение Feb 8 2011, 20:01
Сообщение #4


Универсальный солдатик
******

Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362



Цитата(sergeeff @ Feb 8 2011, 21:07) *
Что за процессор? Какого объема память. Сколько вы выделили под стеки? Под heap? Это все в той же памяти, или у вас еще какай есть? Почему адрес такой странный 0х64000000?

STM32F103ZE, ARM 32-bit Cortex-M3 Microcontroller, 72MHz, 512kB Flash, 64kB SRAM, Flexible Static Memory Controller for SRAM, PSRAM, NOR and NAND Flash.
Stack_Size EQU 0x00000400
Heap_Size EQU 0x00000200
Все должно работать из внутренней Flash, на время отладки гружу код во внутреннюю SRAM - отвел половину для кода в настройках проекта в Keil.
Адреса для внешних устройств формирует FSMC. Адрес нормальный. ОЗУ тестировал раньше. Да дело и не в этом. Код не компилируется.
Go to the top of the page
 
+Quote Post
andrewlekar
сообщение Feb 9 2011, 05:12
Сообщение #5


Знающий
****

Группа: Участник
Сообщений: 837
Регистрация: 8-02-07
Пользователь №: 25 163



Попробуйте-ка для вашего массива поставить атрибут __no_init или аналогичный для вашего компилятора.
Go to the top of the page
 
+Quote Post
sergeeff
сообщение Feb 9 2011, 06:56
Сообщение #6


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

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



Цитата(ViKo @ Feb 8 2011, 13:25) *
В тестовом проекте Keil создаю массив во внешней памяти
Код
uint16_t ExtDpyBuf[0x9600] __attribute__((at(0x64000000)));


Еще добавлю - если атрибут уберу, компилируется.


Так все таки, не компилируется (т.е. ошибка компилятора) или не линкуется (ошибка линкера)?
Go to the top of the page
 
+Quote Post
sonycman
сообщение Feb 9 2011, 07:50
Сообщение #7


Любитель
*****

Группа: Свой
Сообщений: 1 864
Регистрация: 20-08-06
Из: Тольятти
Пользователь №: 19 695



А почему бы не задать регион для внешней памяти и помещать массив в этот регион директивой section?
Go to the top of the page
 
+Quote Post
sergeeff
сообщение Feb 9 2011, 08:10
Сообщение #8


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

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



Почти уверен, что ошибка линкера. И, скорее всего, из-за того, что в проекте неверно указан размер внешней памяти с адреса 0х64000000.
Go to the top of the page
 
+Quote Post
ViKo
сообщение Feb 9 2011, 08:47
Сообщение #9


Универсальный солдатик
******

Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362



Цитата(andrewlekar @ Feb 9 2011, 07:12) *
Попробуйте-ка для вашего массива поставить атрибут __no_init или аналогичный для вашего компилятора.

Добавил атрибут
Код
uint16_t ExtDpyBuf[0x9600] __attribute__((at(0x64000000), zero_init));

не помогло, все по-прежнему.

Цитата(sergeeff @ Feb 9 2011, 10:10) *
Почти уверен, что ошибка линкера. И, скорее всего, из-за того, что в проекте неверно указан размер внешней памяти с адреса 0х64000000.

Ошибка линковки, естественно. Но с размерами там все в порядке.
Start 0x64000000, Size 0x80000

Внутреннее ОЗУ я разбил на 2 части: 48KB под код, 16KB под данные. Попробую изменить пропорцию.

Цитата(sonycman @ Feb 9 2011, 09:50) *
А почему бы не задать регион для внешней памяти и помещать массив в этот регион директивой section?

Пробовал через scatter файл, да что-то "ниасилил".

Что любопытно. Пишет
Цитата
Error: L6407E: Sections of aggregate size 0x1e60 bytes could not fit into .ANY selector(s).

А секция .ANY - это ж для кода (+RO). И что там делает агрегат? Не влазит что-то другое? Там перед этим много чего написано, что не влазит...

Передвинул беду на размер массива 0x3600 (этот линкуется, 0x4600 - уже нет), сдвинув пропорцию код/данные в отношение 0xD000/0x3000
Похоже, при объявлении массива во внешней памяти какой-то код все-таки создается. И чем больше массив, тем больше кода. Чудеса?
Go to the top of the page
 
+Quote Post
sonycman
сообщение Feb 9 2011, 10:09
Сообщение #10


Любитель
*****

Группа: Свой
Сообщений: 1 864
Регистрация: 20-08-06
Из: Тольятти
Пользователь №: 19 695



Приведите скаттер файл, каким образом у вас регионы объявлены.
И список секций, генерируемых компилятором.

А для чего код в ОЗУ располагаете?
Go to the top of the page
 
+Quote Post
ViKo
сообщение Feb 9 2011, 10:28
Сообщение #11


Универсальный солдатик
******

Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362



Цитата(sonycman @ Feb 9 2011, 12:09) *
Приведите скаттер файл, каким образом у вас регионы объявлены.
И список секций, генерируемых компилятором.
А для чего код в ОЗУ располагаете?

Обычный
Код
; *************************************************************
; *** Scatter-Loading Description File generated by uVision ***
; *************************************************************

LR_IROM1 0x20000000 0x0000D000  {; load region size_region
  ER_IROM1 0x20000000 0x0000D000  {; load address = execution address
   *.o (RESET, +First)
   *(InRoot$$Sections)
   .ANY (+RO)
  }
  RW_IRAM1 0x2000D000 0x00003000  {; RW data
   .ANY (+RW +ZI)
  }
}

Располагаю в ОЗУ, экономлю ресурс флэш.
А вот из map куски
Код
Load Region LR$$.ARM.__AT_0x64000000 (Base: 0x64000000, Size: 0x00000000, Max: 0x00006c00, ABSOLUTE)
    Execution Region ER$$.ARM.__AT_0x64000000 (Base: 0x64000000, Size: 0x00006c00, Max: 0x00006c00, ABSOLUTE, UNINIT)
    Base Addr    Size         Type   Attr      Idx    E Section Name        Object
    0x64000000   0x00006c00   Zero   RW          214    .ARM.__AT_0x64000000  sledk_main.o

     Code (inc. data)   RO Data    RW Data    ZI Data      Debug  
     18166       1432       7206        516      37700     328496   Grand Totals
     18166       1432       7206        264      37700     328496   ELF Image Totals (compressed)
     18166       1432       7206        264          0          0   ROM Totals

  Total RO  Size (Code + RO Data)                25372 (  24.78kB)
    Total RW  Size (RW Data + ZI Data)             38216 (  37.32kB)
    Total ROM Size (Code + RO Data + RW Data)      25636 (  25.04kB)

Тут какая-то декомпрессия присутствует...??
Go to the top of the page
 
+Quote Post
ViKo
сообщение Feb 9 2011, 12:08
Сообщение #12


Универсальный солдатик
******

Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362



В тестовом примере путем урезания памяти
Код
LR_IROM1 0x20000000 0x00010000  {; load region size_region
  ER_IROM1 0x20000000 0x00010000  {; load address = execution address
   *.o (RESET, +First)
   *(InRoot$$Sections)
   .ANY (+RO)
  }
  RW_IRAM1 0x20010000 0x00010000  {; RW data
   .ANY (+RW +ZI)
  }
}

Добился, что
Код
uint16_t ExtDpyBuf[0x0010] __attribute__((at(0x64000000)));

вываливается с ошибкой
Keil_Temp.axf: Error: L6985E: Unable to automatically place AT section keil_temp.o(.ARM.__AT_0x20000208) with required base address 0x20000208. Please manually place in the scatter file using the --no_autoat option.

Нет! Все не так. Оно уже и без буфера то же пишет! Надо добавить памяти. Там в другом дело было. Пока убрал. Дальше вожусь...
Go to the top of the page
 
+Quote Post
ar__systems
сообщение Feb 9 2011, 13:48
Сообщение #13


self made
****

Группа: Свой
Сообщений: 855
Регистрация: 7-03-09
Из: Toronto, Canada
Пользователь №: 45 795



Цитата(ViKo @ Feb 9 2011, 05:28) *
Располагаю в ОЗУ, экономлю ресурс флэш.


А в ОЗУ этот кусок откуда переписываться будет?
Go to the top of the page
 
+Quote Post
ViKo
сообщение Feb 9 2011, 14:26
Сообщение #14


Универсальный солдатик
******

Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362



Цитата(ar__systems @ Feb 9 2011, 15:48) *
А в ОЗУ этот кусок откуда переписываться будет?

Из компьютера. Вот такой функцией Keil_Temp.ini, запускаемой при отладке
Код
func void Setup (void) {
  SP = _RDWORD(0x20000000);          // Setup Stack Pointer
  PC = _RDWORD(0x20000004);          // Setup Program Counter
  _WDWORD(0xE000ED08, 0x20000000);   // Setup Vector Table Offset Register
}

  map 0x64000000, 0x6407ffff read write
  map 0x6c000000, 0x6c03ffff read write
  //  map
  Load Keil_Temp.axf incremental // Download
  Setup();                              // Setup for Running
  G , main
Go to the top of the page
 
+Quote Post
ViKo
сообщение Feb 9 2011, 16:51
Сообщение #15


Универсальный солдатик
******

Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362



Попытался в тестовом проекте найти, обращается ли функция __main к массиву во внешней памяти. Не нашел.
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 24th September 2024 - 11:50
Рейтинг@Mail.ru


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