Перейти к содержанию
    

Зависание при использовании freertos_spi_write_packet

Здравствуйте, исп. 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

Stackstack.jpg

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Решение - использовать версию не выше 8.1.2,

code works with the binary semaphore, but the 8.2.3 doesn't

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...