1

ロボット用の FRAM 用のドライバーを作成していますが、突然次のエラーが発生し始めました。

C:\Users\james\AppData\Local\Temp\cciezvMm.o: In function `_FRAM_driver_setup':
(.text+0x0): multiple definition of `_FRAM_driver_setup'
cmm/FRAM_driver.o:(.text+0x0): first defined here
C:\Users\james\AppData\Local\Temp\cciezvMm.o: In function `_FRAM_log_data':
(.text+0xf): multiple definition of `_FRAM_log_data'
cmm/FRAM_driver.o:(.text+0xf): first defined here
C:\Users\james\AppData\Local\Temp\cciezvMm.o: In function `_FRAM_read_data':
(.text+0x7a): multiple definition of `_FRAM_read_data'
cmm/FRAM_driver.o:(.text+0x7a): first defined here
collect2: ld returned 1 exit status
Done. Build Failed!

何が原因なのかはわかりませんが、コード内に複数の定義を見つけることができませんでした。ヘッダーファイルは次のとおりです。

#ifndef FRAM_DRIVER_H_
#define FRAM_DRIVER_H_

#include "simpletools.h"

typedef struct FRAM_driver_type {
    i2c* busID;
} FRAM_driver_type;

void FRAM_driver_setup(FRAM_driver_type* ptr, int sclPin, int sdaPin,
    int sclDrive);

void FRAM_log_data(unsigned char* string, FRAM_driver_type* ptr);

void FRAM_read(FRAM_driver_type* ptr);
#endif

c ファイルは次のとおりです。

#include "FRAM_driver.h"

#define FRAM_DEFAULT_ADDR              (0x50)
#define FRAM_MAX_MEM_ADDRESS           (0x00)
#define FRAM_FIRST_MEM_ADDR            (0x01)
#define FRAM_ADDR_SIZE                 (  2 )
#define FRAM_DATA_SIZE                 (  1 )
#define INT_SIZE                       (  1 )

void FRAM_driver_setup(FRAM_driver_type* ptr, int sclPin, int sdaPin,
    int sclDrive){
    ptr->busID = i2c_newbus(sclPin, sdaPin, sclDrive);
}

void FRAM_log_data(unsigned char* data, FRAM_driver_type* ptr){
    // Create a static integer initialized to the first memory address of the
    // FRAM. It is 0x01 instead of 0x00 because 0x00 is going to be used to
    // store the last memory adress being used. Also, create the int data_Size
    // and set it equal to the length of the string plus one.
    //
    static int mem_Addr = FRAM_FIRST_MEM_ADDR;
    int data_Size = strlen(data) + 1;

    // Send the size of the data being sent to the next available memory
    // address. This allows the FRAM_read_data funtion to know what size of
    // data to read. Then increment up by one memory address.
    //
    i2c_out(ptr->busID, FRAM_DEFAULT_ADDR, mem_Addr, FRAM_ADDR_SIZE, data_Size,
        INT_SIZE);
    while(i2c_busy(ptr->busID, FRAM_DEFAULT_ADDR));
    mem_Addr += 0x01;

    // Write data to the next address when the FRAM is not busy, then increment
    // the memory address by one again.
    //
    i2c_out(ptr->busID, FRAM_DEFAULT_ADDR, mem_Addr, FRAM_ADDR_SIZE, data,
        data_Size);
    while(i2c_busy(ptr->busID, FRAM_DEFAULT_ADDR));
    mem_Addr += 0x01;

    // Write the last memory address used to the first memory address of the
    // FRAM. Then wait for the FRAM to not be busy.
    //
    i2c_out(ptr->busID, FRAM_DEFAULT_ADDR, FRAM_FIRST_MEM_ADDR, FRAM_ADDR_SIZE,
        mem_Addr, INT_SIZE);
    while(i2c_busy(ptr->busID, FRAM_DEFAULT_ADDR));
}

void FRAM_read_data(FRAM_driver_type* ptr){
    // Initialize unsigned characters to receive data from i2c_in.
    //
    unsigned char logged_Data = 1;
    unsigned char logged_Data_Size;
    unsigned char last_Memory_Address;

    // Get the last memory address written to from FRAM_MAX_MEM_ADDRESS and
    // store it in last_Memory_Address.
    //
    i2c_in(ptr->busID, FRAM_DEFAULT_ADDR, FRAM_MAX_MEM_ADDRESS, FRAM_ADDR_SIZE,
        &last_Memory_Address, INT_SIZE);
    while(i2c_busy(ptr->busID, FRAM_DEFAULT_ADDR));

    // Loop through all of the filled memory addresses in the FRAM and print
    // the logged data in each address.
    //
    for (int i = FRAM_FIRST_MEM_ADDR; i <= last_Memory_Address; i+=2){
        // Get the data_Size from the odd memory address and store it in
        // logged_Data_Size. Then wait until the FRAM isn't busy.
        //
        i2c_in(ptr->busID, i, FRAM_FIRST_MEM_ADDR,
            FRAM_ADDR_SIZE, &logged_Data_Size, INT_SIZE);
        while(i2c_busy(ptr->busID, FRAM_DEFAULT_ADDR));


        // Use logged_Data_Size to store the data to logged_Data and then print
        // the data. Wait until the FRAM isn't busy.
        //
        i2c_in(ptr->busID, i++, FRAM_FIRST_MEM_ADDR,
            FRAM_ADDR_SIZE, &logged_Data, logged_Data_Size);
        print("Log: %d \n", logged_Data);
        while(i2c_busy(ptr->busID, FRAM_DEFAULT_ADDR));
    }
}

最後に、テストベンチ ファイルは次のとおりです。

#include "FRAM_driver.h"

#define FRAM_SCL_PIN 28
#define FRAM_SDA_PIN 29

static FRAM_driver_type fram_obj;

int main() {
  const unsigned char* data = 2;
  FRAM_driver_setup(&fram_obj, FRAM_SCL_PIN, FRAM_SDA_PIN, 0);
  FRAM_log_data(data , &fram_obj);
  FRAM_read_data(&fram_obj);
}

どんな助けでも大歓迎です。また、Propeller マイクロコントローラ用に simpleIDE と simpletools ライブラリを使用しています。

4

2 に答える 2

1

C:\Users\james\AppData\Local\Temp\cciezvMm.o: In function '_FRAM_driver_setup: (.text+0x0): multiple definition of '_FRAM_driver_setup' cmm/FRAM_driver.o:(.text+0x0): first defined here

このエラーは、リンク行がFRAM_driver.c2 回参照されていることを意味し、次のようになります。

gcc ... cmm/FRAM_driver.o ... cmm/FRAM_driver.c ...

そんなことはしないください-- 明らかにうまくいきません。

于 2016-04-03T17:03:20.513 に答える
1

SimpleIDE には、プロジェクト ディレクトリに含まれていないファイルのバックアップが含まれていました。実は、どこを探しても見つかりませんでした。作業中のコードのバックアップ コピーを作成し、コードを実行するたびに一時的な場所に保存しているようなものでした。ファイルはSimpleIDEプロジェクトファイルから削除され、その後機能しました。

于 2016-04-03T18:25:20.840 に答える