Further investigation : Interrupt priority fix just masks the issue. Found a problem writing to two different files, every few seconds a write takes an entire second. The scope grab shows quick writes followed by long delays of a second.
/*
* SD Card writes will periodically take 1 seconds when writing to two files
* */
// Standard C Included Files
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
// SDK Included Files
#include "fsl_os_abstraction.h"
#include "fsl_debug_console.h"
#include "fsl_clock_manager.h"
#include "fsl_sdhc_card.h"
#include "fsl_sdmmc_card.h"
#include "fsl_mpu_driver.h"
#include "board.h"
#include "ff.h"
#include "diskio.h"
FATFS fatfs;
static void primary_thread(void *params)
{
FIL file1, file2;
uint8_t status;
uint8_t buffer[5120];
uint32_t buffer_len = 5120;
uint32_t size, i;
char filename[40];
configure_sdhc_pins(0);
CLOCK_SYS_EnableSdhcClock(0);
GPIO_DRV_Init(sdhcCdPin, NULL);
NVIC_SetPriority(SDHC_IRQn, 8U); // Will cause erratic bugs with threads when accessing sd card if not included
// disable Memory Protection Unit, required for SD Writes
for(i = 0; i < MPU_INSTANCE_COUNT; i++)
{
MPU_HAL_Disable(g_mpuBase[i]);
}
for (i = 0; i < buffer_len; i++)
{
buffer[i] = i;
}
status = f_mount(SD, &fatfs);
if (status)
{
PRINTF("f_mount error %i\r\n", status);
while(1);
}
status = disk_initialize(SD);
if (status != 0)
{
PRINTF("Failed to initialise SD card\r\n");
while(1);
}
sprintf(filename, "%i:file1.txt", SD);
PRINTF("FILENAME =%s\r\n ", filename);
status = f_open(&file1, filename, FA_WRITE | FA_CREATE_ALWAYS);
if (status)
{
PRINTF("f_open error %i\r\n", status);
while(1);
}
sprintf(filename, "%i:file2.txt", SD);
PRINTF("FILENAME =%s\r\n ", filename);
status = f_open(&file2, filename, FA_WRITE | FA_CREATE_ALWAYS);
if (status)
{
PRINTF("f_open error %i\r\n", status);
while(1);
}
while (1)
{
status = f_write(&file1, buffer, buffer_len, &size);
if (status || size != buffer_len)
{
PRINTF("f_write error %i\r\n", status);
while(1);
}
GPIO1_HIGH;
status = f_write(&file2, buffer, buffer_len, &size);
if (status || size != buffer_len)
{
PRINTF("f_write error %i\r\n", status);
while(1);
}
GPIO1_LOW;
}
status += f_close(&file1);
if (status)
{
PRINTF("f_close error %i\r\n", status);
while(1);
}
status += f_close(&file2);
if (status)
{
PRINTF("f_close error %i\r\n", status);
while(1);
}
}
int main(void)
{
uint32_t status;
hardware_init();
OSA_Init();
status = OSA_TaskCreate(primary_thread, (uint8_t*)"primary_thread", 10000L, NULL, 4L, NULL , false, NULL);
if (kStatus_OSA_Success != status)
{
PRINTF("Error Creating thread \"output_thread\" \r\n");
while(1)
;
}
OSA_Start();
return 1;
}