Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Проблема со статическими переменными в IAR 4/10
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > AVR
Пришелец
Не инициализируются статические и глобальные переменные. (mega128 IAR 4.10b)

хотя сами переменные создаются и их инициализаторы так же создаются во FLASH.

нулями переменные инициализируются. если инициализировать другим числом то всегда FF.



Помогите пожалуйста кто знает в чём дело. smile.gif
maniac.gif Геморой - вручную инициализировать глобальные переменные и не пользоваться static
Old1
Есть подозрение, что эти пременные у вас определены и инициализированы, но далее вы кним (может быть пока еще?) не обращаеетесь. Если это так, то обратитесь к ним, или при определении используйте квалификатор __root, и они должны будут инициализироваться автоматически...
Пришелец
нет - переменные используются

__root - пробовал не помогает. sad.gif
Виктория
0xFF - где наблюдаете? В ассемблерном листинге или в отладчике?
Хорошо бы дополнительные условия к задаче wink.gif - текст программы, опции компилятора.
Пришелец
ff наблюдаю при отладке когда вывожу значение переменной.

от текста программы проблема не зависит.

char b=10;

void func(void)
{
static char a=10;
char c=10;

print_dec(a);
print_dec(cool.gif;
print_dec©;

}

a и b всегда ff
c=10

хотя однозначно в файле кода для прошивки есть инициализаторы для них.

_______________
мне кажется что проблема где-то в настройках сегментов

неужели у всех нет этого глюка???
Rst7
Была такая проблема, правда наоборот - не инициализировались нулевые переменные - инициализировались 0xFF.

Оказалось вот что - шился собственным программатором, а в софте ошибка была - не дописывался последний байт в прошивку, туда как раз попадало значение инициализации, оно становилось 0xFF и все.

Посмотри, может у тебя тоже чего не дописывается?
Виктория
Во-первых, используйте все-таки скобки [code][/code] cool.gif


Цитата
хотя однозначно в файле кода для прошивки есть инициализаторы для них.

Ну и в листинге перепроверьте, на всякий случай.
A c int - тот же эффект?
Пришелец
с программатором всё нормально.

да все типы ведут себя так же.

В настройках С перепробовал (там три галочки есть) по всякому - не помогает

насчёт - спасибо - учту smile.gif

скажите у Вас нет такой проблемы с той же версией иара?
статики и глобальные нормально инициализируются?
Виктория
У меня нет такой версии IARa sad.gif. Я все-таки думаю, что листинг ассемблерный хорошо бы посмотреть (лучше прямо в теме ветки).
Пришелец
там где объявляется переменная никаих команд нет.

Код
\                                 In segment CODE, align 2, keep-with-next
   1276          void menu_firstOBR(void)
   \                     menu_firstOBR:
   1277          {
   1278          static char cnt_123=1;
   1279          key();
   \   00000000   ........           CALL    key
   1280          menu_ptr=&menu_first;
   \   00000004   ....               LDI     R16, LOW(menu_first)


в сегментах NEAR_I и NEAR_ID место под переменные выделяется и инициализатор прописывается:

   \                                 In segment NEAR_I, align 1, keep-with-next, root
   \   00000000                      REQUIRE `?<Segment init: NEAR_I>`
   \                     ??cnt_123:
   \   00000000                      DS 1
   \   00000001                      REQUIRE `?<Initializer for cnt_123>`
   1283          



   \                                 In segment NEAR_ID, align 1, keep-with-next, root
   \                     `?<Initializer for cnt_123>`:
   \   00000000   01                 DB 1

   \                                 In segment NEAR_ID, align 1, keep-with-next, root
   \                     `?<Initializer for a>`:
   \   00000000   01                 DB 1

   \                                 In segment NEAR_ID, align 1, keep-with-next, root
   \                     `?<Initializer for a>_1`:
   \   00000000   01                 DB 1


!!! только смещение адреса почему-то не изменяется в NEAR_ID или я чего-то не понимаю?
GxOST
  1. Возможно, проблема в настройках компилятора - попробуйте поменять значения на вкладке Code
  2. Попробуйте включить в проект файл avr\src\lib\low_level_init.c
  3. Проверьте через листинг линкера, в какие сегменты попадают переменные.
Old1
Цитата(Пришелец @ Jan 9 2006, 14:56) *
скажите у Вас нет такой проблемы с той же версией иара?
статики и глобальные нормально инициализируются?

У меня на домашнем компе стоит IAR 4.10b, с инициализацией глобальных и статических локальных переменных все в порядке... Вы каким отладчиком пользуетесь? Может быть в нем проблема?
Пришелец
Во вкладке CODE пробовал все комбинации - не помогает
Напишите пожалуйста как стоят галки в след опциях у кого всё работает:

Place string literals and constants in initialized RAM ?
Place aggregate initializers in flash memory ?
Force generation of all global and static variables ?

avr\src\lib\low_level_init.c попробую сегодня включить

переменные вроде попадают в нужные сегменты Near_i и Near_id

отладчиком не пользуюсь - прямо на железке.
GxOST
Цитата(Пришелец @ Jan 10 2006, 07:17) *
Напишите пожалуйста как стоят галки в след опциях у кого всё работает:

Place string literals and constants in initialized RAM ?
Place aggregate initializers in flash memory ?
Force generation of all global and static variables ?
вкл,
вкл,
выкл.

Цитата(Пришелец @ Jan 10 2006, 07:17) *
avr\src\lib\low_level_init.c попробую сегодня включить
Это я к тому, что если функция __low_level_init() где-то в проекте переопределяется, то она обязательнодолжна возвращать 1, иначе инициализации не будет.

Цитата(Пришелец @ Jan 10 2006, 07:17) *
переменные вроде попадают в нужные сегменты Near_i и Near_id
Near_id - это сегмент кода (т.е. флэш). Переменных там быть не может, только константы.
Old1
Цитата(Пришелец @ Jan 10 2006, 08:17) *
отладчиком не пользуюсь - прямо на железке.

Проверьте, что получается в ИАРовском отладчике, если там инициализация проходит нормально, то ИМХО дело в ваших аппаратных средствах...
Andy Mozzhevilov
startup используется свой или библиотечный?
Пришелец
подключил оба файла
avr\src\lib\low_level_init.c
avr\src\lib\segment_init.c
хоть ф-ции эти и не переопределяются. используются по умолчанию


попробовал иаровским debugerom значение переменной не присваивается но вместо ff начальное значение = 0

В near_id я имел в виду записывается значение инициализатора.

поставил галки как Вы сказали - то же самое sad.gif
______________

что дальше делать? самому писать segment_init smile.gif ???
GxOST
Цитата(Пришелец @ Jan 10 2006, 12:43) *
что дальше делать? самому писать segment_init smile.gif ???
Я бы попробовал заново проект создать (с прежними исходниками, конечно).
Пришелец
создал новый проект sad.gif sad.gif sad.gif sad.gif sad.gif sad.gif sad.gif sad.gif sad.gif sad.gif sad.gif sad.gif

не помогло.

Код
__x_z void __flashcpy(DstPtr_Type dst, SrcPtr_Type src, Counter_Type size)
{
  do {
    *dst++ = *src++;
  } while(--size != 0);
}


эта ф-ция в файле segment_init.c
она неправильно работает - если поменять *dst++ = *src++; на *dst++ = 1;
то все статические переменные инициализируются единицами
т.е. видимо src не на нужную область указывает
в файле кода смотрел структуры SegmentInitBlock (их всего две для near_i и near_z)сформированы правильно с нужными адресами
инициализаторов.
т.е. всё вроде правильно написано и должно работать - но не работает.

только размер сегментов Near_i и near_id не совпадает первый больше
и цикл копирования из flash в RAM выполняется по длине near_i
__________но это наверное не страшно blink.gif
Пришелец
Всем большое спасибо!!!
Ура !!! всё понятно!!!

дело было вот в чём:

проект состоит из файлов на C и на ассемблере, я как-то давно повелось, не задумываясь в ассемблерных файлах данные определял в сегмент NEAR_I. Отсюда у меня и получались разные размеры сегментов NEAR_I и NEAR_ID - терялось их соответствие данные копировались из flash в ram со сдвигом.

Поменял сегменты для данных в ассемблерных файлах на NEAR_Z и всё заработало!!!

РАЗМРЫ СЕГМЕНТОВ NEAR_I и NEAR_ID ДОЛЖНЫ БЫТЬ РАВНЫ ! ! !

biggrin.gif biggrin.gif biggrin.gif biggrin.gif biggrin.gif biggrin.gif biggrin.gif biggrin.gif biggrin.gif biggrin.gif biggrin.gif
Виктория
Поздравляю! blush.gif
GxOST
За простенькой проблемой крылся огромный баг. 8)
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.