Beware that this post is related to an SDK in maintenance mode
More Info: Consider nRF Connect SDK for new designs
This post is older than 2 years and might not be relevant anymore
More Info: Consider searching for newer posts

Help Importing Existing IAR Project to SES / GCC

Hi,

I am attempting to import an existing IAR project to SES / GCC and am having some trouble. I recently joined the project team and we are making an effort to switch from the paid IAR license that our contracting firmware group has used to a free IDE/toolchain in order to take over development.

It began as a ble_app_hrs example and dfu secure_bootloader example was later incorporated, but it has come a long way.

I am not yet familiar with IAR so I am having some trouble translating the IAR .icf linker files, macros, and preprocessor definitions to work with the Segger internal GCC toolchain. I have been looking for any guides or assistance that I can find, but there doesn't seem to be much on the subject.

I followed the Segger guide for porting projects from IAR (link) but it is not specific to Nordic or comprehensive, and I have had difficulty at the troubleshooting memory linker script section. I also referenced the Nordic guide for Importing from Keil but it seems a bit out of date. After creating a flash_placement.xml file based off the original SES examples' flash_placement.xml files, and then changing the FLASH and RAM section placement macros and Heap/Stack size in runtime memory area settings I am still unable to compile and am seeing the following errors:

Building ‘neop_hat_main_s132_with_dfu_pca10040’ from solution ‘project’ in configuration ‘nrf52832_xxaa_s132 Internal’
...
Output/nrf52832_xxaa_s132 Internal/Exe/neop_hat_main_s132_with_dfu_pca10040.elf does not exist.
Generating linker script ‘neop_hat_main_s132_with_dfu_pca10040.ld’
Linking neop_hat_main_s132_with_dfu_pca10040.elf
Output/nrf52832_xxaa_s132 Internal/Exe/neop_hat_main_s132_with_dfu_pca10040.elf section `.init' will not fit in region `UNPLACED_SECTIONS'
region `UNPLACED_SECTIONS' overflowed by 16688 bytes
cannot find entry symbol reset_handler; not setting start address
Output/neop_hat_main_s132_with_dfu_pca10040 nrf52832_xxaa_s132 Internal/Obj/ses_startup_nrf52.o: in function `_vectors':
(.vectors+0x0): undefined reference to `__stack_end__'
(.vectors+0x4): undefined reference to `Reset_Handler'
Output/neop_hat_main_s132_with_dfu_pca10040 nrf52832_xxaa_s132 Internal/Obj/nrf_sdh.o:(.rodata.sdh_stack_observers+0x0): undefined reference to `__start_sdh_stack_observers'
Output/neop_hat_main_s132_with_dfu_pca10040 nrf52832_xxaa_s132 Internal/Obj/nrf_sdh.o:(.rodata.sdh_stack_observers+0x4): undefined reference to `__stop_sdh_stack_observers'
Post-build command
\GIT\Neopenda\Firmware\neop_hat_main\pca10040\s132_with_dfu\iar>echo Creating folder for DFU packages if not exist... 1>.\..\..\..\tools\"\postBuildLog.txt
\GIT\Neopenda\Firmware\neop_hat_main\pca10040\s132_with_dfu\iar>if not exist ".\..\..\..\tools\"\DFU_Packages" mkdir .\..\..\..\tools\"\DFU_Packages
Build failed

So my questions are:

  1. Is there anything obvious I am doing wrong based on error output?
  2. Which startup files should I be including? I added thumb_crt0.s as the Keil importing guide instructed - is this correct? Should I also add ses_startup_nrf_common.s (it is in the ble_app_hrs example but causes more errors when I include it). Anything else?
  3. Is there any more comprehensive guide or any other useful information available on converting the IAR linker scripts correctly to corresponding GCC linker scripts and allocating memory correctly in the flash_placement.xml format?
  4. Am I going about this the right way or is there anything else I should be considering or referencing at this point in order to successfully migrate the project?

I am aware that importing existing IAR projects can be challenging. If there is anything else that can help us do so I would like to pursue it. If however, the recommendation is that this is a mess and to stay with IAR at all costs we would consider that as well.

