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

 
 
> не хочет в переменную заносится значение регистра IDR
Метценгерштейн
сообщение Nov 26 2014, 18:40
Сообщение #1


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

Группа: Свой
Сообщений: 1 357
Регистрация: 12-04-05
Из: Петербург
Пользователь №: 4 079



uint32_t c = GPIOB->IDR;

вот в таком виде переменная с не доступна для считывания. Должна же показывать после прочтения чему равна?

подозреваю, что надо значение поля структуры как-то к типу привести
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов (1 - 9)
toweroff
сообщение Nov 27 2014, 05:02
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 2 957
Регистрация: 19-09-06
Из: Москва
Пользователь №: 20 514



Цитата(Метценгерштейн @ Nov 26 2014, 21:40) *
uint32_t c = GPIOB->IDR;

вот в таком виде переменная с не доступна для считывания.

а какой уровень оптимизации стоит? вполне может быть, что компилятор эту переменную просто выбросил за ненадобностью
Go to the top of the page
 
+Quote Post
juvf
сообщение Nov 27 2014, 05:24
Сообщение #3


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

Группа: Свой
Сообщений: 1 261
Регистрация: 14-05-09
Из: Челябинск
Пользователь №: 49 045



на время отладки сделай
Цитата
static uint32_t c;
c = GPIOB->IDR;
Go to the top of the page
 
+Quote Post
Метценгерштейн
сообщение Nov 27 2014, 07:47
Сообщение #4


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

Группа: Свой
Сообщений: 1 357
Регистрация: 12-04-05
Из: Петербург
Пользователь №: 4 079



Цитата(toweroff @ Nov 27 2014, 08:02) *
а какой уровень оптимизации стоит? вполне может быть, что компилятор эту переменную просто выбросил за ненадобностью

да нулевая оптимизация была.
Вечером попробую поэкспериментировать ос статик- отпишусь.
Go to the top of the page
 
+Quote Post
megajohn
сообщение Nov 27 2014, 07:51
Сообщение #5


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

Группа: Свой
Сообщений: 1 080
Регистрация: 16-11-04
Из: СПб
Пользователь №: 1 143



в иаре также можно __root c =


--------------------
Марс - единственная планета, полностью населенная роботами (около 7 штук).
Go to the top of the page
 
+Quote Post
jcxz
сообщение Nov 28 2014, 03:27
Сообщение #6


Гуру
******

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



Цитата(juvf @ Nov 27 2014, 11:24) *
на время отладки сделай

Оптимизацию отключает volatile.
А static - это совсем о другом.
Учите матчасть!
Go to the top of the page
 
+Quote Post
juvf
сообщение Nov 28 2014, 04:49
Сообщение #7


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

Группа: Свой
Сообщений: 1 261
Регистрация: 14-05-09
Из: Челябинск
Пользователь №: 49 045



Цитата(jcxz @ Nov 28 2014, 08:27) *
Оптимизацию отключает volatile.
А static - это совсем о другом.
Учите матчасть!

вы сами учите матчасть. Нет задачи отключить оптимизацию, есть задача просмотреть переменую. статик эту задачу решает. Ещё второй вариант можно вынести цэ как глобальную.
Цитата
int c;
int main()
{
c = GPIOB->IDR;
}
эффект тотже. чем хороши эти способы - тем, что цэ будет видна в любом месте кода... где бы вы не остановились, цэ будет всегда видна в переменных, за исключением, если в какойнибудь области видимости не переопределена с.

теперь про volatile.... даже на реальном железе проверил, неполенился. (iar arm + eclipse, с уровнем оптимизации всего проекта s1)

если в коде сделать так
Код
volatile uint32_t r;
r = GPIOB->IDR;

