組み込み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タスクや他の多数の管理タスクを含む、実行する他のプロセスを確認してください。これはあなたが制御できないことであるため、あなたのコードが利用可能な期間は予測できず、収集されるサンプルの数は絶えず変わります。

私が思いつくことができる唯一の解決策は、どのパラメータが本当に重要であるかを評価し、他のすべてのパラメータの可変性に対応しながら、これを最大限に制御する方法を決定することです。

おすすめ記事