Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Зависание при использовании freertos_spi_write_packet
Форум разработчиков электроники ELECTRONIX.ru > Cистемный уровень проектирования > Операционные системы > FreeRTOS
Andreyy
Здравствуйте, исп. ATSAM3S4A, AtmelStudio 6.2, freertos 8.2.3, "freertos - spi interface layer(service)" подцеплен из коробки.
По умолчанию задача 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();
}

FreeRTOSconfig https://github.com/jameswalmsley/FreeRTOS/b...reeRTOSConfig.h
Disassembly code http://textuploader.com/5g7n2
Stack
Andreyy
Решение - использовать версию не выше 8.1.2,
code works with the binary semaphore, but the 8.2.3 doesn't
SMaster
М.б. поможет увеличение стека задачи?
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2024 Invision Power Services, Inc.