У меня возникли проблемы с указателями, используемыми в качестве входных аргументов для функции cost_compare , которые я хотел бы передать в HW с помощью инструмента синтеза Xilinx SDSoC.
Мне удалось исправить часть проблемы на основе первой рекомендации @Gerardo Zinno (см. использование значений вместо указателей в качестве аргументов функции - второе решение ухудшает ситуацию), и мой код теперь следующим образом
typedef struct arc *arc_p;
typedef LONG cost_t;
typedef struct basket
{
arc_t *a;
cost_t cost;
cost_t abs_cost;
LONG number;
} BASKET;
/* ... */
typedef struct arc
{
int id;
cost_t cost;
node_p tail, head;
short ident;
arc_p nextout, nextin;
flow_t flow;
cost_t org_cost;
} arc;
/* ... */
int cost_compare( void *x, void *y )
{
BASKET *b1 = x;
BASKET *b2 = y;
if( b1->abs_cost < b2->abs_cost )
return 1;
if( b1->abs_cost > b2->abs_cost )
return -1;
if( b1->a->id > b2->a->id )
return 1;
else
return -1;
}
Новый код прекрасно работает на SW, но при запуске в SDSoC выдает следующие ошибки:
ERROR: [SYNCHK 200-61] /home/a1083898/Xilinx_examples/original_routeplanning/src/pbeampp.c:85: unsupported memory access on variable 'x' which is (or contains) an array with unknown size at compile time.
ERROR: [SYNCHK 200-41] /home/a1083898/Xilinx_examples/original_routeplanning/src/pbeampp.c:89: unsupported pointer reinterpretation from type 'i8*' to type '%struct.arc.1.4.6 = type { i32, i64, %struct.node.0.3.5*, %s...' on variable 'x'.
ERROR: [SYNCHK 200-11] /home/a1083898/Xilinx_examples/original_routeplanning/src/pbeampp.c:89: Argument 'x' has an unsynthesizable type 'i8*' (possible cause(s): pointer to pointer or global pointer).
ERROR: [SYNCHK 200-11] /home/a1083898/Xilinx_examples/original_routeplanning/src/pbeampp.c:89: Argument 'x' has an unsynthesizable type 'i8*' (possible cause(s): structure variable cannot be decomposed due to (1) unsupported type conversion; (2) memory copy operation; (3) function pointer used in struct; (4) unsupported pointer comparison).'
, что соответствует
if( b1->abs_cost < b2->abs_cost ) /*line 85*/
и
if( b1->a->id > b2->a->id ) /*line 89*/
Не думаю, что могу изменить количество аргументов функции, поскольку она вызывается еще двумя функциями как
spec_qsort(perm + 1, basket_sizes[thread], sizeof(BASKET*), cost_compare);
и
qsort(perm + 1, basket_sizes[thread], sizeof(BASKET*), cost_compare);
и cost_compare должны иметь определенную подпись, поскольку spec_qsort и qsort call const_compare только с двумя элементами из массива, к которому он идет сортировать (спасибо @Gerardo Zinno за разъяснения).
У меня вопрос, как решить эту проблему и сделать код HW дружественным, чтобы он мог быть синтезирован SDSoC?
С наилучшими пожеланиями
Hooman