|
Инициализация данных, в KEIL |
|
|
|
Aug 23 2007, 07:59
|
Участник

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

|
Что-то я в последнее время много топиков развел, но все же....
В компиляторе REAL VIEW в KEIL, в соответствии с сишными стандартами, явно неинициализированные переменные по дефолту инициализируются нулями, но, напимер, в моем случае это очень неудобно. У меня есть дополнение к некоторому массиву данных который храниется во флеше, которое должно быть инициализировано 0xFF-ми, но это дополнение в общем случае переменной длины, которая вычисляется в зависимости от длины массива данных. Тоесть сейчас я компилируюсь с одной длиной дополнения, а завтра эта длина может поменяться. И соответственно очень не хочется каждый раз руками изменять в коде количество 0xFF-ов, к тому же можно просто забыть про это, что вызовет ошибки... Так вот, я копался в хелпах Кейла, но так и не нашел директивы, меняющей инициализацию по умолчанию... Может быть есть возможность делать инициализацию как-нибуть в автомате? Может макросы такие есть или всетаки директивы?
|
|
|
|
|
 |
Ответов
|
Aug 23 2007, 08:23
|

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

|
Цитата(SanyaKID @ Aug 23 2007, 10:59)  Так вот, я копался в хелпах Кейла, но так и не нашел директивы, меняющей инициализацию по умолчанию... Не майтесь и не создавайте проблем себе - все, что должно-быть инициализировано явно, должно быть явно и инициализировано. Кроме того, как нечно хранящееся во Flash может быть "переменной" и инициализироваться. Цитата ...в соответствии с сишными стандартами, явно неинициализированные переменные по дефолту инициализируются нулями, В общем случае - категорически нет.
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Aug 23 2007, 08:46
|
Участник

Группа: Участник
Сообщений: 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 байтам.
|
|
|
|
|
Aug 23 2007, 09:28
|

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

|
Цитата(SanyaKID @ Aug 23 2007, 11:46)  Ну это константа. Я понял, о чем шла речь. Просто счел необходимым отметить, что к неициализированным переменным, которые потому и не инициализированные, что не инициализируются  этот случай не имеет никакого отношения. В данном случае Ваша переменная (или константа, если Вы прикажете разместить ее в CONST сегменте) это вся структура целиком и инициализация хотя-бы одного элемента сразу всю стуктуру целиком делает инициализированной и приводит к ее размещению вне сегмента BSS. Неинициализированные Вами явно поля не могут иметь 'никакого' значения и по это причине действительно инициализируются 0. Но еще раз подчеркивую Вы имеете дело с инициализированной структурой, а отнюдь не с тем, что якобы в 'С' неициализированные данные обнуляются. В подобных случаях придется явно инициализовать 0xFF при объявлении, а правильнее считать, что неиспользуемые элементы обнулены  . Для случая выравнивания все проще - эту проблему обычно решает #pragma data_alignment= хотя насчет того, что мусор между структурами будет 0xff никаких гарантий быть не может. Выводы - практически наверняка неудачно постороена система работы с вышеописанной стуктурой - поменяйте  , дабы независеть от содержимого памяти ПОСЛЕ структуры.
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
Сообщений в этой теме
SanyaKID Инициализация данных Aug 23 2007, 07:59 SanyaKID Спасибо за разъяснения! Насчет структуры я под... Aug 23 2007, 09:46 zltigo Цитата(SanyaKID @ Aug 23 2007, 12:46) Ест... Aug 23 2007, 10:03 VAI Кстати, про выравнивание:
в версии 3.1 компилятор... Aug 23 2007, 11:34 SanyaKID Она все-равно нулями выравнивает, и похоже опять-т... Aug 23 2007, 11:47 amw Не знаю как в RealView но в GCC, а точнее в LD дос... Aug 23 2007, 17:15
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|