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

 
 
 
Reply to this topicStart new topic
> Инициализация данных, в KEIL
SanyaKID
сообщение Aug 23 2007, 07:59
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 48
Регистрация: 13-09-06
Пользователь №: 20 359



Что-то я в последнее время много топиков развел, но все же....

В компиляторе REAL VIEW в KEIL, в соответствии с сишными стандартами, явно неинициализированные переменные по дефолту инициализируются нулями, но, напимер, в моем случае это очень неудобно.
У меня есть дополнение к некоторому массиву данных который храниется во флеше, которое должно быть инициализировано 0xFF-ми, но это дополнение в общем случае переменной длины, которая вычисляется в зависимости от длины массива данных. Тоесть сейчас я компилируюсь с одной длиной дополнения, а завтра эта длина может поменяться. И соответственно очень не хочется каждый раз руками изменять в коде количество 0xFF-ов, к тому же можно просто забыть про это, что вызовет ошибки...
Так вот, я копался в хелпах Кейла, но так и не нашел директивы, меняющей инициализацию по умолчанию... Может быть есть возможность делать инициализацию как-нибуть в автомате? Может макросы такие есть или всетаки директивы?
Go to the top of the page
 
+Quote Post
zltigo
сообщение Aug 23 2007, 08:23
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



Цитата(SanyaKID @ Aug 23 2007, 10:59) *
Так вот, я копался в хелпах Кейла, но так и не нашел директивы, меняющей инициализацию по умолчанию...

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

В общем случае - категорически нет.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
SanyaKID
сообщение Aug 23 2007, 08:46
Сообщение #3


Участник
*

Группа: Участник
Сообщений: 48
Регистрация: 13-09-06
Пользователь №: 20 359



Цитата(zltigo @ Aug 23 2007, 12:23) *
Не майтесь и не создавайте проблем себе - все, что должно-быть инициализировано явно, должно быть явно и инициализировано. Кроме того, как нечно хранящееся во Flash может быть "переменной" и инициализироваться.


Ну это константа. Например так:

Код
//sn.h
#define SN_LEN 10;

unsigned char sn[SN_LEN] = {1,2,3,4,5,6,7,8,9,0};

.................

//struct.h
typedef struct
{
    unsigned char   massiv[SN_LEN];
    unsigned char    dummy[16-sizeof(massiv) %16];
} FN_STR;

.................

//struct.c
const FN_STR fn_serial  __at(0x1230) =
{
    sn,
    {0xFF}
};



Пример упрощен, но суть примерно такая. в dummy 0xFF будет только первый байт, а остальные нулями. А хотелось бы чтобы какнибуть в автомате сделать весь dummy 0xFF.

Это все сводится к тому, чтобы выравнивать данные по адресам и по дленне до кратности 16 байтам.
Go to the top of the page
 
+Quote Post
zltigo
сообщение Aug 23 2007, 09:28
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



Цитата(SanyaKID @ Aug 23 2007, 11:46) *
Ну это константа.

Я понял, о чем шла речь.
Просто счел необходимым отметить, что к неициализированным переменным, которые потому и не инициализированные, что не инициализируются smile.gif этот случай не имеет никакого отношения.
В данном случае Ваша переменная (или константа, если Вы прикажете разместить ее в CONST сегменте)
это вся структура целиком и инициализация хотя-бы одного элемента сразу всю стуктуру целиком делает инициализированной и приводит к ее размещению вне сегмента BSS. Неинициализированные Вами явно поля не могут иметь 'никакого' значения и по это причине действительно инициализируются 0. Но еще раз подчеркивую Вы имеете дело с инициализированной структурой, а отнюдь не с тем, что якобы в 'С' неициализированные данные обнуляются.
В подобных случаях придется явно инициализовать 0xFF при объявлении, а правильнее считать, что неиспользуемые элементы обнулены smile.gif.
Для случая выравнивания все проще - эту проблему обычно решает #pragma data_alignment=
хотя насчет того, что мусор между структурами будет 0xff никаких гарантий быть не может.
Выводы - практически наверняка неудачно постороена система работы с вышеописанной стуктурой - поменяйте smile.gif, дабы независеть от содержимого памяти ПОСЛЕ структуры.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
SanyaKID
сообщение Aug 23 2007, 09:46
Сообщение #5


Участник
*

Группа: Участник
Сообщений: 48
Регистрация: 13-09-06
Пользователь №: 20 359



Спасибо за разъяснения! Насчет структуры я подумаю. А прагмы такой в этом компиляторе RealView нету sad.gif Есть другие, но они позволяют выравнивать только по 8 байт.
Go to the top of the page
 
+Quote Post
zltigo
сообщение Aug 23 2007, 10:03
Сообщение #6


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



Цитата(SanyaKID @ Aug 23 2007, 12:46) *
Есть другие, но они позволяют выравнивать только по 8 байт.

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


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
VAI
сообщение Aug 23 2007, 11:34
Сообщение #7


Профессионал
*****

Группа: Модераторы
Сообщений: 1 120
Регистрация: 17-06-04
Пользователь №: 37



Кстати, про выравнивание:
в версии 3.1 компилятора RV, что идет в комплекте с МДК3.11, корректно работает #pragma pack() - как в "IAR C/EC++ Compiler", "Borland C++Builder" или "Microsoft Visual C++".
Код
#pragma pack( 1 ) - выравнивание по байтам
#pragma pack( 2 ) - по 2 байта
#pragma pack( 4 ) - по 4 байта и т.д.
#pragma pack()    - выравнивание по умолчанию

В документации пока не отражено, но я потестировал, посмотрел листинги..
По ссылке косвенное подтверждение...
http://www.keil.com/forum/docs/thread9546.asp


--------------------
Если зайца бить, его можно и спички научить зажигать
Сколько дурака не бей - умнее не будет. Зато опытнее
Go to the top of the page
 
+Quote Post
SanyaKID
сообщение Aug 23 2007, 11:47
Сообщение #8


Участник
*

Группа: Участник
Сообщений: 48
Регистрация: 13-09-06
Пользователь №: 20 359



Она все-равно нулями выравнивает, и похоже опять-таки только максимум по 8 байт
Go to the top of the page
 
+Quote Post
amw
сообщение Aug 23 2007, 17:15
Сообщение #9


Знающий
****

Группа: Свой
Сообщений: 601
Регистрация: 22-09-05
Из: Kharkov
Пользователь №: 8 847



Не знаю как в RealView но в GCC, а точнее в LD достаточно записать в скрипте линкера что-то на подобие:
Код
/* Memory Definitions */
MEMORY
{
  FFINIT (r) : ORIGIN = 0x1230, LENGTH = 0x800
}

SECTIONS
{
  .ffdata :
  {
     *(.ffdata)
  }> FFINIT = 0xFF;
}

А C файле указать:
Код
const FN_STR fn_serial  = {Чего-то там равно}
} __attribute__ (( section(".ffdata") )) FN_STR;


Сообщение отредактировал amw - Aug 23 2007, 17:15


--------------------
- А мораль отсюда такова: всякому овощу свое время. Или, хочешь, я это сформулирую попроще: никогда не думай, что ты иная, чем могла бы быть иначе, чем будучи иной в тех случаях, когда иначе нельзя не быть.
© Lewis Carroll. Alice's adventures in wonderland.
Go to the top of the page
 
+Quote Post

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

 


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


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