Task dies right after doing DMA transfer on PIC32MX470

I have a FreeRTOS task that triggers a DMA transfer once per second.

while (1)
{
  uint8_t byte[1] = {0xFF};
  size_t len = 1;
  printf("Transfer success=%s\n", b2str(SYS_DMA_ChannelTransfer(SYS_DMA_CHANNEL_0, byte, (const void *)&U4TXREG, len)));
  vTaskDelay(1000);
}

I have a scope connected to my UART line and I can see 0xFF being transmitted on that line. But shortly after my DMA write my seems to stop running.

If I remove the call to SYS_DMA_ChannelTransfer and simply printf to console my task runs fine. If I run this code outside FreeRTOS (don’t call the vTaskScheduler) and have this code directly in main, my program runs fine (Obviously comment out vTaskDelay).

My FreeRTOSConfig.h:

#define configUSE_PREEMPTION                    1
#define configUSE_PORT_OPTIMISED_TASK_SELECTION 1
#define configUSE_TICKLESS_IDLE                 0
#define configTICK_RATE_HZ                      ( ( TickType_t ) 1000 )
#define configMAX_PRIORITIES                    ( 8UL )
#define configMINIMAL_STACK_SIZE                ( 1024 )
#define configSUPPORT_DYNAMIC_ALLOCATION        1
#define configSUPPORT_STATIC_ALLOCATION         0
#define configTOTAL_HEAP_SIZE                   ( ( size_t ) 40960 )
#define configMAX_TASK_NAME_LEN                 ( 16 )
#define configUSE_16_BIT_TICKS                  0
#define configIDLE_SHOULD_YIELD                 1
#define configUSE_MUTEXES                       1
#define configUSE_RECURSIVE_MUTEXES             0
#define configUSE_COUNTING_SEMAPHORES           1
#define configUSE_TASK_NOTIFICATIONS            1
#define configQUEUE_REGISTRY_SIZE               0
#define configUSE_QUEUE_SETS                    0
#define configUSE_TIME_SLICING                  1
#define configUSE_NEWLIB_REENTRANT              0
#define configUSE_TASK_FPU_SUPPORT              0
 
 
 
 
/* Hook function related definitions. */
#define configUSE_IDLE_HOOK                     0
#define configUSE_TICK_HOOK                     0
#define configCHECK_FOR_STACK_OVERFLOW          2
#define configUSE_MALLOC_FAILED_HOOK            1
 
 
/* Run time and task stats gathering related definitions. */
#define configGENERATE_RUN_TIME_STATS           0
#define configUSE_TRACE_FACILITY                0
#define configUSE_STATS_FORMATTING_FUNCTIONS    0
 
 
/* Co-routine related definitions. */
#define configUSE_CO_ROUTINES                   0
#define configMAX_CO_ROUTINE_PRIORITIES         2
 
 
/* Software timer related definitions. */
#define configUSE_TIMERS                        0
#define configTIMER_TASK_PRIORITY               0
#define configTIMER_QUEUE_LENGTH                0
#define configTIMER_TASK_STACK_DEPTH            0
#define configUSE_DAEMON_TASK_STARTUP_HOOK      0
 
 
/* Misc */
#define configUSE_APPLICATION_TASK_TAG          0
 
 
 
 
/* Interrupt nesting behaviour configuration. */
#define configPERIPHERAL_CLOCK_HZ               ( 4000000UL )
#define configISR_STACK_SIZE                    ( 400 )
/* The priority at which the tick interrupt runs.  This should probably be kept at lowest priority. */
#define configKERNEL_INTERRUPT_PRIORITY         (1)
/* The maximum interrupt priority from which FreeRTOS.org API functions can be called.
 *Only API functions that end in ...FromISR() can be used within interrupts. */
#define configMAX_SYSCALL_INTERRUPT_PRIORITY    (4)
 
 
 
 
/* Optional functions - most linkers will remove unused functions anyway. */
#define INCLUDE_vTaskPrioritySet                1
#define INCLUDE_uxTaskPriorityGet               1
#define INCLUDE_vTaskDelete                     1
#define INCLUDE_vTaskSuspend                    1
#define INCLUDE_vTaskDelayUntil                 1
#define INCLUDE_vTaskDelay                      1
#define INCLUDE_xTaskGetSchedulerState          0
#define INCLUDE_xTaskGetCurrentTaskHandle       1
#define INCLUDE_uxTaskGetStackHighWaterMark     0
#define INCLUDE_xTaskGetIdleTaskHandle          0
#define INCLUDE_eTaskGetState                   0
#define INCLUDE_xTimerPendFunctionCall          0
#define INCLUDE_xTaskAbortDelay                 0
#define INCLUDE_xTaskGetHandle                  0
#define INCLUDE_xQueueGetMutexHolder            0
#define INCLUDE_xSemaphoreGetMutexHolder        0
#define INCLUDE_uxTaskGetStackHighWaterMark2    0
#define INCLUDE_xTaskResumeFromISR              0


Task Creation:

  (void) xTaskCreate((TaskFunction_t) lapp,
                "app",
                1024,
                NULL,
                5,
                &APP)

Any ideas what my issue could be or where I can start looking to troubleshoot ?

The big question is SYS_DMA_ChannelTransfer comptible with running in an RTOS. Depending on what it does, it might not be as it is written.

Can you break the code in the debugger and see what it is doing when it appears stuck? As @richard-damon mentioned, the other thing is to check with the vendor is designed to work in an RTOS environment.