Форум Микро-Чип
Поиск и заказ электронных компонентов
 

Вернуться   Форум Микро-Чип > Инструментарий

Инструментарий Тестеры, паяльники, осциллографы, программаторы, IDE.

Ответ
 
Опции темы Опции просмотра
Старый 30.01.2017, 12:57   #1
Pasha_Bi
Senior Member
 
Регистрация: 24.07.2009
Адрес: г. Иваново
Возраст: 45
Сообщений: 296
Вес репутации: 640/48
Pasha_Bi is a name known to allPasha_Bi is a name known to allPasha_Bi is a name known to allPasha_Bi is a name known to allPasha_Bi is a name known to allPasha_Bi is a name known to all
По умолчанию Keil uvision как объявить неинициализированную переменную

В HI-TECH - persistent, в EWARM - __no_init, а в Keil как? Чего то не нахожу?
За ранее спасибо!
Pasha_Bi вне форума   Ответить с цитированием
Старый 30.01.2017, 14:19   #2
Pridnya
Senior Member
 
Регистрация: 21.01.2009
Адрес: Russia, Orel
Возраст: 40
Сообщений: 4,754
Вес репутации: 4545/133
Pridnya has a reputation beyond reputePridnya has a reputation beyond reputePridnya has a reputation beyond reputePridnya has a reputation beyond reputePridnya has a reputation beyond reputePridnya has a reputation beyond reputePridnya has a reputation beyond reputePridnya has a reputation beyond reputePridnya has a reputation beyond reputePridnya has a reputation beyond reputePridnya has a reputation beyond repute
По умолчанию Re: Keil uvision как объявить неинициализированную переменную

Цитата:
Сообщение от Pasha_Bi Посмотреть сообщение
В HI-TECH - persistent, в EWARM - __no_init, а в Keil как? Чего то не нахожу?
За ранее спасибо!
Это не оно? И какой смысл в таком объявлении?
Цитата:
ARM ® Compiler toolchain Version 5.02 Using the Compiler

6.85 How to prevent uninitialized data from being initialized to zero
The ANSI C specification states that static data that is not explicitly initialized, is to be
initialized to zero. Therefore, by default, the compiler puts both zero-initialized and
uninitialized data into the same ZI data section, which is populated with zeroes at runtime by
the C library initialization code.

You can prevent uninitialized data from being initialized to zero by placing that data in a
different section. This can be achieved using #pragma arm section , or with the GNU compiler
extension __attribute__((section("name")))

Example 6-9 Retaining uninitialized data using #pragma arm section

#pragma arm section zidata = “non_initialized”
int i, j; // uninitialized data in non_initialized section (without the pragma,
would be in .bss section by default)

#pragma arm section zidata // back to default (.bss section)
int k = 0, l = 0; // zero-initialized data in .bss section
The non_initialized section is then placed into its own UNINIT execution region:

LOAD_1 0x0
{
EXEC_1 +0
{
* (+RO)
* (+RW)
* (+ZI) ; ZI data gets initialized to zero
}
EXEC_2 +0 UNINIT
{
* (non_init) ; ZI data does not get initialized to zero
}
}
__________________
Прогресс неизбежен.
Pridnya вне форума   Ответить с цитированием
Старый 30.01.2017, 14:24   #3
Рак
Senior Member
 
Регистрация: 02.04.2008
Адрес: Кременчуг
Возраст: 34
Сообщений: 1,401
Вес репутации: 2524/83
Рак has a reputation beyond reputeРак has a reputation beyond reputeРак has a reputation beyond reputeРак has a reputation beyond reputeРак has a reputation beyond reputeРак has a reputation beyond reputeРак has a reputation beyond reputeРак has a reputation beyond reputeРак has a reputation beyond reputeРак has a reputation beyond reputeРак has a reputation beyond repute
По умолчанию Re: Keil uvision как объявить неинициализированную переменную

