diff --git a/.mbedignore b/.mbedignore index ef3cf8a..a4c7376 100644 --- a/.mbedignore +++ b/.mbedignore @@ -14,4 +14,5 @@ mbed-os/features/FEATURE_BOOTLOADER/* mbed-os/features/frameworks/mbed-client-cli/* mbed-os/features/frameworks/COMPONENT_FPGA_CI_TEST_SHIELD/* mbed-os/platform/randlib/* -mbed-os/storage/kvstore/* \ No newline at end of file +mbed-os/storage/kvstore/* +mbed-os-bootloader/* \ No newline at end of file diff --git a/mbed-bootloader-advembsof.bin b/mbed-bootloader-advembsof.bin new file mode 100644 index 0000000..5a505d0 Binary files /dev/null and b/mbed-bootloader-advembsof.bin differ diff --git a/mbed-os-bootloader/.clang-format b/mbed-os-bootloader/.clang-format new file mode 100644 index 0000000..3e33698 --- /dev/null +++ b/mbed-os-bootloader/.clang-format @@ -0,0 +1,12 @@ +--- +BasedOnStyle: Google +IndentWidth: 4 +--- +Language: Cpp +ColumnLimit: 90 +AlignConsecutiveAssignments: true +DerivePointerAlignment: false +PointerAlignment: Left +BinPackArguments: false +BinPackParameters: false +IndentAccessModifiers: false \ No newline at end of file diff --git a/mbed-os-bootloader/.gitignore b/mbed-os-bootloader/.gitignore new file mode 100644 index 0000000..8641c54 --- /dev/null +++ b/mbed-os-bootloader/.gitignore @@ -0,0 +1,8 @@ +.build +.mbed +projectfiles +*.py* +mbed-os +BUILD +!BUILD/DISCO_H747I/GCC_ARM/mbed-os-bootloader.bin + diff --git a/mbed-os-bootloader/.mbedignore b/mbed-os-bootloader/.mbedignore new file mode 100644 index 0000000..c45492f --- /dev/null +++ b/mbed-os-bootloader/.mbedignore @@ -0,0 +1,17 @@ +mbed-os/drivers/device_key/* +mbed-os/drivers/source/usb/USBMSD.cpp +mbed-os/drivers/source/SFDP.cpp +mbed-os/connectivity/cellular/* +mbed-os/connectivity/drivers/* +mbed-os/connectivity/FEATURE_BLE/* +mbed-os/connectivity/libraries/* +mbed-os/connectivity/lorawan/* +mbed-os/connectivity/lwipstack/* +mbed-os/connectivity/nanostack/* +mbed-os/connectivity/netsocket/* +mbed-os/connectivity/nfc/* +mbed-os/features/FEATURE_BOOTLOADER/* +mbed-os/features/frameworks/mbed-client-cli/* +mbed-os/features/frameworks/COMPONENT_FPGA_CI_TEST_SHIELD/* +mbed-os/platform/randlib/* +mbed-os/storage/kvstore/* diff --git a/mbed-os-bootloader/.pre-commit-config.yaml b/mbed-os-bootloader/.pre-commit-config.yaml new file mode 100644 index 0000000..c6018cc --- /dev/null +++ b/mbed-os-bootloader/.pre-commit-config.yaml @@ -0,0 +1,26 @@ +files: ^main.cpp +repos: + - repo: https://github.com/pre-commit/pre-commit-hooks + rev: v4.3.0 + hooks: + - id: check-yaml + args: [--allow-multiple-documents] + - id: end-of-file-fixer + - id: trailing-whitespace + - repo: https://github.com/pre-commit/mirrors-clang-format + rev: "v14.0.6" + hooks: + - id: clang-format + - repo: https://github.com/cpplint/cpplint + rev: "1.6.1" + hooks: + - id: cpplint + name: cpplint + entry: cpplint --linelength=90 --filter=-build/include_subdir,-whitespace/indent,-build/namespaces,-build/c++11 + - repo: local + hooks: + - id: cppcheck + name: cppcheck + require_serial: true + entry: cppcheck --enable=all --suppress=missingInclude --inline-suppr -i mbed-os --std=c++14 --error-exitcode=1 + language: system diff --git a/mbed-os-bootloader/BUILD/DISCO_H747I/GCC_ARM/mbed-os-bootloader.bin b/mbed-os-bootloader/BUILD/DISCO_H747I/GCC_ARM/mbed-os-bootloader.bin new file mode 100644 index 0000000..f1e18f4 Binary files /dev/null and b/mbed-os-bootloader/BUILD/DISCO_H747I/GCC_ARM/mbed-os-bootloader.bin differ diff --git a/mbed-os-bootloader/main.cpp b/mbed-os-bootloader/main.cpp new file mode 100644 index 0000000..f401e67 --- /dev/null +++ b/mbed-os-bootloader/main.cpp @@ -0,0 +1,35 @@ +#include "mbed.h" + +#include "mbed_trace.h" +#if MBED_CONF_MBED_TRACE_ENABLE +#define TRACE_GROUP "bootloader" +#endif // MBED_CONF_MBED_TRACE_ENABLE + +#if MBED_CONF_MBED_TRACE_ENABLE +static UnbufferedSerial g_uart(CONSOLE_TX, CONSOLE_RX); + +// Function that directly outputs to an unbuffered serial port in blocking mode. +static void boot_debug(const char *s) { + size_t len = strlen(s); + g_uart.write(s, len); + g_uart.write("\r\n", 2); +} +#endif + +int main() { +#if MBED_CONF_MBED_TRACE_ENABLE + mbed_trace_init(); + mbed_trace_print_function_set(boot_debug); +#endif // MBED_CONF_MBED_TRACE_ENABLE + + tr_debug("BikeComputer bootloader\r\n"); + + // at this stage we directly branch to the main application + void *sp = *((void **) POST_APPLICATION_ADDR + 0); // NOLINT(readability/casting) + void *pc = *((void **) POST_APPLICATION_ADDR + 1); // NOLINT(readability/casting) + tr_debug("Starting application at address 0x%08x (sp 0x%08x, pc 0x%08x)\r\n", POST_APPLICATION_ADDR, (uint32_t) sp, (uint32_t) pc); + + mbed_start_application(POST_APPLICATION_ADDR); + + return 0; +} \ No newline at end of file diff --git a/mbed-os-bootloader/mbed-os.lib b/mbed-os-bootloader/mbed-os.lib new file mode 100644 index 0000000..91bb263 --- /dev/null +++ b/mbed-os-bootloader/mbed-os.lib @@ -0,0 +1 @@ +https://github.com/ARMmbed/mbed-os.git#17dc3dc2e6e2817a8bd3df62f38583319f0e4fed \ No newline at end of file diff --git a/mbed-os-bootloader/mbed_app.json b/mbed-os-bootloader/mbed_app.json new file mode 100644 index 0000000..9dd117b --- /dev/null +++ b/mbed-os-bootloader/mbed_app.json @@ -0,0 +1,28 @@ +{ + "macros": [ + "MBED_CONF_MBED_TRACE_FEA_IPV6=0" + ], + "config": { + "main-stack-size": { + "value": 4096 + } + }, + "target_overrides": { + "*": { + "mbed-trace.enable": false, + "platform.stdio-convert-newlines": true, + "platform.stdio-baud-rate": 115200, + "platform.default-serial-baud-rate": 115200, + "platform.stdio-buffered-serial": true, + "platform.all-stats-enabled": true, + "target.printf_lib":"minimal-printf", + "platform.minimal-printf-enable-floating-point": true, + "platform.minimal-printf-set-floating-point-max-decimals": 2 + }, + "DISCO_H747I": { + "target.restrict_size": "0x20000", + "mbed-trace.enable": true, + "mbed-trace.max-level": "TRACE_LEVEL_DEBUG" + } + } + } \ No newline at end of file diff --git a/mbed_app.json b/mbed_app.json index 2e6efc6..5fb202c 100644 --- a/mbed_app.json +++ b/mbed_app.json @@ -16,10 +16,13 @@ "target.printf_lib": "minimal-printf", "platform.minimal-printf-enable-floating-point": true, "platform.minimal-printf-set-floating-point-max-decimals": 2 - }, - "DISCO_H747I": { - "mbed-trace.enable": true, - "mbed-trace.max-level": "TRACE_LEVEL_DEBUG" + } + "DISCO_H747I": { + "mbed-trace.enable": true, + "mbed-trace.max-level": "TRACE_LEVEL_DEBUG", + "target.bootloader_img":"./mbed-os-bootloader/BUILD/DISCO_H747I/GCC_ARM/mbed-os-bootloader.bin", + "target.app_offset": "0x20000" + } } } } diff --git a/static_scheduling/bike_system.cpp b/static_scheduling/bike_system.cpp index 1e4dac4..e36ac60 100644 --- a/static_scheduling/bike_system.cpp +++ b/static_scheduling/bike_system.cpp @@ -61,7 +61,10 @@ BikeSystem::BikeSystem() : _gearDevice(_timer), _pedalDevice(_timer), _resetDevice(_timer), + _displayDevice(), _speedometer(_timer), + _sensorDevice(), + _taskLogger(), _cpuLogger(_timer) {} void BikeSystem::start() { @@ -205,29 +208,18 @@ void BikeSystem::speedDistanceTask() { _timer, advembsof::TaskLogger::kSpeedTaskIndex, taskStartTime); } -void BikeSystem::temperatureTask() { +void BikeSystem::displayTask1() { auto taskStartTime = _timer.elapsed_time(); - tr_warn("Tick1 %" PRIu64, _timer.elapsed_time().count()); - - // no need to protect access to data members (single threaded) - _currentTemperature = _sensorDevice.readTemperature(); - - tr_warn("Tick2 %" PRIu64, _timer.elapsed_time().count()); + _displayDevice.displayGear(_currentGear); + _displayDevice.displaySpeed(_currentSpeed); + _displayDevice.displayDistance(_traveledDistance); ThisThread::sleep_for(std::chrono::duration_cast( - kTemperatureTaskComputationTime - (_timer.elapsed_time() - taskStartTime))); - - // simulate task computation by waiting for the required task computation time - - // std::chrono::microseconds elapsedTime = - // std::chrono::microseconds::zero(); while (elapsedTime < - // kTemperatureTaskComputationTime) { - // elapsedTime = _timer.elapsed_time() - taskStartTime; - // } + kDisplayTask1ComputationTime - (_timer.elapsed_time() - taskStartTime))); _taskLogger.logPeriodAndExecutionTime( - _timer, advembsof::TaskLogger::kTemperatureTaskIndex, taskStartTime); + _timer, advembsof::TaskLogger::kDisplayTask1Index, taskStartTime); } void BikeSystem::resetTask() { @@ -243,27 +235,17 @@ void BikeSystem::resetTask() { _taskLogger.logPeriodAndExecutionTime( _timer, advembsof::TaskLogger::kResetTaskIndex, taskStartTime); } - -void BikeSystem::displayTask1() { +void BikeSystem::temperatureTask() { auto taskStartTime = _timer.elapsed_time(); - _displayDevice.displayGear(_currentGear); - _displayDevice.displaySpeed(_currentSpeed); - _displayDevice.displayDistance(_traveledDistance); + // no need to protect access to data members (single threaded) + _currentTemperature = _sensorDevice.readTemperature(); ThisThread::sleep_for(std::chrono::duration_cast( - kDisplayTask1ComputationTime - (_timer.elapsed_time() - taskStartTime))); - - // simulate task computation by waiting for the required task computation time - - // std::chrono::microseconds elapsedTime = - // std::chrono::microseconds::zero(); while (elapsedTime < - // kDisplayTask1ComputationTime) { - // elapsedTime = _timer.elapsed_time() - taskStartTime; - // } + kTemperatureTaskComputationTime - (_timer.elapsed_time() - taskStartTime))); _taskLogger.logPeriodAndExecutionTime( - _timer, advembsof::TaskLogger::kDisplayTask1Index, taskStartTime); + _timer, advembsof::TaskLogger::kTemperatureTaskIndex, taskStartTime); } void BikeSystem::displayTask2() { @@ -274,13 +256,6 @@ void BikeSystem::displayTask2() { ThisThread::sleep_for(std::chrono::duration_cast( kDisplayTask2ComputationTime - (_timer.elapsed_time() - taskStartTime))); - // simulate task computation by waiting for the required task computation time - - // std::chrono::microseconds elapsedTime = - // std::chrono::microseconds::zero(); while (elapsedTime < - // kDisplayTask2ComputationTime) { - // elapsedTime = _timer.elapsed_time() - taskStartTime; - // } _taskLogger.logPeriodAndExecutionTime( _timer, advembsof::TaskLogger::kDisplayTask2Index, taskStartTime); } diff --git a/static_scheduling/pedal_device.cpp b/static_scheduling/pedal_device.cpp index e7f67ff..b81c4bd 100644 --- a/static_scheduling/pedal_device.cpp +++ b/static_scheduling/pedal_device.cpp @@ -37,7 +37,7 @@ namespace static_scheduling { static constexpr std::chrono::microseconds kTaskRunTime = 200000us; -PedalDevice::PedalDevice(Timer& timer) : _timer(timer) {} +PedalDevice::PedalDevice(Timer& timer) : _timer(timer), _pedalRotationTime(0) {} std::chrono::milliseconds PedalDevice::getCurrentRotationTime() { std::chrono::microseconds initialTime = _timer.elapsed_time(); diff --git a/static_scheduling/pedal_device.hpp b/static_scheduling/pedal_device.hpp index ae1caeb..5010706 100644 --- a/static_scheduling/pedal_device.hpp +++ b/static_scheduling/pedal_device.hpp @@ -46,9 +46,9 @@ class PedalDevice { void decreaseRotationSpeed(); // data members + Timer& _timer; std::chrono::milliseconds _pedalRotationTime = bike_computer::kInitialPedalRotationTime; - Timer& _timer; }; } // namespace static_scheduling diff --git a/static_scheduling/reset_device.cpp b/static_scheduling/reset_device.cpp index b94e83e..76bb180 100644 --- a/static_scheduling/reset_device.cpp +++ b/static_scheduling/reset_device.cpp @@ -43,7 +43,8 @@ namespace static_scheduling { static constexpr std::chrono::microseconds kTaskRunTime = 100000us; -ResetDevice::ResetDevice(Timer& timer) : _timer(timer), _resetButton(PUSH_BUTTON) { +ResetDevice::ResetDevice(Timer& timer) + : _resetButton(PUSH_BUTTON), _timer(timer), _pressTime(0) { _resetButton.rise(callback(this, &ResetDevice::onRise)); } diff --git a/static_scheduling_with_event/bike_system.cpp b/static_scheduling_with_event/bike_system.cpp index b4696cd..e9416d5 100644 --- a/static_scheduling_with_event/bike_system.cpp +++ b/static_scheduling_with_event/bike_system.cpp @@ -62,12 +62,15 @@ static constexpr std::chrono::milliseconds kDisplayTask2ComputationTime = 100ms; static constexpr std::chrono::milliseconds kCPUTaskPeriod = 1600ms; static constexpr std::chrono::milliseconds kCPUTaskDelay = 1200ms; static constexpr std::chrono::milliseconds kCPUTaskComputationTime = 100ms; - + BikeSystem::BikeSystem() : _gearDevice(), _pedalDevice(), _resetDevice(callback(this, &BikeSystem::onReset)), + _displayDevice(), _speedometer(_timer), + _sensorDevice(), + _taskLogger(), _cpuLogger(_timer) {} void BikeSystem::start() { @@ -175,22 +178,19 @@ void BikeSystem::speedDistanceTask() { _taskLogger.logPeriodAndExecutionTime( _timer, advembsof::TaskLogger::kSpeedTaskIndex, taskStartTime); } - -void BikeSystem::temperatureTask() { + +void BikeSystem::displayTask1() { auto taskStartTime = _timer.elapsed_time(); - // tr_warn("Tick1 %" PRIu64, _timer.elapsed_time().count()); - - // no need to protect access to data members (single threaded) - _currentTemperature = _sensorDevice.readTemperature(); - - // tr_warn("Tick2 %" PRIu64, _timer.elapsed_time().count()); + _displayDevice.displayGear(_currentGear); + _displayDevice.displaySpeed(_currentSpeed); + _displayDevice.displayDistance(_traveledDistance); ThisThread::sleep_for(std::chrono::duration_cast( - kTemperatureTaskComputationTime - (_timer.elapsed_time() - taskStartTime))); + kDisplayTask1ComputationTime - (_timer.elapsed_time() - taskStartTime))); _taskLogger.logPeriodAndExecutionTime( - _timer, advembsof::TaskLogger::kTemperatureTaskIndex, taskStartTime); + _timer, advembsof::TaskLogger::kDisplayTask1Index, taskStartTime); } void BikeSystem::resetTask() { @@ -208,18 +208,17 @@ void BikeSystem::resetTask() { _timer, advembsof::TaskLogger::kResetTaskIndex, taskStartTime); } -void BikeSystem::displayTask1() { +void BikeSystem::temperatureTask() { auto taskStartTime = _timer.elapsed_time(); - _displayDevice.displayGear(_currentGear); - _displayDevice.displaySpeed(_currentSpeed); - _displayDevice.displayDistance(_traveledDistance); + // no need to protect access to data members (single threaded) + _currentTemperature = _sensorDevice.readTemperature(); ThisThread::sleep_for(std::chrono::duration_cast( - kDisplayTask1ComputationTime - (_timer.elapsed_time() - taskStartTime))); + kTemperatureTaskComputationTime - (_timer.elapsed_time() - taskStartTime))); _taskLogger.logPeriodAndExecutionTime( - _timer, advembsof::TaskLogger::kDisplayTask1Index, taskStartTime); + _timer, advembsof::TaskLogger::kTemperatureTaskIndex, taskStartTime); } void BikeSystem::displayTask2() {