Перейти к содержанию
    

Проблема со статическими переменными в IAR 4/10

Не инициализируются статические и глобальные переменные. (mega128 IAR 4.10b)

 

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

 

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

 

 

 

Помогите пожалуйста кто знает в чём дело. :)

:maniac: Геморой - вручную инициализировать глобальные переменные и не пользоваться static

Изменено пользователем Пришелец

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

0xFF - где наблюдаете? В ассемблерном листинге или в отладчике?

Хорошо бы дополнительные условия к задаче ;) - текст программы, опции компилятора.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

ff наблюдаю при отладке когда вывожу значение переменной.

 

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

 

char b=10;

 

void func(void)

{

static char a=10;

char c=10;

 

print_dec(a);

print_dec(B);

print_dec©;

 

}

 

a и b всегда ff

c=10

 

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

 

_______________

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

 

неужели у всех нет этого глюка???

Изменено пользователем Пришелец

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Была такая проблема, правда наоборот - не инициализировались нулевые переменные - инициализировались 0xFF.

 

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

 

Посмотри, может у тебя тоже чего не дописывается?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Во-первых, используйте все-таки скобки


B)

 

 

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

Ну и в листинге перепроверьте, на всякий случай.

A c int - тот же эффект?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

с программатором всё нормально.

 

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

 

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

 

насчёт - спасибо - учту :)

 

скажите у Вас нет такой проблемы с той же версией иара?

статики и глобальные нормально инициализируются?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

У меня нет такой версии IARa :(. Я все-таки думаю, что листинг ассемблерный хорошо бы посмотреть (лучше прямо в теме ветки).

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

там где объявляется переменная никаих команд нет.

 

 \                                 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 или я чего-то не понимаю?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

  1. Возможно, проблема в настройках компилятора - попробуйте поменять значения на вкладке Code
  2. Попробуйте включить в проект файл avr\src\lib\low_level_init.c
  3. Проверьте через листинг линкера, в какие сегменты попадают переменные.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

скажите у Вас нет такой проблемы с той же версией иара?

статики и глобальные нормально инициализируются?

У меня на домашнем компе стоит 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

 

отладчиком не пользуюсь - прямо на железке.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Напишите пожалуйста как стоят галки в след опциях у кого всё работает:

 

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 попробую сегодня включить
Это я к тому, что если функция __low_level_init() где-то в проекте переопределяется, то она обязательнодолжна возвращать 1, иначе инициализации не будет.

 

переменные вроде попадают в нужные сегменты Near_i и Near_id
Near_id - это сегмент кода (т.е. флэш). Переменных там быть не может, только константы.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

отладчиком не пользуюсь - прямо на железке.

Проверьте, что получается в ИАРовском отладчике, если там инициализация проходит нормально, то ИМХО дело в ваших аппаратных средствах...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...