This is function definition:
static uint32_t battery_level_char_add(ble_bas_t * p_bas, const ble_bas_init_t * p_bas_init)
This is declaration of the automatic variable inside this function:
uint8_t initial_battery_level; // this var is in stack of the function
This its initialisation:
initial_battery_level = p_bas_init->initial_batt_level;
This is how it used:
attr_char_value.p_value = &initial_battery_level; // attention: pointer to stack!!!
err_code = sd_ble_gatts_characteristic_add(p_bas->service_handle, &char_md,
&attr_char_value,
&p_bas->battery_level_handles);
Looks very suspicious isn't it?! I don't now what sd_ble_gatts_characteristic_add() does exactly but my assumption is that it will store internaly this pointer to stack, which will become junk as soon as function battery_level_char_add() is completed. Shouldn't it be static uint8_t initial_battery_level ?
Thanks.