Цитата:
Сообщение от Pridnya Посмотреть сообщение
Это не оно? И какой смысл в таком объявлении?
Что бы сохранить значение переменной при перезагрузке от watchdoga, например.
Рак вне форума   Ответить с цитированием
Старый 30.01.2017, 14:42   #4
Pridnya
Senior Member
 
Регистрация: 21.01.2009
Адрес: Russia, Orel
Возраст: 40
Сообщений: 4,754
Вес репутации: 4545/133
Pridnya has a reputation beyond reputePridnya has a reputation beyond reputePridnya has a reputation beyond reputePridnya has a reputation beyond reputePridnya has a reputation beyond reputePridnya has a reputation beyond reputePridnya has a reputation beyond reputePridnya has a reputation beyond reputePridnya has a reputation beyond reputePridnya has a reputation beyond reputePridnya has a reputation beyond repute
По умолчанию Re: Keil uvision как объявить неинициализированную переменную

Цитата:
Сообщение от Рак Посмотреть сообщение
Чтобы сохранить значение переменной при перезагрузке от watchdoga, например.
Спасибо, я не знал! Это получается таким способом можно хоть половину оперативки (сколько выделишь) сохранить при перезагрузке от сторожевого таймера, т.е. когда питание не сбрасывалось. Пиши вместе, всегда пишешь раздельно.
__________________
Прогресс неизбежен.
Pridnya вне форума   Ответить с цитированием
Старый 30.01.2017, 15:09   #5
IceS
Super Moderator
 
Регистрация: 01.03.2007
Адрес: St. Petersburg
Возраст: 41
Сообщений: 3,246
Вес репутации: 3684/116
IceS has a reputation beyond reputeIceS has a reputation beyond reputeIceS has a reputation beyond reputeIceS has a reputation beyond reputeIceS has a reputation beyond reputeIceS has a reputation beyond reputeIceS has a reputation beyond reputeIceS has a reputation beyond reputeIceS has a reputation beyond reputeIceS has a reputation beyond reputeIceS has a reputation beyond repute
Отправить сообщение для IceS с помощью ICQ
По умолчанию Re: Keil uvision как объявить неинициализированную переменную

Цитата:
Сообщение от Pridnya Посмотреть сообщение
Спасибо, я не знал! Это получается таким способом можно хоть половину оперативки (сколько выделишь) сохранить при перезагрузке от сторожевого таймера, т.е. когда питание не сбрасывалось. Пиши вместе, всегда пишешь раздельно.
Не совсем, эта компилятор не будет делать код для инициализации этой памяти вообще. Т.е. не важно почему программа начала выполняться с начала, собака сработала, или по питанию сброс или по ножке ресет.
__________________
- Готово, мастер !!!
- Что готово ???
- Сломал ...
IceS вне форума   Ответить с цитированием
Старый 30.01.2017, 14:48   #6
Pasha_Bi
Senior Member
 
Регистрация: 24.07.2009
Адрес: г. Иваново
Возраст: 45
Сообщений: 296
Вес репутации: 640/48
Pasha_Bi is a name known to allPasha_Bi is a name known to allPasha_Bi is a name known to allPasha_Bi is a name known to allPasha_Bi is a name known to allPasha_Bi is a name known to all
По умолчанию Re: Keil uvision как объявить неинициализированную переменную

Я эту конструкцию попробовал. Ругается на “non_initialized” - неизвестная область. Ее как то в линкере надо определить сначала. Без “non_initialized” компилируется, но переменная сбрасывается в 0 при старте программы. Я надеялся что есть какой нибудь простой инструмент, чтоб в линкер не лезть.
Pasha_Bi вне форума   Ответить с цитированием
Старый 30.01.2017, 15:04   #7
Daniil
Senior Member
 
Регистрация: 22.09.2008
Адрес: Санкт-Петербург
Сообщений: 133
Вес репутации: 501/49
Daniil is a glorious beacon of lightDaniil is a glorious beacon of lightDaniil is a glorious beacon of lightDaniil is a glorious beacon of lightDaniil is a glorious beacon of lightDaniil is a glorious beacon of light
По умолчанию Re: Keil uvision как объявить неинициализированную переменную

