Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Размер __no_init секции
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > Cредства разработки для МК > IAR
xelax
Коллеги,

такой вопрос:

у меня есть однобайтовая __no_init переменная, при линкове выдаётся ошибка, что разммер секции слишком маленький и туда переменная не помещается. И действительно посмотрев командную строку линкера вижу такие параметры
Код
-D_..X_SRAM_END=21FF
-Z(DATA)NEAR_N=_..X_EXT_NV_BASE:+_..X_EXT_NV_SIZE
-D_..X_EXT_NV_BASE=_..X_SRAM_END
-D_..X_EXT_NV_SIZE=0


использую мегу1281. То есть насколько я понимаю линкер пытается положить переменную по адресу
0х21FF + 0 ???? Я прав????

И такой вопрос как поменять эти дефайны для линкера из IDE??? Создавать свой скрипт для линкера не хотелось бы.
Сергей Борщ
Цитата(xelax @ Oct 3 2008, 13:49) *
использую мегу1281. То есть насколько я понимаю линкер пытается положить переменную по адресу
0х21FF + 0 ???? Я прав????
Нет. Он пытается положить ее по адресу _..X_EXT_NV_BASE.
Цитата(xelax @ Oct 3 2008, 13:49) *
И такой вопрос как поменять эти дефайны для линкера из IDE??? Создавать свой скрипт для линкера не хотелось бы.
Судя по этому отрывку скрипта он пытается положить ее во внешнюю память. Если вам удастся в оболочке указать, что внешняя память лежит по тем же адресам, что и внутренняя, то все должно получиться. Если нет - придется переписывать скрипт. Если удастся - проверьте, не пытается ли оболочка при этом подключить другой стартап, который инициализирует проц на работу с внешней памятью.

Полагаю, что скопировать дефолтный скрипт линкера в папку проекта и слегка подправить его под свои требования - наиболее правильный вариант.
zltigo
Цитата(xelax @ Oct 3 2008, 12:49) *
Создавать свой скрипт для линкера не хотелось бы.

И совершенно зря - нормальный подход к полностью контролируемому коду и процессу работы. Использование "готовых" неведомо для чего сделанных и могущих, между прочим легко поменяться при переходе к другой версии пакета, "универсальных" решений верный путь к ненужным проблемам.
Взять "универсальный" в качестве заготовки, обдумать, понять, подправить.....
xelax
Цитата(zltigo @ Oct 3 2008, 16:59) *
И совершенно зря - нормальный подход к полностью контролируемому коду и процессу работы. Использование "готовых" неведомо для чего сделанных и могущих, между прочим легко поменяться при переходе к другой версии пакета, "универсальных" решений верный путь к ненужным проблемам.
Взять "универсальный" в качестве заготовки, обдумать, понять, подправить.....


smile.gif Уже осознал это. Так в итоге и сделал.
Только вот какой момент смущает, смотрю итоговый map файл и вижу:
Код
NEAR_I      DATA      00000200 - 000003F2      1F3      Relative      0
NEAR_Z     DATA     000003F3 - 00001DF5     1A03     Relative     0
RSTACK     DATA     00001DF6 - 00001E75     80     Predefined     0
CSTACK     DATA     00001E76 - 00002075     200     Predefined     0
NEAR_N     DATA     00002076 - 00002076     1     Relative     0


что стек располагает сразу после секции глобальных переменных. Почему IAR не расположил стек в конце памяти(хотя для формирования стека был указан диапазон всей памяти)? Если разнести стек и глобальные переменные в разные концы памяти, то при переполнении стека будет некий защитный буфер адресов, гарантирующий, что глобальные переменные не затруться. Очень странно....

Буду пытаться исправить вышеописанное руками в скрипте.
zltigo
Цитата(xelax @ Oct 3 2008, 15:09) *
Буду пытаться исправить вышеописанное руками в скрипте.

Легко. Есть возможнось не только указывать диапазон, но и откуда плясать при размещении.
Это ARM, но принцип тот-же
Код
//***************************************************************************
// Stack and heap segments.
//***************************************************************************
-D_CSTACK_SIZE=8         // Dummy System/User Stack Size (Not Used!)
-D_SVC_STACK_SIZE=200     // Supervisor Mode (Main Work Mode)
-D_IRQ_STACK_SIZE=200
-D_FIQ_STACK_SIZE=200            
-D_XXX_STACK_SIZE=20    // 32bytes Shared Stack for Abort/Undefined Instruction    and IAP Buffer        
-D_HEAP_RTOS_SIZE=2000  // 8Kb - Dummy minimal space for My Memory Manager

-Z(DATA)SVC_STACK+_SVC_STACK_SIZE=RAMSTART-RAMEND      // System/User
-Z(DATA)CSTACK+_CSTACK_SIZE=RAMSTART-RAMEND            // Supervisor
-Z(DATA)FIQ_STACK+_FIQ_STACK_SIZE=RAMSTART-RAMEND     // FIQ
-Z(DATA)IRQ_STACK+_IRQ_STACK_SIZE=RAMSTART-RAMEND    // IRQ
-Z(DATA)HEAP_RTOS+_HEAP_RTOS_SIZE=RAMSTART-RAMEND     // Minimal size for My memory manager
// All this space from start HEAP_RTOS to start XXX_STACK for Memory manager
-Z(DATA)XXX_STACK+_XXX_STACK_SIZE#RAMSTART-RAMEND    // Shared - Abort/Undefined and IAP buffer
xelax
Цитата(zltigo @ Oct 3 2008, 17:11) *
Легко. Есть возможнось не только указывать диапазон, но и откуда плясать при размещении.


Был бы признателен, если бы поделились знаниями, как задать откуда плясать. wink.gif


Ооо.... немного не успел с просьбой.... Спасибо буду осознавать
xelax
Спасибо, осознал... Сделал как хотелось. a14.gif

Ещё вопросик возник. А не преследует ли IAR какой скрытой цели, располагая память под переменные и стек подобным образом?
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.