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

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> Размещение переменой по заданному адресу и ее значение после ресета
turnon
сообщение Aug 2 2017, 18:46
Сообщение #1


Местный
***

Группа: Свой
Сообщений: 340
Регистрация: 17-10-14
Пользователь №: 83 207



Представленный код инкрементит переменную между ресетами, но есь вопросы по надежности, а именно - не затрется ли переменная.

Размещение переменой по заданному адресу означает что под нее будет выделено место в памяти, заданное адресом?
Или это просто будет ссылка на заданный адрес - а что там - неизвестно?

STM32F2, IAR

Код
#include "stm32f2xx.h"

static __no_init __root uint32_t flag @0x20000000;

int main(void)
{
  flag++;
  NVIC_SystemReset();
}


Вот разница в .map файлах. Слева - с переменной flag, справа - без:
Прикрепленное изображение

Прикрепленное изображение


Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Aug 2 2017, 19:25
Сообщение #2


Гуру
******

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



QUOTE (turnon @ Aug 2 2017, 21:46) *
а именно - не затрется ли переменная.
CODE
__no_init
"У нас принято джентльменам верить на слово" ("Чокнутые").


--------------------
На любой вопрос даю любой ответ
"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
jcxz
сообщение Aug 2 2017, 20:41
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



Цитата(Сергей Борщ @ Aug 2 2017, 22:25) *
"У нас принято джентльменам верить на слово" ("Чокнутые").

Джентльменам может и да, а вот компоновщику нужно указывать явно - что и куда грузить и инитить или нет.
А у автора - как повезёт прописано в .icf-файле: если на данный адрес не смаппирована ни одна инициализируемая секция - повезло, а иначе - ну тут уж видно не судьба biggrin.gif
Вобщем - лучше не пользоваться такими конструкциями, а написать:
static __no_init __root uint32_t flag @ ".моя_секция";
а уж в .icf прописать куда эту ".моя_секция" компоновать. И там-же - указать, что её не нужно инитить. А то ведь можно даже и переменные __no_init лёгким мановением .icf-файла сделать инициализируемыми biggrin.gif

PS: И кто сказал что IAR - джентльмен? cool.gif
Go to the top of the page
 
+Quote Post
sigmaN
сообщение Aug 2 2017, 21:00
Сообщение #4


I WANT TO BELIEVE
******

Группа: Свой
Сообщений: 2 617
Регистрация: 9-03-08
Пользователь №: 35 751



А нам вообще кто-нибудь гарантирует аппаратно, что в RAM точно будут нули после power on???

Тут же всё держится на том, что при сбросе RAM сохранит данные, а при выключении питания - сотрется.
А через сколько после выключения питания она вся точно стирается? А не может исчезнуть питание "совсем не на долго", так чтобы в оперативке образовался мусор?

ИМХО, ТС встал на скользкую дорожку с этим счётчиком перезапусков....


--------------------
The truth is out there...
Go to the top of the page
 
+Quote Post
jcxz
сообщение Aug 2 2017, 21:28
Сообщение #5


Гуру
******

Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



Цитата(sigmaN @ Aug 3 2017, 00:00) *
А нам вообще кто-нибудь гарантирует аппаратно, что в RAM точно будут нули после power on???

Естественно после POR там будет мусор. Ну так ведь есть соответствующие регистры в МК, указывающие причину сброса: если там POR - обнуляем переменную и всё.
Go to the top of the page
 
+Quote Post
sigmaN
сообщение Aug 3 2017, 07:46
Сообщение #6


I WANT TO BELIEVE
******

Группа: Свой
Сообщений: 2 617
Регистрация: 9-03-08
Пользователь №: 35 751



Цитата
если там POR - обнуляем переменную и всё.
Ну, просто в приведенном коде этого нет.....


--------------------
The truth is out there...
Go to the top of the page
 
+Quote Post
HardEgor
сообщение Aug 3 2017, 09:00
Сообщение #7


Гуру
******

