|
Проблема со статическими переменными в IAR 4/10 |
|
|
|
Jan 9 2006, 07:43
|

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

|
Не инициализируются статические и глобальные переменные. (mega128 IAR 4.10b) хотя сами переменные создаются и их инициализаторы так же создаются во FLASH. нулями переменные инициализируются. если инициализировать другим числом то всегда FF. Помогите пожалуйста кто знает в чём дело.  Геморой - вручную инициализировать глобальные переменные и не пользоваться static
Сообщение отредактировал Пришелец - Jan 9 2006, 07:44
|
|
|
|
2 страниц
1 2 >
|
 |
Ответов
(1 - 21)
|
Jan 9 2006, 10:17
|

Частый гость
 
Группа: Участник
Сообщений: 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(  ; print_dec©; } a и b всегда ff c=10 хотя однозначно в файле кода для прошивки есть инициализаторы для них. _______________ мне кажется что проблема где-то в настройках сегментов неужели у всех нет этого глюка???
Сообщение отредактировал Пришелец - Jan 9 2006, 10:18
|
|
|
|
|
Jan 9 2006, 10:32
|

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

|
Во-первых, используйте все-таки скобки [code][/code] Цитата хотя однозначно в файле кода для прошивки есть инициализаторы для них. Ну и в листинге перепроверьте, на всякий случай. A c int - тот же эффект?
|
|
|
|
|
Jan 9 2006, 10:56
|

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

|
с программатором всё нормально. да все типы ведут себя так же. В настройках С перепробовал (там три галочки есть) по всякому - не помогает насчёт - спасибо - учту скажите у Вас нет такой проблемы с той же версией иара? статики и глобальные нормально инициализируются?
|
|
|
|
|
Jan 9 2006, 11:30
|

Частый гость
 
Группа: Участник
Сообщений: 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 или я чего-то не понимаю?
|
|
|
|
|
Jan 10 2006, 07:19
|

Участник

Группа: Свой
Сообщений: 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 - это сегмент кода (т.е. флэш). Переменных там быть не может, только константы.
--------------------
|
|
|
|
|
Jan 10 2006, 09:43
|

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

|
подключил оба файла avr\src\lib\low_level_init.c avr\src\lib\segment_init.c хоть ф-ции эти и не переопределяются. используются по умолчанию попробовал иаровским debugerom значение переменной не присваивается но вместо ff начальное значение = 0 В near_id я имел в виду записывается значение инициализатора. поставил галки как Вы сказали - то же самое ______________ что дальше делать? самому писать segment_init  ???
|
|
|
|
|
Jan 10 2006, 10:44
|

Участник

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

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

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

|
создал новый проект не помогло. Код __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 __________но это наверное не страшно
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|