-
-
Notifications
You must be signed in to change notification settings - Fork 1.1k
Use all free RAM for FreeRTOS heap #2172
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Merged
Merged
Changes from 16 commits
Commits
Show all changes
17 commits
Select commit
Hold shift + click to select a range
1ed1025
Use all free RAM for FreeRTOS heap
pipe01 30162b6
Use NRF logs functions on LFS
pipe01 2beb0a0
Include lfs_config in recovery
pipe01 5a8b37f
Force fault on _sbrk
pipe01 a7dca9f
Fix unused parameter
pipe01 34f79e4
Show total heap size in system info
pipe01 1355737
Wrap newlib malloc and related functions
pipe01 d295791
Implement calloc
pipe01 8327b1b
Add missing include
pipe01 3ec6bc8
Reuse original littlefs crc implementation
pipe01 e554e9a
Fix cmake
pipe01 6497a1e
Undefine LFS_CONFIG to include original CRC implementation
pipe01 7b4c513
Fix cmake
pipe01 defaf26
Move lfs_config.h to libs folder
pipe01 ab7257d
Add comment
pipe01 fe63482
Move #undef to top of file
pipe01 66f4a43
Reuse lfs_util.h
pipe01 File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,234 @@ | ||
| #pragma once | ||
|
|
||
| #include <libraries/log/nrf_log.h> | ||
|
|
||
| #define LFS_TRACE(fmt, ...) NRF_LOG_DEBUG("[LFS] %s:%d:trace: " fmt "\n", __FILE__, __LINE__, ##__VA_ARGS__) | ||
| #define LFS_DEBUG(fmt, ...) NRF_LOG_DEBUG("[LFS] %s:%d:debug: " fmt "\n", __FILE__, __LINE__, ##__VA_ARGS__) | ||
| #define LFS_WARN(fmt, ...) NRF_LOG_WARNING("[LFS] %s:%d:warn: " fmt "\n", __FILE__, __LINE__, ##__VA_ARGS__) | ||
| #define LFS_ERROR(fmt, ...) NRF_LOG_ERROR("[LFS] %s:%d:error: " fmt "\n", __FILE__, __LINE__, ##__VA_ARGS__) | ||
|
|
||
| // This is required in order for the CRC implementation in littlefs/lfs_util.c to be compiled | ||
| #undef LFS_CONFIG | ||
|
|
||
| // ====== Everything below this line is copied from lfs_util.h ====== | ||
|
FintasticMan marked this conversation as resolved.
Outdated
|
||
|
|
||
| // System includes | ||
| #include <stdint.h> | ||
| #include <stdbool.h> | ||
| #include <string.h> | ||
| #include <inttypes.h> | ||
|
|
||
| #ifndef LFS_NO_MALLOC | ||
| #include <stdlib.h> | ||
| #endif | ||
| #ifndef LFS_NO_ASSERT | ||
| #include <assert.h> | ||
| #endif | ||
| #if !defined(LFS_NO_DEBUG) || \ | ||
| !defined(LFS_NO_WARN) || \ | ||
| !defined(LFS_NO_ERROR) || \ | ||
| defined(LFS_YES_TRACE) | ||
| #include <stdio.h> | ||
| #endif | ||
|
|
||
| #ifdef __cplusplus | ||
| extern "C" | ||
| { | ||
| #endif | ||
|
|
||
|
|
||
| // Macros, may be replaced by system specific wrappers. Arguments to these | ||
| // macros must not have side-effects as the macros can be removed for a smaller | ||
| // code footprint | ||
|
|
||
| // Logging functions | ||
| #ifndef LFS_TRACE | ||
| #ifdef LFS_YES_TRACE | ||
| #define LFS_TRACE_(fmt, ...) \ | ||
| printf("%s:%d:trace: " fmt "%s\n", __FILE__, __LINE__, __VA_ARGS__) | ||
| #define LFS_TRACE(...) LFS_TRACE_(__VA_ARGS__, "") | ||
| #else | ||
| #define LFS_TRACE(...) | ||
| #endif | ||
| #endif | ||
|
|
||
| #ifndef LFS_DEBUG | ||
| #ifndef LFS_NO_DEBUG | ||
| #define LFS_DEBUG_(fmt, ...) \ | ||
| printf("%s:%d:debug: " fmt "%s\n", __FILE__, __LINE__, __VA_ARGS__) | ||
| #define LFS_DEBUG(...) LFS_DEBUG_(__VA_ARGS__, "") | ||
| #else | ||
| #define LFS_DEBUG(...) | ||
| #endif | ||
| #endif | ||
|
|
||
| #ifndef LFS_WARN | ||
| #ifndef LFS_NO_WARN | ||
| #define LFS_WARN_(fmt, ...) \ | ||
| printf("%s:%d:warn: " fmt "%s\n", __FILE__, __LINE__, __VA_ARGS__) | ||
| #define LFS_WARN(...) LFS_WARN_(__VA_ARGS__, "") | ||
| #else | ||
| #define LFS_WARN(...) | ||
| #endif | ||
| #endif | ||
|
|
||
| #ifndef LFS_ERROR | ||
| #ifndef LFS_NO_ERROR | ||
| #define LFS_ERROR_(fmt, ...) \ | ||
| printf("%s:%d:error: " fmt "%s\n", __FILE__, __LINE__, __VA_ARGS__) | ||
| #define LFS_ERROR(...) LFS_ERROR_(__VA_ARGS__, "") | ||
| #else | ||
| #define LFS_ERROR(...) | ||
| #endif | ||
| #endif | ||
|
|
||
| // Runtime assertions | ||
| #ifndef LFS_ASSERT | ||
| #ifndef LFS_NO_ASSERT | ||
| #define LFS_ASSERT(test) assert(test) | ||
| #else | ||
| #define LFS_ASSERT(test) | ||
| #endif | ||
| #endif | ||
|
|
||
|
|
||
| // Builtin functions, these may be replaced by more efficient | ||
| // toolchain-specific implementations. LFS_NO_INTRINSICS falls back to a more | ||
| // expensive basic C implementation for debugging purposes | ||
|
|
||
| // Min/max functions for unsigned 32-bit numbers | ||
| static inline uint32_t lfs_max(uint32_t a, uint32_t b) { | ||
| return (a > b) ? a : b; | ||
| } | ||
|
|
||
| static inline uint32_t lfs_min(uint32_t a, uint32_t b) { | ||
| return (a < b) ? a : b; | ||
| } | ||
|
|
||
| // Align to nearest multiple of a size | ||
| static inline uint32_t lfs_aligndown(uint32_t a, uint32_t alignment) { | ||
| return a - (a % alignment); | ||
| } | ||
|
|
||
| static inline uint32_t lfs_alignup(uint32_t a, uint32_t alignment) { | ||
| return lfs_aligndown(a + alignment-1, alignment); | ||
| } | ||
|
|
||
| // Find the smallest power of 2 greater than or equal to a | ||
| static inline uint32_t lfs_npw2(uint32_t a) { | ||
| #if !defined(LFS_NO_INTRINSICS) && (defined(__GNUC__) || defined(__CC_ARM)) | ||
| return 32 - __builtin_clz(a-1); | ||
| #else | ||
| uint32_t r = 0; | ||
| uint32_t s; | ||
| a -= 1; | ||
| s = (a > 0xffff) << 4; a >>= s; r |= s; | ||
| s = (a > 0xff ) << 3; a >>= s; r |= s; | ||
| s = (a > 0xf ) << 2; a >>= s; r |= s; | ||
| s = (a > 0x3 ) << 1; a >>= s; r |= s; | ||
| return (r | (a >> 1)) + 1; | ||
| #endif | ||
| } | ||
|
|
||
| // Count the number of trailing binary zeros in a | ||
| // lfs_ctz(0) may be undefined | ||
| static inline uint32_t lfs_ctz(uint32_t a) { | ||
| #if !defined(LFS_NO_INTRINSICS) && defined(__GNUC__) | ||
| return __builtin_ctz(a); | ||
| #else | ||
| return lfs_npw2((a & -a) + 1) - 1; | ||
| #endif | ||
| } | ||
|
|
||
| // Count the number of binary ones in a | ||
| static inline uint32_t lfs_popc(uint32_t a) { | ||
| #if !defined(LFS_NO_INTRINSICS) && (defined(__GNUC__) || defined(__CC_ARM)) | ||
| return __builtin_popcount(a); | ||
| #else | ||
| a = a - ((a >> 1) & 0x55555555); | ||
| a = (a & 0x33333333) + ((a >> 2) & 0x33333333); | ||
| return (((a + (a >> 4)) & 0xf0f0f0f) * 0x1010101) >> 24; | ||
| #endif | ||
| } | ||
|
|
||
| // Find the sequence comparison of a and b, this is the distance | ||
| // between a and b ignoring overflow | ||
| static inline int lfs_scmp(uint32_t a, uint32_t b) { | ||
| return (int)(unsigned)(a - b); | ||
| } | ||
|
|
||
| // Convert between 32-bit little-endian and native order | ||
| static inline uint32_t lfs_fromle32(uint32_t a) { | ||
| #if !defined(LFS_NO_INTRINSICS) && ( \ | ||
| (defined( BYTE_ORDER ) && defined( ORDER_LITTLE_ENDIAN ) && BYTE_ORDER == ORDER_LITTLE_ENDIAN ) || \ | ||
| (defined(__BYTE_ORDER ) && defined(__ORDER_LITTLE_ENDIAN ) && __BYTE_ORDER == __ORDER_LITTLE_ENDIAN ) || \ | ||
| (defined(__BYTE_ORDER__) && defined(__ORDER_LITTLE_ENDIAN__) && __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__)) | ||
| return a; | ||
| #elif !defined(LFS_NO_INTRINSICS) && ( \ | ||
| (defined( BYTE_ORDER ) && defined( ORDER_BIG_ENDIAN ) && BYTE_ORDER == ORDER_BIG_ENDIAN ) || \ | ||
| (defined(__BYTE_ORDER ) && defined(__ORDER_BIG_ENDIAN ) && __BYTE_ORDER == __ORDER_BIG_ENDIAN ) || \ | ||
| (defined(__BYTE_ORDER__) && defined(__ORDER_BIG_ENDIAN__) && __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__)) | ||
| return __builtin_bswap32(a); | ||
| #else | ||
| return (((uint8_t*)&a)[0] << 0) | | ||
| (((uint8_t*)&a)[1] << 8) | | ||
| (((uint8_t*)&a)[2] << 16) | | ||
| (((uint8_t*)&a)[3] << 24); | ||
| #endif | ||
| } | ||
|
|
||
| static inline uint32_t lfs_tole32(uint32_t a) { | ||
| return lfs_fromle32(a); | ||
| } | ||
|
|
||
| // Convert between 32-bit big-endian and native order | ||
| static inline uint32_t lfs_frombe32(uint32_t a) { | ||
| #if !defined(LFS_NO_INTRINSICS) && ( \ | ||
| (defined( BYTE_ORDER ) && defined( ORDER_LITTLE_ENDIAN ) && BYTE_ORDER == ORDER_LITTLE_ENDIAN ) || \ | ||
| (defined(__BYTE_ORDER ) && defined(__ORDER_LITTLE_ENDIAN ) && __BYTE_ORDER == __ORDER_LITTLE_ENDIAN ) || \ | ||
| (defined(__BYTE_ORDER__) && defined(__ORDER_LITTLE_ENDIAN__) && __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__)) | ||
| return __builtin_bswap32(a); | ||
| #elif !defined(LFS_NO_INTRINSICS) && ( \ | ||
| (defined( BYTE_ORDER ) && defined( ORDER_BIG_ENDIAN ) && BYTE_ORDER == ORDER_BIG_ENDIAN ) || \ | ||
| (defined(__BYTE_ORDER ) && defined(__ORDER_BIG_ENDIAN ) && __BYTE_ORDER == __ORDER_BIG_ENDIAN ) || \ | ||
| (defined(__BYTE_ORDER__) && defined(__ORDER_BIG_ENDIAN__) && __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__)) | ||
| return a; | ||
| #else | ||
| return (((uint8_t*)&a)[0] << 24) | | ||
| (((uint8_t*)&a)[1] << 16) | | ||
| (((uint8_t*)&a)[2] << 8) | | ||
| (((uint8_t*)&a)[3] << 0); | ||
| #endif | ||
| } | ||
|
|
||
| static inline uint32_t lfs_tobe32(uint32_t a) { | ||
| return lfs_frombe32(a); | ||
| } | ||
|
|
||
| // Calculate CRC-32 with polynomial = 0x04c11db7 | ||
| uint32_t lfs_crc(uint32_t crc, const void *buffer, size_t size); | ||
|
|
||
| // Allocate memory, only used if buffers are not provided to littlefs | ||
| // Note, memory must be 64-bit aligned | ||
| static inline void *lfs_malloc(size_t size) { | ||
| #ifndef LFS_NO_MALLOC | ||
| return malloc(size); | ||
| #else | ||
| (void)size; | ||
| return NULL; | ||
| #endif | ||
| } | ||
|
|
||
| // Deallocate memory, only used if buffers are not provided to littlefs | ||
| static inline void lfs_free(void *p) { | ||
| #ifndef LFS_NO_MALLOC | ||
| free(p); | ||
| #else | ||
| (void)p; | ||
| #endif | ||
| } | ||
|
|
||
|
|
||
| #ifdef __cplusplus | ||
| } /* extern "C" */ | ||
| #endif | ||
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Uh oh!
There was an error while loading. Please reload this page.