Ошибка компилятора Gcc. Требуется помощь.

  • Автор темы Автор темы alx
  • Дата начала Дата начала
A

alx

собственно скачал драйвера для некого железа. не могу собрать.
есть файл.h
там такой фрагмент кода:
<!--shcode--><pre><code class='с'>#define AE531X_DESC_SWPTR_GET(ptr) \
(void *)(*(volatile UINT32 *) ((UINT32)ptr + AE531X_DESC_SWPTR))

#define AE531X_DESC_SWPTR_SET(ptr,val) \
AE531X_DESC_SWPTR_GET(ptr) = (void *)(val)[/CODE]
и в самой программке
...........
<!--shcode--><pre><code class='с'>AE531X_DESC_SWPTR_SET(txDesc, TxBuf);[/CODE]
вызывает ошибку компилятора error: lvalue required as left operand of assignment...
понимаю, что после преобразований define код получится страшным, но знаний не хватает...
 
собственно скачал драйвера для некого железа. не могу собрать.
есть файл.h
там такой фрагмент кода:
<!--shcode--><pre><code class='с'>#define AE531X_DESC_SWPTR_GET(ptr) \
(void *)(*(volatile UINT32 *) ((UINT32)ptr + AE531X_DESC_SWPTR))

#define AE531X_DESC_SWPTR_SET(ptr,val) \
AE531X_DESC_SWPTR_GET(ptr) = (void *)(val)[/CODE]
и в самой программке
...........
<!--shcode--><pre><code class='с'>AE531X_DESC_SWPTR_SET(txDesc, TxBuf);[/CODE]
вызывает ошибку компилятора error: lvalue required as left operand of assignment...
понимаю, что после преобразований define код получится страшным, но знаний не хватает...

Получается что-то типа
(void *)(*(volatile UINT32 *) ((UINT32)txDesc + AE531X_DESC_SWPTR)) = (void *)(TxBuf)

чтобы посмотреть во что превращается код можно использовать опцию -E (gcc -E main.c), которая выдает код после разворачивания макросов.

Проблема скорее всего в типе txDesc. Покажите описание переменных.

С уважением.
 
Все во вложении. Файл ae531xecos.c в архиве.Посмотреть вложение 3417
Интересно для чего проект?
Экзотическая ось такая ) eCos.
А по сути..
Возможно стоит более свежую версию скачать :).

Ещё вариант убрать в макросе:
<!--shcode--><pre><code class='С'>#define AE531X_DESC_SWPTR_GET(ptr)[/CODE]

преобразование (void *), так чтобы получилось
<!--shcode--><pre><code class='С'>#define AE531X_DESC_SWPTR_GET(ptr) \
(*(volatile UINT32 *) ((UINT32)ptr + AE531X_DESC_SWPTR))[/CODE]

Преобразование типа левой части операции присваивания запрещено в современных версиях gcc. (в 4.4) точно.
Так что либо используйте старый gcc, либо ищите новый драйвер, либо правьте согласно рецепту, но там наверное ещё много чего вылезет )


Удач. :)
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!