2016-10-16 6 views
0

UARTからシリアルデータをロードしてフラッシュに書き込むMCUアプリケーションを作成しています。私は "空のバッファに入ってくるデータを格納している間に2つのバッファを使用しています"(別名 "バッファトグル")方法論です。 UART受信は、「受信データを格納する」が適切なバイト位置にバッファに直接格納されるように書かれていました。各フラッシュセクタは512バイトの長さであるため、バッファの長さは512バイトです。ポインタアドレスにインデックスを使用すると、アドレスがゼロになる

インデックスを使用したかった:どのバッファがロードされているかを示す1つのインデックス。各バッファの最初のバイトのアドレスを持つ2つのインデックスの配列。着信バイトの実際のターゲット記憶アドレスのバッファ内のオフセット(0-511)を有するインデックスとを含む。コードは "どのバッファ?"を使うように設計されています。索引を使用してロードするバッファのアドレスを取得し、バッファ内のオフセットを追加します。これはすべて必要です。私は、バッファオーバーランを避けるために可能なすべてを行うために、パスの長さを短く保つことを試みています。

しかし、私はCで多少n00bです.2つのaFlashBuffahsを調べると、bFlashBuffah0 [512]とbFlashBuffah1 [512]という2つのバッファの正しいアドレスがわかりますが、以下のコードでは、 (aFlashBuffahInUse)を0にして、*(aFlashBuffahInUse + hBuffahByteInUse)という式を偽とする。

uint32_t fFlashEndingAddress  = 0x2765A6; 
uint8_t  iBuffahInUse   = 0; 
uint16_t hBuffahByteInUse  = 0; 
uint16_t *aFlashBuffahInUse; 
uint16_t *aFlashBuffahs[2]; 
uint8_t  bFlashBuffah0[512]; 
uint8_t  bFlashBuffah1[512]; 

aFlashBuffahs[0] = &bFlashBuffah0; 
aFlashBuffahs[1] = &bFlashBuffah1; 

iBuffahInUse  = 0; 
aFlashBuffahInUse = aFlashBuffahs[iBuffahInUse]; 
hBuffahByteInUse = 0; 

for (i = 0; i < fFlashEndingAddress; i++) { 
    *(aFlashBuffahInUse+hBuffahByteInUse) = usart_getchar(UASRT_SERIAL); 

誰かが私が誤りを犯した場所にいらっしゃいましたら、私はそれを感謝します。ティア!

+0

実行時の問題を尋ねるとき、きれいにコンパイルするポストコードは短く、それでも問題が表示されます。問題がデータに関するものであれば、実際の入力データ(妥当なサンプル)と実際の出力データ(妥当なサンプル)を投稿します。 – user3629249

+0

私はあなたのループ 'for(i = 0; i

+0

あなたは何かを索引付けするために 'i'を使ったことさえありません。ループが何をしても、すべての着信バイトが同じ場所に書き込まれます。 –

答えて

-1

注:Cでは、配列名の参照は配列の最初のバイトのアドレスに縮まるため、次のような行になります。aFlashBuffahs [0] =&bFlashBuffah0;アドレスのアドレスを取得している場合は、次のようになります。aFlashBuffahs [0] = bFlashBuffah0;オペレーター&はありません。

ALSO
uint32_t fFlashEndingAddress  = 0x2765A6; 
uint8_t  iBuffahInUse   = 0; 
uint16_t hBuffahByteInUse  = 0; 
uint16_t *aFlashBuffahInUse; 
uint16_t *aFlashBuffahs[2]; 
uint8_t  bFlashBuffah0[512]; 
uint8_t  bFlashBuffah1[512]; 

aFlashBuffahs[0] = bFlashBuffah0; // <-- note change 
aFlashBuffahs[1] = bFlashBuffah1; // <-- note change 

//iBuffahInUse  = 0; 
//aFlashBuffahInUse = aFlashBuffahs[iBuffahInUse]; 
aFlashBuffahInUse = bFlashBuffah0; // <-- added 
//hBuffahByteInUse = 0; 


for (i = 0; i < fFlashEndingAddress; i++) { 
    *(aFlashBuffahInUse+hBuffahByteInUse) = usart_getchar(UASRT_SERIAL); 
    hBuffahByteInUse++; 
    if(512 == hBuffahByteInUse) 
    { 
     hBuffahByteInUse = 0; 
     // initiate processing of buffer (but do not do processing here) 
     .... 
     // swap buffers 
     (aFlashBuffahInUse == bFlashBuffah0)? bFlashBuffah1 : bFlashBuffah0; 
    } 

: 掲載コードいくつかの 'マジック' の数字が含まれている

は次のようにコードを書く提案します。 「魔法」の数字は、基準のない数字です。

例は以下のとおりです。0x2765A6、2、512

その後、コード全体でそれらの意味のある名前を使用し、それらの「マジック」の数字に意味のある名前を与えることenum文または#define文を使用するか提案します。

バッファがいっぱいになったときにポストされたコードがバッファをスワップしないことにも言及することがあります。私は私の答えにその機能を追加しました。

+0

提案: 'for() 'コードブロックでコードを実行する割り込みハンドラを書く。これにより、全体的なフローがはるかに良くなり、 'usart_getchar() '関数のように次のcharが利用可能になるのを待っているCPUサイクルを'食べる 'ことはありません – user3629249

+0

" ...配列名への参照は、配列の最初のバイト " - 1つの文に2つの間違った文がある(データ型"参照 "を意味し、名前に言及していないと仮定すると - Cは参照型を持たない)。 – Olaf

+0

割り込みハンドラからMCUへの書き込みは非常に悪い考えです。最高で実行をストールし、最悪の場合、Flashコンテンツがクラッシュして破損します。 – Olaf

関連する問題