lessen stack usage

This commit is contained in:
iceman1001
2026-09-01 06:39:04 +02:00
parent 03f9601cc2
commit f1cc02a6ca
+17 -7
View File
@@ -98,9 +98,9 @@ static int colin_currfline;
static int colin_curlline;
static int cjat91_saMifareChkKeys(uint8_t blockNo, uint8_t keyType, bool clearTrace, uint8_t keyCount, const uint8_t *datain, uint64_t *key);
static int e_MifareECardLoad(uint32_t numofsectors, uint8_t keytype);
static void saMifareMakeTag(void);
static void __attribute__((noinline)) saMifareMakeTag(void);
static int saMifareCSetBlock(uint32_t arg0, uint32_t arg1, uint32_t arg2, const uint8_t *datain);
static void WriteTagToFlash(uint32_t uid, size_t size);
static void __attribute__((noinline)) WriteTagToFlash(uint32_t uid, size_t size);
// TODO : Implement fast read of KEYS like in RFIdea
// also http://ext.delaat.net/rp/2015-2016/p04/report.pdf
@@ -261,7 +261,7 @@ static char *ReadSchemasFromSPIFFS(char *filename) {
return (char *)mem;
}
static void add_schemas_from_json_in_spiffs(char *filename) {
static void __attribute__((noinline)) add_schemas_from_json_in_spiffs(char *filename) {
const char *jsonfile = ReadSchemasFromSPIFFS((char *)filename);
@@ -281,7 +281,7 @@ static void add_schemas_from_json_in_spiffs(char *filename) {
}
}
static void ReadLastTagFromFlash(void) {
static void __attribute__((noinline)) ReadLastTagFromFlash(void) {
SpinOff(0);
LED_A_ON();
LED_B_ON();
@@ -307,7 +307,7 @@ static void ReadLastTagFromFlash(void) {
return;
}
static void WriteTagToFlash(uint32_t uid, size_t size) {
static void __attribute__((noinline)) WriteTagToFlash(uint32_t uid, size_t size) {
SpinOff(0);
LED_A_ON();
LED_B_ON();
@@ -315,7 +315,17 @@ static void WriteTagToFlash(uint32_t uid, size_t size) {
LED_D_ON();
uint32_t len = size;
uint8_t data[(size * (16 * 64)) / 1024];
// this used to be a VLA - `uint8_t data[(size * (16 * 64)) / 1024]` - which put
// another `size` bytes (1024 at the only call site) on top of RunMod's already
// 2.5 kB frame, and did not show up in -fstack-usage as anything but "dynamic".
uint8_t *data = BigBuf_calloc((size * (16 * 64)) / 1024);
if (data == NULL) {
DbprintfEx(FLAG_NEWLINE, "[!!] out of memory, tag NOT written to flash");
cjSetCursLeft();
SpinOff(0);
return;
}
emlGetMem_xt(data, 0, (size * 64) / 1024, MIFARE_BLOCK_SIZE);
@@ -864,7 +874,7 @@ static int cjat91_saMifareChkKeys(uint8_t blockNo, uint8_t keyType, bool clearTr
return retval;
}
static void saMifareMakeTag(void) {
static void __attribute__((noinline)) saMifareMakeTag(void) {
uint8_t cfail = 0;
cjSetCursLeft();
cjTabulize();