Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Инициализация переменных в CVAVR
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > AVR
Marian
В 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 или так и должно быть ?
в файле полный пример и рисунки отладки.
Нажмите для просмотра прикрепленного файла
WHALE
Ничего не понял..почему вы считаете,что ваш массив должен начинаться с какого-то конкретного адреса?
В компиляторе есть прагмы,позволяющие класть данные в фиксированные адреса,но вы-же их не применяете,да и нафига это нужно?Оставьте черновую работу компилятору и не парьтесь.
и кстати,инициализация.имхо,неправильная,так попробуйте

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

typePunktMenu.linija = "ABCDEFGHIJKLMNOP";


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

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

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

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


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


Смотрел, не затирается.
Такое ощущение что компилятор производит оптимизацию с ошибкой , если не произвести ручной(принудительной) иницилизации.
Оптимизация не отключается, переключение с Size на Speed не помогает.
WHALE
а версия компилятора у вас какая?
VDG
Пересечение областей памяти, так?
Вы хотя бы числа дали бы: откуда начинается, где кончается...
Marian
Цитата(WHALE @ Aug 28 2007, 22:59) *
а версия компилятора у вас какая?

версия 1.24.6

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


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

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

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

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

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

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

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

( В файле есть две папки с проектом, если не лень, можете попробовать. Там в проекте после визарда добавлены только эти переменные.)
WHALE
я не знаю,пару лет назад как раз по-моему на 1.24.6 писался софт-там было штук 10 вложенных меню
все на структурах плюс еще чего-то,ничего друг на друга не наползало.
Попробуйте поставить 1.25.5,ссылок полно и на форуме тоже.
В настройках проекта все правильно-модель памяти,размер?
VDG
Цитата(Marian @ Aug 29 2007, 07:41) *
Да, пересечение областей памяти.

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

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

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

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


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

Спасибо всем за участие.
VDG
Цитата(Marian @ Aug 29 2007, 18:44) *
В том и проблема, что масив остается в том месте где и должен сидеть согласно map

А Вы это проверили, что он не дислокацию поменял, а так и остался сидеть на месте указанном в map (картинку бы...)? Реально пробывали массив проинициализировать и посмотреть где вылезло? То что строка у Вас съехала это видно, вопрос в том съехал ли куда-то сам массив?
Может и нет никакого наложения, а только перестановка, о которой умолчал компилятор. Иначе бы у товарища (вверху) похожий код глючил.

На map смотреть больше не надо. Это баг.
Marian
Цитата(VDG @ Aug 29 2007, 23:23) *
А Вы это проверили, что он не дислокацию поменял, а так и остался сидеть на месте указанном в map (картинку бы...)? Реально пробывали массив проинициализировать и посмотреть где вылезло? То что строка у Вас съехала это видно, вопрос в том съехал ли куда-то сам массив?
Может и нет никакого наложения, а только перестановка, о которой умолчал компилятор. Иначе бы у товарища (вверху) похожий код глючил.

На map смотреть больше не надо. Это баг.


Посмотрите на отладку :
Первый рисунок до выполнения
strcpyf(mainMenu[0].linia1,"nuznyj tekst");
Нажмите для просмотра прикрепленного файла
второй после
Нажмите для просмотра прикрепленного файла

И это полностью потверждается в железе.
VDG
Цитата(Marian @ Aug 30 2007, 19:14) *
Посмотрите на отладку :
Первый рисунок до выполнения
strcpyf(mainMenu[0].linia1,"nuznyj tekst");

Мда, самый плохой вариант.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.