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

 
 
> Перенос кода из под ИАРа на WinAVR, возникают некоторые вопросы...
sonycman
сообщение Nov 22 2008, 19:39
Сообщение #1


Любитель
*****

Группа: Свой
Сообщений: 1 864
Регистрация: 20-08-06
Из: Тольятти
Пользователь №: 19 695



Сейчас пытаюсь подогнать ИАРовский проект на меге88 под ВинАВР 4.3.2.
Чувствую, помучаться придётся немало smile3046.gif

Пока не могу разобраться, как красиво прочитать/записать 16-ти битный таймер, обеспечив атомарность операции.
Аналога иаровского __monitor не нашёл.
Существуют ли подобные макросы? Или надо писать самому?
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
demiurg_spb
сообщение Nov 22 2008, 20:04
Сообщение #2


неотягощённый злом
******

Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643



Поможет WinAVR\avr\include\util\atomic.h


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post
sonycman
сообщение Nov 22 2008, 21:17
Сообщение #3


Любитель
*****

Группа: Свой
Сообщений: 1 864
Регистрация: 20-08-06
Из: Тольятти
Пользователь №: 19 695



Цитата(demiurg_spb @ Nov 23 2008, 00:04) *
Поможет WinAVR\avr\include\util\atomic.h

Уря, разобрался! a14.gif
С меня beer.gif

Я то пытался накропать код и заюзать что-то типа cli() и sei() своими корявенькими ручонками, а тут уже готовое решение, такое компактное и мощное одновременно!
Разрабы туда, наверное, тонну хитрости запихали! Учитывать все выходы из секции для восстановления прерываний... бла, как они это осуществили?

Всё, пошёл спать. С утра буду невыспавшийся - зато довольный laughing.gif
Go to the top of the page
 
+Quote Post
ReAl
сообщение Nov 23 2008, 18:03
Сообщение #4


Нечётный пользователь.
******

Группа: Свой
Сообщений: 2 033
Регистрация: 26-05-05
Из: Бровари, Україна
Пользователь №: 5 417



Цитата(sonycman @ Nov 22 2008, 23:17) *
Разрабы туда, наверное, тонну хитрости запихали! Учитывать все выходы из секции для восстановления прерываний... бла, как они это осуществили?
У gcc есть довольно мощная штука - атрибуты. Куча разных.
Например, атрибутом можно сказать, что результат, возвращаемый данной функцией, зависит только от передаваемых ей параметров и она сама вовне ничего не меняет, т.е. не имеет "побочных эффектов".
Вся математика типа sqrt() такая.
Тогда если её вызывать с одними и теми же неизменными аргументами (константами либо переменными, про которые компилятор знает, что они не менялись) несколько раз - компилятор вызовет одитн раз, запомнит значение и подставит где нужно сам.

Для переменных можно задать аттрибутами функции создания и очистки, при создании переменной будет вызвана одна функция, при уничтожении (при выходе из окружающего её блока { } ) - другая. Это что-то типа конструкторов-деструкторов в C++. Вот они и спрятали в макросах переменную, при создании которой в неё копируется SREG и прерывания запрещаются/разрешаются, в зависимости от типа блока, а при удалении она переписывается назад в SREG, таким образом состояние прерываний восстанавливается.
Чтобы созданная как бы до блока переменная была привязана к блоку, т.е. чтобы можно было писать
Код
ATOMIC_BLOCK(ATOMIC_RESTORESTATE)
{
   ...
}

А не
Код
{
    ATOMIC_BLOCK(ATOMIC_RESTORESTATE);
   ...
}
макросы оформили в виде заголовка цикла for(;;) - переменная, которая объявлена в заголовке (for( unsigned char u; ...; ... ) ) имеет время жизни в пределах цикла, создаётся до первого входа в тело и уничтожается после выхода из цикла.

Очень симпатично сделано... Учтено всё.

Вот тут ещё на эту тему было, только "наоборот" - нужно на время разрешить прерывания:
http://electronix.ru/forum/index.php?showt...mp;#entry487831
в примере макрос из atomic.h и С++ класс дали при компиляции тождественный код.


--------------------
Ну, я пошёл… Если что – звоните…
Go to the top of the page
 