Thanks!

  • Hello, 

    Can you please provide some information on what version of IAR and SES you are using? I will need this information to investigate here. 

    It began as a ble_app_hrs example and dfu secure_bootloader example was later incorporated, but it has come a long way.

    What version of nRF SDK are these from? And are they still based on the same SDK version?

    While I try to find a solution here, have you tried to search DevZone for the error output or similar cases? I found some cases that are similar to your question: [Link1] [Link2] [Link3]

    I also found this thread on Segger's own forum, and this Quick Start guide on importing projects. The Segger forum is probably the best place to start. 



    Kind regards,
    Øyvind

  • A tedious process indeed, we have done a similar exercise. The best guide we found was comparing a standard project (uart or hrs or similar) between IAR and SES; there are only two files needed for this, IAR .icf and .ewp and SES .emProject and .xml which I'm sure you already know. Contrasting those diffs with the same diffs between the specific project files gives the best guide to what is missing.

    Here are the IAR and SES linker control files from a working project which has been converted from IAR to SES:

    /*###ICF### Section handled by ICF editor, don't touch! ****/
    /*-Editor annotation file-*/
    /* IcfEditorFile="$TOOLKIT_DIR$\config\ide\IcfEditor\cortex_v1_0.xml" */
    /*-Specials-*/
    define symbol __ICFEDIT_intvec_start__ = 0x26000;
    /*-Memory Regions-*/
    define symbol __ICFEDIT_region_ROM_start__   = 0x26000;
    define symbol __ICFEDIT_region_ROM_end__     = 0x7ffff;
    define symbol __ICFEDIT_region_RAM_start__   = 0x20002a98;
    define symbol __ICFEDIT_region_RAM_end__     = 0x2000ffff;
    export symbol __ICFEDIT_region_RAM_start__;
    export symbol __ICFEDIT_region_RAM_end__;
    /*-Sizes-*/
    define symbol __ICFEDIT_size_cstack__   = 8192;
    define symbol __ICFEDIT_size_heap__     = 8192;
    /**** End of ICF editor section. ###ICF###*/
    
    define memory mem with size = 4G;
    define region ROM_region   = mem:[from __ICFEDIT_region_ROM_start__   to __ICFEDIT_region_ROM_end__];
    define region RAM_region   = mem:[from __ICFEDIT_region_RAM_start__   to __ICFEDIT_region_RAM_end__];
    
    define block CSTACK    with alignment = 8, size = __ICFEDIT_size_cstack__   { };
    define block HEAP      with alignment = 8, size = __ICFEDIT_size_heap__     { };
    define block RO_END    with alignment = 8, size = 0     { };
    
    initialize by copy { readwrite };
    do not initialize  { section .noinit };
    
    keep { section .intvec };
    place at address mem:__ICFEDIT_intvec_start__ { readonly section .intvec };
    place in ROM_region   { readonly,
                            block RO_END };
    place in RAM_region   { readwrite,
                            block CSTACK,
                            block HEAP };

    .. and SES .xml linker file:

    <!DOCTYPE Linker_Placement_File>
    <Root name="Flash Section Placement">
      <MemorySegment name="FLASH" start="$(FLASH_PH_START)" size="$(FLASH_PH_SIZE)">
        <ProgramSection load="no" name=".reserved_flash" start="$(FLASH_PH_START)" size="$(FLASH_START)-$(FLASH_PH_START)" />
        <ProgramSection alignment="0x100" load="Yes" name=".vectors" start="$(FLASH_START)" />
        <ProgramSection alignment="4" load="Yes" name=".init" />
        <ProgramSection alignment="4" load="Yes" name=".init_rodata" />
        <ProgramSection alignment="4" load="Yes" name=".text" />
        <ProgramSection alignment="4" keep="Yes" load="Yes" name=".sdh_soc_observers" inputsections="*(SORT(.sdh_soc_observers*))" address_symbol="__start_sdh_soc_observers" end_symbol="__stop_sdh_soc_observers" />
        <ProgramSection alignment="4" keep="Yes" load="Yes" name=".sdh_ble_observers" inputsections="*(SORT(.sdh_ble_observers*))" address_symbol="__start_sdh_ble_observers" end_symbol="__stop_sdh_ble_observers" />
        <ProgramSection alignment="4" keep="Yes" load="Yes" name=".pwr_mgmt_data" inputsections="*(SORT(.pwr_mgmt_data*))" address_symbol="__start_pwr_mgmt_data" end_symbol="__stop_pwr_mgmt_data" />
        <ProgramSection alignment="4" keep="Yes" load="Yes" name=".sdh_req_observers" inputsections="*(SORT(.sdh_req_observers*))" address_symbol="__start_sdh_req_observers" end_symbol="__stop_sdh_req_observers" />
        <ProgramSection alignment="4" keep="Yes" load="Yes" name=".sdh_state_observers" inputsections="*(SORT(.sdh_state_observers*))" address_symbol="__start_sdh_state_observers" end_symbol="__stop_sdh_state_observers" />
        <ProgramSection alignment="4" keep="Yes" load="Yes" 
    name=".sdh_stack_observers" inputsections="*(SORT(.sdh_stack_observers*))" address_symbol="__start_sdh_stack_observers" end_symbol="__stop_sdh_stack_observers" />
        <ProgramSection alignment="4" keep="Yes" load="Yes" name=".nrf_queue" inputsections="*(.nrf_queue*)" address_symbol="__start_nrf_queue" end_symbol="__stop_nrf_queue" />
        <ProgramSection alignment="4" keep="Yes" load="Yes" name=".nrf_balloc" inputsections="*(.nrf_balloc*)" address_symbol="__start_nrf_balloc" end_symbol="__stop_nrf_balloc" />
        <ProgramSection alignment="4" keep="Yes" load="Yes" name=".cli_command" inputsections="*(.cli_command*)" address_symbol="__start_cli_command" end_symbol="__stop_cli_command" />
        <ProgramSection alignment="4" keep="Yes" load="Yes" name=".crypto_data" inputsections="*(SORT(.crypto_data*))" address_symbol="__start_crypto_data" end_symbol="__stop_crypto_data" />
        <ProgramSection alignment="4" keep="Yes" load="Yes" name=".log_const_data" inputsections="*(SORT(.log_const_data*))" address_symbol="__start_log_const_data" end_symbol="__stop_log_const_data" />
        <ProgramSection alignment="4" keep="Yes" load="Yes" name=".log_backends" inputsections="*(SORT(.log_backends*))" address_symbol="__start_log_backends" end_symbol="__stop_log_backends" />
        <ProgramSection alignment="4" keep="Yes" load="No" name=".nrf_sections" address_symbol="__start_nrf_sections" />
        <ProgramSection alignment="4" keep="Yes" load="Yes" name=".cli_sorted_cmd_ptrs"  inputsections="*(.cli_sorted_cmd_ptrs*)" runin=".cli_sorted_cmd_ptrs_run"/>
        <ProgramSection alignment="4" keep="Yes" load="Yes" name=".fs_data"  inputsections="*(.fs_data*)" runin=".fs_data_run"/>
        <ProgramSection alignment="4" keep="Yes" load="Yes" name=".log_dynamic_data"  inputsections="*(SORT(.log_dynamic_data*))" runin=".log_dynamic_data_run"/>
        <ProgramSection alignment="4" keep="Yes" load="Yes" name=".log_filter_data"  inputsections="*(SORT(.log_filter_data*))" runin=".log_filter_data_run"/>
        <ProgramSection alignment="4" load="Yes" name=".dtors" />
        <ProgramSection alignment="4" load="Yes" name=".ctors" />
        <ProgramSection alignment="4" load="Yes" name=".rodata" />
        <ProgramSection alignment="4" load="Yes" name=".ARM.exidx" address_symbol="__exidx_start" end_symbol="__exidx_end" />
        <ProgramSection alignment="4" load="Yes" runin=".fast_run" name=".fast" />
        <ProgramSection alignment="4" load="Yes" runin=".data_run" name=".data" />
        <ProgramSection alignment="4" load="Yes" runin=".tdata_run" name=".tdata" />
      </MemorySegment>
      <MemorySegment name="RAM" start="$(RAM_PH_START)" size="$(RAM_PH_SIZE)">
        <ProgramSection load="no" name=".reserved_ram" start="$(RAM_PH_START)" size="$(RAM_START)-$(RAM_PH_START)" />
        <ProgramSection alignment="0x100" load="No" name=".vectors_ram" start="$(RAM_START)" address_symbol="__app_ram_start__"/>
        <ProgramSection alignment="4" keep="Yes" load="No" name=".nrf_sections_run" address_symbol="__start_nrf_sections_run" />
        <ProgramSection alignment="4" keep="Yes" load="No" name=".cli_sorted_cmd_ptrs_run" address_symbol="__start_cli_sorted_cmd_ptrs" end_symbol="__stop_cli_sorted_cmd_ptrs" />
        <ProgramSection alignment="4" keep="Yes" load="No" name=".fs_data_run" address_symbol="__start_fs_data" end_symbol="__stop_fs_data" />
        <ProgramSection alignment="4" keep="Yes" load="No" name=".log_dynamic_data_run" address_symbol="__start_log_dynamic_data" end_symbol="__stop_log_dynamic_data" />
        <ProgramSection alignment="4" keep="Yes" load="No" name=".log_filter_data_run" address_symbol="__start_log_filter_data" end_symbol="__stop_log_filter_data" />
        <ProgramSection alignment="4" keep="Yes" load="No" name=".nrf_sections_run_end" address_symbol="__end_nrf_sections_run" />
        <ProgramSection alignment="4" load="No" name=".fast_run" />
        <ProgramSection alignment="4" load="No" name=".data_run" />
        <ProgramSection alignment="4" load="No" name=".tdata_run" />
        <ProgramSection alignment="4" load="No" name=".bss" />
        <ProgramSection alignment="4" load="No" name=".tbss" />
        <ProgramSection alignment="4" load="No" name=".non_init" />
        <ProgramSection alignment="4" size="__HEAPSIZE__" load="No" name=".heap" />
        <ProgramSection alignment="8" size="__STACKSIZE__" load="No" place_from_segment_end="Yes" name=".stack"  address_symbol="__StackLimit" end_symbol="__StackTop"/>
        <ProgramSection alignment="8" size="__STACKSIZE_PROCESS__" load="No" name=".stack_process" />
      </MemorySegment>
    </Root>
    

    Then the converted project file for SES for this project, with some of the target sources removed which would need to be replaced by the specific project sources (if any):

    <!DOCTYPE CrossStudio_Project_File>
    <solution Name="ble_s132" target="8" version="2">
      <project Name="ble_s132">
        <configuration
          Name="Common"
          arm_architecture="v7EM"
          arm_core_type="Cortex-M4"
          arm_endian="Little"
          arm_fp_abi="Hard"
          arm_fpu_type="FPv4-SP-D16"
          arm_linker_heap_size="2048"
          arm_linker_process_stack_size="0"
          arm_linker_stack_size="4096"
          arm_linker_treat_warnings_as_errors="No"
          arm_simulator_memory_simulation_parameter="RWX 00000000,00100000,FFFFFFFF;RWX 20000000,00010000,CDCDCDCD"
          arm_target_device_name="nRF52832_xxAA"
          arm_target_interface_type="SWD"
          c_preprocessor_definitions="BOARD_YOUR_DESIGN;notBOARD_PCA10040;CONFIG_NFCT_PINS_AS_GPIOS;notCONFIG_GPIO_AS_PINRESET;FLOAT_ABI_HARD;INITIALIZE_USER_SECTIONS;NO_VTOR_CONFIG;NRF52;NRF52832_XXAA;NRF52_PAN_74;NRF_SD_BLE_API_VERSION=6;S132;SOFTDEVICE_PRESENT;SWI_DISABLE0"
          c_user_include_directories="../../../;../../../application;../../../../../../components;../../../../../../components/ble/ble_advertising;../../../../../../components/ble/ble_db_discovery;../../../../../../components/ble/ble_dtm;../../../../../../components/ble/ble_link_ctx_manager;../../../../../../components/ble/ble_racp;../../../../../../components/ble/ble_services/ble_ancs_c;../../../../../../components/ble/ble_services/ble_ans_c;../../../../../../components/ble/ble_services/ble_bas;../../../../../../components/ble/ble_services/ble_bas_c;../../../../../../components/ble/ble_services/ble_cscs;../../../../../../components/ble/ble_services/ble_cts_c;../../../../../../components/ble/ble_services/ble_dfu;../../../../../../components/ble/ble_services/ble_dis;../../../../../../components/ble/ble_services/ble_gls;../../../../../../components/ble/ble_services/ble_hids;../../../../../../components/ble/ble_services/ble_hrs;../../../../../../components/ble/ble_services/ble_hrs_c;../../../../../../components/ble/ble_services/ble_hts;../../../../../../components/ble/ble_services/ble_ias;../../../../../../components/ble/ble_services/ble_ias_c;../../../../../../components/ble/ble_services/ble_lbs;../../../../../../components/ble/ble_services/ble_lbs_c;../../../../../../components/ble/ble_services/ble_lls;../../../../../../components/ble/ble_services/ble_nus;../../../../../../components/ble/ble_services/ble_nus_c;../../../../../../components/ble/ble_services/ble_rscs;../../../../../../components/ble/ble_services/ble_rscs_c;../../../../../../components/ble/ble_services/ble_tps;../../../../../../components/ble/common;../../../../../../components/ble/nrf_ble_gatt;../../../../../../components/ble/nrf_ble_qwr;../../../../../../components/ble/peer_manager;../../../../../../components/boards;../../../../../../components/drivers_nrf/usbd;../../../../../../components/libraries/atomic;../../../../../../components/libraries/atomic_fifo;../../../../../../components/libraries/atomic_flags;../../../../../../components/libraries/balloc;../../../../../../components/libraries/bootloader/ble_dfu;../../../../../../components/libraries/bsp;../../../../../../components/libraries/button;../../../../../../components/libraries/cli;../../../../../../components/libraries/crc16;../../../../../../components/libraries/crc32;../../../../../../components/libraries/crypto;../../../../../../components/libraries/csense;../../../../../../components/libraries/csense_drv;../../../../../../components/libraries/delay;../../../../../../components/libraries/ecc;../../../../../../components/libraries/experimental_section_vars;../../../../../../components/libraries/experimental_task_manager;../../../../../../components/libraries/fds;../../../../../../components/libraries/fifo;../../../../../../components/libraries/fstorage;../../../../../../components/libraries/gfx;../../../../../../components/libraries/gpiote;../../../../../../components/libraries/hardfault;../../../../../../components/libraries/hci;../../../../../../components/libraries/led_softblink;../../../../../../components/libraries/log;../../../../../../components/libraries/log/src;../../../../../../components/libraries/low_power_pwm;../../../../../../components/libraries/mem_manager;../../../../../../components/libraries/memobj;../../../../../../components/libraries/mpu;../../../../../../components/libraries/mutex;../../../../../../components/libraries/pwm;../../../../../../components/libraries/pwr_mgmt;../../../../../../components/libraries/queue;../../../../../../components/libraries/ringbuf;../../../../../../components/libraries/scheduler;../../../../../../components/libraries/sdcard;../../../../../../components/libraries/slip;../../../../../../components/libraries/sortlist;../../../../../../components/libraries/spi_mngr;../../../../../../components/libraries/stack_guard;../../../../../../components/libraries/strerror;../../../../../../components/libraries/svc;../../../../../../components/libraries/timer;../../../../../../components/libraries/twi_mngr;../../../../../../components/libraries/twi_sensor;../../../../../../components/libraries/uart;../../../../../../components/libraries/usbd;../../../../../../components/libraries/usbd/class/audio;../../../../../../components/libraries/usbd/class/cdc;../../../../../../components/libraries/usbd/class/cdc/acm;../../../../../../components/libraries/usbd/class/hid;../../../../../../components/libraries/usbd/class/hid/generic;../../../../../../components/libraries/usbd/class/hid/kbd;../../../../../../components/libraries/usbd/class/hid/mouse;../../../../../../components/libraries/usbd/class/msc;../../../../../../components/libraries/util;../../../../../../components/nfc/ndef/conn_hand_parser;../../../../../../components/nfc/ndef/conn_hand_parser/ac_rec_parser;../../../../../../components/nfc/ndef/conn_hand_parser/ble_oob_advdata_parser;../../../../../../components/nfc/ndef/conn_hand_parser/le_oob_rec_parser;../../../../../../components/nfc/ndef/connection_handover/ac_rec;../../../../../../components/nfc/ndef/connection_handover/ble_oob_advdata;../../../../../../components/nfc/ndef/connection_handover/ble_pair_lib;../../../../../../components/nfc/ndef/connection_handover/ble_pair_msg;../../../../../../components/nfc/ndef/connection_handover/common;../../../../../../components/nfc/ndef/connection_handover/ep_oob_rec;../../../../../../components/nfc/ndef/connection_handover/hs_rec;../../../../../../components/nfc/ndef/connection_handover/le_oob_rec;../../../../../../components/nfc/ndef/generic/message;../../../../../../components/nfc/ndef/generic/record;../../../../../../components/nfc/ndef/launchapp;../../../../../../components/nfc/ndef/parser/message;../../../../../../components/nfc/ndef/parser/record;../../../../../../components/nfc/ndef/text;../../../../../../components/nfc/ndef/uri;../../../../../../components/nfc/t2t_lib;../../../../../../components/nfc/t2t_lib/hal_t2t;../../../../../../components/nfc/t2t_parser;../../../../../../components/nfc/t4t_lib;../../../../../../components/nfc/t4t_lib/hal_t4t;../../../../../../components/nfc/t4t_parser/apdu;../../../../../../components/nfc/t4t_parser/cc_file;../../../../../../components/nfc/t4t_parser/hl_detection_procedure;../../../../../../components/nfc/t4t_parser/tlv;../../../../../../components/softdevice/common;../../../../../../components/softdevice/s132/headers;../../../../../../components/softdevice/s132/headers/nrf52;../../../../../../components/toolchain/cmsis/include;../../../../../../external/fprintf;../../../../../../external/segger_rtt;../../../../../../external/utf_converter;../../../../../../integration/nrfx;../../../../../../integration/nrfx/legacy;../../../../../../modules/nrfx;../../../../../../modules/nrfx/drivers/include;../../../../../../modules/nrfx/hal;../../../../../../modules/nrfx/mdk;../config"
          debug_additional_load_file="../../../../../../components/softdevice/s132/hex/s132_nrf52_6.1.1_softdevice.hex"
          debug_register_definition_file="../../../../../../modules/nrfx/mdk/nrf52.svd"
          debug_start_from_entry_point_symbol="No"
          debug_target_connection="J-Link"
          gcc_debugging_level="Level 3"
          gcc_entry_point="Reset_Handler"
          linker_output_format="hex"
          linker_printf_fmt_level="long"
          linker_printf_width_precision_supported="Yes"
          linker_section_placement_file="flash_placement.xml"
          linker_section_placement_macros="FLASH_PH_START=0x0;FLASH_PH_SIZE=0x80000;RAM_PH_START=0x20000000;RAM_PH_SIZE=0x10000;FLASH_START=0x26000;FLASH_SIZE=0x5a000;RAM_START=0x20002a98;RAM_SIZE=0xd568"
          linker_section_placements_segments="FLASH RX 0x0 0x80000;RAM RWX 0x20000000 0x10000"
          macros="CMSIS_CONFIG_TOOL=../../../../../../external_tools/cmsisconfig/CMSIS_Configuration_Wizard.jar"
          project_directory=""
          project_type="Executable" />
        <folder Name="Segger Startup Files">
          <file file_name="$(StudioDir)/source/thumb_crt0.s" />
        </folder>
        <folder Name="nRF_Log">
          <file file_name="../../../../../../components/libraries/log/src/nrf_log_backend_rtt.c" />
          <file file_name="../../../../../../components/libraries/log/src/nrf_log_backend_serial.c" />
          <file file_name="../../../../../../components/libraries/log/src/nrf_log_default_backends.c" />
          <file file_name="../../../../../../components/libraries/log/src/nrf_log_frontend.c" />
          <file file_name="../../../../../../components/libraries/log/src/nrf_log_str_formatter.c" />
        </folder>
        <folder Name="nRF_Libraries">
          <file file_name="../../../../../../components/libraries/button/app_button.c" />
          <file file_name="../../../../../../components/libraries/util/app_error.c" />
          <file file_name="../../../../../../components/libraries/util/app_error_handler_gcc.c" />
          <file file_name="../../../../../../components/libraries/util/app_error_weak.c" />
          <file file_name="../../../../../../components/libraries/fifo/app_fifo.c" />
          <file file_name="../../../../../../components/libraries/scheduler/app_scheduler.c" />
          <file file_name="../../../../../../components/libraries/timer/app_timer.c" />
          <file file_name="../../../../../../components/libraries/uart/app_uart_fifo.c" />
          <file file_name="../../../../../../components/libraries/util/app_util_platform.c" />
          <file file_name="../../../../../../components/libraries/hardfault/hardfault_implementation.c" />
          <file file_name="../../../../../../components/libraries/util/nrf_assert.c" />
          <file file_name="../../../../../../components/libraries/atomic_fifo/nrf_atfifo.c" />
          <file file_name="../../../../../../components/libraries/atomic_flags/nrf_atflags.c" />
          <file file_name="../../../../../../components/libraries/atomic/nrf_atomic.c" />
          <file file_name="../../../../../../components/libraries/balloc/nrf_balloc.c" />
          <file file_name="../../../../../../external/fprintf/nrf_fprintf.c" />
          <file file_name="../../../../../../external/fprintf/nrf_fprintf_format.c" />
          <file file_name="../../../../../../components/libraries/memobj/nrf_memobj.c" />
          <file file_name="../../../../../../components/libraries/pwr_mgmt/nrf_pwr_mgmt.c" />
          <file file_name="../../../../../../components/libraries/ringbuf/nrf_ringbuf.c" />
          <file file_name="../../../../../../components/libraries/experimental_section_vars/nrf_section_iter.c" />
          <file file_name="../../../../../../components/libraries/strerror/nrf_strerror.c" />
          <file file_name="../../../../../../components/libraries/uart/retarget.c" />
        </folder>
        <folder Name="None">
          <file file_name="../../../../../../modules/nrfx/mdk/ses_startup_nrf52.s" />
          <file file_name="../../../../../../modules/nrfx/mdk/ses_startup_nrf_common.s" />
          <file file_name="../../../../../../modules/nrfx/mdk/system_nrf52.c" />
          <file file_name="flash_placement.xml" />
        </folder>
        <folder Name="Board Definition">
          <file file_name="../../../../../../components/boards/boards.c" />
          <file file_name="../../../../../../components/boards/simple_nRF52832.h" />
          <file file_name="../../../main_uart.c">
            <configuration Name="Debug" build_exclude_from_build="Yes" />
            <configuration Name="Release" build_exclude_from_build="Yes" />
          </file>
        </folder>
        <folder Name="nRF_Drivers">
          <file file_name="../../../../../../integration/nrfx/legacy/nrf_drv_clock.c" />
          <file file_name="../../../../../../integration/nrfx/legacy/nrf_drv_spi.c">
            <configuration Name="Debug" build_exclude_from_build="Yes" />
          </file>
          <file file_name="../../../../../../integration/nrfx/legacy/nrf_drv_uart.c" />
          <file file_name="../../../../../../components/libraries/spi_mngr/nrf_spi_mngr.c" />
          <file file_name="../../../../../../modules/nrfx/soc/nrfx_atomic.c" />
          <file file_name="../../../../../../modules/nrfx/drivers/src/nrfx_clock.c" />
          <file file_name="../../../../../../modules/nrfx/drivers/src/nrfx_gpiote.c" />
          <file file_name="../../../../../../modules/nrfx/drivers/src/nrfx_power.c" />
          <file file_name="../../../../../../modules/nrfx/drivers/src/prs/nrfx_prs.c" />
          <file file_name="../../../../../../modules/nrfx/drivers/src/nrfx_rtc.c" />
          <file file_name="../../../../../../modules/nrfx/drivers/src/nrfx_spi.c">
            <configuration Name="Debug" build_exclude_from_build="Yes" />
          </file>
          <file file_name="../../../../../../modules/nrfx/drivers/src/nrfx_spim.c">
            <configuration Name="Debug" build_exclude_from_build="Yes" />
          </file>
          <file file_name="../../../../../../modules/nrfx/drivers/src/nrfx_uart.c" />
          <file file_name="../../../../../../modules/nrfx/drivers/src/nrfx_uarte.c" />
        </folder>
        <folder Name="Board Support">
          <file file_name="../../../../../../components/libraries/bsp/bsp_btn_ble.c" />
        </folder>
        <folder Name="Application">
          <file file_name="./../../../main.c">
            <configuration Name="Debug" build_exclude_from_build="No" />
          </file>
          <file file_name="./../../../sdk_config.h" />
          <file file_name="../../../application/your_source.c" />
          <file file_name="../../../application/your_source.h" />
        <folder Name="nRF_Segger_RTT">
          <file file_name="../../../../../../external/segger_rtt/SEGGER_RTT.c" />
          <file file_name="../../../../../../external/segger_rtt/SEGGER_RTT_Syscalls_SES.c" />
          <file file_name="../../../../../../external/segger_rtt/SEGGER_RTT_printf.c" />
        </folder>
        <folder Name="nRF_BLE">
          <file file_name="../../../../../../components/ble/common/ble_advdata.c" />
          <file file_name="../../../../../../components/ble/ble_advertising/ble_advertising.c" />
          <file file_name="../../../../../../components/ble/common/ble_conn_params.c" />
          <file file_name="../../../../../../components/ble/common/ble_conn_state.c" />
          <file file_name="../../../../../../components/ble/ble_link_ctx_manager/ble_link_ctx_manager.c" />
          <file file_name="../../../../../../components/ble/common/ble_srv_common.c" />
          <file file_name="../../../../../../components/ble/nrf_ble_gatt/nrf_ble_gatt.c" />
          <file file_name="../../../../../../components/ble/nrf_ble_qwr/nrf_ble_qwr.c" />
        </folder>
        <folder Name="UTF8/UTF16 converter">
          <file file_name="../../../../../../external/utf_converter/utf.c" />
        </folder>
        <folder Name="nRF_BLE_Services">
          <file file_name="../../../../../../components/ble/ble_services/ble_nus/ble_nus.c" />
        </folder>
        <folder Name="nRF_SoftDevice">
          <file file_name="../../../../../../components/softdevice/common/nrf_sdh.c" />
          <file file_name="../../../../../../components/softdevice/common/nrf_sdh_ble.c" />
          <file file_name="../../../../../../components/softdevice/common/nrf_sdh_soc.c" />
        </folder>
        <configuration Name="Release" gcc_optimization_level="Level 2" />
        <configuration
          Name="Debug"
          link_use_linker_script_file="No"
          linker_section_placement_file="flash_placement.xml" />
      </project>
      <configuration
        Name="Release"
        c_preprocessor_definitions="NDEBUG"
        gcc_optimization_level="Optimize For Size" />
      <configuration
        Name="Debug"
        c_preprocessor_definitions="DEBUG; DEBUG_NRF"
        gcc_optimization_level="None" />
    </solution>
    

    Compare there SES files with the files generated from your project to get a good guide on what is missing. This SES project uses the internal GCC tool chain, not the external IAR tool chain. Using the external IAR tool chain is also an option when importing the project to SES, but that just further complicates the process. The IAR above is v8.32 if I recall.

  • It  is much faster just to based on an existing SES project (or create new one) then add require files to it.  Don't try to convert an Apple to an Orange or vice-versa. You'll get more trouble than what is worth.

  • Thanks for all the input!  your example files are particularly helpful, and your comment makes for a pretty good basic migration guide. I see some of the steps/checks that I was missing in my first attempt. I did have the same initial thought.. to take a standard project and directly compare differences in unaltered linker files, then compare with linker files from our existing IAR project and attempt the migration. Unfortunately upon going through the differences it quickly turned into a more complicated endeavor than I was hoping it would be.

    Ultimately we decided to stick with IAR for the time being as there seems to be too much risk in changing at our current stage of development. I will be coming back to this however if we have time later on when development is less active and transitioning is less risky.

  • Thanks for feedback, and good luck. As an aside, one of the most tedious parts in SES is to get the include files correct, and sometimes it's easier to just include all header file paths in the project and edit them later to remove those unneeded paths. I added this script to another response recently; it generates either absolute paths or relative paths., the latter in case your project is not in the Nordic tree. Some of the obvious include directories not required can easily be removed. Windows 10 I'm afraid.

    rem: Project Header File Directory Listing Utility
    rem:
    rem: Author - Hugh
    rem:
    rem: "find" can get lost, use specific path
    SET path=C:\Windows\System32\;%path%
    rem:
    rem: Setup output file and initialise it
    set OutputFile=HeaderIncludeList.txt
    echo Project root directory                 > %OutputFile%
    echo ======================                >> %OutputFile%
    cd                                         >> %OutputFile%
    echo -                                     >> %OutputFile%
    echo Header file Include Directories       >> %OutputFile%
    echo ===============================       >> %OutputFile%
    rem: Catalogue all header file directories
    rem:  - leave out "File(s)" total size
    rem:
    dir *.h /O N /S | find "Directory"         >> %OutputFile%
    rem:
    rem: Now edit to replace " Directory of D:\blahblah" with "D:\blahblah"
    @echo off
    rem: Begin localization of environment changes:
    setlocal
    rem: optionally use relative path or absolute path; first is relative second is absolute
    rem: set "Search= Directory of D:\Projects\Nordic\NRF5-SDK-15.2.0.xpi"
    rem: set "Replace=../../../../../../"
    set "Search= Directory of "
    set "Replace="
    set "TempFile=Temp-99.txt"
    (for /f "delims=" %%i in (%OutputFile%) do (
        set "line=%%i"
        setlocal ENABLEDELAYEDEXPANSION
        set "line=!line:%Search%=%Replace%!"
        echo(!line!
        endlocal)
    )>"%TempFile%"
    rem: Update output file
    if exist %OutputFile% del %OutputFile%
    if exist %TempFile% rename %TempFile% %OutputFile%

Related