Как изменить значение #define из другого файла - PullRequest
1 голос
/ 26 марта 2020

У меня есть исходный файл и файл заголовка:

//boot.h

#define BOOT_DATA_ADDRESS EMBEDDED_ADDRESS

void BootDataReadTable(bootData_t * bootData);

//boot.c

void BootDataReadTable(bootData_t * bootData)
{
    uint32_t *userPageBootDataTable = (uint32_t *) (BOOT_DATA_ADDRESS );
    uint32_t copiedDataTable[BOOT_DATA_WORDS] = {0U};
    for (uint32_t i = 0; i < BOOT_DATA_WORDS; i++)
    {
        copiedDataTable[i] = userPageBootDataTable[i];
    }
    unpackBootData(copiedDataTable, bootData);
}

и тестовый файл:

//test_boot.c

#include "bootdata.h"

#ifdef BOOT_DATA_ADDRESS
#undef BOOT_DATA_ADDRESS
#define BOOT_DATA_ADDRESS (stackpointer)
#endif 

static uint32_t stack[0x2000] = {0};
static uint32_t * stackpointer = &stack[0];

void test_BootDataReadTable(void)
{
    bootData_t lBootData = {0};

    BootDataReadTable(&lBootData, (uint32_t *)addr);

    //test lBootData
}

Этот код работает на встроенной платформе. Доступ к памяти в BootDataReadTable обращается к внутреннему флагу sh на MCU. В целях модульного тестирования я хочу запустить это на моем хост-компьютере. В test_boot.c я хочу изменить BOOT_DATA_ADDRESS, чтобы он указывал на мою область стека на моей хост-машине, чтобы BootDataReadTable просто получал доступ к некоторым фиктивным данным вместо попытки доступа к внутреннему флагу sh.

Я собираю / запускаю модульный тест с ceedling.

Метод, который я использую выше, не работает. Что я делаю неправильно / как я могу sh изменить значение BOOT_DATA_ADDRESS из другого файла?

1 Ответ

1 голос
/ 27 марта 2020

Поскольку вы делаете это для модульного тестирования, я предполагаю, что у вас нет проблем с компиляцией специально для модульных тестов (возможно, даже не для целевой архитектуры).

env.h:

#ifdef UNIT_TESTING

extern int stack[0x2000];
#define BOOT_DATA_ADDRESS (stack)

#endif

boot.h:

#include "env.h"

#ifndef BOOT_DATA_ADDRESS
#define BOOT_DATA_ADDRESS ((void *)0xdeadbeef)
#endif

void BootDataReadTable(void);

boot.c:

#include <stdio.h>

#include "boot.h"

void BootDataReadTable(void)
{
    printf("BOOT_DATA_ADDRESS = %p\n", BOOT_DATA_ADDRESS);
}

main.c:

#include "boot.h"

int main(int argc, char **argv)
{
    BootDataReadTable();
}

test_boot.c:

#include "boot.h"

int stack[0x2000] = {0};

void test_BootDataReadTable(void)
{
    BootDataReadTable();
}

int main(int argc, char **argv)
{
    test_BootDataReadTable();
}

Makefile:

demo: main test_boot
    ./main
    ./test_boot

main::
    cc -o main main.c boot.c

test_boot::
    cc -DUNIT_TESTING -o test_boot test_boot.c boot.c

вывод:

cc -o main main.c boot.c
cc -DUNIT_TESTING -o test_boot test_boot.c boot.c
./main
BOOT_DATA_ADDRESS = 0xdeadbeef
./test_boot
BOOT_DATA_ADDRESS = 0x601060
...