首页 > 解决方案 > 如何从另一个文件更改#define 值

问题描述

我有一个源文件和头文件:

//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访问 MCU 上的内部闪存。出于单元测试的目的,我想在我的主机上运行它。在test_boot.c我想更改BOOT_DATA_ADDRESS指向我的主机上的堆栈区域,以便BootDataReadTable只访问一些虚拟数据而不是尝试访问内部闪存。

我正在编译/运行单元测试ceedling

我上面使用的方法不起作用。我在做什么错/如何完成BOOT_DATA_ADDRESS从另一个文件更改值?

标签: cembeddedc-preprocessor

解决方案


由于您这样做是为了进行单元测试,我假设您专门为单元测试编译没有问题(甚至可能不是针对目标架构)。

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

推荐阅读