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

 
 
> Проблема со статическими переменными в IAR 4/10
Пришелец
сообщение Jan 9 2006, 07:43
Сообщение #1


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

Группа: Участник
Сообщений: 183
Регистрация: 28-01-05
Пользователь №: 2 272



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

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

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



Помогите пожалуйста кто знает в чём дело. smile.gif
maniac.gif Геморой - вручную инициализировать глобальные переменные и не пользоваться static

Сообщение отредактировал Пришелец - Jan 9 2006, 07:44
Go to the top of the page
 
+Quote Post
2 страниц V   1 2 >  
Start new topic
Ответов (1 - 21)
Old1
сообщение Jan 9 2006, 08:25
Сообщение #2


Знающий
****

Группа: Свой
Сообщений: 697
Регистрация: 26-07-05
Из: Могилев
Пользователь №: 7 095



Есть подозрение, что эти пременные у вас определены и инициализированы, но далее вы кним (может быть пока еще?) не обращаеетесь. Если это так, то обратитесь к ним, или при определении используйте квалификатор __root, и они должны будут инициализироваться автоматически...
Go to the top of the page
 
+Quote Post
Пришелец
сообщение Jan 9 2006, 09:18
Сообщение #3


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

Группа: Участник
Сообщений: 183
Регистрация: 28-01-05
Пользователь №: 2 272



нет - переменные используются

__root - пробовал не помогает. sad.gif
Go to the top of the page
 
+Quote Post
Виктория
сообщение Jan 9 2006, 10:03
Сообщение #4


инженер
****

Группа: Свой
Сообщений: 520
Регистрация: 19-09-05
Из: Самара
Пользователь №: 8 701



0xFF - где наблюдаете? В ассемблерном листинге или в отладчике?
Хорошо бы дополнительные условия к задаче wink.gif - текст программы, опции компилятора.
Go to the top of the page
 
+Quote Post
Пришелец
сообщение Jan 9 2006, 10:17
Сообщение #5


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

Группа: Участник
Сообщений: 183
Регистрация: 28-01-05
Пользователь №: 2 272



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

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

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

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

Сообщение отредактировал Пришелец - Jan 9 2006, 10:18
Go to the top of the page
 
+Quote Post
Rst7
сообщение Jan 9 2006, 10:29
Сообщение #6


Йа моск ;)
******

Группа: Модераторы
Сообщений: 4 345
Регистрация: 7-07-05
Из: Kharkiv-city
Пользователь №: 6 610



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

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

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


--------------------
"Практика выше (теоретического) познания, ибо она имеет не только достоинство всеобщности, но и непосредственной действительности." - В.И. Ленин
Go to the top of the page
 
+Quote Post
Виктория
сообщение Jan 9 2006, 10:32
Сообщение #7


инженер
****

Группа: Свой
Сообщений: 520
Регистрация: 19-09-05
Из: Самара
Пользователь №: 8 701



Во-первых, используйте все-таки скобки [code][/code] cool.gif


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

Ну и в листинге перепроверьте, на всякий случай.
A c int - тот же эффект?
Go to the top of the page
 
+Quote Post
Пришелец
сообщение Jan 9 2006, 10:56
Сообщение #8


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

Группа: Участник
Сообщений: 183
Регистрация: 28-01-05
Пользователь №: 2 272



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

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

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

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

скажите у Вас нет такой проблемы с той же версией иара?
статики и глобальные нормально инициализируются?
Go to the top of the page
 
+Quote Post
Виктория
сообщение Jan 9 2006, 11:17
Сообщение #9


инженер
****

Группа: Свой
Сообщений: 520
Регистрация: 19-09-05
Из: Самара
Пользователь №: 8 701



У меня нет такой версии IARa sad.gif. Я все-таки думаю, что листинг ассемблерный хорошо бы посмотреть (лучше прямо в теме ветки).
Go to the top of the page
 
+Quote Post
Пришелец
сообщение Jan 9 2006, 11:30
Сообщение #10


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

Группа: Участник
Сообщений: 183
Регистрация: 28-01-05
Пользователь №: 2 272



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

Код
\                                 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 или я чего-то не понимаю?
Go to the top of the page
 
+Quote Post
GxOST
сообщение Jan 9 2006, 19:59
Сообщение #11


Участник
*

Группа: Свой
Сообщений: 58
Регистрация: 6-12-05
Из: Санкт-Петербург
Пользователь №: 11 878



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


--------------------
cul8r!
* #ru_embedded - эмбеддерский чат
Go to the top of the page
 
