Цитата(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, без временных цэ.