Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: не хочет в переменную заносится значение регистра IDR
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > ARM, 32bit
Метценгерштейн
uint32_t c = GPIOB->IDR;

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

подозреваю, что надо значение поля структуры как-то к типу привести
toweroff
Цитата(Метценгерштейн @ Nov 26 2014, 21:40) *
uint32_t c = GPIOB->IDR;

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

а какой уровень оптимизации стоит? вполне может быть, что компилятор эту переменную просто выбросил за ненадобностью
juvf
на время отладки сделай
Цитата
static uint32_t c;
c = GPIOB->IDR;
Метценгерштейн
Цитата(toweroff @ Nov 27 2014, 08:02) *
а какой уровень оптимизации стоит? вполне может быть, что компилятор эту переменную просто выбросил за ненадобностью

да нулевая оптимизация была.
Вечером попробую поэкспериментировать ос статик- отпишусь.
megajohn
в иаре также можно __root c =
jcxz
Цитата(juvf @ Nov 27 2014, 11:24) *
на время отладки сделай

Оптимизацию отключает volatile.
А static - это совсем о другом.
Учите матчасть!
juvf
Цитата(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, без временных цэ.
jcxz
Цитата(juvf @ Nov 28 2014, 10:49) *
вы сами учите матчасть. Нет задачи отключить оптимизацию, есть задача просмотреть переменую. статик эту задачу решает. Ещё второй вариант можно вынести цэ как глобальную.

То что у Вас именно такие опции оптимизации, при которых неиспользуемый static не удаляется - это частный случай.
В общем случае оптимизатор имеет право удалить любую неиспользуемую переменную/функцию вне зависимости static она или глобальная или автоматическая. Если она не объявлена с volatile.
Без отключения оптимизации, нет гарантии, что она не будет удалена оптимизатором.
Так что всё-таки - учите wink.gif
juvf
Цитата(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
Bear_ku
Согласен. Это не редкий случай когда не найдя переменную в отладчике, винят во всем компилятор.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.