+Quote Post
Old1
сообщение Jan 9 2006, 20:01
Сообщение #12


Знающий
****

Группа: Свой
Сообщений: 697
Регистрация: 26-07-05
Из: Могилев
Пользователь №: 7 095



Цитата(Пришелец @ Jan 9 2006, 14:56) *
скажите у Вас нет такой проблемы с той же версией иара?
статики и глобальные нормально инициализируются?

У меня на домашнем компе стоит IAR 4.10b, с инициализацией глобальных и статических локальных переменных все в порядке... Вы каким отладчиком пользуетесь? Может быть в нем проблема?
Go to the top of the page
 
+Quote Post
Пришелец
сообщение Jan 10 2006, 04:17
Сообщение #13


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

Группа: Участник
Сообщений: 183
Регистрация: 28-01-05
Пользователь №: 2 272



Во вкладке 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

отладчиком не пользуюсь - прямо на железке.
Go to the top of the page
 
+Quote Post
GxOST
сообщение Jan 10 2006, 07:19
Сообщение #14


Участник
*

Группа: Свой
Сообщений: 58
Регистрация: 6-12-05
Из: Санкт-Петербург
Пользователь №: 11 878



Цитата(Пришелец @ 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 - это сегмент кода (т.е. флэш). Переменных там быть не может, только константы.


--------------------
cul8r!
* #ru_embedded - эмбеддерский чат
Go to the top of the page
 
+Quote Post
Old1
сообщение Jan 10 2006, 08:14
Сообщение #15


Знающий
****

Группа: Свой
Сообщений: 697
Регистрация: 26-07-05
Из: Могилев
Пользователь №: 7 095



Цитата(Пришелец @ Jan 10 2006, 08:17) *
отладчиком не пользуюсь - прямо на железке.

Проверьте, что получается в ИАРовском отладчике, если там инициализация проходит нормально, то ИМХО дело в ваших аппаратных средствах...
Go to the top of the page
 
+Quote Post
Andy Mozzhevilov
сообщение Jan 10 2006, 09:25
Сообщение #16


Знающий
****

Группа: Свой
Сообщений: 877
Регистрация: 26-01-05
Из: Екатеринбург
Пользователь №: 2 206



startup используется свой или библиотечный?


--------------------
Пасу котов...
Go to the top of the page
 
+Quote Post
Пришелец
сообщение Jan 10 2006, 09:43
Сообщение #17


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

Группа: Участник
Сообщений: 183
Регистрация: 28-01-05
Пользователь №: 2 272



подключил оба файла
avr\src\lib\low_level_init.c
avr\src\lib\segment_init.c
хоть ф-ции эти и не переопределяются. используются по умолчанию


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

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

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

что дальше делать? самому писать segment_init smile.gif ???
Go to the top of the page
 
+Quote Post
GxOST
сообщение Jan 10 2006, 10:44
Сообщение #18


Участник
*

Группа: Свой
Сообщений: 58
Регистрация: 6-12-05
Из: Санкт-Петербург
Пользователь №: 11 878



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


--------------------
cul8r!
* #ru_embedded - эмбеддерский чат
Go to the top of the page
 
+Quote Post
Пришелец
сообщение Jan 10 2006, 12:24
Сообщение #19


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

Группа: Участник
Сообщений: 183
Регистрация: 28-01-05
Пользователь №: 2 272



создал новый проект 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
Go to the top of the page
 
+Quote Post
Пришелец
сообщение Jan 10 2006, 13:39
Сообщение #20


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

Группа: Участник
Сообщений: 183
Регистрация: 28-01-05
Пользователь №: 2 272



Всем большое спасибо!!!
Ура !!! всё понятно!!!

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

проект состоит из файлов на 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
Go to the top of the page
 
+Quote Post
Виктория
сообщение Jan 10 2006, 14:05
Сообщение #21


инженер
****

Группа: Свой
Сообщений: 520
Регистрация: 19-09-05
Из: Самара
Пользователь №: 8 701



Поздравляю! blush.gif
Go to the top of the page
 
+Quote Post
GxOST
сообщение Jan 10 2006, 14:12
Сообщение #22


Участник
*

Группа: Свой
Сообщений: 58
Регистрация: 6-12-05
Из: Санкт-Петербург
Пользователь №: 11 878



За простенькой проблемой крылся огромный баг. 8)


--------------------
cul8r!
* #ru_embedded - эмбеддерский чат
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 22nd July 2025 - 08:56
Рейтинг@Mail.ru


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