Merge branch 'develop' into FEAT/multi-tasking
This commit is contained in:
commit
7838ed0448
@ -15,3 +15,4 @@ mbed-os/features/frameworks/mbed-client-cli/*
|
||||
mbed-os/features/frameworks/COMPONENT_FPGA_CI_TEST_SHIELD/*
|
||||
mbed-os/platform/randlib/*
|
||||
mbed-os/storage/kvstore/*
|
||||
mbed-os-bootloader/*
|
BIN
mbed-bootloader-advembsof.bin
Normal file
BIN
mbed-bootloader-advembsof.bin
Normal file
Binary file not shown.
12
mbed-os-bootloader/.clang-format
Normal file
12
mbed-os-bootloader/.clang-format
Normal file
@ -0,0 +1,12 @@
|
||||
---
|
||||
BasedOnStyle: Google
|
||||
IndentWidth: 4
|
||||
---
|
||||
Language: Cpp
|
||||
ColumnLimit: 90
|
||||
AlignConsecutiveAssignments: true
|
||||
DerivePointerAlignment: false
|
||||
PointerAlignment: Left
|
||||
BinPackArguments: false
|
||||
BinPackParameters: false
|
||||
IndentAccessModifiers: false
|
8
mbed-os-bootloader/.gitignore
vendored
Normal file
8
mbed-os-bootloader/.gitignore
vendored
Normal file
@ -0,0 +1,8 @@
|
||||
.build
|
||||
.mbed
|
||||
projectfiles
|
||||
*.py*
|
||||
mbed-os
|
||||
BUILD
|
||||
!BUILD/DISCO_H747I/GCC_ARM/mbed-os-bootloader.bin
|
||||
|
17
mbed-os-bootloader/.mbedignore
Normal file
17
mbed-os-bootloader/.mbedignore
Normal file
@ -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/*
|
26
mbed-os-bootloader/.pre-commit-config.yaml
Normal file
26
mbed-os-bootloader/.pre-commit-config.yaml
Normal file
@ -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
|
Binary file not shown.
35
mbed-os-bootloader/main.cpp
Normal file
35
mbed-os-bootloader/main.cpp
Normal file
@ -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;
|
||||
}
|
1
mbed-os-bootloader/mbed-os.lib
Normal file
1
mbed-os-bootloader/mbed-os.lib
Normal file
@ -0,0 +1 @@
|
||||
https://github.com/ARMmbed/mbed-os.git#17dc3dc2e6e2817a8bd3df62f38583319f0e4fed
|
28
mbed-os-bootloader/mbed_app.json
Normal file
28
mbed-os-bootloader/mbed_app.json
Normal file
@ -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"
|
||||
}
|
||||
}
|
||||
}
|
@ -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"
|
||||
"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"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -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<std::chrono::milliseconds>(
|
||||
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<std::chrono::milliseconds>(
|
||||
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<std::chrono::milliseconds>(
|
||||
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);
|
||||
}
|
||||
|
@ -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();
|
||||
|
@ -46,9 +46,9 @@ class PedalDevice {
|
||||
void decreaseRotationSpeed();
|
||||
|
||||
// data members
|
||||
Timer& _timer;
|
||||
std::chrono::milliseconds _pedalRotationTime =
|
||||
bike_computer::kInitialPedalRotationTime;
|
||||
Timer& _timer;
|
||||
};
|
||||
|
||||
} // namespace static_scheduling
|
||||
|
@ -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));
|
||||
}
|
||||
|
||||
|
@ -67,7 +67,10 @@ BikeSystem::BikeSystem()
|
||||
: _gearDevice(),
|
||||
_pedalDevice(),
|
||||
_resetDevice(callback(this, &BikeSystem::onReset)),
|
||||
_displayDevice(),
|
||||
_speedometer(_timer),
|
||||
_sensorDevice(),
|
||||
_taskLogger(),
|
||||
_cpuLogger(_timer) {}
|
||||
|
||||
void BikeSystem::start() {
|
||||
@ -176,21 +179,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<std::chrono::milliseconds>(
|
||||
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<std::chrono::milliseconds>(
|
||||
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() {
|
||||
|
Loading…
x
Reference in New Issue
Block a user