Ceedling如何将定义传递给CMock

时间:2016-05-06 17:35:25

标签: c cmock

我对TDD有点新鲜,虽然我已经使用C一段时间了。结果,我正在使用ceedling来测试我的嵌入式项目。

我可以在gcc中rake test:all,但我现在正尝试将其移至嵌入式目标模拟器。我通过' project.yml'指定我的交叉编译器,链接器等。文件。

当我rake test:all时,我在编译cmock.c"时遇到错误。 (其他几个文件编译没有问题):

  

< path_to_cmock> /cmock.c:17:31:错误:数组的大小' CMock_Guts_Buffer'太大了

此后还有其他错误,但这是将其解雇的错误。

当我转到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中的默认值。

我找到了CMOCK的文档,并在" Compiled Options",

下找到了
  

还有许多#defines可用于自定义cmock体验...

继续列出我在源代码中找到的#defines,但它没有说明在哪里找到它们。我试图用适当的定义创建一个包含文件,并通过' project.yml'传递包含文件。没有运气。

我怀疑答案简单得令人难以置信,在我搜索的任何地方都没有概述。谢谢你的时间,

2 个答案:

答案 0 :(得分:3)

当然,答案就是盯着我。

在'project.yml'文件中,有一个名为'definitions'的部分。默认定义为:

: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

答案 1 :(得分:2)

为您的prohect设置cmock的正确方法是在前面的答案中指出slightlynybbled,你也可以为你的cmocks提供一个隐藏的设置到你的project.yml文件中,如下所示:

: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

测试了该设置