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

 
 
 
Reply to this topicStart new topic
> переменные __no_init в IAR 5.11, В начале main равно нулю.
Aleksandr Barano...
сообщение Jan 2 2011, 23:38
Сообщение #1


Частый гость
**

Группа: Участник
Сообщений: 169
Регистрация: 31-08-05
Из: New York
Пользователь №: 8 118



Здравствуйте.
У меня 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.
Что делаю неправильно?
Спасибо.


--------------------
ASB
Go to the top of the page
 
+Quote Post
rezident
сообщение Jan 3 2011, 04:26
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882



Вы небось в симуляторе проверяете?
Go to the top of the page
 
+Quote Post
Aleksandr Barano...
сообщение Jan 3 2011, 10:35
Сообщение #3


Частый гость
**

Группа: Участник
Сообщений: 169
Регистрация: 31-08-05
Из: New York
Пользователь №: 8 118



Цитата(rezident @ Jan 3 2011, 02:26) *
Вы небось в симуляторе проверяете?

Вовсе нет. Проверяю "вживую". Причем, если делаю сброс JTAG-ом в режиме отладки- все получается как надо, а если реально - с помощью WDT, то переменная обнуляется.


--------------------
ASB
Go to the top of the page
 
+Quote Post
skripach
сообщение Jan 3 2011, 11:37
Сообщение #4


■ ■ ■ ■
*****

Группа: Свой
Сообщений: 1 100
Регистрация: 9-08-06
Пользователь №: 19 443



Тоже вопрос в тему:
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" ?




--------------------
Делай что должен и будь что будет.
Go to the top of the page
 
+Quote Post
Aleksandr Barano...
сообщение Jan 3 2011, 11:50
Сообщение #5


Частый гость
**

Группа: Участник
Сообщений: 169
Регистрация: 31-08-05
Из: New York
Пользователь №: 8 118



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

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


--------------------
ASB
Go to the top of the page
 
+Quote Post
skripach
сообщение Jan 3 2011, 11:59
Сообщение #6


■ ■ ■ ■
*****

Группа: Свой
Сообщений: 1 100
Регистрация: 9-08-06
Пользователь №: 19 443



Цитата
все получилось без __no_init.

Хотелось бы всё таки с ним.


--------------------
Делай что должен и будь что будет.
Go to the top of the page
 
+Quote Post
Aleksandr Barano...
сообщение Jan 4 2011, 00:42
Сообщение #7


Частый гость
**

Группа: Участник
Сообщений: 169
Регистрация: 31-08-05
Из: New York
Пользователь №: 8 118



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

Будем искать


--------------------
ASB
Go to the top of the page
 
+Quote Post
Dog Pawlowa
сообщение Jan 4 2011, 04:33
Сообщение #8


Гуру
******

Группа: Свой
Сообщений: 2 702
Регистрация: 14-07-06
Пользователь №: 18 823



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


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

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

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

А вот почему не действует, если не указано - можно посмотреть в map-файле.


--------------------
Уходя, оставьте свет...
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 27th July 2025 - 20:33
Рейтинг@Mail.ru


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