Repository: incubator-mynewt-core Updated Branches: refs/heads/develop 0d659e876 -> d1f00e95a
MYNEWT-676 Reboot counter value inconsistent The value that gets logged to the reboot log is one greater than the actual reboot counter (the value retrieved via "newtmgr config reboot/reboot_cnt"). Project: http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/repo Commit: http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/commit/d1f00e95 Tree: http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/tree/d1f00e95 Diff: http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/diff/d1f00e95 Branch: refs/heads/develop Commit: d1f00e95a6d4187d4227782fd97b055473137a0e Parents: 0d659e8 Author: Christopher Collins <[email protected]> Authored: Fri Mar 17 12:04:40 2017 -0700 Committer: Christopher Collins <[email protected]> Committed: Fri Mar 17 12:20:11 2017 -0700 ---------------------------------------------------------------------- apps/sensors_test/src/main.c | 4 +- apps/slinky/src/main.c | 4 +- apps/slinky_oic/src/main.c | 4 +- apps/splitty/src/main.c | 4 +- apps/testbench/src/testbench.c | 4 +- apps/testbench/src/testbench.h | 2 +- sys/reboot/include/reboot/log_reboot.h | 1 + sys/reboot/src/log_reboot.c | 119 +++++++++++++--------------- 8 files changed, 67 insertions(+), 75 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/blob/d1f00e95/apps/sensors_test/src/main.c ---------------------------------------------------------------------- diff --git a/apps/sensors_test/src/main.c b/apps/sensors_test/src/main.c index 45d25a2..8ecbccd 100755 --- a/apps/sensors_test/src/main.c +++ b/apps/sensors_test/src/main.c @@ -46,7 +46,7 @@ #include <assert.h> #include <string.h> #include <flash_test/flash_test.h> -#include <reboot/log_reboot.h> +#include <reboot/reboot_start.h> #include <os/os_time.h> #include <id/id.h> @@ -425,7 +425,7 @@ main(int argc, char **argv) conf_load(); - log_reboot(hal_reset_cause()); + reboot_start(hal_reset_cause()); init_tasks(); http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/blob/d1f00e95/apps/slinky/src/main.c ---------------------------------------------------------------------- diff --git a/apps/slinky/src/main.c b/apps/slinky/src/main.c index 7ab13d6..2e74801 100755 --- a/apps/slinky/src/main.c +++ b/apps/slinky/src/main.c @@ -41,7 +41,7 @@ #include <assert.h> #include <string.h> #include <flash_test/flash_test.h> -#include <reboot/log_reboot.h> +#include <reboot/reboot_start.h> #include <os/os_time.h> #include <id/id.h> @@ -269,7 +269,7 @@ main(int argc, char **argv) conf_load(); - log_reboot(hal_reset_cause()); + reboot_start(hal_reset_cause()); init_tasks(); http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/blob/d1f00e95/apps/slinky_oic/src/main.c ---------------------------------------------------------------------- diff --git a/apps/slinky_oic/src/main.c b/apps/slinky_oic/src/main.c index 2f8df31..115fa33 100755 --- a/apps/slinky_oic/src/main.c +++ b/apps/slinky_oic/src/main.c @@ -37,7 +37,7 @@ #include <oic/oc_api.h> #include <assert.h> #include <string.h> -#include <reboot/log_reboot.h> +#include <reboot/reboot_start.h> #include <os/os_time.h> #ifdef ARCH_sim @@ -283,7 +283,7 @@ main(int argc, char **argv) conf_load(); - log_reboot(hal_reset_cause()); + reboot_start(hal_reset_cause()); #if MYNEWT_VAL(SPLIT_LOADER) { http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/blob/d1f00e95/apps/splitty/src/main.c ---------------------------------------------------------------------- diff --git a/apps/splitty/src/main.c b/apps/splitty/src/main.c index 267b4bc..6362187 100755 --- a/apps/splitty/src/main.c +++ b/apps/splitty/src/main.c @@ -34,7 +34,7 @@ #include <imgmgr/imgmgr.h> #include <assert.h> #include <string.h> -#include <reboot/log_reboot.h> +#include <reboot/reboot_start.h> #include <os/os_time.h> #include <id/id.h> @@ -196,7 +196,7 @@ main(int argc, char **argv) conf_load(); - log_reboot(hal_reset_cause()); + reboot_start(hal_reset_cause()); init_tasks(); http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/blob/d1f00e95/apps/testbench/src/testbench.c ---------------------------------------------------------------------- diff --git a/apps/testbench/src/testbench.c b/apps/testbench/src/testbench.c index b8fe034..5345d6f 100644 --- a/apps/testbench/src/testbench.c +++ b/apps/testbench/src/testbench.c @@ -43,7 +43,7 @@ #include <assert.h> #include <string.h> #include <json/json.h> -#include <reboot/log_reboot.h> +#include <reboot/reboot_start.h> #include <os/os_time.h> #include <id/id.h> #include <os/os_eventq.h> @@ -353,7 +353,7 @@ main(int argc, char **argv) cbmem_init(&cbmem, cbmem_buf, MAX_CBMEM_BUF); log_register("testlog", &testlog, &log_cbmem_handler, &cbmem, LOG_SYSLEVEL); - log_reboot(hal_reset_cause()); + reboot_start(hal_reset_cause()); conf_load(); http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/blob/d1f00e95/apps/testbench/src/testbench.h ---------------------------------------------------------------------- diff --git a/apps/testbench/src/testbench.h b/apps/testbench/src/testbench.h index a94ee1c..8b39310 100644 --- a/apps/testbench/src/testbench.h +++ b/apps/testbench/src/testbench.h @@ -46,7 +46,7 @@ #include <assert.h> #include <string.h> #include <json/json.h> -#include <reboot/log_reboot.h> +#include <reboot/reboot_start.h> #include <os/os_time.h> #include <id/id.h> http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/blob/d1f00e95/sys/reboot/include/reboot/log_reboot.h ---------------------------------------------------------------------- diff --git a/sys/reboot/include/reboot/log_reboot.h b/sys/reboot/include/reboot/log_reboot.h index e3ff093..fbc1f24 100644 --- a/sys/reboot/include/reboot/log_reboot.h +++ b/sys/reboot/include/reboot/log_reboot.h @@ -35,6 +35,7 @@ extern "C" { int reboot_init_handler(int log_store_type, uint8_t entries); int log_reboot(enum hal_reset_reason); +void reboot_start(enum hal_reset_reason reason); #ifdef __cplusplus } http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/blob/d1f00e95/sys/reboot/src/log_reboot.c ---------------------------------------------------------------------- diff --git a/sys/reboot/src/log_reboot.c b/sys/reboot/src/log_reboot.c index 9bfe04c..b795e1c 100644 --- a/sys/reboot/src/log_reboot.c +++ b/sys/reboot/src/log_reboot.c @@ -43,17 +43,17 @@ static uint16_t reboot_cnt; static uint16_t soft_reboot; static char reboot_cnt_str[12]; static char soft_reboot_str[12]; -static char *reboot_cnt_get(int argc, char **argv, char *buf, int max_len); -static int reboot_cnt_set(int argc, char **argv, char *val); -static int reboot_cnt_export(void (*export_func)(char *name, char *val), +static char *reboot_conf_get(int argc, char **argv, char *buf, int max_len); +static int reboot_conf_set(int argc, char **argv, char *val); +static int reboot_conf_export(void (*export_func)(char *name, char *val), enum conf_export_tgt tgt); struct conf_handler reboot_conf_handler = { .ch_name = "reboot", - .ch_get = reboot_cnt_get, - .ch_set = reboot_cnt_set, + .ch_get = reboot_conf_get, + .ch_set = reboot_conf_set, .ch_commit = NULL, - .ch_export = reboot_cnt_export + .ch_export = reboot_conf_export }; #if MYNEWT_VAL(REBOOT_LOG_FCB) @@ -127,6 +127,19 @@ reboot_init_handler(int log_store_type, uint8_t entries) return 0; } +static int +reboot_cnt_inc(void) +{ + char str[12]; + int rc; + + reboot_cnt++; + rc = conf_save_one("reboot/reboot_cnt", + conf_str_from_value(CONF_INT16, &reboot_cnt, + str, sizeof(str))); + return rc; +} + /** * Logs reboot with the specified reason * @param reason for reboot @@ -135,105 +148,83 @@ reboot_init_handler(int log_store_type, uint8_t entries) int log_reboot(enum hal_reset_reason reason) { - int rc; - char str[12] = {0}; struct image_version ver; - int16_t reboot_tmp_cnt; - rc = 0; #if MYNEWT_VAL(REBOOT_LOG_FCB) { const struct flash_area *ptr; if (flash_area_open(MYNEWT_VAL(REBOOT_LOG_FLASH_AREA), &ptr)) { - goto err; + return 0; } } #endif - reboot_tmp_cnt = reboot_cnt; - if (reason == HAL_RESET_REQUESTED) { - /* - * Save soft_reboot as 1 if user is requesting restart. - */ - reboot_tmp_cnt = 1; - conf_save_one("reboot/soft_reboot", - conf_str_from_value(CONF_INT16, &reboot_tmp_cnt, - str, sizeof(str))); - reboot_tmp_cnt = reboot_cnt + 1; + conf_save_one("reboot/soft_reboot", "1"); } else { conf_save_one("reboot/soft_reboot", "0"); - if (soft_reboot && reason == HAL_RESET_SOFT) { - /* No need to log as it's not a hard reboot */ - goto err; - } else { - reboot_cnt++; - reboot_tmp_cnt = reboot_cnt; - } } - /* - * Only care for this return code as it will tell whether the config is - * full, the caller of the function might not care about the return code - * Saving the reboot cnt - */ - rc = conf_save_one("reboot/reboot_cnt", - conf_str_from_value(CONF_INT16, &reboot_tmp_cnt, - str, sizeof(str))); + if (!soft_reboot || reason != HAL_RESET_SOFT) { + imgr_my_version(&ver); + + /* Log a reboot */ + LOG_CRITICAL(&reboot_log, LOG_MODULE_REBOOT, "rsn:%s, cnt:%u," + " img:%u.%u.%u.%u", REBOOT_REASON_STR(reason), + reboot_cnt, ver.iv_major, ver.iv_minor, + ver.iv_revision, (unsigned int)ver.iv_build_num); + } - imgr_my_version(&ver); + return 0; +} - /* Log a reboot */ - LOG_CRITICAL(&reboot_log, LOG_MODULE_REBOOT, "rsn:%s, cnt:%u," - " img:%u.%u.%u.%u", REBOOT_REASON_STR(reason), reboot_tmp_cnt, - ver.iv_major, ver.iv_minor, ver.iv_revision, - (unsigned int)ver.iv_build_num); -err: - return (rc); +/** + * Increments the reboot counter and writes an entry to the reboot log, if + * necessary. This function should be called from main() after config + * settings have been loaded via conf_load(). + * + * @param reason The cause of the reboot. + */ +void +reboot_start(enum hal_reset_reason reason) +{ + reboot_cnt_inc(); + log_reboot(reason); } static char * -reboot_cnt_get(int argc, char **argv, char *buf, int max_len) +reboot_conf_get(int argc, char **argv, char *buf, int max_len) { if (argc == 1) { if (!strcmp(argv[0], "reboot_cnt")) { - return reboot_cnt_str; + return conf_str_from_value(CONF_INT16, &reboot_cnt, + reboot_cnt_str, sizeof reboot_cnt_str); } else if (!strcmp(argv[0], "soft_reboot")) { - return soft_reboot_str; + return conf_str_from_value(CONF_INT16, &soft_reboot, + soft_reboot_str, + sizeof soft_reboot_str); } } return NULL; } static int -reboot_cnt_set(int argc, char **argv, char *val) +reboot_conf_set(int argc, char **argv, char *val) { - int rc; - if (argc == 1) { if (!strcmp(argv[0], "reboot_cnt")) { - rc = CONF_VALUE_SET(val, CONF_STRING, reboot_cnt_str); - if (rc) { - goto err; - } - - return CONF_VALUE_SET(reboot_cnt_str, CONF_INT16, reboot_cnt); + return CONF_VALUE_SET(val, CONF_INT16, reboot_cnt); } else if (!strcmp(argv[0], "soft_reboot")) { - rc = CONF_VALUE_SET(val, CONF_STRING, soft_reboot_str); - if (rc) { - goto err; - } - - return CONF_VALUE_SET(soft_reboot_str, CONF_INT16, soft_reboot); + return CONF_VALUE_SET(val, CONF_INT16, soft_reboot); } } -err: return OS_ENOENT; } static int -reboot_cnt_export(void (*func)(char *name, char *val), enum conf_export_tgt tgt) +reboot_conf_export(void (*func)(char *name, char *val), + enum conf_export_tgt tgt) { if (tgt == CONF_EXPORT_SHOW) { func("reboot/reboot_cnt", reboot_cnt_str);