Группа: Свой
Сообщений: 2 223
Регистрация: 3-03-06
Из: Tomsk
Пользователь №: 14 925



Цитата(turnon @ Aug 3 2017, 01:46) *
Представленный код инкрементит переменную между ресетами, но есь вопросы по надежности, а именно - не затрется ли переменная.

Размещение переменой по заданному адресу означает что под нее будет выделено место в памяти, заданное адресом?
Или это просто будет ссылка на заданный адрес - а что там - неизвестно?

STM32F2, IAR

Я так не экспериментирую, а для таких целей использую регистры Backup RTC_BKP_DR0 и т.д.
Если нет батарейки, то делаю питание BKP от конденсатора с диодной развязкой - надолго хватает.
Go to the top of the page
 
+Quote Post
esaulenka
сообщение Aug 3 2017, 09:09
Сообщение #8


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

Группа: Свой
Сообщений: 1 032
Регистрация: 13-03-08
Из: Маськва
Пользователь №: 35 877



Цитата(jcxz @ Aug 2 2017, 23:41) *
А у автора - как повезёт прописано в .icf-файле: если на данный адрес не смаппирована ни одна инициализируемая секция - повезло, а иначе - ну тут уж видно не судьба biggrin.gif

Это где-нибудь в документации написано?
Потому что я видел только объяснения "хотите разместить что-нибудь по фиксированному адресу - используйте секции или синтаксис @адрес ".
И, с моей точки зрения, второй способ удобнее - всё в одном месте, не размазано по исходнику и скрипту линкера.


--------------------
Тут обсуждается творческий порыв, а не соответствие каким-либо стандартам ©
Go to the top of the page
 
+Quote Post
sigmaN
сообщение Aug 3 2017, 11:07
Сообщение #9


I WANT TO BELIEVE
******

Группа: Свой
Сообщений: 2 617
Регистрация: 9-03-08
Пользователь №: 35 751



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


--------------------
The truth is out there...
Go to the top of the page
 
+Quote Post
jcxz
сообщение Aug 3 2017, 16:39
Сообщение #10


Гуру
******

Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



Цитата(esaulenka @ Aug 3 2017, 12:09) *
Это где-нибудь в документации написано?

Что именно описано?
У автора в коде написано, что он помещает переменную по адресу 0x20000000. А что находится по этому адресу - известно только .icf файлу. Там может быть что-то, а может и не быть.
Вот именно удобно когда всё размещение в памяти описано в одном месте. У IAR это место - .icf-файл.
Go to the top of the page
 
+Quote Post
gerber
сообщение Aug 3 2017, 19:30
Сообщение #11


Знающий
****

Группа: Участник
Сообщений: 750
Регистрация: 1-11-11
Пользователь №: 68 088



Цитата(jcxz @ Aug 3 2017, 19:39) *
Что именно описано?
У автора в коде написано, что он помещает переменную по адресу 0x20000000. А что находится по этому адресу - известно только .icf файлу. Там может быть что-то, а может и не быть.

Нет. Если есть прямая директива разместить переменную по фиксированному адресу, то линкер её там и разместит, все остальные переменные лягут по другим адресам, никакого "затирания" не произойдет. В противном случае смысл в этой директиве напрочь отпадает.


--------------------
"... часами я мог наблюдать, как люди работают." (М. Горький)
Go to the top of the page
 
+Quote Post
esaulenka
сообщение Aug 3 2017, 20:07
Сообщение #12


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

Группа: Свой
Сообщений: 1 032
Регистрация: 13-03-08
Из: Маськва
Пользователь №: 35 877



Отлично. Берём другого автора.
https://www.iar.com/support/tech-notes/comp...ecific-address/
Они делают то же самое, и не говорят, что между двумя способами указания адреса есть какая-то разница.

Цитата(jcxz @ Aug 3 2017, 19:39) *
А что находится по этому адресу - известно только .icf файлу. Там может быть что-то, а может и не быть.

