mirror of
https://github.com/iNavFlight/inav.git
synced 2025-07-13 11:29:56 +03:00
* Initial commit for the CLI settings compiler Not very useful for now, only generates settings.c in the same way the settings were manually written in cli.c * Move all settings to a YAML file This will eventually let us compile and pack the settings saving a lot of memory. For now, the code compiles but it doesn't work since it uses a byte to index into the word array which has more than 256 entries. * Use varint encoding for cli name word indexing This makes the CLI work again. * Make clivalue_name_* funcs return bool Makes more sense than returning uint8_t, even when the compiler will probably generate exactly the same assembly in both cases. * Fix invalid field name Missing a closing ] * Initial attempt at generating the settings files at build time Optimize the generator to call into the compiler only once, so we can afford to call it for each build and, eventually, generate build-optimized settings. * Fix build error due to generated files Due to make's expansion rules, the generated implementation file wasn't correctly compiled if the build was started when the generated files didn't exist. Althogh there's probably a better solution, this should work for now. * Generate a per-build settings_generated.{h,c} This allows us to save a bit more space, since this way the words array doesn't include words which are not used by the build. * Remove pgn_t field from cliValueConfig_t Use a couple of arrays to find the pgn_t for a setting from its offset in the table. This saves another 384 bytes on NAZE. * Use only a byte for the field offset in clivalue_t when possible While compiling the settings, determine if any offset requires a number bigger than 255. If that's not the case, use a uint8_t rather than an uint16_t for storing the field offset. * Add missing header to PG_MODE_ACTIVATION_OPERATOR_CONFIG group * Fix unbalanced #endif Introduced when deleting the hardcoded settings from cli.c * Don't ignore the return value from g.CanUseByteOffsetoff() CLIVALUE_USE_BYTE_OFFSETOF was always defined regardless of the maximum offsetof() value found in the settings. * clivalue_name_*() functions now take a buffer Requires only CLIVALUE_MAX_NAME_LENGTH bytes in the stack rather than 2*CLIVALUE_MAX_NAME_LENGTH, since those functions were called from functions which already had a buffer for the name allocated but had to allocate their own. * Remove unneeded clivalue_get_name() call clivalue_name_exact_match() will already fill the buffer with the value name. * Fix off-by-one error in the settings generator The generated C code wasn't allocating enough space for the '\0' terminator for setting names * Fix off-by-one error in the name decoder CLIVALUE_ENCODED_NAME_MAX_BYTES represents the maximum number of bytes in an encoded name, not the maximum word index. * Add missing headers to PG_STATS_CONFIG group * Make sure the settings are always up to date * Initial attempt at encoding constants used for min/max settings Pretty naive approach for now. Saves ~400 bytes on F1 targets. * Move tool for generating settings to tools/ Also, rename it from settings_gen to just settings. Delete the .gitignore in src/main/fc and just add all ignored files in the root .gitignore, since that speeds up git. * Only print setting stats when the env var V=1 This way we get quiet output unless the Makefile has been invoked with verbose output. * Make setting generation rules compatible with gmake 4 Rules were working fine on gmake 3, but failing with gmake 4. These new rules should work with both of them. * Fix constant value detection with GCC 7.1 GCC 6.3 emits errors with <42type-suffix> while GCC 7.1 emits the errors with only <42> * Format uint8_t arrays a bit better Don't add a comma after the last element * Sort words and values determiniscally This will help while checking the upcoming Ruby implementation of the generator against the previous one using Go. * Add missing headers for some groups in settings.yaml * Replace the Go settings generator with a Ruby implementation This makes it easier to install the required dependencies to build INAV, since Ruby is installed by default on macOS and installing it in Linux should be easier than installing Go and a 3rd party package (for YAML parsing). * Don't hardcode the value type for each parameter group Instead, add a value_type field to each group with a default value of MASTER_VALUE * Simplify code for adding custom methods to StringIO * Only resolve types for enabled fields This fixes issues with some types which are only defined if the feature for them is enabled (e.g. STATS or NAV). * Implement print_stats() in the Ruby settings generator * Rename constant in generated settings CLIVALUE_ENCODED_NAME_USES_DIRECT_INDEXING => CLIVALUE_ENCODED_NAME_USES_BYTE_INDEXING * Remove old settings generator binary from .gitignore * Enable DEBUG while generating settings Travis build is failing, this should help determine why * Add $TOOLCHAINPATH to $PATH on Travis builds * Disable DEBUG in settings.rb Travis build is now failing because the log is too big * Fix warning when running settings.rb on RB >= 2.4 * Don't print message when generating settings with V=0 * Use a relative path for the temporary dir Absolute paths cause issues calling out to g++ on Windows * Add INAV license header to settings.rb * Add missing header to settings.c Required since last rebase, it was compiling fine previously * Remove unneeded extern variable decl from settings.c Not needed anymore since we're now including settings_generated.c directly in settings.c to simplify the Makefile. * Use obj/tmp rather than just tmp for temporary files * Update devdocs to mention Ruby installation * Update Dockerfile and Vagrantfile to install Ruby Required by the settings generator Fixes #1997
3.7 KiB
3.7 KiB
Short Version
Install the latest Eclipse Standard/SDK and install the C/C++ developments Tools plugins
Import the project using the wizard Existing Code as Makefile Project
Adjust your build option if necessary
Make sure you have a valid ARM toolchain and Ruby in the path
Long version
- First you need an ARM toolchain. Good choices are GCC ARM Embedded (https://launchpad.net/gcc-arm-embedded) or Yagarto (http://www.yagarto.de).
- Install Ruby (see the document for your operating system).
- Now download Eclipse and unpack it somewhere. At the time of writing Eclipse 4.2 was the latest stable version.
- To work with ARM projects in Eclipse you need a few plugins:
- Eclipse C Development Tools (CDT) (available via Help > Install new Software).
- Zylin Embedded CDT Plugin (http://opensource.zylin.com/embeddedcdt.html).
- GNU ARM Eclipse (http://sourceforge.net/projects/gnuarmeclipse/).
- If you want to hook up an SWD debugger you also need the GDB Hardware Debugging plugin (Also available via Install new Software).
- Now clone the project to your harddrive.
- Create a new C project in Eclipse and choose ARM Cross Target Application and your ARM toolchain.
- Import the Git project into the C project in Eclipse via File > Import > General > File System.
- Activate Git via Project > Team > Share Project.
- Switch to the development branch in Eclipse (Project > Team > Switch To > development).
- The next thing you need to do is adjust the project configuration. There is a Makefile included that works but you might want to use GNU ARM Eclipse's automatic Makefile generation. Open the Project configuration and go to C/C++ Build > Settings
- Under Target Processor choose "cortex-m3"
- Under ARM Yagarto [Windows/Mac OS] Linker > General (or whatever toolchain you chose)
- Browse to the Script file stm32_flash.ld
- Uncheck "Do not use standard start files"
- Check "Remove unused sections"
- Under ARM Yagarto [Windows/Mac OS] Linker > Libraries
- Add "m" for the math library
- Under ARM Yagarto [Windows/Mac OS] Compiler > Preprocessor add the following 2 items to "Defined Symbols":
- STM32F10X_MD
- USE_STDPERIPH_DRIVER
- Under ARM Yagarto [Windows/Mac OS] Compiler > Directories add the following 3 items
- ${workspace_loc:/${ProjName}/lib/CMSIS/CM3/CoreSupport}
- ${workspace_loc:/${ProjName}/lib/CMSIS/CM3/DeviceSupport/ST/STM32F10x}
- ${workspace_loc:/${ProjName}/lib/STM32F10x_StdPeriph_Driver/inc}
- Under ARM Yagarto [Windows/Mac OS] Compiler > Miscellaneous add the following item to "Other flags":
- -fomit-frame-pointer
- The code in the support directory is for uploading firmware to the board and is meant for your host machine. Hence, it must not be included in the build process. Just right-click on it to open its properties and choose "Exclude from build" under C/C++ Build > Settings
- The last thing you need to do is adding your toolchain to the PATH environment variable.
- Go to Project > Properties > C/C++ Build > Environment, add a variable named "PATH" and fill in the full path of your toolchain's binaries.
- Make sure "Append variables to native environment" is selected.
- Try to build the project via Project > Build Project.
- Note: If you're getting "...could not be resolved" errors for data types like int32_t etc. try to disable and re-enable the Indexer under Project > Properties > C/C++ General > Indexer.