http://www.keil.com/support/man/docs/ca/ca_noinit.htm

Код:
#pragma NOINIT 
char states[100];     /* Uninitialized Variable */ 
#pragma INIT 
char array[100];      /* Initialized Variable */
Daniil вне форума   Ответить с цитированием
Старый 30.01.2017, 15:12   #8
Pridnya
Senior Member
 
Регистрация: 21.01.2009
Адрес: Russia, Orel
Возраст: 40
Сообщений: 4,754
Вес репутации: 4545/133
Pridnya has a reputation beyond reputePridnya has a reputation beyond reputePridnya has a reputation beyond reputePridnya has a reputation beyond reputePridnya has a reputation beyond reputePridnya has a reputation beyond reputePridnya has a reputation beyond reputePridnya has a reputation beyond reputePridnya has a reputation beyond reputePridnya has a reputation beyond reputePridnya has a reputation beyond repute
По умолчанию Re: Keil uvision как объявить неинициализированную переменную

Цитата:
Сообщение от IceS Посмотреть сообщение
Не совсем, эта компилятор не будет делать код для инициализации этой памяти вообще. Т.е. не важно почему программа начала выполняться с начала, собака сработала, или по питанию сброс или по ножке ресет.
Когда с самого начала - понятно, а мне интересно было зачем вообще. Такой способ может добавить косяков: например произошла ошибка и счетчик в ОЗУ улетел за диапазон, а после перезагрузки улетевшее значение сохранится и снова улетаем. Вот я и спросил, а зачем? Какой смысл?

Цитата:
Сообщение от Daniil Посмотреть сообщение
http://www.keil.com/support/man/docs/ca/ca_noinit.htm

Код:
#pragma NOINIT 
char states[100];     /* Uninitialized Variable */ 
#pragma INIT 
char array[100];      /* Initialized Variable */
main.c
#pragma NOINIT
char states[100]; /* Uninitialized Variable */
#pragma INIT
char array[100]; /* Initialized Variable */

compiling main.c...
main.c(14): warning: #161-D: unrecognized #pragma
main.c(17): warning: #161-D: unrecognized #pragma
linking...

PS: C Compiler ARMCC v5.03
PPS: Эти директивы работали в каком-то очень старом компиляторе CARM Compiler? Сейчас он называется ARMCC.
Изображения
Тип файла: png Discontinued.PNG (38.1 Кб, 2 просмотров)
__________________
Прогресс неизбежен.

Последний раз редактировалось Pridnya; 30.01.2017 в 15:28.
Pridnya вне форума   Ответить с цитированием
Старый 30.01.2017, 15:30   #9
IceS
Super Moderator
 
Регистрация: 01.03.2007
Адрес: St. Petersburg
Возраст: 41
Сообщений: 3,246
Вес репутации: 3684/116
IceS has a reputation beyond reputeIceS has a reputation beyond reputeIceS has a reputation beyond reputeIceS has a reputation beyond reputeIceS has a reputation beyond reputeIceS has a reputation beyond reputeIceS has a reputation beyond reputeIceS has a reputation beyond reputeIceS has a reputation beyond reputeIceS has a reputation beyond reputeIceS has a reputation beyond repute
Отправить сообщение для IceS с помощью ICQ
По умолчанию Re: Keil uvision как объявить неинициализированную переменную