А вот это неправда. Что находится по этому адресу, известно линкеру. Один из способов сообщить это линкеру - icf-скрипт. Другой - прагмы и IAR'овские расширения языка си непосредственно в исходнике. Более того, достаточно прочитать первое сообщение темы - там отчётливо видно, как этот флажок расположен именно в том месте, какое и подразумевалось при объявлении. И что стек автоматически смещается, тоже видно. Т.е. линкер эту область видит. Ставим галочку.

Что будет, если линкер не сможет растолкать bss (zero-init), data (non-zero-init), стек и эти секции в области памяти - надо проверять. Но в то, что без каких-то ошибок они перекроют друг друга, я не верю. И аргументов от Вас никаких не услышал.


Цитата(jcxz @ Aug 3 2017, 19:39) *
Вот именно удобно когда всё размещение в памяти описано в одном месте. У IAR это место - .icf-файл.

Чувства верующих я, пожалуй, обсуждать не буду.


--------------------
Тут обсуждается творческий порыв, а не соответствие каким-либо стандартам ©
Go to the top of the page
 
+Quote Post
jcxz
сообщение Aug 4 2017, 06:42
Сообщение #13


Гуру
******

Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



Цитата(gerber @ Aug 3 2017, 22:30) *
Нет. Если есть прямая директива разместить переменную по фиксированному адресу, то линкер её там и разместит, все остальные переменные лягут по другим адресам, никакого "затирания" не произойдет. В противном случае смысл в этой директиве напрочь отпадает.

Ну хорошо, коли так rolleyes.gif
IAR может и проверяет, но вот другие компиляторы? В теме у автора из раздела форума "ARM" как раз подобное и приключилось - перекрылись две секции памяти, видимо описанные в разных местах.
Go to the top of the page
 
+Quote Post
turnon
сообщение Aug 5 2017, 10:25
Сообщение #14


Местный
***

Группа: Свой
Сообщений: 340
Регистрация: 17-10-14
Пользователь №: 83 207



Цитата(HardEgor @ Aug 3 2017, 12:00) *
Если нет батарейки, то делаю питание BKP от конденсатора с диодной развязкой - надолго хватает.

Потребление RTC - 5 uA. Если питание пропадет на сутки, чтобы RTC не сбросился (снижение напряжение с 3.3 до 2.3В) понадобится конденсатор 432000 uF (!). Конденсатор мелкие тоже ставлю, но исключительно чтобы не было сброса при заменен батарейки или при дребезге контактов в держателе батарейки.


Цитата(esaulenka @ Aug 3 2017, 23:07) *
А вот это неправда. Что находится по этому адресу, известно линкеру. Один из способов сообщить это линкеру - icf-скрипт. Другой - прагмы и IAR'овские расширения языка си непосредственно в исходнике. Более того, достаточно прочитать первое сообщение темы - там отчётливо видно, как этот флажок расположен именно в том месте, какое и подразумевалось при объявлении. И что стек автоматически смещается, тоже видно. Т.е. линкер эту область видит. Ставим галочку.

Значит таки выделяется место под переменную и не надо ничего прописывать в .icf файле. Это обнадеживает.

Цитата(esaulenka @ Aug 3 2017, 23:07) *
Что будет, если линкер не сможет растолкать bss (zero-init), data (non-zero-init), стек и эти секции в области памяти - надо проверять.

Вот тут не понял, расшифруйте пожалуйста для чайника.
Go to the top of the page
 
+Quote Post
jcxz
сообщение Aug 5 2017, 10:30
Сообщение #15


Гуру
******

Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



Цитата(turnon @ Aug 5 2017, 13:25) *
Потребление RTC - 5 uA. Если питание пропадет на сутки, чтобы RTC не сбросился (снижение напряжение с 3.3 до 2.3В) понадобится конденсатор 432000 uF (!). Конденсатор мелкие тоже ставлю, но исключительно чтобы не было сброса при заменен батарейки или при дребезге контактов в держателе батарейки.

А зачем нужно это инкрементирование переменной? Возможно есть решения получше, которые Вы не замечаете.
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 16th June 2025 - 16:22
Рейтинг@Mail.ru


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