【问题标题】:How to change #define value from another file如何从另一个文件更改#define 值
【发布时间】:2020-03-26 00:48:43
【问题描述】:

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

//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 的值?

【问题讨论】:

  • “不起作用”是什么意思?你期望它做什么? (如果您希望它进入一个可能已经完成的单独编译并以某种方式重新编译它,您认为可以使用什么机制来实现您的目标?)
  • 预处理器的东西看起来不错——但是,将BOOT_DATA_ADDRESS 定义为(*stackpointer) 看起来有点奇怪。您确定要取消引用吗? (也许只是(stackpointer)??)
  • @Adrian Mole 取消引用是一个错字。
  • @rici 我编辑了帖子希望这能解决你的问题
  • @peter:如果你准备重新编译整个项目,这显然是可行的。否则,没有。单独编译就是单独编译。

标签: c embedded c-preprocessor


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 2012-06-10
    • 1970-01-01
    • 2019-07-30
    • 2015-04-07
    • 1970-01-01
    • 1970-01-01
    • 2021-05-09
    • 2016-09-25
    • 2014-04-21
    相关资源
    最近更新 更多