По умолчанию задача task_monitor выводит инфу о запущенных задачах, все работает, однако если добавить в задачу функционал - записи по SPI порту, то МК зависает (причем при компиляции с небольшими изменениями МК уходит либо в HardFault_Handler, либо виснет на ConfigAssert в queue.c(как в данном случае)) .
"freertos_spi_write_packet() is an ASF specific FreeRTOS driver function. It configures the SPI peripheral DMA controller (PDC) to transmit data on the SPI port, then waits until the transmission is complete. Other RTOS tasks execute while the transmission is in progress."
Код
freertos_spi_if spi_freertos;
static void task_monitor(void *pvParameters)
{uint8_t uc_pcs;uint8_t data[4];
static portCHAR szList[64];
UNUSED(pvParameters);
{ //printf("--- task ## %u", (unsigned int)uxTaskGetNumberOfTasks());
//vTaskList((signed portCHAR *)szList);
//printf(szList);
data[0]=0x80;data[1]=0x0E;
spi_set_peripheral_chip_select_value(spi_freertos, spi_get_pcs(SPI_SEL_atm90)); //Added
printf("1 status: %d \n\r",freertos_spi_write_packet(spi_freertos,data,2,200UL));//!Тут виснет!
spi_set_peripheral_chip_select_value(spi_freertos, 0x0f); //
spi_set_lastxfer(spi_freertos); //
vTaskDelay(1000);
}while(1);
}
freertos_spi_if prepare_spi_port( Spi *spi_base )
{/* Handle used to access the initialized port by other FreeRTOS ASF functions. */
freertos_spi_if freertos_spi;
const freertos_peripheral_options_t driver_options={NULL,0,0x0f,SPI_MASTER,(USE_TX_ACCESS_MUTEX|USE_RX_ACCESS_MUTEX|WAIT_TX_COMPLETE|WAIT_RX_COMPLETE)};
/* Call the SPI specific FreeRTOS ASF driver initialization function. */
freertos_spi=freertos_spi_master_init(spi_base,&driver_options);
/* Check the port was initialized successfully. */
configASSERT(freertos_spi);
if(freertos_spi != NULL )
{ spi_disable(spi_base); spi_disable_mode_fault_detect(SPI_MASTER_BASE);
.... spi_enable(spi_base);};
return freertos_spi;}
int main (void)
{ sysclk_init();
NVIC_SetPriorityGrouping( 0 );
board_init();
configure_console();
spi_freertos=prepare_spi_port(SPI_MASTER_BASE);
if (xTaskCreate(task_monitor, "Monitor", 1024/sizeof(portSTACK_TYPE), NULL, (tskIDLE_PRIORITY+1), NULL) != pdPASS)
{printf("Failed to create Monitor task\r\n"); }
vTaskStartScheduler();
}
static void task_monitor(void *pvParameters)
{uint8_t uc_pcs;uint8_t data[4];
static portCHAR szList[64];
UNUSED(pvParameters);
{ //printf("--- task ## %u", (unsigned int)uxTaskGetNumberOfTasks());
//vTaskList((signed portCHAR *)szList);
//printf(szList);
data[0]=0x80;data[1]=0x0E;
spi_set_peripheral_chip_select_value(spi_freertos, spi_get_pcs(SPI_SEL_atm90)); //Added
printf("1 status: %d \n\r",freertos_spi_write_packet(spi_freertos,data,2,200UL));//!Тут виснет!
spi_set_peripheral_chip_select_value(spi_freertos, 0x0f); //
spi_set_lastxfer(spi_freertos); //
vTaskDelay(1000);
}while(1);
}
freertos_spi_if prepare_spi_port( Spi *spi_base )
{/* Handle used to access the initialized port by other FreeRTOS ASF functions. */
freertos_spi_if freertos_spi;
const freertos_peripheral_options_t driver_options={NULL,0,0x0f,SPI_MASTER,(USE_TX_ACCESS_MUTEX|USE_RX_ACCESS_MUTEX|WAIT_TX_COMPLETE|WAIT_RX_COMPLETE)};
/* Call the SPI specific FreeRTOS ASF driver initialization function. */
freertos_spi=freertos_spi_master_init(spi_base,&driver_options);
/* Check the port was initialized successfully. */
configASSERT(freertos_spi);
if(freertos_spi != NULL )
{ spi_disable(spi_base); spi_disable_mode_fault_detect(SPI_MASTER_BASE);
.... spi_enable(spi_base);};
return freertos_spi;}
int main (void)
{ sysclk_init();
NVIC_SetPriorityGrouping( 0 );
board_init();
configure_console();
spi_freertos=prepare_spi_port(SPI_MASTER_BASE);
if (xTaskCreate(task_monitor, "Monitor", 1024/sizeof(portSTACK_TYPE), NULL, (tskIDLE_PRIORITY+1), NULL) != pdPASS)
{printf("Failed to create Monitor task\r\n"); }
vTaskStartScheduler();
}
FreeRTOSconfig https://github.com/jameswalmsley/FreeRTOS/b...reeRTOSConfig.h
Disassembly code http://textuploader.com/5g7n2
Stack