Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Расположение нескольких массивов во внешней flash?
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
ZSN1
Keil ARM

Чет ума не приложу как объявить сегмент при расположении массивов?

Нашел только __at (0x80000000)
Для второго и последующего делаю пока так
Код
const double __at(0x80000000) Tabl_acos[10000] =
{
.....
};

const double __at(0x80000000) Tabl_asin[10000 + 10000*8] =
{
.....
};

и т.д.


Массивов много и высчитывать каждый ....
Как вставить объявление секции LR_ROM1 из scater файла в программу?

Код
; *************************************************************
; *** 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)
  }
}

LR_ROM1 0x80000000 0x00400000  {
  ER_ROM1 0x80000000 0x00400000  { ; load address = execution address
   .ANY (+RO)
  }
}


Или ткните в мануал, где это написано?
bugdesigner
Цитата(ZSN1 @ Aug 24 2015, 08:47) *
Keil ARM

Чет ума не приложу как объявить сегмент при расположении массивов?

Нашел только __at (0x80000000)

Когда-то делал подобное... Нужно использовать __attribute__(section ("name")) для каждой переменной, и секцию объявить в скаттер файле. Поищите на arm.com примеры. Если не найдёте, пишите, пороюсь завтра в старых проектах.
zltigo
QUOTE (ZSN1 @ Aug 24 2015, 08:47) *
Массивов много и высчитывать каждый ....

Говорят, что кроме массивов существуют "структуры". Настоятельно рекомендую познакомиться, как и вообще с языком 'C' - ну хоть немного!
ZSN1
Цитата(zltigo @ Aug 24 2015, 22:23) *
Говорят, что кроме массивов существуют "структуры". Настоятельно рекомендую познакомиться, как и вообще с языком 'C' - ну хоть немного!

Зачем усложнять. Чуйка подсказывает, что можно проще, путем простого объявления сегмента
esaulenka
Цитата(ZSN1 @ Aug 24 2015, 08:47) *
Keil ARM
Чет ума не приложу как объявить сегмент при расположении массивов?


У кейла можно сделать это галками, в свойствах файла.
Естественное ограничение - в эту область памяти переедет всё содержимое файла.
zltigo
QUOTE (ZSN1 @ Aug 25 2015, 07:55) *
Зачем усложнять. Чуйка подсказывает, что можно проще, путем простого объявления сегмента

"Усложнять"??? Ну если для Вас простой путь проходит через анус, то тогда, конечно....

ZSN1
Цитата(zltigo @ Aug 25 2015, 06:14) *
"Усложнять"??? Ну если для Вас простой путь проходит через анус, то тогда, конечно....

Ну если вы программируешь через анус ... laughing.gif то вы конечно супер-попель программер
Golikov A.
сдается мне объявив массив const он сам поедет в секцию ROM
ZSN1
Цитата(esaulenka @ Aug 25 2015, 06:14) *
У кейла можно сделать это галками, в свойствах файла.
Естественное ограничение - в эту область памяти переедет всё содержимое файла.

Тоже выход. Спасибо!

Цитата(Golikov A. @ Aug 25 2015, 06:31) *
сдается мне объявив массив const он сам поедет в секцию ROM

Не едет суко. Остается в процессорной flash. Чтоб поехал - надо пинка дать laughing.gif

Цитата(bugdesigner @ Aug 24 2015, 19:57) *
Когда-то делал подобное... Нужно использовать __attribute__(section ("name")) для каждой переменной, и секцию объявить в скаттер файле. Поищите на arm.com примеры. Если не найдёте, пишите, пороюсь завтра в старых проектах.


Помогло. Спасибо.

Код
__attribute__((section ("LR_ROM1"))) const unsigned short array[104312] = {
......
};


Скаттер
Код
; *************************************************************
; *** 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)
  }
}

LR_ROM1 0x80000000 0x00400000
{
  ER_ROM1 0x80000000 0x00400000
    { ; load address = execution address
   .ANY (+RO)
  }
}


+ немного поправить настройки линкера ...

Всем ответившим огромное спасибо!!!
bugdesigner
Цитата(ZSN1 @ Aug 25 2015, 08:43) *
Помогло. Спасибо.

Не знаю, как у Вас получилось :-/ LR_ROM1 - это load region, а не имя секции. Имя секции (например extrom) нужно объявить в этом регионе.
Правильно будет так (поправил Ваш пример):
Код
__attribute__((section ("extrom"))) const unsigned short array[104312] = {
......
};


Скаттер
Код
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)
  }
}

LR_ROM1 0x80000000 0x00400000
{
  ER_ROM1 0x80000000 0x00400000
    {; load address = execution address
   *(extrom)
  }
}

PS: И адреса проверьте, точно ли они соответствуют физической карте адресов Вашего ARM
ZSN1
Незнаю, у меня работает. Наверное глюк компилятора ... rolleyes.gif
Может линкер взял LR_ROM1 как адрес 0x80000000 и все? или я переубедил его настройками линкера, которые основательно перекопал ...

Незнаю, у меня работает. Наверное глюк компилятора ... rolleyes.gif
Может линкер взял LR_ROM1 как адрес 0x80000000 и все? или я переубедил его настройками линкера, которые основательно перекопал ...

Попробовал по вашему - обновление экрана возросло в разы!
Настройки линкера минимальны
СПС!
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.