임베디드 Linux - 일정한 주기 시간

임베디드 Linux - 일정한 주기 시간

저는 Toradex의 Colibri iMX6 DualLite SoM을 사용하고 있습니다. 이는 멀티 코어 ARM Cortex™A9 프로세서를 기반으로 합니다. 저는 toradex에서 제공하는 임베디드 Linux 배포판을 실행하고 있습니다. 이를 활용하여 정밀 아날로그 DAQ 제품을 개발하고 있습니다.

우리는 SPI/SSI 통신을 통해 연결된 TI ADC IC - ADS8684 16비트 500kSPS(채널당 125kSPS)를 사용합니다.

테스트 목적으로 while 루프에서 5초 동안 지속적으로 데이터를 가져온 다음 루프를 중단합니다. 아래 코드와 같이 동적 메모리 할당을 사용하여 각 반복마다 배열을 재할당하여 가져온 데이터를 저장합니다.

time_t start, end; 
double *arr; int n=1;   
arr=(double*)malloc(n*sizeof(double)); 
start=time(NULL);   //get the present time stamp as start time 
end=start+5;        //to acquire data for 5 sec 
while(start<=end) 
{       
  for(int i=0;i<4;i++)     //to take data from 4 ch of adc  
  {
   libsoc_gpio_set_level(cs, LOW);  // For acquiring data from the IC
   libsoc_spi_read(spi_dev,rdata,4);    // For acquiring data from the IC
   libsoc_gpio_set_level(cs, HIGH);     // For acquiring data from the IC

   arr[n-1]=(10.24/65536)*((rdata[2]<<8) | rdata[3]);
   n=n+1;       // Once a data is acquired increment the size of the array
   arr=(double*)realloc(arr,n*sizeof(double));  // Re-Allocate the array for the new size   
  }     
  start=time(NULL);  }

// 데이터 수집이 완료된 후 배열과 요소의 크기를 인쇄합니다.

printf("The size of arr for 5 sec is %d\n",n);

for(int i=0;i<n;i++) 
{   
  printf("arr[%d] is  %f\n",i,arr[i]); 
}

우리가 직면한 문제는 루프 반복이 일정한 속도로 실행되지 않는다는 것입니다. 따라서 배열의 요소 수는 8000, 15000, 11000, 6000 등과 같이 크게 다릅니다. 루프 내부의 모든 명령문은 일정한 속도로 실행되고 반복 사이에 지연이 없으므로 가능한 유일한 이유는 루프 시간이 각 반복을 변경한다는 것입니다.

루프를 일정한 속도로 실행하는 동안 DAQ를 실행할 수 있는 방법이 있습니까? 즉, 각 반복 사이의 시간 간격은 동일해야 합니다.

시간 내 주셔서 감사합니다.

답변1

이 명령문은 상수로 실행될 수 있지만시계주기각 루프마다 상수가 보장되지 않습니다.시계 시간실행을 위해.

커널은 루프를 사용할 수 없는 클럭 사이클을 사용하여 다른 많은 문제를 해결해야 합니다. 시스템 시계를 업데이트하고, 가능한 cron작업 및 수많은 기타 관리 작업을 포함하여 실행할 다른 프로세스를 확인하세요. 이러한 일은 귀하가 통제할 수 없는 일이므로 귀하의 코드를 사용할 수 있는 기간은 예측할 수 없으며 수집되는 샘플 수는 지속적으로 변경됩니다.

제가 생각해 낼 수 있는 유일한 해결책은 어떤 매개변수가 정말 중요한지 평가하고 다른 모든 매개변수의 가변성을 수용하면서 이를 최대한 잘 제어하는 ​​방법을 결정하는 것입니다.

답변2

코드에서 한 가지 주요 실패는 를 사용하는 것입니다 time(). 이는 초 단위로 값을 반환하므로 루프는 4~5초 동안 지속될 수 있습니다. 대신 마이크로초 필드를 제공하는 데 사용해야 합니다 gettimeofday()(해상도가 이보다 나쁠 수도 있음).

프로세스를 실시간 프로세스로 만들어 변동성을 줄일 수도 있습니다. chrt -f명령을 실행하거나 를 사용 sched_setscheduler()하여 호출하는 데 사용됩니다 SCHED_FIFO.

관련 정보