[FL-2263] Flasher service & RAM exec (#1006)
* WIP on stripping fw * Compact FW build - use RAM_EXEC=1 COMPACT=1 DEBUG=0 * Fixed uninitialized storage struct; small fixes to compact fw * Flasher srv w/mocked flash ops * Fixed typos & accomodated FFF changes * Alternative fw startup branch * Working load & jmp to RAM fw * +manifest processing for stage loader; + crc verification for stage payload * Fixed questionable code & potential leaks * Lowered screen update rate; added radio stack update stubs; working dfu write * Console EP with manifest & stage validation * Added microtar lib; minor ui fixes for updater * Removed microtar * Removed mtar #2 * Added a better version of microtar * TAR archive api; LFS backup & restore core * Recursive backup/restore * LFS worker thread * Added system apps to loader - not visible in UI; full update process with restarts * Typo fix * Dropped BL & f6; tooling for updater WIP * Minor py fixes * Minor fixes to make it build after merge * Ported flash workaround from BL + fixed visuals * Minor cleanup * Chmod + loader app search fix * Python linter fix * Removed usb stuff & float read support for staged loader == -10% of binary size * Added backup/restore & update pb requests * Added stub impl to RPC for backup/restore/update commands * Reworked TAR to use borrowed Storage api; slightly reduced build size by removing `static string`; hidden update-related RPC behind defines * Moved backup&restore to storage * Fixed new message types * Backup/restore/update RPC impl * Moved furi_hal_crc to LL; minor fixes * CRC HAL rework to LL * Purging STM HAL * Brought back minimal DFU boot mode (no gui); additional crc state checks * Added splash screen, BROKEN usb function * Clock init rework WIP * Stripped graphics from DFU mode * Temp fix for unused static fun * WIP update picker - broken! * Fixed UI * Bumping version * Fixed RTC setup * Backup to update folder instead of ext root * Removed unused scenes & more usb remnants from staged loader * CI updates * Fixed update bundle name * Temporary restored USB handler * Attempt to prevent .text corruption * Comments on how I spent this Saturday * Added update file icon * Documentation updates * Moved common code to lib folder * Storage: more unit tests * Storage: blocking dir open, differentiate file and dir when freed. * Major refactoring; added input processing to updater to allow retrying on failures (not very useful prob). Added API for extraction of thread return value * Removed re-init check for manifest * Changed low-level path manipulation to toolbox/path.h; makefile cleanup; tiny fix in lint.py * Increased update worker stack size * Text fixes in backup CLI * Displaying number of update stages to run; removed timeout in handling errors * Bumping version * Added thread cleanup for spawner thread * Updated build targets to exclude firmware bundle from 'ALL' * Fixed makefile for update_package; skipping VCP init for update mode (ugly) * Switched github build from ALL to update_package * Added +x for dist_update.sh * Cli: add total heap size to "free" command * Moved (RAM) suffix to build version instead of git commit no. * DFU comment * Some fixes suggested by clang-tidy * Fixed recursive PREFIX macro * Makefile: gather all new rules in updater namespace. FuriHal: rename bootloader to boot, isr safe delays * Github: correct build target name in firmware build * FuriHal: move target switch to boot * Makefile: fix firmware flash * Furi, FuriHal: move kernel start to furi, early init * Drop bootloader related stuff * Drop cube. Drop bootloader linker script. * Renamed update_hl, moved constants to #defines * Moved update-related boot mode to separate bitfield * Reworked updater cli to single entry point; fixed crash on tar cleanup * Added Python replacement for dist shell scripts * Linter fixes for dist.py +x * Fixes for environment suffix * Dropped bash scripts * Added dirty build flag to version structure & interfaces * Version string escapes * Fixed flag logic in dist.py; added support for App instances being imported and not terminating the whole program * Fixed fw address in ReadMe.md * Rpc: fix crash on double screen start * Return back original boot behavior and fix jump to system bootloader * Cleanup code, add error sequence for RTC * Update firmware readme * FuriHal: drop boot, restructure RTC registers usage and add header register check * Furi goes first * Toolchain: add ccache support * Renamed update bundle dir Co-authored-by: DrZlo13 <who.just.the.doctor@gmail.com> Co-authored-by: あく <alleteam@gmail.com>
This commit is contained in:
@@ -11,13 +11,14 @@ static void flipper_print_version(const char* target, const Version* version) {
|
||||
TAG,
|
||||
"\r\n\t%s version:\t%s\r\n"
|
||||
"\tBuild date:\t\t%s\r\n"
|
||||
"\tGit Commit:\t\t%s (%s)\r\n"
|
||||
"\tGit Commit:\t\t%s (%s)%s\r\n"
|
||||
"\tGit Branch:\t\t%s",
|
||||
target,
|
||||
version_get_version(version),
|
||||
version_get_builddate(version),
|
||||
version_get_githash(version),
|
||||
version_get_gitbranchnum(version),
|
||||
version_get_dirty_flag(version) ? " (dirty)" : "",
|
||||
version_get_gitbranch(version));
|
||||
} else {
|
||||
FURI_LOG_I(TAG, "No build info for %s", target);
|
||||
@@ -25,13 +26,7 @@ static void flipper_print_version(const char* target, const Version* version) {
|
||||
}
|
||||
|
||||
void flipper_init() {
|
||||
const Version* version;
|
||||
|
||||
version = (const Version*)furi_hal_version_get_bootloader_version();
|
||||
flipper_print_version("Bootloader", version);
|
||||
|
||||
version = (const Version*)furi_hal_version_get_firmware_version();
|
||||
flipper_print_version("Firmware", version);
|
||||
flipper_print_version("Firmware", furi_hal_version_get_firmware_version());
|
||||
|
||||
FURI_LOG_I(TAG, "starting services");
|
||||
|
||||
|
@@ -1,7 +1,13 @@
|
||||
#include "furi.h"
|
||||
|
||||
void furi_init() {
|
||||
osKernelInitialize();
|
||||
|
||||
furi_log_init();
|
||||
furi_record_init();
|
||||
furi_stdglue_init();
|
||||
}
|
||||
|
||||
void furi_run() {
|
||||
osKernelStart();
|
||||
}
|
||||
|
@@ -27,6 +27,8 @@ extern "C" {
|
||||
|
||||
void furi_init();
|
||||
|
||||
void furi_run();
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
@@ -21,20 +21,21 @@ void __furi_print_name() {
|
||||
}
|
||||
}
|
||||
|
||||
void __furi_halt() {
|
||||
static FURI_NORETURN void __furi_halt() {
|
||||
asm volatile(
|
||||
#ifdef FURI_DEBUG
|
||||
"bkpt 0x00 \n"
|
||||
#endif
|
||||
"loop: \n"
|
||||
"loop%=: \n"
|
||||
"wfi \n"
|
||||
"b loop \n"
|
||||
"b loop%= \n"
|
||||
:
|
||||
:
|
||||
: "memory");
|
||||
__builtin_unreachable();
|
||||
}
|
||||
|
||||
void furi_crash(const char* message) {
|
||||
FURI_NORETURN void furi_crash(const char* message) {
|
||||
__disable_irq();
|
||||
|
||||
if(message == NULL) {
|
||||
@@ -54,9 +55,10 @@ void furi_crash(const char* message) {
|
||||
furi_hal_console_puts("\033[0m\r\n");
|
||||
furi_hal_power_reset();
|
||||
#endif
|
||||
__builtin_unreachable();
|
||||
}
|
||||
|
||||
void furi_halt(const char* message) {
|
||||
FURI_NORETURN void furi_halt(const char* message) {
|
||||
__disable_irq();
|
||||
|
||||
if(message == NULL) {
|
||||
@@ -69,4 +71,4 @@ void furi_halt(const char* message) {
|
||||
furi_hal_console_puts("\r\nSystem halted. Bye-bye!\r\n");
|
||||
furi_hal_console_puts("\033[0m\r\n");
|
||||
__furi_halt();
|
||||
}
|
||||
}
|
@@ -1,7 +1,10 @@
|
||||
#pragma once
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#define FURI_NORETURN [[noreturn]]
|
||||
#else
|
||||
#include <stdnoreturn.h>
|
||||
#define FURI_NORETURN noreturn
|
||||
#endif
|
||||
|
||||
/** Check condition and crash if check failed */
|
||||
@@ -15,10 +18,10 @@ extern "C" {
|
||||
#endif
|
||||
|
||||
/** Crash system */
|
||||
void furi_crash(const char* message);
|
||||
FURI_NORETURN void furi_crash(const char* message);
|
||||
|
||||
/** Halt system */
|
||||
void furi_halt(const char* message);
|
||||
FURI_NORETURN void furi_halt(const char* message);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
|
@@ -101,18 +101,20 @@ extern "C" {
|
||||
#endif
|
||||
|
||||
#ifndef FURI_IS_ISR
|
||||
#define FURI_IS_ISR() \
|
||||
(FURI_IS_IRQ_MODE() || (FURI_IS_IRQ_MASKED() && (osKernelGetState() == osKernelRunning)))
|
||||
#define FURI_IS_ISR() (FURI_IS_IRQ_MODE() || FURI_IS_IRQ_MASKED())
|
||||
#endif
|
||||
|
||||
#ifndef FURI_CRITICAL_ENTER
|
||||
#define FURI_CRITICAL_ENTER() \
|
||||
uint32_t __isrm = 0; \
|
||||
bool __from_isr = FURI_IS_ISR(); \
|
||||
if(__from_isr) { \
|
||||
__isrm = taskENTER_CRITICAL_FROM_ISR(); \
|
||||
} else { \
|
||||
taskENTER_CRITICAL(); \
|
||||
#define FURI_CRITICAL_ENTER() \
|
||||
uint32_t __isrm = 0; \
|
||||
bool __from_isr = FURI_IS_ISR(); \
|
||||
bool __kernel_running = (osKernelGetState() == osKernelRunning); \
|
||||
if(__from_isr) { \
|
||||
__isrm = taskENTER_CRITICAL_FROM_ISR(); \
|
||||
} else if(__kernel_running) { \
|
||||
taskENTER_CRITICAL(); \
|
||||
} else { \
|
||||
__disable_irq(); \
|
||||
}
|
||||
#endif
|
||||
|
||||
@@ -120,8 +122,10 @@ extern "C" {
|
||||
#define FURI_CRITICAL_EXIT() \
|
||||
if(__from_isr) { \
|
||||
taskEXIT_CRITICAL_FROM_ISR(__isrm); \
|
||||
} else { \
|
||||
} else if(__kernel_running) { \
|
||||
taskEXIT_CRITICAL(); \
|
||||
} else { \
|
||||
__enable_irq(); \
|
||||
}
|
||||
#endif
|
||||
|
||||
|
@@ -4,6 +4,7 @@
|
||||
extern void* pvPortMalloc(size_t xSize);
|
||||
extern void vPortFree(void* pv);
|
||||
extern size_t xPortGetFreeHeapSize(void);
|
||||
extern size_t xPortGetTotalHeapSize(void);
|
||||
extern size_t xPortGetMinimumEverFreeHeapSize(void);
|
||||
|
||||
void* malloc(size_t size) {
|
||||
@@ -50,6 +51,10 @@ size_t memmgr_get_free_heap(void) {
|
||||
return xPortGetFreeHeapSize();
|
||||
}
|
||||
|
||||
size_t memmgr_get_total_heap(void) {
|
||||
return xPortGetTotalHeapSize();
|
||||
}
|
||||
|
||||
size_t memmgr_get_minimum_free_heap(void) {
|
||||
return xPortGetMinimumEverFreeHeapSize();
|
||||
}
|
||||
|
@@ -23,6 +23,12 @@ extern "C" {
|
||||
*/
|
||||
size_t memmgr_get_free_heap(void);
|
||||
|
||||
/** Get total heap size
|
||||
*
|
||||
* @return total heap size in bytes
|
||||
*/
|
||||
size_t memmgr_get_total_heap(void);
|
||||
|
||||
/** Get heap watermark
|
||||
*
|
||||
* @return minimum heap in bytes
|
||||
|
@@ -526,6 +526,11 @@ void vPortFree(void* pv) {
|
||||
}
|
||||
/*-----------------------------------------------------------*/
|
||||
|
||||
size_t xPortGetTotalHeapSize(void) {
|
||||
return (size_t)&__heap_end__ - (size_t)&__heap_start__;
|
||||
}
|
||||
/*-----------------------------------------------------------*/
|
||||
|
||||
size_t xPortGetFreeHeapSize(void) {
|
||||
return xFreeBytesRemaining;
|
||||
}
|
||||
|
@@ -49,7 +49,7 @@ bool furi_record_destroy(const char* name);
|
||||
*
|
||||
* @return pointer to the record
|
||||
* @note Thread safe. Open and close must be executed from the same
|
||||
* thread. Suspends caller thread till record appear
|
||||
* thread. Suspends caller thread till record is available
|
||||
*/
|
||||
void* furi_record_open(const char* name);
|
||||
|
||||
|
@@ -30,7 +30,7 @@ void furi_thread_set_state(FuriThread* thread, FuriThreadState state) {
|
||||
}
|
||||
}
|
||||
|
||||
void furi_thread_body(void* context) {
|
||||
static void furi_thread_body(void* context) {
|
||||
furi_assert(context);
|
||||
FuriThread* thread = context;
|
||||
|
||||
@@ -167,3 +167,9 @@ size_t furi_thread_get_heap_size(FuriThread* thread) {
|
||||
furi_assert(thread->heap_trace_enabled == true);
|
||||
return thread->heap_size;
|
||||
}
|
||||
|
||||
int32_t furi_thread_get_return_code(FuriThread* thread) {
|
||||
furi_assert(thread);
|
||||
furi_assert(thread->state == FuriThreadStateStopped);
|
||||
return thread->ret;
|
||||
}
|
||||
|
@@ -150,6 +150,14 @@ void furi_thread_disable_heap_trace(FuriThread* thread);
|
||||
*/
|
||||
size_t furi_thread_get_heap_size(FuriThread* thread);
|
||||
|
||||
/** Get thread return code
|
||||
*
|
||||
* @param thread FuriThread instance
|
||||
*
|
||||
* @return return code
|
||||
*/
|
||||
int32_t furi_thread_get_return_code(FuriThread* thread);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
#endif
|
Reference in New Issue
Block a user