Работа с аргументами-указателями в функциях HW при синтезе с SDSoC - PullRequest
0 голосов
/ 05 июня 2019

У меня возникли проблемы с указателями, используемыми в качестве входных аргументов для функции 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

...