我需要把多个传感器的数据记录到 U 盘,采样频率 500Hz。
我配置了定时器来设置数据记录的采样频率,整体运行正常。问题出在向日志文件写入数据时,写入操作会带来不规则的延时。
目前我已经试过:使用多种缓冲方案,对齐扇区大小;将 U 盘格式化为 FAT32、FAT16、exFAT;精简代码,只保留记录相关的写入逻辑等等。
有没有办法提升写入速度?
下面是 main 函数代码片段:
if(eff==1){
if(fs==1){
HAL_GPIO_WritePin(LED2_GPIO_Port, LED2_Pin, RESET);
myData = LIS3DSH_GetDataScaled();
x=(int)(myData.x*9806.65);
acc_raw[k]=x;
k++;
y=(int)(myData.y*9806.65);
acc_raw[k]=y;
k++;
z=(int)(myData.z*9806.65);
acc_raw[k]=z;
k++;
HAL_GPIO_WritePin(LED2_GPIO_Port, LED2_Pin, SET);
fs=0;
}
if(k==99){
s++;
for(int g=0; g<98; g=g+3){
f_printf(&myFilea, "%d : %d, %d, %d\n", s, acc_raw[g], acc_raw[g+1], acc_raw[g+2] );
}
k=0;
bufclear1();
}
if(HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_0) == GPIO_PIN_SET && write_var==0){
i=0;
write_var=1;
while(deb<250){
}
eff=1;
}
if(one_sec==500 && write_var==1){
for(int g=0; g<98; g=g+3){
f_printf(&myFilea, "%d : %d, %d, %d\n", s+1, acc_raw[g], acc_raw[g+1], acc_raw[g+2] );
}
HAL_GPIO_WritePin(LED2_GPIO_Port, LED2_Pin, GPIO_PIN_RESET);
HAL_GPIO_WritePin(LED1_GPIO_Port, LED1_Pin, GPIO_PIN_RESET);
HAL_GPIO_WritePin(LED4_GPIO_Port, LED4_Pin, GPIO_PIN_RESET);
f_close(&myFilea);
f_close(&myFilet);
write_var=0;
s=0;
deb=0;
eff=0;
open=0;
one_sec=0;
acqu_count++;
HAL_Delay(500);
}
}
if(Appli_state == APPLICATION_DISCONNECT){
HAL_GPIO_WritePin(LED1_GPIO_Port, LED1_Pin, GPIO_PIN_RESET);
HAL_GPIO_WritePin(LED2_GPIO_Port, LED2_Pin, GPIO_PIN_RESET);
open=0;
}
if(open==0){
switch(Appli_state){
case APPLICATION_IDLE:
break;
case APPLICATION_START:
res=f_mount(&myUsbFatFS, (TCHAR const*)USBHPath, 0);
if( res != FR_OK)
{
/* FatFs Initialization Error */
Error_Handler();
}
else
{
//HAL_GPIO_WritePin(LED1_GPIO_Port, LED1_Pin, GPIO_PIN_SET);
}
break;
case APPLICATION_READY:
sprintf (buffer, "A%d.bin",acqu_count);
res=f_open(&myFilea, buffer, FA_OPEN_APPEND | FA_WRITE );
bufclear();
open=1;
HAL_GPIO_WritePin(LED1_GPIO_Port, LED1_Pin, GPIO_PIN_SET );
break;
case APPLICATION_DISCONNECT:
//tUTRN GREEN ON
HAL_GPIO_WritePin(LED1_GPIO_Port, LED1_Pin, GPIO_PIN_RESET);
break;
}
}
定时器中断回调函数:
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
/* Prevent unused argument(s) compilation warning */
HAL_GPIO_TogglePin(LED3_GPIO_Port, LED3_Pin);
if(eff==1){
one_sec++;
}
if(write_var==1){
deb++;
fs=1;
if(temp_counter <250) temp_counter++;
else {
fs_temp=1;
temp_counter=0;
}
//i=1-i;
|