+Quote Post
sonycman
сообщение Nov 23 2008, 19:09
Сообщение #5


Любитель
*****

Группа: Свой
Сообщений: 1 864
Регистрация: 20-08-06
Из: Тольятти
Пользователь №: 19 695



Цитата(ARV @ Nov 23 2008, 21:23) *
как правило, она находится в папке WinAVR\doc\avr-libc - я ведь верно понял, что интересует документация на avr-libc?

Нет, на библиотеку как раз pdf есть. Мне бы на компилятор, со всеми его ключевыми словами, аттрибутами и т.д...
Она там только в формате html... в принципе, сойдёт, если нет лучшего smile.gif

Цитата(ReAl @ Nov 23 2008, 22:03) *
Очень симпатично сделано... Учтено всё.

Спасибо за разъяснение, стало понятнее!
Сам только недавно начал осваивать С++, и имею небольшое представление о классах.
Очень интересная штука wink.gif

У меня возникла очередная проблема в портировании проекта IAR на WinAVR.
Есть класс таймеров:
Код
#include    <util/atomic.h>

typedef    unsigned long    dword;
typedef    unsigned short    word;
typedef    unsigned char    byte;

extern volatile    word    tcounter;       //hardware timer

class    CTimer    {
private:
    word    interval;
    word    counter;

public:
    CTimer (word timeout    =    0) {    Set(timeout);    }
    void    operator =    (word    timeout);
    void    Set (word timeout);
    bool    operator ! ();
    operator    bool ();
};

        CTimer::operator    bool()
{
    if (!interval) return TRUE;
    if ((tcounter - counter) >= interval)
    {
        interval    =    0;
        return    TRUE;
    }
    return    FALSE;
}

bool    CTimer::operator !    ()
{
    return    !operator bool();
}

void    CTimer::operator =    (word    timeout)
{
    Set(timeout);
}

void    CTimer::Set(word timeout)
{
    if (timeout)
    {
        interval    =    timeout    /    10;            //interrupts timer resolution is 10ms
        counter    =    tcounter;
    }
    else
    {
        interval    =    0;
    }
}

Этот файл компилируется нормально.
Но при компиляции таких строк:
Код
static CTimer tmrSpinup;

то есть при создании объекта класса выдаётся ошибка: undefined reference to `__cxa_guard_release'

Что-то я пока что в тупике.
Описания такой функции нет в исходниках компилятора.
Что делать? Почему так получилось? wacko.gif
Go to the top of the page
 
+Quote Post
ReAl
сообщение Nov 23 2008, 21:37
Сообщение #6


Нечётный пользователь.
******

Группа: Свой
Сообщений: 2 033
Регистрация: 26-05-05
Из: Бровари, Україна
Пользователь №: 5 417



Цитата(sonycman @ Nov 23 2008, 21:09) *
то есть при создании объекта класса выдаётся ошибка: undefined reference to `__cxa_guard_release'

Что-то я пока что в тупике.
Описания такой функции нет в исходниках компилятора.
Что делать? Почему так получилось? wacko.gif
Странно. К тому коду было добавлено
Код
static CTimer tmrSpinup;

int main()
{
    tmrSpinup.Set(10);
    while( !tmrSpinup );
    for(;;);
}
и всё собралось-слинковалось несколькими версиями от 3.4.6 (WinAVR-20060421) до 4.4.0 (Klen-20080530), более свежих нет на компе.
Это функция, похоже, должна была бы быть в libstdc++, если бы она для AVR была. Там же __cxa_pure_virtual и т.д., т.е. поддержка для более "взрослого" применения С++ с исключениями и т.д.
Почему вдруг в данном случае компилятор решил, что нужна помощь зала библиотеки поддержки - неясно. Иногда такое бывает и иногда при этом помогает добавление ключей
Код
    CFLAGS += -ffunction-sections #-fdata-sections
    LDFLAGS += -Wl,--gc-sections
Это предназначено для итеративного выбрасывания кода и данных, которые никогда не вызывается/не используются.
За компанию стоит добавить
Код
    LDFLAGS += -Wl,--relax

поиском по разделу AVR можно найти объяснения.


