Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: переменные __no_init в IAR 5.11
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > Cредства разработки для МК > IAR
Aleksandr Baranov
Здравствуйте.
У меня IAR5.11, процессор STR912. Хочу, чтобы переменная в ОЗУ сохраняла значение после сброса.
Объявляю переменную:

__no_init int foo;

В начале функции main вывожу ее значение;

printf(" foo = %x", foo);

В одной из функций:

foo = 0x55;
printf(" And now foo = %x", foo);


и делаю сброс через WDT.
В начале foo = 0;
После присвоения перед сбросом foo = 0x55.
Я читал, что начиная с 5 версии создание специальных секций noinit не тербуется, а достаточно задать аттрибут __no_init.
Что делаю неправильно?
Спасибо.
rezident
Вы небось в симуляторе проверяете?
Aleksandr Baranov
Цитата(rezident @ Jan 3 2011, 02:26) *
Вы небось в симуляторе проверяете?

Вовсе нет. Проверяю "вживую". Причем, если делаю сброс JTAG-ом в режиме отладки- все получается как надо, а если реально - с помощью WDT, то переменная обнуляется.
skripach
Тоже вопрос в тему:
IAR 5.50, LPC2478.
При таком скрипке линкера:
Код
define symbol __region_SDRAM_2_RAM_start__ = 0xA2000000;
define symbol __region_SDRAM_2_RAM_end__   = 0xA3FFFFFF;
define region SDRAM_2_region= mem:[from __region_SDRAM_2_RAM_start__  to __region_SDRAM_2_RAM_end__];

place in SDRAM_2_region
                      { readwrite data section SDRAM_2_RAM };

Все переменные объявленные как:
Код
#pragma location="SDRAM_2_RAM"
__no_init int xxx;

все равно затираются нулями.
Если в скрипт добавить:
Код
do not initialize  { section SDRAM_2_RAM };

То все переменные сохраняют свои значения в не зависимости от наличия "__no_init".
Как сделать чтобы правильно работало "__no_init" ?


Aleksandr Baranov
Цитата(skripach @ Jan 3 2011, 09:37) *
То все переменные сохраняют свои значения в не зависимости от наличия "__no_init".
Как сделать чтобы правильно работало "__no_init" ?

Да, как раз только что сделал секцию .noinit:
и
do not initialize { section .noinit };
Вставил переменную туда и все получилось без __no_init.
skripach
Цитата
все получилось без __no_init.

Хотелось бы всё таки с ним.
Aleksandr Baranov
Цитата(skripach @ Jan 3 2011, 09:59) *
Хотелось бы всё таки с ним.

Будем искать
Dog Pawlowa
Цитата(Aleksandr Baranov @ Jan 4 2011, 07:42) *
Будем искать


Дык конфликтует pragma location и no_init.

Мне кажется, логика такова.
Без принудительного указания секции линкер в зависимости от наличия __no_init располагает переменную в инициализируемой или неинициализируемой секции (.noinit), которые создаются неявно в недрах линкера.
С принудительным указанием секции __no_init не работает, поскольку поверх действует указание для этой секции.

Т.е. почему не действует __no_init если указано location, понятно.

А вот почему не действует, если не указано - можно посмотреть в map-файле.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.