取消如何将定义传递给 CMock
Ceedling how to pass defines to CMock
虽然我已经使用 C 一段时间了,但我对 TDD 还是有些陌生。因此,我正在使用 ceedling 来测试我的嵌入式项目。
我可以 rake test:all
在 gcc 中,但我现在正试图将其移动到嵌入式目标模拟器。我正在通过 'project.yml' 文件指定我的交叉编译器、链接器等。
当我rake test:all
时,我在"compiling cmock.c"时出错(其他几个文件编译没有问题):
< path_to_cmock >/cmock.c:17:31: error: size of array 'CMock_Guts_Buffer' is too large
在此之后还有其他错误,但这是开始错误的错误。
当我转到 cmock.c
时,我在文件顶部看到了这个:
#ifdef CMOCK_MEM_DYNAMIC
static unsigned char* CMock_Guts_Buffer = NULL;
static CMOCK_MEM_INDEX_TYPE CMock_Guts_BufferSize = CMOCK_MEM_ALIGN_SIZE;
static CMOCK_MEM_INDEX_TYPE CMock_Guts_FreePtr;
#else
static unsigned char CMock_Guts_Buffer[CMOCK_MEM_SIZE + CMOCK_MEM_ALIGN_SIZE];
static CMOCK_MEM_INDEX_TYPE CMock_Guts_BufferSize = CMOCK_MEM_SIZE + CMOCK_MEM_ALIGN_SIZE;
static CMOCK_MEM_INDEX_TYPE CMock_Guts_FreePtr;
#endif
完美,所以我只需要找到声明它们的位置。我进行了文本搜索,结果发现它们没有在任何地方声明...所以我怀疑它们来自 ceedling 中的默认值。
我在 "Compiled Options"、
下找到了 CMOCK 的文档
A number of #defines also exist for customizing the cmock experience...
它接着列出了我在源代码中找到的#defines,但没有说明在哪里可以找到它们。我试图用适当的定义制作一个包含文件,并通过 'project.yml' 传递包含文件,但没有成功。
我怀疑答案简单得令人难以置信,只是在我搜索过的任何地方都没有概述。谢谢你的时间,
当然,答案就在眼前。
在 'project.yml' 文件中,有一个名为 'defines' 的部分。默认定义为:
:defines:
# in order to add common defines:
# 1) remove the trailing [] from the :common: section
# 2) add entries to the :common: section (e.g. :test: has TEST defined)
:commmon: &common_defines []
:test:
- *common_defines
- TEST
:test_preprocess:
- *common_defines
- TEST
我只是为我的目标添加了定义:
:defines:
# in order to add common defines:
# 1) remove the trailing [] from the :common: section
# 2) add entries to the :common: section (e.g. :test: has TEST defined)
:commmon: &common_defines
- __dsPIC33EP32MC204__
- UNITY_INT_WIDTH=16
- CMOCK_MEM_INDEX_TYPE=uint16_t
- CMOCK_MEM_PTR_AS_INT=uint16_t
- CMOCK_MEM_ALIGN=1
- CMOCK_MEM_SIZE=1024
- CMOCK_MEM_STATIC
:test:
- *common_defines
- TEST
:test_preprocess:
- *common_defines
- TEST
为您的项目设置 cmock 的正确方法是 slightlynybbled 在之前的回答中指出的,但是您也可以在 project.yml 文件中为您的 cmock 提供隐藏设置,如下所示:
:cmock:
:mock_prefix: mock_
:when_no_prototypes:
:warn
:enforce_strict_ordering: TRUE
:includes_h_pre_orig_header:
- ../<cmock_headers_includes>.h
:plugins:
- :ignore
- :ignore_arg
- :callback
- :expect
- :expect_any_args
:treat_as:
uint8: HEX8
uint16: HEX16
uint32: UINT32
int8: INT8
bool: UINT8
此设置已通过 Ceedling 0.27、0.28 和 0.28.1 测试
虽然我已经使用 C 一段时间了,但我对 TDD 还是有些陌生。因此,我正在使用 ceedling 来测试我的嵌入式项目。
我可以 rake test:all
在 gcc 中,但我现在正试图将其移动到嵌入式目标模拟器。我正在通过 'project.yml' 文件指定我的交叉编译器、链接器等。
当我rake test:all
时,我在"compiling cmock.c"时出错(其他几个文件编译没有问题):
< path_to_cmock >/cmock.c:17:31: error: size of array 'CMock_Guts_Buffer' is too large
在此之后还有其他错误,但这是开始错误的错误。
当我转到 cmock.c
时,我在文件顶部看到了这个:
#ifdef CMOCK_MEM_DYNAMIC
static unsigned char* CMock_Guts_Buffer = NULL;
static CMOCK_MEM_INDEX_TYPE CMock_Guts_BufferSize = CMOCK_MEM_ALIGN_SIZE;
static CMOCK_MEM_INDEX_TYPE CMock_Guts_FreePtr;
#else
static unsigned char CMock_Guts_Buffer[CMOCK_MEM_SIZE + CMOCK_MEM_ALIGN_SIZE];
static CMOCK_MEM_INDEX_TYPE CMock_Guts_BufferSize = CMOCK_MEM_SIZE + CMOCK_MEM_ALIGN_SIZE;
static CMOCK_MEM_INDEX_TYPE CMock_Guts_FreePtr;
#endif
完美,所以我只需要找到声明它们的位置。我进行了文本搜索,结果发现它们没有在任何地方声明...所以我怀疑它们来自 ceedling 中的默认值。
我在 "Compiled Options"、
下找到了 CMOCK 的文档A number of #defines also exist for customizing the cmock experience...
它接着列出了我在源代码中找到的#defines,但没有说明在哪里可以找到它们。我试图用适当的定义制作一个包含文件,并通过 'project.yml' 传递包含文件,但没有成功。
我怀疑答案简单得令人难以置信,只是在我搜索过的任何地方都没有概述。谢谢你的时间,
当然,答案就在眼前。
在 'project.yml' 文件中,有一个名为 'defines' 的部分。默认定义为:
:defines:
# in order to add common defines:
# 1) remove the trailing [] from the :common: section
# 2) add entries to the :common: section (e.g. :test: has TEST defined)
:commmon: &common_defines []
:test:
- *common_defines
- TEST
:test_preprocess:
- *common_defines
- TEST
我只是为我的目标添加了定义:
:defines:
# in order to add common defines:
# 1) remove the trailing [] from the :common: section
# 2) add entries to the :common: section (e.g. :test: has TEST defined)
:commmon: &common_defines
- __dsPIC33EP32MC204__
- UNITY_INT_WIDTH=16
- CMOCK_MEM_INDEX_TYPE=uint16_t
- CMOCK_MEM_PTR_AS_INT=uint16_t
- CMOCK_MEM_ALIGN=1
- CMOCK_MEM_SIZE=1024
- CMOCK_MEM_STATIC
:test:
- *common_defines
- TEST
:test_preprocess:
- *common_defines
- TEST
为您的项目设置 cmock 的正确方法是 slightlynybbled 在之前的回答中指出的,但是您也可以在 project.yml 文件中为您的 cmock 提供隐藏设置,如下所示:
:cmock:
:mock_prefix: mock_
:when_no_prototypes:
:warn
:enforce_strict_ordering: TRUE
:includes_h_pre_orig_header:
- ../<cmock_headers_includes>.h
:plugins:
- :ignore
- :ignore_arg
- :callback
- :expect
- :expect_any_args
:treat_as:
uint8: HEX8
uint16: HEX16
uint32: UINT32
int8: INT8
bool: UINT8
此设置已通过 Ceedling 0.27、0.28 和 0.28.1 测试