2016-12-14 87 views
0

Я пытаюсь разработать новую функцию для встроенного приложения, и я хотел бы сделать это, используя подход, основанный на проверке.Как настроить Ceedling для проекта IAR Embedded Workbench?

Проект написан в чистом виде C и разрабатывается с использованием встроенного инструментария IAR 6.60.1.5104. Я нацелен на LPC1788, который является устройством Cortex-M3, и вся разработка выполняется на 64-битной машине Windows 7. Сейчас я больше склоняюсь к тому, чтобы тестировать модульные тесты на ПК, а не на целевое оборудование (оперативная память довольно ограничена).

Я столкнулся с полезной книгой по теме Test Driven Development for Embedded C, и это указывало на инструменты вроде Unity, CppUTest, Ceedling и т. Д. После изучения этого материала, я думаю, что мой лучший выбор - настроить Ceedling (который использует Unity) для моего проекта. Тем не менее, я не совсем уверен, какие шаги мне нужно предпринять, чтобы настроить Ceedling на работу с моей текущей инструментальной привязкой IAR.

Я установил Ceedling и создал проект «blinky», и я пытаюсь его построить и протестировать с помощью инструментальной привязки IAR. Я добавил iccarm.exe на моем пути и редактируются blinky/project.yml, как указано ниже:

--- 

# Notes: 
# This is a fully tested project that demonstrates the use 
# of a timer ISR to blink the on board LED of an Arduino UNO 
:project: 
    :use_exceptions: FALSE 
    :use_test_preprocessor: TRUE 
    :use_auxiliary_dependencies: TRUE 
    :build_root: build 
    :release_build: TRUE 
    :test_file_prefix: test_ 

#You'll have to specify these 
:environment: 
    - :mcu: atmega328p 
    - :f_cpu: 16000000UL 
    - :serial_port: COM8 #change this to the serial port you are using!!! 
    - :objcopy: avr-objcopy 
    # Uncomment these lines if you are using windows and don't have these tools in your path 
    # - :path: 
    # - C:\mingw\bin 
    # - C:\WinAVR-20100110\bin 
    # - C:\WinAVR-20100110\utils\bin 
    # - #{ENV['PATH']} 

:extension: 
    :executable: .bin 

:release_build: 
    :output: blinky 

