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

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> Инициализация переменных в CVAVR, Ошибка иницилизации глобальной переменной в CVAVR
Marian
сообщение Aug 28 2007, 18:18
Сообщение #1


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

Группа: Участник
Сообщений: 148
Регистрация: 23-02-07
Пользователь №: 25 618



В CVAVR создаются глобальные переменные :

Код
// Declare your global variables here

typedef struct typePunktMenu punktMenu;

struct typePunktMenu  // struktura punkta menu
{  
   char linia1[17];
   char linia2[17];  
   punktMenu *Up;          
   punktMenu * Left;        
   punktMenu * Right;
   punktMenu * Down;
   void     (*function)();
};              

// masiv punktov menu
punktMenu mainMenu[3];

char linija[17]    = "ABCDEFGHIJKLMNOP";


linija должна начинатся с адреса 1E4h , но в отладке видно, что начинается с адреса 160h

если mainMenu проиницилизировать вручную

Код
// masiv punktov menu
punktMenu mainMenu[3]=
{
{"","",0,0,0,0,0},
{"","",0,0,0,0,0},
{"","",0,0,0,0,0}
};

то све встает на свои места.

Ошибка CVAVR или так и должно быть ?
в файле полный пример и рисунки отладки.
Прикрепленный файл  Projekt.rar ( 327.12 килобайт ) Кол-во скачиваний: 648
Go to the top of the page
 
+Quote Post
WHALE
сообщение Aug 28 2007, 18:41
Сообщение #2


Знающий
****

Группа: Свой
Сообщений: 902
Регистрация: 2-01-06
Из: Краснодар
Пользователь №: 12 768



Ничего не понял..почему вы считаете,что ваш массив должен начинаться с какого-то конкретного адреса?
В компиляторе есть прагмы,позволяющие класть данные в фиксированные адреса,но вы-же их не применяете,да и нафига это нужно?Оставьте черновую работу компилятору и не парьтесь.
и кстати,инициализация.имхо,неправильная,так попробуйте

typePunktMenu.linija = "ABCDEFGHIJKLMNOP";


--------------------
"Hello, word!" - 17 errors 56 warnings
Go to the top of the page
 
+Quote Post
Marian
сообщение Aug 28 2007, 19:08
Сообщение #3


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

Группа: Участник
Сообщений: 148
Регистрация: 23-02-07
Пользователь №: 25 618



Цитата(WHALE @ Aug 28 2007, 21:41) *
Ничего не понял..почему вы считаете,что ваш массив должен начинаться с какого-то конкретного адреса?
В компиляторе есть прагмы,позволяющие класть данные в фиксированные адреса,но вы-же их не применяете,да и нафига это нужно?Оставьте черновую работу компилятору и не парьтесь.
и кстати,инициализация.имхо,неправильная,так попробуйте

typePunktMenu.linija = "ABCDEFGHIJKLMNOP";


Переменная linija отношения к typePunktMenu неимеет.

массив будет начинаться с какого-то адреса, так как его туда компилятор помещает.
Мне не нужен постоянный адрес.
( адрес размещения виден в файле main.map , и там он указан верно) но в готовом проекте адрес переменной linija залазит на массив.

Мне кажется что все глобальные переменные должны быть проинициализированны автоматически.

А инициализация(для масива) такая как у меня показанна работает нормально.
Go to the top of the page
 
+Quote Post
WHALE
сообщение Aug 28 2007, 19:28
Сообщение #4


Знающий
****

Группа: Свой
Сообщений: 902
Регистрация: 2-01-06
Из: Краснодар
Пользователь №: 12 768



опять ничего не понял-так linija у вас переменная или массив


--------------------
"Hello, word!" - 17 errors 56 warnings
Go to the top of the page
 
+Quote Post
Marian
сообщение Aug 28 2007, 19:37
Сообщение #5


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

Группа: Участник
Сообщений: 148
Регистрация: 23-02-07
Пользователь №: 25 618



Цитата(WHALE @ Aug 28 2007, 22:28) *
опять ничего не понял-так linija у вас переменная или массив


llinija отдельная переменная ( массив из 16 char ) и располагается после массива mainMenu

Сообщение отредактировал Marian - Aug 28 2007, 19:39
Go to the top of the page
 
+Quote Post
WHALE
сообщение Aug 28 2007, 19:41
Сообщение #6


Знающий
****

Группа: Свой
Сообщений: 902
Регистрация: 2-01-06
Из: Краснодар
Пользователь №: 12 768



может,у вас стек маловат?попробуйте включить маркер конца стека и посмотрите в отладчике,не затира
ется ли он.


--------------------
"Hello, word!" - 17 errors 56 warnings
Go to the top of the page
 
+Quote Post
Marian
сообщение Aug 28 2007, 19:45
Сообщение #7


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

Группа: Участник
Сообщений: 148
Регистрация: 23-02-07
Пользователь №: 25 618



Цитата(WHALE @ Aug 28 2007, 22:41) *
может,у вас стек маловат?попробуйте включить маркер конца стека и посмотрите в отладчике,не затира
ется ли он.


Смотрел, не затирается.
Такое ощущение что компилятор производит оптимизацию с ошибкой , если не произвести ручной(принудительной) иницилизации.
Оптимизация не отключается, переключение с Size на Speed не помогает.

Сообщение отредактировал Marian - Aug 28 2007, 19:51
Go to the top of the page
 
+Quote Post
WHALE
сообщение Aug 28 2007, 19:59
Сообщение #8


Знающий
****

