Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: WinAVR
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > Программирование
manul78
Ковыряю ATMEL-овскую "демку" и не пойму никак...

Код
     int main(void)
{
    Usb_enable_regulator();
    wdtdrv_disable();
    start_boot_if_required();
    Clear_prescaler();                     // Проблемная функция
    scheduler();
    return 0;
}

#ifdef  __GNUC__
// Locate low level init function before RAM init (init3 section)
// and remove std prologue/epilogue
char __low_level_init(void) __attribute__ ((section (".init3"),naked));
#endif

#ifdef __cplusplus
extern "C" {
#endif
char __low_level_init()
{
Clear_prescaler();             // Проблемная функция
return 1;
}
#ifdef __cplusplus
}
#endif


Конкретно WinAVR ругается сначала warning-ом, затем ошибкой. Функция Clear_prescaler();
Она определяется в заголовочном файле #include "lib_mcu/power/power_drv.h"
и выглядит вот так:

Код
#ifdef  __GNUC__
   #define Clear_prescaler()                       (clock_prescale_set(0))
#else
    #define Clear_prescaler()                       (Set_cpu_prescaler(0))
#endif

#ifdef  __GNUC__
   #define Set_cpu_prescaler(x)                        (clock_prescale_set(x))
#else
  extern void Set_cpu_prescaler(U8 x);
#endif


И теряется дальше где-то в "дебрях" WinAVR...
Ошибку выдает об отсутствии clock_prescale_set
В принципе, мне не важно, я её отключаю и всё равно программа работает. Но интересно. Функция вызываемая в скобках, это что ? Внутренние какие-то дела WinAVR ? (clock_prescale_set(0)) ?

Ещё интересуют выкусывания по частям стандартных "заготовок" WinAVR:
Код
// Locate low level init function before RAM init (init3 section)
// and remove std prologue/epilogue
   char __low_level_init(void) __attribute__ ((section (".init3"),naked));

Как работает данная функция ?
SysRq
Цитата(manul78 @ Jan 30 2010, 01:26) *
...это что ? Внутренние какие-то дела WinAVR ? (clock_prescale_set(0)) ?
Запись в CLKPR -- Clock Prescale Register (не на всех МК). Определена в avr/power.h.

Цитата(manul78 @ Jan 30 2010, 01:26) *
Код
char __low_level_init(void) __attribute__ ((section (".init3"),naked));

Как работает данная функция ?
Код тела фукнции линкер вставит в .init3. Можно считать, что функция в итоге вызовется единожды во время выполнения стартап-кода.
(http://www.nongnu.org/avr-libc/user-manual/mem_sections.html)
(http://www.nongnu.org/avr-libc/user-manual/FAQ.html)
manul78
Цитата(SysRq @ Jan 30 2010, 02:23) *
Запись в CLKPR -- Clock Prescale Register (не на всех МК). Определена в avr/power.h.


Спасибо ! Разобрался...
У меня стоит WinAVR 2007 года выпуска. Держу исключительно из за понравившегося мне компилятора данной версии,
хороший код генерит, и компактный.
А "таргет" мой AT90USB162... smile.gif Их в те времена еще не было. Из за этого и весь глюк.
Перекинул файл power.h из 2009-ой версии в 2007-ую и всё заработало... Ошибок нет.
Самое интересное, стал разбираться - в 2007-ом WinAVR вообще нет AT90USB82 - 162 моделей. smile.gif Но код генерит !
И рабочий код !
Если-бы не "прескаллер" то и не заметил-бы вообще... smile.gif

За ссылки спасибо, вот не знал, что можно свои start_up функции вставлять. Как-то отложилось в голове, что стандартную
процедуру начальной инициализации можно только отключить полностью.
_Pasha
Цитата(manul78 @ Jan 30 2010, 03:12) *
Но код генерит !
И рабочий код !

А что удивительного? Все тот же АВР...
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.