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 ?