Группа: Свой
Сообщений: 902
Регистрация: 2-01-06
Из: Краснодар
Пользователь №: 12 768



а версия компилятора у вас какая?


--------------------
"Hello, word!" - 17 errors 56 warnings
Go to the top of the page
 
+Quote Post
VDG
сообщение Aug 28 2007, 20:12
Сообщение #9


Знающий
****

Группа: Участник
Сообщений: 845
Регистрация: 10-02-06
Пользователь №: 14 193



Пересечение областей памяти, так?
Вы хотя бы числа дали бы: откуда начинается, где кончается...


--------------------
Go to the top of the page
 
+Quote Post
Marian
сообщение Aug 29 2007, 03:41
Сообщение #10


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

Группа: Участник
Сообщений: 148
Регистрация: 23-02-07
Пользователь №: 25 618



Цитата(WHALE @ Aug 28 2007, 22:59) *
а версия компилятора у вас какая?

версия 1.24.6

Цитата(VDG @ Aug 28 2007, 23:12) *
Пересечение областей памяти, так?
Вы хотя бы числа дали бы: откуда начинается, где кончается...


Да, пересечение областей памяти.
Располажение переменных в памяти
Прикрепленное изображение

А так в проекте
Прикрепленное изображение
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Aug 29 2007, 06:56
Сообщение #11


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(Marian @ Aug 28 2007, 22:08) *
Мне кажется что все глобальные переменные должны быть проинициализированны автоматически.
Да, вам правильно кажется. Только обратите внимание, что в первом случае вы не указываете, чем инициализировать ваши структуры. Существует минимум два способа инициализации -
1) в переменную записывается записанное где-то во флеш начальное состояние
2) область памяти переменной заполняется заренее известной константой (нулем).

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

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

Еще - при указании инициализационных значений структуры можно указывать не все значения, а только несколько первых элементов. Остальные будут считаться компилятором как 0. Т.е. ваша инициализация могла быть записана как punktMenu mainMenu[3]={{0}};


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
Marian
сообщение Aug 29 2007, 09:40
Сообщение #12


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

Группа: Участник
Сообщений: 148
Регистрация: 23-02-07
Пользователь №: 25 618



Цитата
Существует минимум два способа инициализации-
1) в переменную записывается записанное где-то во флеш начальное состояние
2) область памяти переменной заполняется заренее известной константой (нулем).

Способ инициализации здесь неважен, при автоматическом размещении и инициализации переменной нулем, должно быть выделено место в памяти и другая переменная недолжна, занимать тоже место в памяти. Похоже на ошибку компилятора.

Цитата
Еще - при указании инициализационных значений структуры можно указывать не все значения, а только несколько первых элементов. Остальные будут считаться компилятором как 0. Т.е. ваша инициализация могла быть записана как punktMenu mainMenu[3]={{0}};

Пробовал инициализировать и так как у Вас в примере, дает ошибочный результат.

( В файле есть две папки с проектом, если не лень, можете попробовать. Там в проекте после визарда добавлены только эти переменные.)
Go to the top of the page
 
+Quote Post
WHALE
сообщение Aug 29 2007, 09:56
Сообщение #13


Знающий
****

Группа: Свой
Сообщений: 902
Регистрация: 2-01-06
Из: Краснодар
Пользователь №: 12 768



я не знаю,пару лет назад как раз по-моему на 1.24.6 писался софт-там было штук 10 вложенных меню
все на структурах плюс еще чего-то,ничего друг на друга не наползало.
Попробуйте поставить 1.25.5,ссылок полно и на форуме тоже.
В настройках проекта все правильно-модель памяти,размер?


--------------------
"Hello, word!" - 17 errors 56 warnings
Go to the top of the page
 
+Quote Post
VDG
сообщение Aug 29 2007, 14:14
Сообщение #14


Знающий
****

Группа: Участник
Сообщений: 845
Регистрация: 10-02-06
Пользователь №: 14 193



Цитата(Marian @ Aug 29 2007, 07:41) *
Да, пересечение областей памяти.

Компилятор после того как выдал Вам таблицу распределения в памяти, взял и втихомолку перетасовал адреса. Это глюк. Но не смертельный, если не делать из асма обращения к памяти (по данным из таблицы).
Это именно перетасовка, а не "наезд" одной области на другую. Проинициализируйте массив и посмотрите куда он на самом деле уехал. Скорее всего он идёт сразу же за строкой.

Сообщение отредактировал VDG - Aug 29 2007, 14:15


--------------------
Go to the top of the page
 
+Quote Post
Marian
сообщение Aug 29 2007, 14:44
Сообщение #15


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

Группа: Участник
Сообщений: 148
Регистрация: 23-02-07
Пользователь №: 25 618



С настройками программы вроде все в порядке.

Цитата(VDG @ Aug 29 2007, 17:14) *
Компилятор после того как выдал Вам таблицу распределения в памяти, взял и втихомолку перетасовал адреса. Это глюк. Но не смертельный, если не делать из асма обращения к памяти (по данным из таблицы).
Это именно перетасовка, а не "наезд" одной области на другую. Проинициализируйте массив и посмотрите куда он на самом деле уехал. Скорее всего он идёт сразу же за строкой.

В том и проблема, что масив остается в том месте где и должен сидеть согласно map

И например если в программе использовать :
Код
strcpyf(mainMenu[0].linia1,"nuznyj tekst");


то содержимое переменной linija, будет испорчено.

Спасибо всем за участие.

Сообщение отредактировал Marian - Aug 29 2007, 14:46
Go to the top of the page
 
+Quote Post

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

 


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


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