This post is older than 2 years and might not be relevant anymore
More Info: Consider searching for newer posts

Peer Manager in SDK 11

Hi,

I am working on an application that needs to use pairing/bonding. I am incorporating peer manager into the project. I have included in Makefile paths the following:

$(SDK_ROOT)/components/ble/peer_manager\
$(SDK_ROOT)/components/libraries/fstorage \
$(SDK_ROOT)/components/libraries/fds \
$(SDK_ROOT)/components/libraries/experimental_section_vars \

And the source files:

[sdk]/components/libraries/fds/fds.c
[sdk]/components/libraries/fstorage/fstorage.c
[sdk]/components/libraries/util/sdk_mapped_flags.c
[sdk]/components/ble/common/ble_conn_state.c

I have also included following headers in source file that calls peer manager functions:

#include "fstorage.h"
#include "fds.h"
#include "peer_manager.h"
#include "ble_conn_state.h"

I have initialised pm in the source file by calling all related functions. However I get a compile-time error saying:

Memory region         Used Size  Region Size  %age Used
           FLASH:       74528 B        98 KB     74.27%
..\medsens_periph_build/nrf51422_xxac_adv_setup_app.c.o: In function `ble_evt_dispatch':
C:\Users\shor_\Desktop\NXTSENS\embedded_software\medsens_periph/drivers/adv_setup_app.c:461: undefined reference to `pm_on_ble_evt'
..\medsens_periph_build/nrf51422_xxac_adv_setup_app.c.o: In function `peer_manager_event_handler':
             RAM:        8380 B      24448 B     34.28%
C:\Users\shor_\Desktop\NXTSENS\embedded_software\medsens_periph/drivers/adv_setup_app.c:72: undefined reference to `pm_peer_rank_highest'
C:\Users\shor_\Desktop\NXTSENS\embedded_software\medsens_periph/drivers/adv_setup_app.c:84: undefined reference to `pm_conn_secure'
C:\Users\shor_\Desktop\NXTSENS\embedded_software\medsens_periph/drivers/adv_setup_app.c:101: undefined reference to `pm_conn_sec_config_reply'
C:\Users\shor_\Desktop\NXTSENS\embedded_software\medsens_periph/drivers/adv_setup_app.c:142: undefined reference to `pm_local_database_has_changed'
..\medsens_periph_build/nrf51422_xxac_adv_setup_app.c.o: In function `peer_manager_init':
C:\Users\shor_\Desktop\NXTSENS\embedded_software\medsens_periph/drivers/adv_setup_app.c:156: undefined reference to `pm_init'
C:\Users\shor_\Desktop\NXTSENS\embedded_software\medsens_periph/drivers/adv_setup_app.c:179: undefined reference to `pm_sec_params_set'
C:\Users\shor_\Desktop\NXTSENS\embedded_software\medsens_periph/drivers/adv_setup_app.c:181: undefined reference to `pm_register'
collect2.exe: error: ld returned 1 exit status
make: *** [..\medsens_periph_build/nrf51422_xxac.out] Error 1
../drivers_common/Makefile.common.mk:122: recipe for target '..\medsens_periph_build/nrf51422_xxac.out' failed

It seems that the problem is that I missed a definition or a flag. Can you please suggest where to look to solve this problem ? I have included: CFLAGS += -DPEER_MANAGER_ENABLED=1 in Makefile. However, the problem persisted.

  • It seems it is complaining about the functions defined in the peer_manager.c source file. Have you not included this?

  • I included the header file "peer_manager.h" in file where I am calling pm functions, and the error shown above appeared. Do you mean I should include the source file peer_manager.c? I have also tried to include the source file in Makefile by adding:

    $(SDK_ROOT)/components/ble/peer_manager/peer_manager.c\

    However, im this case it produces more undefined reference errors, some are shown below:

    `C:\Users\shor_\Desktop\NXTSENS\embedded_software\medsens_periph/../nRF5_SDK_11.0.0_89a8197/components/ble/peer_manager/peer_manager.c:359: undefined reference to `im_conn_handle_get'
    ..\medsens_periph_build/nrf51422_xxac_peer_manager.c.o: In function `sm_evt_handler':
    C:\Users\shor_\Desktop\NXTSENS\embedded_software\medsens_periph/../nRF5_SDK_11.0.0_89a8197/components/ble/peer_manager/peer_manager.c:337: undefined reference to `im_peer_id_get_by_conn_handle'`
    
  • I turns out that you have to include all the source files in peer_manager folder in the Makefile SRC FILES when using gcc. I added the following source files:

    $(SDK_ROOT)/components/ble/peer_manager/peer_manager.c \
    $(SDK_ROOT)/components/ble/peer_manager/gatt_cache_manager.c \
    $(SDK_ROOT)/components/ble/peer_manager/gatts_cache_manager.c \
    $(SDK_ROOT)/components/ble/peer_manager/gattc_cache_manager.c \
    $(SDK_ROOT)/components/ble/peer_manager/id_manager.c \
    $(SDK_ROOT)/components/ble/peer_manager/peer_data.c \
    $(SDK_ROOT)/components/ble/peer_manager/peer_data_storage.c \
    $(SDK_ROOT)/components/ble/peer_manager/peer_database.c \
    $(SDK_ROOT)/components/ble/peer_manager/peer_id.c \
    $(SDK_ROOT)/components/ble/peer_manager/pm_buffer.c \
    $(SDK_ROOT)/components/ble/peer_manager/pm_mutex.c \
    $(SDK_ROOT)/components/ble/peer_manager/security_manager.c \
    $(SDK_ROOT)/components/ble/peer_manager/security_dispatcher.c \
    
Related