Вопрос по avr-gcc

Dec 25, 2003 1 Replies

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; // :)



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



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



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


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

Join the Discussion

Have something to add? Share your thoughts — no account required.

Didn't find your answer?

Ask the community — no account required