:paths: 
    :test: 
    - +:test/** 
    - -:test/support 
    :source: 
    - src/** 
    :support: 
    - test/support 

: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 

:tools: 
    :release_compiler: 
    :executable: avr-gcc 
    :arguments: 
     - ${1} 
     - -DTARGET 
     - -DF_CPU=#{ENV['F_CPU']} 
     - -mmcu=#{ENV['MCU']} 
     - -Iinclude/ 
     - -Wall 
     - -Os 
     - -c 
     - -o ${2} 
    :release_linker: 
    :executable: avr-gcc 
    :arguments: 
     - -mmcu=#{ENV['MCU']} 
     - ${1} 
     - -o ${2}.bin 

:cmock: 
    :mock_prefix: mock_ 
    :when_no_prototypes: :warn 
    :enforce_strict_ordering: TRUE 
    :plugins: 
    - :ignore 
    :treat_as: 
    uint8: HEX8 
    uint16: HEX16 
    uint32: UINT32 
    int8:  INT8 
    bool:  UINT8 

:tools: 
    :test_file_preprocessor: 
    :executable: iccarm 
    :name: 'IAR test file preprocessor' 

    :test_includes_preprocessor: 
    :executable: iccarm 
    :name: 'IAR test includes preprocessor' 

    :test_compiler: 
    :executable: iccarm 
    :name: 'IAR test compiler' 

    :test_linker: 
    :executable: iccarm 
    :name: 'IAR test linker' 

    :release_compiler: 
    :executable: iccarm 
    :name: 'IAR release compiler' 

    :release_linker: 
    :executable: iccarm 
    :name: 'IAR release linker' 

:plugins: 
    :load_paths: 
    - vendor/ceedling/plugins 
    :enabled: 
    - stdout_pretty_tests_report 
    - module_generator 
... 

Единственное различие между этим и значение по умолчанию project.yml является содержание под второй :tools разделе.

Я предполагаю, что я направляюсь в правильном направлении, но я не уверен, является ли iccarm.exe правильным исполняемым файлом для использования для всех этих частей инструментальной цепочки и какие аргументы мне нужно передать.

Если я могу настроить Ceedling для сборки и тестирования моргнутого проекта с помощью инструментальной привязки IAR, я надеюсь, что смогу применить такую ​​же конфигурацию для своего фактического проекта. Если я пытаюсь работаю rake сейчас, я получаю следующий результат:

$ rake 


Test 'test_BlinkTask.c' 
----------------------- 
rake aborted! 
Errno::ENOENT: No such file or directory @ rb_sysopen - build/test/preprocess/files/test_BlinkTask.c 
C:/Users/davidfallah/Documents/IAR Projects/blinky/vendor/ceedling/lib/ceedling/preprocessinator_extractor.rb:18:in `readlines' 
C:/Users/davidfallah/Documents/IAR Projects/blinky/vendor/ceedling/lib/ceedling/preprocessinator_extractor.rb:18:in `extract_base_file_from_preprocessed_expansion' 
C:/Users/davidfallah/Documents/IAR Projects/blinky/vendor/ceedling/lib/ceedling/preprocessinator_file_handler.rb:14:in `preprocess_file' 
C:/Users/davidfallah/Documents/IAR Projects/blinky/vendor/ceedling/lib/ceedling/preprocessinator.rb:40:in `preprocess_file' 
C:/Users/davidfallah/Documents/IAR Projects/blinky/vendor/ceedling/lib/ceedling/preprocessinator.rb:12:in `block in setup' 
C:/Users/davidfallah/Documents/IAR Projects/blinky/vendor/ceedling/lib/ceedling/preprocessinator_helper.rb:33:in `preprocess_test_file' 
C:/Users/davidfallah/Documents/IAR Projects/blinky/vendor/ceedling/lib/ceedling/preprocessinator.rb:25:in `preprocess_test_and_invoke_test_mocks' 
C:/Users/davidfallah/Documents/IAR Projects/blinky/vendor/ceedling/lib/ceedling/test_invoker.rb:42:in `block in setup_and_invoke' 
C:/Users/davidfallah/Documents/IAR Projects/blinky/vendor/ceedling/lib/ceedling/test_invoker.rb:32:in `setup_and_invoke' 
C:/Users/davidfallah/Documents/IAR Projects/blinky/vendor/ceedling/lib/ceedling/tasks_tests.rake:11:in `block (2 levels) in <top (required)>' 
Tasks: TOP => default => test:all 
(See full trace by running task with --trace) 

-------------------- 
OVERALL TEST SUMMARY 
-------------------- 

No tests executed. 

я предполагаю, что это потому, что файл препроцессор теста должен быть копирование тестовых файлов под build/test/preprocess/files каталогом, который в настоящее время не происходит.

После небольшого поиска я нашел это example configuration file for Unity, который выглядит как может быть полезно. Он ориентирован на среду IAR EW/Cortex M3, такую ​​как я использую. Это может дать некоторое представление о том, что варианты конфигурации мне нужно указать в моем Ceedling project.yml:

Если я могу получить Ceedling построить и протестировать blinky проект с использованием набора инструментов IAR, я надеюсь, что я могу адаптировать его для работы с мой фактический проект. Любая помощь будет оценена по достоинству.

+1

Насколько Я знаю, что IAR linker является 'ilinkarm',' iccarm' является только компилятором. В руководстве по компиляции вы должны указать, как их использовать. Кроме того, workbench имеет возможность отображать полные команды сборки на компиляции, которые вы можете проверить для справки. – user694733

+0

@ user694733 Спасибо, я сделал это изменение. Вам неизвестно, подходит ли 'iccarm' для ролей' test_file_preprocessor' и 'test_includes_preprocessor'? – Tagc

+0

Я не очень много компилировал из командной строки, поэтому не могу сказать точно. И вы должны проверить мой предыдущий комментарий из руководства для компилятора: моя версия IAR немного старше вашей, поэтому она может быть изменена. – user694733

ответ

2

Это была борьба, но я считаю, что мне удалось настроить Ceedling, чтобы помочь проверить мой проект. Надеюсь, это будет полезно для всех, кто хочет использовать Ceedling в проектах IAR.

У Ceedling CLI есть команда (ceedling new <proj_name>), которая позволяет создавать новые проекты со структурой, которую ожидает Ceedling. Вы также можете указать имя существующего проекта , и в этом случае он добавляет только необходимые файлы, чтобы сделать его совместимым с Ceedling, что я и сделал с моим проектом.

Для справки, моя структура проекта выглядел примерно так после выполнения этого шага:

. 
├── build 
│   ├── artifacts 
│   │   └── test 
│   ├── docs 
│   ├── exe 
│   ├── list 
│   ├── logs 
│   ├── obj 
│   ├── temp 
│   └── test 
│    ├── cache 
│    ├── dependencies 
│    ├── list.i 
│    ├── mocks 
│    ├── out 
│    ├── results 
│    ├── runners 
│    └── tests.map 
├── project.yml 
├── rakefile.rb 
├── src 
│   └── main 
│    ├── c 
│    │   ├── canDatabase.c 
│    ├── include 
│    │   ├── canDatabase.h 
│    ├── python 
│    └── resources 
├── test 
│   ├── support 
│   └── test_canDatabase.c 
├── <my_project>.dep 
├── <my_project>.ewd 
├── <my_project>.ewp 
├── <my_project>.eww 
├── vendor 
│   └── ceedling 
│    ├── docs 
│    ├── lib 
│    ├── plugins 
│    └── vendor 
└── version.properties 

После этого я просмотрел справочники для инструментов IAR и изучил выход из IAR Embedded Workbench при создании образца проектов, как предложил @ user694733. Я использовал эту информацию, чтобы изменить мой project.yml, как указано ниже:

:project: 
    :use_exceptions: FALSE 
    :use_test_preprocessor: FALSE 
    :use_auxiliary_dependencies: TRUE 
    :build_root: build 
    :release_build: FALSE 
    :test_file_prefix: test_ 

:environment: 
    - :path: 
    - 'C:\Program Files (x86)\IAR Systems\Embedded Workbench 6.5\arm\bin' 
    - 'C:\Program Files (x86)\IAR Systems\Embedded Workbench 6.5\common\bin' 
    - #{ENV['PATH']} 

:extension: 
    :executable: .out 

:paths: 
    :test: 
    - +:test/** 
    - -:test/support 
    :source: 
    - src/main/c/** 
    - src/main/include/** 
    - src/main/resources/** 
    :support: 
    - test/support 

:defines: 
    :commmon: &common_defines [] 
    :test: 
    - *common_defines 
    - TEST 
    :test_preprocess: 
    - *common_defines 
    - TEST 

:cmock: 
    :mock_prefix: mock_ 
    :when_no_prototypes: :warn 
    :enforce_strict_ordering: TRUE 
    :plugins: 
    - :ignore 
    - :callback 
    :treat_as: 
    uint8: HEX8 
    uint16: HEX16 
    uint32: UINT32 
    int8:  INT8 
    bool:  UINT8 

:tools: 
    :test_compiler: 
    :executable: iccarm 
    :name: 'IAR test compiler' 
    :arguments: 
     - -D _DLIB_FILE_DESCRIPTOR=1 
     - --debug 
     - --endian=little 
     - --cpu=Cortex-M3 
     - -e 
     - --fpu=None 
     - -Ol 
     - --preprocess "build/test/list" 
     - --dlib_config "C:/Program Files (x86)/IAR Systems/Embedded Workbench 6.5/arm/INC/c/DLib_Config_Normal.h" 
     - -I"$": COLLECTION_PATHS_TEST_TOOLCHAIN_INCLUDE 
     - -I"$": COLLECTION_PATHS_TEST_SUPPORT_SOURCE_INCLUDE_VENDOR 
     - -o "${2}" 
     - --diag_suppress=Pa050 
     - '"${1}"' 

    :test_linker: 
    :executable: ilinkarm 
    :name: 'IAR test linker' 
    :arguments: 
     - --vfe 
     - --redirect _Printf=_PrintfFull 
     - --redirect _Scanf=_ScanfFull 
     - --semihosting 
     - --config "C:/Program Files (x86)/IAR Systems/Embedded Workbench 6.5/arm/config/generic_cortex.icf" 
     - --map "build/test/tests.map" 
     - -o "${2}" 
     - '"${1}"' 

    :test_fixture: 
    :executable: cspybat 
    :name: 'CSpyBat test runner' 
    :arguments: 
     - '"C:\Program Files (x86)\IAR Systems\Embedded Workbench 6.5\arm\bin\armproc.dll"' 
     - '"C:\Program Files (x86)\IAR Systems\Embedded Workbench 6.5\arm\bin\armsim2.dll"' 
     - '"${1}"' 
     - --plugin "C:\Program Files (x86)\IAR Systems\Embedded Workbench 6.5\arm\bin\armbat.dll" 
     - --backend -B 
     - --endian=little 
     - --cpu=Cortex-M3 
     - --fpu=None 
     - --semihosting 

:plugins: 
    :load_paths: 
    - vendor/ceedling/plugins 
    :enabled: 
    - stdout_pretty_tests_report 
    - module_generator 
... 

Это, кажется, подходящая конфигурация для тестирования кода предназначен для работы на устройстве Cortex-M3.

Я также отредактировал rakefile.rb, чтобы убедиться, что сгенерированные тестовые файлы очищены перед каждым испытательным прогоном, так как это необходимо для непрерывного распечатки результатов теста.

PROJECT_CEEDLING_ROOT = "vendor/ceedling" 
load "#{PROJECT_CEEDLING_ROOT}/lib/ceedling.rb" 

Ceedling.load_project 

task :default => %w[ clean test:all ] 

Я был тогда в состоянии определить и запустить модульные тесты. Ниже приводится выдержка из test_canDatabase.c:

#include "unity.h" 
#include "canDatabase.h" 

uint32_t actualId; 
uint8_t actualPayload[8]; 
uint8_t actualPayloadLen; 
uint8_t actualCanPort; 

void mockHandler(uint32_t id, uint8_t payload[8], uint8_t payloadLen, uint8_t canPort) 
{ 
    actualId = id; 
    actualPayloadLen = payloadLen; 
    actualCanPort = canPort; 

    for (int i=0; i < payloadLen; i++) 
    { 
    actualPayload[i] = payload[i]; 
    } 
} 

void setUp(void) 
{ 
    actualId = 0; 
    actualPayloadLen = 0; 
    actualCanPort = 0; 

    for (int i=0; i < 8; i++) 
    { 
    actualPayload[i] = 0; 
    } 

    CANDB_Init(mockHandler); 
} 

void tearDown(void) {} 

void test_Register_Tx_Definition() 
{ 
    // GIVEN a CAN Tx message definition. 
    CAN_TX_MESSAGE_DEFINITION_T definition; 
    definition.id = 0; 

    // WHEN we register the definition in the CAN database. 
    int err = CANDB_RegisterTxDefinition(definition); 

    // THEN the database should return SUCCESS (0x0). 
    TEST_ASSERT_EQUAL_MESSAGE(0x0, err, "Registration should succeed"); 
} 

void test_Register_Tx_Definition_Twice() 
{ 
    // GIVEN a CAN Tx message definition. 
    CAN_TX_MESSAGE_DEFINITION_T definition; 
    definition.id = 0; 

    // WHEN we register the definition once. 
    CANDB_RegisterTxDefinition(definition); 

    // AND we register the definition again. 
    int err = CANDB_RegisterTxDefinition(definition); 

    // THEN the database should return SUCCESS (0x0). 
    TEST_ASSERT_EQUAL_MESSAGE(0x0, err, "Re-registration should succeed"); 
} 

Я теперь в состоянии выполнять автоматизированные тесты, вызывая «ceedling» из терминала (корень проекта текущий рабочий каталог):

$ ceedling 
--------------------- 
BUILD FAILURE SUMMARY 
--------------------- 
Unit test failures. 


Cleaning build artifacts... 
(For large projects, this task may take a long time to complete) 



Test 'test_canDatabase.c' 
------------------------- 
Generating runner for test_canDatabase.c... 
Compiling test_canDatabase_runner.c... 
Compiling test_canDatabase.c... 
Compiling unity.c... 
Compiling canDatabase.c... 
Compiling cmock.c... 
Linking test_canDatabase.out... 
Running test_canDatabase.out... 

----------- 
TEST OUTPUT 
----------- 
[test_canDatabase.c] 
    - "" 
    - "  IAR C-SPY Command Line Utility V6.6.0.2752" 
    - "  Copyright 2000-2013 IAR Systems AB." 
    - "" 
    - "" 

------------------- 
FAILED TEST SUMMARY 
------------------- 
[test_canDatabase.c] 
    Test: test_Register_More_Than_Max_Allowed_Definitions 
    At line (84): "Expected 1 Was 0. Registration > CANDB_MAX_TX_DEFINITIONS should fail" 

    Test: test_Activate_Tx_Definition_With_Hardcoded_Payload 
    At line (124): "Expected 0x00000001 Was 0x00000000. Incorrect ID" 

-------------------- 
OVERALL TEST SUMMARY 
-------------------- 
TESTED: 4 
PASSED: 2 
FAILED: 2 
IGNORED: 0