From fc3acdb2c1b6c656c6a815f04e036b1159a1dfc5 Mon Sep 17 00:00:00 2001 From: Mark Charlebois Date: Fri, 11 Sep 2015 12:41:00 -0700 Subject: [PATCH] cmake: param refactoring Use a struct to contain all the parameters so the ordering in memory is not machine dependent. Add number of parameters to the param struct. The struct actually allows direct accessing by the member name if desired. Signed-off-by: Mark Charlebois --- Tools/px_generate_params.py | 80 ++++++++++++++++++++--------- cmake/common/px4_base.cmake | 2 +- src/firmware/posix/CMakeLists.txt | 2 +- src/modules/systemlib/param/param.c | 8 ++- 4 files changed, 62 insertions(+), 30 deletions(-) diff --git a/Tools/px_generate_params.py b/Tools/px_generate_params.py index 08808bc5599..a12c72f5e08 100755 --- a/Tools/px_generate_params.py +++ b/Tools/px_generate_params.py @@ -2,52 +2,86 @@ import xml.etree.ElementTree as ET import os -if len(os.sys.argv) != 3: +if len(os.sys.argv) != 2: print "Error in %s" % os.sys.argv[0] - print "Usage: %s " + print "Usage: %s " raise SystemExit -fp = open(os.sys.argv[2], "w") +fp_header = open("px4_parameters.h", "w") +fp_src = open("px4_parameters.c", "w") tree = ET.parse(os.sys.argv[1]) root = tree.getroot() -body = """ + +# Generate the header file content +header = """ #include #include // DO NOT EDIT // This file is autogenerated from paramaters.xml +struct px4_parameters_t { """ - start_name = "" end_name = "" for group in root: if group.tag == "group": - body += "// %s\n" % group.attrib["name"] + header += """ + /***************************************************************** + * %s + ****************************************************************/""" % group.attrib["name"] for param in group: if not start_name: start_name = param.attrib["name"] end_name = param.attrib["name"] - body += """ -static const -__attribute__((used, section("__param"))) -struct param_info_s __param__%s = { - "%s", - PARAM_TYPE_%s, - .val.f = %s + header += """ + const struct param_info_s __param__%s;""" % param.attrib["name"] +header += """ + const unsigned int param_count; }; -""" % (param.attrib["name"], param.attrib["name"], param.attrib["type"], param.attrib["default"]) -body += """ -extern const -__attribute__((alias("__param__%s"))) -struct param_info_s __param_start; -extern const -__attribute__((alias("__param__%s"))) -struct param_info_s __param_end; -""" % (start_name, end_name) +extern const struct px4_parameters_t px4_parameters; +""" -fp.write(body) +# Generate the C file content +src = """ +#include + +// DO NOT EDIT +// This file is autogenerated from paramaters.xml + +static const +__attribute__((used, section("__param"))) +struct px4_parameters_t px4_parameters_impl = { +""" +i=0 +for group in root: + if group.tag == "group": + src += """ + /***************************************************************** + * %s + ****************************************************************/""" % group.attrib["name"] + for param in group: + if not start_name: + start_name = param.attrib["name"] + end_name = param.attrib["name"] + i+=1 + src += """ + { + "%s", + PARAM_TYPE_%s, + .val.f = %s + }, +""" % (param.attrib["name"], param.attrib["type"], param.attrib["default"]) +src += """ + %d +}; + +extern const struct px4_parameters_t px4_parameters __attribute__((alias("px4_parameters_impl"))); +""" % i + +fp_header.write(header) +fp_src.write(src) diff --git a/cmake/common/px4_base.cmake b/cmake/common/px4_base.cmake index c8362232588..b1cf5aa33ef 100644 --- a/cmake/common/px4_base.cmake +++ b/cmake/common/px4_base.cmake @@ -681,7 +681,7 @@ function(px4_generate_parameters) ) execute_process( - COMMAND ${PYTHON_EXECUTABLE} ${CMAKE_SOURCE_DIR}/Tools/px_generate_params.py ${CMAKE_BINARY_DIR}/parameters.xml ${CMAKE_BINARY_DIR}/parameters.c + COMMAND ${PYTHON_EXECUTABLE} ${CMAKE_SOURCE_DIR}/Tools/px_generate_params.py ${CMAKE_BINARY_DIR}/parameters.xml ) endfunction() diff --git a/src/firmware/posix/CMakeLists.txt b/src/firmware/posix/CMakeLists.txt index 657d8d45ad6..bc557ce6f70 100644 --- a/src/firmware/posix/CMakeLists.txt +++ b/src/firmware/posix/CMakeLists.txt @@ -9,7 +9,7 @@ px4_generate_parameters() add_executable(mainapp ${CMAKE_SOURCE_DIR}/src/platforms/posix/main.cpp - ${CMAKE_BINARY_DIR}/parameters.c + ${CMAKE_BINARY_DIR}/px4_parameters.c apps.h ) diff --git a/src/modules/systemlib/param/param.c b/src/modules/systemlib/param/param.c index 7af26cd30b5..4efe7bea0d2 100644 --- a/src/modules/systemlib/param/param.c +++ b/src/modules/systemlib/param/param.c @@ -63,6 +63,7 @@ #include "uORB/uORB.h" #include "uORB/topics/parameter_update.h" +#include "px4_parameters.h" #if 0 # define debug(fmt, args...) do { warnx(fmt, ##args); } while(0) @@ -86,14 +87,11 @@ extern struct param_info_s param_array[]; extern struct param_info_s *param_info_base; extern struct param_info_s *param_info_limit; #else -extern const struct param_info_s __param_start, __param_end; - // FIXME - start and end are reversed -static const struct param_info_s *param_info_base = &__param_end; -static const struct param_info_s *param_info_limit = &__param_start; +static const struct param_info_s *param_info_base = (const struct param_info_s *)&px4_parameters; #endif -#define param_info_count ((unsigned)(param_info_limit - param_info_base)) +#define param_info_count px4_parameters.param_count /** * Storage for modified parameters.