--------------------
Ну, я пошёл… Если что – звоните…
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- sonycman   Перенос кода из под ИАРа на WinAVR   Nov 22 2008, 19:39
||- - Сергей Борщ   Цитата(sonycman @ Nov 23 2008, 21:09) то ...   Nov 23 2008, 21:45
|- - Petka   Цитата(ReAl @ Nov 23 2008, 21:03) У gcc е...   Nov 23 2008, 20:38
|- - sonycman   Цитата(Petka @ Nov 24 2008, 00:38) В прин...   Nov 23 2008, 21:37
||- - ReAl   Цитата(sonycman @ Nov 23 2008, 23:37) А е...   Nov 23 2008, 21:51
|- - ReAl   Цитата(Petka @ Nov 23 2008, 22:38) В прин...   Nov 23 2008, 21:43
|- - Petka   Цитата(ReAl @ Nov 24 2008, 00:43) Это НЕ ...   Nov 24 2008, 07:35
- - MrYuran   Насколько я помню, у WinAVR имеется отличная докум...   Nov 23 2008, 08:24
|- - sonycman   Цитата(MrYuran @ Nov 23 2008, 12:24) Наск...   Nov 23 2008, 14:33
|- - sonycman   Цитата(MrYuran @ Nov 23 2008, 12:24) Наск...   Nov 23 2008, 17:09
|- - ARV   Цитата(sonycman @ Nov 23 2008, 20:09) А м...   Nov 23 2008, 17:23
|- - alx2   Цитата(sonycman @ Nov 23 2008, 22:09) А м...   Nov 23 2008, 21:54
- - sonycman   Портировал я свою программу с IARа на GCC. Оптимиз...   Nov 24 2008, 11:05
|- - aesok   Цитата(sonycman @ Nov 24 2008, 14:05) Так...   Nov 24 2008, 11:35
||- - sonycman   Цитата(aesok @ Nov 24 2008, 15:35) Добавт...   Nov 24 2008, 11:57
||- - aesok   Цитата(sonycman @ Nov 24 2008, 14:57) У м...   Nov 24 2008, 19:07
||- - sonycman   Цитата(ARV @ Nov 24 2008, 20:40) смутил к...   Nov 24 2008, 19:26
||- - ARV   Цитата(sonycman @ Nov 24 2008, 22:26) Поп...   Nov 24 2008, 20:00
||- - sonycman   Цитата(ARV @ Nov 25 2008, 00:00) Кодavr-g...   Nov 24 2008, 20:23
||- - Сергей Борщ   Цитата(sonycman @ Nov 24 2008, 22:23) Вот...   Nov 24 2008, 21:14
||- - sonycman   Цитата(Сергей Борщ @ Nov 25 2008, 01:14) ...   Nov 24 2008, 23:36
||- - gotty   Цитата(sonycman @ Nov 25 2008, 01:36) Так...   Nov 25 2008, 07:39
|- - demiurg_spb   Цитата(sonycman @ Nov 24 2008, 14:05) и в...   Nov 24 2008, 11:56
|- - alx2   Привет, sonycman! Цитата(sonycman @ Nov 2...   Nov 25 2008, 21:58
|- - Rst7   Цитата(alx2 @ Nov 25 2008, 23:58) И зря. ...   Nov 26 2008, 12:46
- - sonycman   Интересно, почему при делении на два не всегда исп...   Nov 24 2008, 14:15
|- - MrYuran   Цитата(sonycman @ Nov 24 2008, 17:15) Инт...   Nov 24 2008, 14:22
|- - sonycman   Цитата(MrYuran @ Nov 24 2008, 18:22) Я об...   Nov 24 2008, 14:46
|- - demiurg_spb   Цитата(sonycman @ Nov 24 2008, 17:46) Ещё...   Nov 24 2008, 15:58
|- - sonycman   Цитата(demiurg_spb @ Nov 24 2008, 19:58) ...   Nov 24 2008, 16:05
- - ARV   смутил ключик --gc-sections я всегда использую -Wl...   Nov 24 2008, 16:40
- - ARV   -ff-sections заставляет компилятор размещать код к...   Nov 25 2008, 05:56
|- - sonycman   Цитата(gotty @ Nov 25 2008, 11:39) Для то...   Nov 25 2008, 09:41
|- - ARV   Цитата(sonycman @ Nov 25 2008, 12:41) Над...   Nov 25 2008, 09:52
|- - gotty   Цитата(sonycman @ Nov 25 2008, 11:41) Лин...   Nov 25 2008, 10:01
|- - sonycman   Цитата(ARV @ Nov 25 2008, 13:52) практика...   Nov 25 2008, 10:42
|- - ARV   Цитата(sonycman @ Nov 25 2008, 13:42) Пон...   Nov 26 2008, 07:22
|- - aesok   Цитата(ARV @ Nov 26 2008, 10:22) на сколь...   Nov 26 2008, 09:39
|- - ARV   Цитата(aesok @ Nov 26 2008, 12:39) На как...   Nov 26 2008, 09:50
- - sonycman   Цитата(alx2 @ Nov 26 2008, 01:58) Привет,...   Nov 26 2008, 10:17
|- - alx2   Цитата(sonycman @ Nov 26 2008, 15:17) Сей...   Nov 26 2008, 20:20
|- - Rst7   Цитата(alx2 @ Nov 26 2008, 22:20) -2, -3 ...   Nov 26 2008, 20:45
|- - alx2   Цитата(Rst7 @ Nov 27 2008, 01:45) Если уж...   Nov 26 2008, 21:35
||- - Rst7   Цитата(alx2 @ Nov 26 2008, 23:35) оно дае...   Nov 26 2008, 21:56
|- - sonycman   Цитата(Rst7 @ Nov 27 2008, 00:45) Однако,...   Nov 26 2008, 22:02
|- - aesok   Цитата(sonycman @ Nov 27 2008, 01:02) Но ...   Nov 27 2008, 04:14
||- - alx2   Цитата(aesok @ Nov 27 2008, 09:14) The co...   Nov 27 2008, 11:50
|- - Rst7   Цитата(sonycman @ Nov 27 2008, 00:02) А д...   Nov 27 2008, 07:56
||- - gotty   Цитата(Rst7 @ Nov 27 2008, 09:56) Аналоги...   Nov 27 2008, 08:51
|||- - Rst7   Цитата(gotty @ Nov 27 2008, 10:51) Это на...   Nov 27 2008, 09:08
||||- - gotty   Цитата(Rst7 @ Nov 27 2008, 11:08) Ссылку....   Nov 27 2008, 09:24
|||- - sonycman   Цитата(gotty @ Nov 27 2008, 12:51) Это на...   Nov 27 2008, 09:28
|||- - zltigo   Цитата(sonycman @ Nov 27 2008, 12:28) Но ...   Nov 27 2008, 09:45
|||- - sonycman   Цитата(zltigo @ Nov 27 2008, 13:45) Следо...   Nov 27 2008, 10:04
|||- - Сергей Борщ   Цитата(sonycman @ Nov 27 2008, 12:04) Пон...   Nov 27 2008, 11:35
||- - aesok   Цитата(Rst7 @ Nov 27 2008, 10:56) вычисля...   Nov 27 2008, 16:52
||- - Rst7   Цитата(aesok @ Nov 27 2008, 18:52) Расмот...   Nov 27 2008, 17:08
|- - alx2   Цитата(sonycman @ Nov 27 2008, 03:02) Код...   Nov 27 2008, 11:29
|- - sonycman   Цитата(alx2 @ Nov 27 2008, 15:29) Как ты ...   Nov 27 2008, 13:35
- - sonycman   2aesok Если у меня в программе операнд имеет тип c...   Nov 27 2008, 17:03
|- - aesok   Цитата(sonycman @ Nov 27 2008, 20:03) 2ae...   Nov 27 2008, 17:18
|- - sonycman   Цитата(aesok @ Nov 27 2008, 21:18) Я вам ...   Nov 27 2008, 18:22
|- - aesok   ЦитатаЭтот пример не имеет ничего общего с моим пр...   Nov 27 2008, 19:49
|- - sonycman   Цитата(aesok @ Nov 27 2008, 23:49) Это Ва...   Nov 27 2008, 21:52
|- - aesok   Цитата(sonycman @ Nov 28 2008, 00:52) Нет...   Nov 27 2008, 22:22
||- - sonycman   Цитата(aesok @ Nov 28 2008, 02:22) Я попы...   Nov 27 2008, 22:46
||- - aesok   Цитата(sonycman @ Nov 28 2008, 01:46) Хм....   Nov 27 2008, 23:20
||- - sonycman   Цитата(aesok @ Nov 28 2008, 03:20) Потому...   Nov 28 2008, 00:34
|- - alx2   Цитата(sonycman @ Nov 28 2008, 02:52) Код...   Nov 29 2008, 11:51
|- - sonycman   Цитата(alx2 @ Nov 29 2008, 15:51) Поэтому...   Nov 29 2008, 21:02
|- - aesok   Цитата(sonycman @ Nov 30 2008, 00:02) Я п...   Nov 29 2008, 22:00
||- - sonycman   Цитата(aesok @ Nov 30 2008, 02:00) Не заб...   Nov 29 2008, 22:24
|||- - alx2   Цитата(sonycman @ Nov 30 2008, 03:24) А в...   Nov 30 2008, 14:40
||- - Rst7   Цитата(aesok @ Nov 30 2008, 00:00) меня н...   Nov 29 2008, 22:24
||- - aesok   Цитата(Rst7 @ Nov 30 2008, 01:24) Простит...   Nov 29 2008, 22:36
|- - alx2   Цитата(sonycman @ Nov 30 2008, 02:02) Зач...   Nov 30 2008, 13:41
|- - sonycman   Цитата(Rst7 @ Nov 30 2008, 17:46) Жесть. ...   Nov 30 2008, 14:19
- - Сергей Борщ   Цитата(sonycman @ Nov 28 2008, 02:34) То ...   Nov 28 2008, 01:08
- - Rst7   ЦитатаВо-вторых, я подозреваю, что вероятность вых...   Nov 29 2008, 12:53
|- - AHTOXA   Цитата(Rst7 @ Nov 29 2008, 17:53) А значи...   Nov 29 2008, 19:31
||- - Rst7   Цитата(AHTOXA @ Nov 29 2008, 21:31) Но ве...   Nov 29 2008, 21:43
||- - sonycman   Цитата(Rst7 @ Nov 30 2008, 01:43) С друго...   Nov 29 2008, 21:56
|||- - Rst7   Цитата(sonycman @ Nov 29 2008, 23:56) Там...   Nov 29 2008, 22:53
||||- - sonycman   Цитата(Rst7 @ Nov 30 2008, 02:53) Дык где...   Nov 29 2008, 23:14
|||||- - alx2   Цитата(sonycman @ Nov 30 2008, 04:14) В И...   Nov 30 2008, 14:21
|||||- - sonycman   Цитата(alx2 @ Nov 30 2008, 18:21) Можно в...   Nov 30 2008, 14:34
||||- - aesok   Цитата(Rst7 @ Nov 30 2008, 01:53) Вынужде...   Nov 29 2008, 23:31
|||- - alx2   Цитата(sonycman @ Nov 30 2008, 02:56) Име...   Nov 30 2008, 13:57
||- - AHTOXA   Цитата(Rst7 @ Nov 30 2008, 02:43) Плохо В...   Nov 29 2008, 23:23
|- - alx2   Привет, Rst7! Цитата(Rst7 @ Nov 29 2008, ...   Nov 30 2008, 13:13
- - sonycman   Неважнецки получается у GCC работа со структурой в...   Nov 30 2008, 10:23
- - Rst7   Хоть я и откланялся, но господину sonycman'у о...   Nov 30 2008, 11:09
|- - sonycman   Цитата(Rst7 @ Nov 30 2008, 15:09) 218 byt...   Nov 30 2008, 11:57
- - sonycman   RST7 Не получается у меня научить гнуса правильно ...   Nov 30 2008, 13:22
- - Rst7   Цитатаи результат компиляции первой строчки: Жест...   Nov 30 2008, 13:46
2 страниц V   1 2 >


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

 


RSS Текстовая версия Сейчас: 22nd July 2025 - 18:11
Рейтинг@Mail.ru


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