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

 
 
> не хочет в переменную заносится значение регистра 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
Ответов
juvf
сообщение Nov 27 2014, 05:24
Сообщение #2


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

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



на время отладки сделай
Цитата
static uint32_t c;
c = GPIOB->IDR;
Go to the top of the page
 
+Quote Post
jcxz
сообщение Nov 28 2014, 03:27
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 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
Сообщение #4


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

Группа: Свой
Сообщений: 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
Сообщение #5


Гуру
******

Группа: Свой
Сообщений: 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



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

 


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


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