Цитата:
Сообщение от Pridnya Посмотреть сообщение
Когда с самого начала - понятно, а мне интересно было зачем вообще. Такой способ может добавить косяков: например произошла ошибка и счетчик в ОЗУ улетел за диапазон, а после перезагрузки улетевшее значение сохранится и снова улетаем. Вот я и спросил, а зачем? Какой смысл?
Ну начнем с того что компилятор знает о существовании системных портов, управлении направлением ножек контроллера и т.п. Но он не должен их трогать при старте программы. Об их состоянии при рестарте позаботились разработчики процессора. Так вот эти все регитры обозваны как persistent (в иаре любят слово __no_init, но persistent там тоже должен работать).
Так же есть всякие часы, счетчики, которые тоже не должны изменяться при запуске программы. Ну и бывает что прога стартуя должны иметь доступ к некоторым ячейкам самой себя, чтобы определить какие-то состояния (вход/выход из BOOT'а, определить причину сброса и т.п.).
__________________
- Готово, мастер !!!
- Что готово ???
- Сломал ...
IceS вне форума   Ответить с цитированием
Старый 30.01.2017, 15:40   #10
Pasha_Bi
Senior Member
 
Регистрация: 24.07.2009
Адрес: г. Иваново
Возраст: 45
Сообщений: 296
Вес репутации: 640/48
Pasha_Bi is a name known to allPasha_Bi is a name known to allPasha_Bi is a name known to allPasha_Bi is a name known to allPasha_Bi is a name known to allPasha_Bi is a name known to all
По умолчанию Re: Keil uvision как объявить неинициализированную переменную

классификатор persistent "не проходит" ни EWARM ни в Keil v5.17.
Pasha_Bi вне форума   Ответить с цитированием
Старый 30.01.2017, 15:42   #11
Pasha_Bi
Senior Member
 
Регистрация: 24.07.2009
Адрес: г. Иваново
Возраст: 45
Сообщений: 296
Вес репутации: 640/48
Pasha_Bi is a name known to allPasha_Bi is a name known to allPasha_Bi is a name known to allPasha_Bi is a name known to allPasha_Bi is a name known to allPasha_Bi is a name known to all
По умолчанию Re: Keil uvision как объявить неинициализированную переменную

#pragma NOINIT выдала предупреждение и переменная все равно инициализируется 0
Pasha_Bi вне форума   Ответить с цитированием
Старый 30.01.2017, 15:07   #12
IceS
Super Moderator
 
Регистрация: 01.03.2007
Адрес: St. Petersburg
Возраст: 41
Сообщений: 3,246
Вес репутации: 3684/116
IceS has a reputation beyond reputeIceS has a reputation beyond reputeIceS has a reputation beyond reputeIceS has a reputation beyond reputeIceS has a reputation beyond reputeIceS has a reputation beyond reputeIceS has a reputation beyond reputeIceS has a reputation beyond reputeIceS has a reputation beyond reputeIceS has a reputation beyond reputeIceS has a reputation beyond repute
Отправить сообщение для IceS с помощью ICQ
По умолчанию Re: Keil uvision как объявить неинициализированную переменную

Цитата:
Сообщение от Pasha_Bi Посмотреть сообщение
В HI-TECH - persistent, в EWARM - __no_init, а в Keil как? Чего то не нахожу?
За ранее спасибо!
вообще-то persistent это сишная фича, и она должна работать в Си компиляторе изначально.
__________________
- Готово, мастер !!!
- Что готово ???
- Сломал ...
IceS вне форума   Ответить с цитированием
Ответ


Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
 
Опции темы
Опции просмотра
Комбинированный вид Комбинированный вид

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Имитатор DS18B20 Filya44 Вопросы начинающих 14 12.03.2012 17:39
C18. Как объявить переменную с указанием адреса? FlashBack Продукция MICROCHIP 8 03.05.2011 15:01
Как перевести переменную int в строку Mizar Вопросы начинающих 14 13.10.2010 18:25
как объявить битовое поле в mcc18? ШуркоL Продукция MICROCHIP 6 10.03.2009 19:52
как в си хайтековском объявить массив и сказать чтобы он лежал на границе килобайта? Sergey Продукция MICROCHIP 1 22.05.2007 17:22


Часовой пояс GMT +3, время: 05:10.


Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2020, Jelsoft Enterprises Ltd. Перевод: zCarot