Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Инициализация переменных в Keil 4.50...
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
DO_SL
Здравствуйте. Возник следующий вопрос при работе c Keil 4.50: хочу прочитать состояние порта, чтение не дает результатов.
Код
int main(void)
{
uint16_t result = 0;
    InitAll();    // выполняем инициализацию порта
    while(1)
    {
        result = GPIOA -> IDR & GPIO_IDR_IDR8;
    }
}


Компилятор выдает предупреждение:
Код
main.c(20): warning:  #550-D: variable "result" was set but never used


Просмотрел файл линкера Prg_name.map, действительно, под переменную result не выделена память.
После объявления переменной как volatile предупреждение не возникает, но память по прежнему не выделяется.
Как я понимаю, приводить инициализацию портов нет смысла, ибо на выход все работает, такты подаются, светодиод моргает.
При этом в регистре IDR должно быть текущее состояние порта в не зависимости от режима работы. Я прав?

Компилятор Keil 4.50, МК STM32F103ZET6.

Спасибо за помощь.

Да, забыл указать, уровень оптимизации -00.
brag
Тю, вполне нормальное поведение компилятора. GPIOA -> IDR будет читатся всегда тк volatile. Действия с volatile result зависит от степени тупости компилятора.
DO_SL
Проверил следующий вариант, все заработало (т.е. вопрос правильности инцициализации периферии снят)
Код
int main(void)
{
              InitAll();    // выполняем инициализацию порта
    while(1)
    {
        if (!(GPIOA -> IDR & GPIO_IDR_IDR8))
                            { do something }
    }
}


Цитата
Тю, вполне нормальное поведение компилятора. GPIOA -> IDR будет читатся всегда тк volatile. Действия с volatile result зависит от степени тупости компилятора.


Эмм... А не подскажете, как все же сохранить состояние регистра МК в переменной? Операция то типовая. Начал разбираться с STM-кой, вот и натыкаюсь на грабли в самых неожиданный местах. sm.gif
brag
Смысл сохранять,если потом не используете? хотя фактически оно сохраняется, загрузка ведь в регистр идет
Если уж так сильно хочется в память - обьявите ее static volatile
delamoure
А у меня как-раз такой "рабочий" вариант не работал в версии 4.23.
Пришлось вводить переменную в которую читалось состояние регистра.
brag
Что ж там в InitAll() такого, что распознает чтение регистра опосля?
DO_SL
Цитата
Что ж там в InitAll() такого, что распознает чтение регистра опосля?


То есть? При чем тут InitAll()? Инициализация идентична в обоих версиях.
В функции настройка таймеров, прерываний, тактирование портов и задание их режимов.
MK2
У меня как раз приколы начались в кейле 4.5
он мог запросто неоткомпилировать новый кусок кода, решалось это изменением опции компиляции, причем не важно в какую сторону :|
ViKo
А выдать result куда-нибудь наружу, по USART, например, и шабаш!
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.