01:37 

Хозяйке на заметку

Wuiss
Хранитель Атлантиды
Инструменты, предполагаемые для использования с МК AVR, порой не вполне очевидны. Этим вечером столкнулся с тем, что при отключенной в компиляторе оптимизации, у меня съезжают все задержки в программе. Проанализировав, понял, что ровно в четыре раза, что соответствует делителю частоты, который призван выставляться в самом начале.

Анализ ассемблерного кода, генерируемого компилятором, показал интересную картину. Покуда оптимизация включена, даже самая базовая, то код вида

Компилируется в четыре строчки ассемблера:

Однако, при выключенной оптимизации, этот же самый код превращается вот в такое чудовище:

Хорошо видно, что между операциями записи в регистр (ST) проходит больше четырех тактов, как требует даташит, и процессор не принимает эти изменения.

Ну, а правильный путь, как выяснилось уже потом, это подключить библиотеку avr/power.h и использовать функцию clock_prescale_set(), которая как раз являет собой интринсинк на ассемблере из тех самых четырех строчек. Выяснилось это как раз, когда я уже собрался вставлять в код подобную вставку. С одной стороны, радует, что к этой мысли я пришел самостоятельно, с другой же — немного грустно, что про эту библиотеку я узнал только сейчас.

Задумался, а не потому ли по умолчанию в AVR Studio даже в профиле Debug оптимизация, совершенно вопреки здравому смыслу, уже включена, хоть и базовая.

@темы: Хозяйке на заметку, Мысли о вечном, Дорогой дневник!..

URL
   

Записки из Атлантиды

главная