то r вообще не видно ни в каком месте, ибо r ни где в коде не используется. делаем так
Код
volatile uint32_t r;
r = GPIOB->IDR;
r++;
Вот тут r будет видно только на строчке r++; шагнув на 1 строчку ниже переменная становиться невидимой всё по тойже причине - она ни где больше не используется.
делаем так
Код
static uint32_t c = 0xffff;
c = GPIOB->IDR;
переменная с везде видна. перед стартом, т.е. на первой строчке в main с видна как 0хфффф, после выполнения c = GPIOB->IDR, с видна со значением GPIOB->IDR. (ну естественно сам GPIOB->IDR должен быть volatile)

ps ещё как вариант решения проблемы.... если оптимизация отключена можно пробовать так
Цитата
uint32_t c = GPIOB->IDR;
с++;
т.е. нужно после считывания с, гдето её использовать. до использования её должно быть видно.

pps 2ТС, а в вашей IDE не видно регистры переферии процессора? Можно же непосредственно посмотреть значение регистра GPIOB->IDR, без временных цэ.
Go to the top of the page
 
+Quote Post
jcxz
сообщение Nov 28 2014, 10:50
Сообщение #8


Гуру
******

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



Цитата(juvf @ Nov 28 2014, 10:49) *
вы сами учите матчасть. Нет задачи отключить оптимизацию, есть задача просмотреть переменую. статик эту задачу решает. Ещё второй вариант можно вынести цэ как глобальную.

То что у Вас именно такие опции оптимизации, при которых неиспользуемый static не удаляется - это частный случай.
В общем случае оптимизатор имеет право удалить любую неиспользуемую переменную/функцию вне зависимости static она или глобальная или автоматическая. Если она не объявлена с volatile.
Без отключения оптимизации, нет гарантии, что она не будет удалена оптимизатором.
Так что всё-таки - учите wink.gif
Go to the top of the page
 
+Quote Post
juvf
сообщение Nov 28 2014, 12:07
Сообщение #9


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

Группа: Свой
Сообщений: 1 261
Регистрация: 14-05-09
Из: Челябинск
Пользователь №: 49 045



Цитата(jcxz @ Nov 28 2014, 15:50) *
То что у Вас именно такие опции оптимизации, при которых неиспользуемый static не удаляется - это частный случай.
В общем случае оптимизатор имеет право удалить любую неиспользуемую переменную/функцию вне зависимости static она или глобальная или автоматическая. Если она не объявлена с volatile.
Без отключения оптимизации, нет гарантии, чтоа онне будет удалена оптимизатором.
Так что всё-таки - учите wink.gif

Кого мне учить? Вы сами подучите про volatile, а потом про оптимизацию.

во первых, volatile не дает оптимизаору указания удалять или не удалять переменную, volatile дает указание компилятору не оптимизировать операции чтения/записи к переменной. во 2-х..... оптимизатор.... вроде как именно к компилятору относится. Как компилятор может соптимизировать (т.е. удалить) глобальную переменную, если компилятор не знает используется ли она в других файлах или нет? переменную volatile uint32_t r = GPIOB->IDR; может оптимизатор и не удалит.... (это ещё асм нужно глянуть, но и это будет тоже часный случай), но даже если она живая и она в области видимости больше не используется, то дебагер её не отображает. а статик отображает. Уже на практике не раз проверенно. А проверил с volatile - неработает.


ps я проверил на разных уровнях оптимизации. со статиком её видно. с volatile не видно. речь не о том, что переменную оптимизатор удалит или нет, речь о том, то что в дебаге переменную не видно. Если переменная больше не используется в обласnи видимости, как правило дебагер её больше не отображает. Статик - отображает. Пользую это всегда. Со статиком и глобальными переменными это работает в gcc, в iar.... как для любого мк, так и для ПК, и в частных случаях, и не в частных. sm.gif
Go to the top of the page
 
+Quote Post
Bear_ku
сообщение Nov 28 2014, 12:17
Сообщение #10


Частый гость
**

Группа: Участник
Сообщений: 154
Регистрация: 9-09-11
Пользователь №: 67 076



Согласен. Это не редкий случай когда не найдя переменную в отладчике, винят во всем компилятор.
Go to the top of the page
 
+Quote Post

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

 


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


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