Вопрос по avr-gcc

Do you have a question? Post it now! No Registration Necessary

Threaded View
Thu, 25 Dec 2003 18:49:05 +0300 Unrau Alexander wrote to All:

[...]

UA> Т.е. хочется просто написать чтоот типа:

UA> uint32_t dwInternalVariable1;
UA> uint32_t dwInternalVariable2;
UA> #define dwExternalRegisterLitleEndian ( *((volatile uint32_t*)(0xXXXX)) )
UA> #define dwExternalRegisterBigEndian   ( *((volatile uint32_t*)(0xYYYY)) )
UA> ...
UA> dwInternalVariable1 = dwExternalRegisterLitleEndian;
UA> dwInternalVariable2 = dwExternalRegisterBigEndian;
UA> ...
UA> Может секции какие отдельно прописать на эти девайсы и задать для них
UA> порядок
UA> байт. Или тип данных какойнить обратный применить.

UA> А также можно ли его (avr-gcc) обязать писать/читать 16 и 32 разрядные
UA> слова
UA> в определённом порядке?
UA> Hу типа сначала младший байтик, потом старший, или наоборот.

    Это врядли.

UA> Подсознательно мне мыслится что всё это не возможно, но мало-ли?
UA> Можно наверное c++ обёртку смострячить, но что-то как-то не хочется. :(

    Почему? Как раз тот самый случай, когда С++ рулит. Причем, ты уже почти
написал нужный код, осталось только добавить ключевое слово class, пару
фигурных скобок да макросы на функции заменить.


// ---------------------------------------
class TSlon
{
public:
    TSlon() : Value(0) { }
    void GetBE() { Value = ...; }
    void GetLE() { Value = ...; }
    void operator=(uint32 x) { Value = x; }
    operator uint32 () const { return Value; }


private:
    uint32 Value;
};

TSlon s1, s2;

void f()
{
    s1.GetBE();
    s2.GetLE();


    uint32 a = s1;
    a += s2;            // :)

    ...                 // и так далее
}

// ---------------------------------------

    Если нужно не только читать, но и писать такими порядками, то добавить еще
пару функций.

--
H.Z.

harry.zhurov<antispam::at>ngs<antispam::period>ru

We've slightly trimmed the long signature. Click to see the full one.
Re: Вопрос по avr-gcc
Hello Unrau.

25 Dec 03 18:49, you wrote to all:

 UA> Странного хочется.
 UA> А можно ли заставить avr-gcc для разных адресных пространств (внешней
 UA> памяти)
 UA> использовать разный порядок байт (big и litle endian).

Да вроде нет.

 UA> Hапример у меня 2 девайса на внешней шине которые доступны как
 UA> внешняя
 UA> память, но имеют разный порядок байт (с 16 и 32 разрядными
 UA> регистрами), и очень не хочется обращаться к одному из них побайтно и
 UA> складывать прочитанные байтики в половинки/четвертинки внутренних
 UA> переменных при чтении или доставать байтики из этих
 UA> половинок/четвертинок при записи.

Я бы сделал ассемблерные макросы и обращался через них. (Примеры можно найти
в .h файлах, полное описание где-то в недрах документации)

 UA> А также можно ли его (avr-gcc) обязать писать/читать 16 и 32 разрядные
 UA> слова в определённом порядке? Hу типа сначала младший байтик, потом
 UA> старший, или наоборот.

avr-gcc имеет встроеный порядок записи/чтения байтов в слове тот, который нужен
для правильного обращения к внутренним 16-битным регистрам. Менять его я бы не
стал. Сделал бы макрос.

 UA> Можно наверное c++ обёртку смострячить, но что-то как-то не хочется.
 UA> :(

Это к HZ ;)

Alexey


Site Timeline