-1

このコードが何をするつもりなのか、またはこの構文がどのように avr-gcc の下でコンパイルできるのか教えてください。これは、NanoVM ソース コードから取得したコードで、avr atmega128rfa1 用にコンパイルしたものです。

// ファイル自体のバッファは eeprom にあります

ifdef NVM_USE_FLASH_PROGRAM
static u08_t nvmfile[CODESIZE] PROGMEM =
#include "nvmdefault.h"
#else
static u08_t EEPROM nvmfile[CODESIZE] =
#include "nvmdefault.h"
#endif 

これを -DNVM_USE_FLASH_PROGRAM でコンパイルしていないことに注意してください

4

2 に答える 2

5

配列初期化子が含まれている場合nvmdefault.h、このコードは次のように正常にコンパイルされます。

nvmdefault.h
{0x01, 0x02, 0x03, etc...};

それが正確に何をするかについては、ソースコードを確認する必要がありますが、その配列をフラッシュまたは EEPROM メモリに割り当てているように見えます。別のプログラムまたはスクリプトによって生成されます。

于 2012-10-23T13:13:42.853 に答える
0

"nvmdefault.h"初期化子リストの定義から始まる限り、このコードのコンパイルに問題は見られません。

{1, 2, 3, 4};

NVM_USE_FLASH_PROGRAM次に、ソースがこれに前処理されます(定義されているとしましょう):

static u08_t nvmfile[CODESIZE] PROGMEM =
{1, 2, 3, 4};

これは有効な C コードです。

と呼ばれるこのファイルを考えてみましょうdirtyc.c:

#ifndef C_IS_DIRTY
    #define C_IS_DIRTY
    #include <stdio.h>
    int main (void)
    #include "dirtyc.c"
#else
    { printf("hello dirty world!\n"); return 0; }
#endif
于 2012-10-23T13:19:26.063 に答える