I want to use nvs in nrf cloud. A conflict is found between the nrf_cloud library and the nvs library. The nrf_cloud library will cause the nvs library to be unavailable, and an error will be reported: flash_nrf: invalid address: 0x00100ff8:8.
I added nvs library to cloud_client to reproduce this problem. This is my prj.conf:
Added
CONFIG_NVS=y
CONFIG_NVS_LOG_LEVEL_DBG=y
CONFIG_MPU_ALLOW_FLASH_WRITE=y
# # Copyright (c) 2020 Nordic Semiconductor ASA # # SPDX-License-Identifier: LicenseRef-Nordic-5-Clause # # General config CONFIG_NEWLIB_LIBC=y CONFIG_NEWLIB_LIBC_FLOAT_PRINTF=y CONFIG_RESET_ON_FATAL_ERROR=n CONFIG_NCS_SAMPLES_DEFAULTS=y # Log level # For more verbose and detailed log output, set the log level to # CONFIG_CLOUD_CLIENT_LOG_LEVEL_DBG=y instead. CONFIG_CLOUD_CLIENT_LOG_LEVEL_INF=y # Network CONFIG_NETWORKING=y CONFIG_NET_NATIVE=n CONFIG_NET_SOCKETS=y CONFIG_NET_SOCKETS_OFFLOAD=y # LTE link control CONFIG_LTE_LINK_CONTROL=y #CONFIG_LTE_NETWORK_MODE_LTE_M=y CONFIG_LTE_AUTO_INIT_AND_CONNECT=n CONFIG_LTE_NETWORK_MODE_NBIOT_GPS=y CONFIG_LTE_LEGACY_PCO_MODE=y # Modem library CONFIG_NRF_MODEM_LIB=y # DK CONFIG_DK_LIBRARY=y # AT commands interface CONFIG_UART_INTERRUPT_DRIVEN=y CONFIG_AT_HOST_LIBRARY=y # Generic cloud API CONFIG_CLOUD_API=y # Selected cloud backend CONFIG_CLOUD_BACKEND="NRF_CLOUD" # nRF Cloud CONFIG_NRF_CLOUD=y CONFIG_NRF_CLOUD_CONNECTION_POLL_THREAD=y # AWS IoT # CONFIG_AWS_IOT=y # CONFIG_AWS_IOT_CLIENT_ID_STATIC="my-thing" # CONFIG_AWS_IOT_BROKER_HOST_NAME="example.endpoint.com" # CONFIG_AWS_IOT_SEC_TAG=201 # CONFIG_AWS_IOT_TOPIC_UPDATE_DELTA_SUBSCRIBE=y # Azure IoT Hub # CONFIG_AZURE_IOT_HUB=y # CONFIG_AZURE_IOT_HUB_DEVICE_ID="my-device" # CONFIG_AZURE_IOT_HUB_HOSTNAME="example.endpoint.com" # CONFIG_AZURE_IOT_HUB_SEC_TAG=10 # MQTT CONFIG_MQTT_KEEPALIVE=1200 # Heap and stacks # Extended memory heap size needed for encoding nRF Cloud messages to JSON CONFIG_HEAP_MEM_POOL_SIZE=8192 CONFIG_MAIN_STACK_SIZE=4096 CONFIG_SYSTEM_WORKQUEUE_STACK_SIZE=2048 # Settings, used by nRF Cloud library. CONFIG_SETTINGS=y CONFIG_SETTINGS_FCB=y CONFIG_FCB=y # Flash storage, used by settings. CONFIG_FLASH=y CONFIG_FLASH_PAGE_LAYOUT=y CONFIG_FLASH_MAP=y CONFIG_MPU_ALLOW_FLASH_WRITE=y # NVS CONFIG_NVS=y CONFIG_NVS_LOG_LEVEL_DBG=y CONFIG_MPU_ALLOW_FLASH_WRITE=y
main.c:
static struct nvs_fs fs; struct flash_pages_info info; #define GOKE_BINARY_ID 7 int nvs_read_binary_state(bool *flag){ int rc; rc = nvs_read(&fs, GOKE_BINARY_ID, flag, 1); if (rc > 0) { /* item was found, show it */ LOG_INF("Id: %d, binary_state: %d\n", GOKE_BINARY_ID, *flag); } else {/* item was not found, add it */ LOG_INF("No binary_state found"); return -1; } return 0; } int nvs_write_binary_state(bool *flag){ int rc; rc = nvs_write(&fs, GOKE_BINARY_ID, flag, 1); if(rc < 0){ LOG_ERR("NVS write binary_state error!"); return rc; } return 0; } int nvs_setup(void) { int rc; fs.offset = FLASH_AREA_OFFSET(storage);; rc = flash_get_page_info_by_offs( device_get_binding(DT_CHOSEN_ZEPHYR_FLASH_CONTROLLER_LABEL), fs.offset, &info); if (rc) { LOG_ERR("Unable to get page info"); return rc; } fs.sector_size = info.size; fs.sector_count = 3U; rc = nvs_init(&fs, DT_CHOSEN_ZEPHYR_FLASH_CONTROLLER_LABEL); if (rc) { LOG_ERR("Flash Init failed"); return rc; } return 0; } void main(void) { int err; bool flag; LOG_INF("Cloud client has started"); if(nvs_setup()){ LOG_ERR("Init nvs error!"); } if(nvs_read_binary_state(&flag)){ LOG_ERR("read nvs error!"); } if(nvs_write_binary_state(&flag)){ LOG_ERR("write nvs error!"); } cloud_backend = cloud_get_binding(CONFIG_CLOUD_BACKEND); __ASSERT(cloud_backend != NULL, "%s backend not found", CONFIG_CLOUD_BACKEND); err = cloud_init(cloud_backend, cloud_event_handler); if (err) { LOG_ERR("Cloud backend could not be initialized, error: %d", err); } work_init(); modem_configure(); #if defined(CONFIG_CLOUD_PUBLICATION_BUTTON_PRESS) err = dk_buttons_init(button_handler); if (err) { LOG_ERR("dk_buttons_init, error: %d", err); } #endif LOG_INF("Connecting to LTE network, this may take several minutes..."); k_sem_take(<e_connected, K_FOREVER); LOG_INF("Connected to LTE network"); LOG_INF("Connecting to cloud"); k_delayed_work_submit(&connect_work, K_NO_WAIT); }
log:
SPM: NS image at 0xc000 SPM: NS MSP at 0x2001d5a8 SPM: NS reset vector at 0x12e49 SPM: prepare to jump to Non-Secure image. [15:44:22.555]收←◆* [15:44:22.579]收←◆** Booting Zephyr OS build v2.4.99-ncs1 *** I: Cloud client has started E: invalid address: 0x00100ff8:8 I: 3 Sectors of 4096 bytes I: alloc wra: 0, ff0 I: data wra: 0, 8 E: invalid address 0x00100ff8:8 I: No binary_state found E: read nvs error! E: invalid address: 0x00100ff8:8 E: NVS write binary_state error! E: write nvs error! I: Using legacy LTE PCO mode... [15:44:22.653]收←◆I: Connecting to LTE network, this may take several minutes...
demo: