Browse Source

deep optimizing ram usage

funshine 9 years ago
parent
commit
acd9d0dc97

+ 2 - 1
app/driver/onewire.c

@@ -469,7 +469,8 @@ uint8_t onewire_crc8(const uint8_t *addr, uint8_t len)
 	
 	while (len--) {
 		uint8_t inbyte = *addr++;
-		for (uint8_t i = 8; i; i--) {
+    uint8_t i;
+		for (i = 8; i; i--) {
 			uint8_t mix = (crc ^ inbyte) & 0x01;
 			crc >>= 1;
 			if (mix) crc ^= 0x8C;

+ 1 - 1
app/include/driver/onewire.h

@@ -29,7 +29,7 @@
 // old versions of OneWire).  If you disable this, a slower
 // but very compact algorithm is used.
 #ifndef ONEWIRE_CRC8_TABLE
-#define ONEWIRE_CRC8_TABLE 1
+#define ONEWIRE_CRC8_TABLE 0
 #endif
 
 // You can allow 16-bit CRC checks by defining this to 1

+ 1 - 1
app/include/user_config.h

@@ -7,7 +7,7 @@
 #define NODE_VERSION_INTERNAL   0U
 
 #define NODE_VERSION	"NodeMcu 0.9.5"
-#define BUILD_DATE	    "build 20150106"
+#define BUILD_DATE	    "build 20150107"
 
 // #define FLASH_512K
 // #define FLASH_1M

+ 4 - 3
app/lua/lobject.c

@@ -22,7 +22,7 @@
 #include "lstring.h"
 #include "lvm.h"
 
-
+#include "flash_api.h"
 
 const TValue luaO_nilobject_ = {LUA_TVALUE_NIL};
 
@@ -52,7 +52,7 @@ int luaO_fb2int (int x) {
 
 
 int luaO_log2 (unsigned int x) {
-  static const lu_byte log_2[256] = {
+  static const lu_byte log_2[256] ICACHE_STORE_ATTR ICACHE_RODATA_ATTR = {
     0,1,2,2,3,3,3,3,4,4,4,4,4,4,4,4,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,
     6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,
     7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,
@@ -64,7 +64,8 @@ int luaO_log2 (unsigned int x) {
   };
   int l = -1;
   while (x >= 256) { l += 8; x >>= 8; }
-  return l + log_2[x];
+  // return l + log_2[x];
+  return l + byte_of_aligned_array(log_2,x);
 
 }
 

+ 11 - 0
app/platform/flash_api.c

@@ -225,3 +225,14 @@ bool flash_self_destruct(void)
     SPIEraseChip();
     return true;
 }
+
+uint8_t byte_of_aligned_array(const uint8_t* aligned_array, uint32_t index)
+{
+    if( (((uint32_t)aligned_array)%4) != 0 ){
+        NODE_DBG("aligned_array is not 4-byte aligned.\n");
+        return 0;
+    }
+    uint32_t v = ((uint32_t *)aligned_array)[ index/4 ];
+    uint8_t *p = (uint8_t *) (&v);
+    return p[ (index%4) ];
+}

+ 1 - 0
app/platform/flash_api.h

@@ -67,5 +67,6 @@ bool flash_init_data_written(void);
 bool flash_init_data_default(void);
 bool flash_init_data_blank(void);
 bool flash_self_destruct(void);
+uint8_t byte_of_aligned_array(const uint8_t* aligned_array, uint32_t index);
 
 #endif // __FLASH_API_H__

+ 36 - 18
app/ssl/crypto/ssl_aes.c

@@ -81,7 +81,7 @@
 /*
  * AES S-box
  */
-static const uint8_t aes_sbox[256] =
+static const uint8_t aes_sbox[256] ICACHE_STORE_ATTR ICACHE_RODATA_ATTR =
 {
 	0x63,0x7C,0x77,0x7B,0xF2,0x6B,0x6F,0xC5,
 	0x30,0x01,0x67,0x2B,0xFE,0xD7,0xAB,0x76,
@@ -120,7 +120,7 @@ static const uint8_t aes_sbox[256] =
 /*
  * AES is-box
  */
-static const uint8_t aes_isbox[256] = 
+static const uint8_t aes_isbox[256] ICACHE_STORE_ATTR ICACHE_RODATA_ATTR = 
 {
     0x52,0x09,0x6a,0xd5,0x30,0x36,0xa5,0x38,
     0xbf,0x40,0xa3,0x9e,0x81,0xf3,0xd7,0xfb,
@@ -226,20 +226,28 @@ void ICACHE_FLASH_ATTR AES_set_key(AES_CTX *ctx, const uint8_t *key,
 
         if ((i % words) == 0)
         {
-            tmp2 =(uint32_t)aes_sbox[(tmp    )&0xff]<< 8;
-            tmp2|=(uint32_t)aes_sbox[(tmp>> 8)&0xff]<<16;
-            tmp2|=(uint32_t)aes_sbox[(tmp>>16)&0xff]<<24;
-            tmp2|=(uint32_t)aes_sbox[(tmp>>24)     ];
+            // tmp2 =(uint32_t)aes_sbox[(tmp    )&0xff]<< 8;
+            // tmp2|=(uint32_t)aes_sbox[(tmp>> 8)&0xff]<<16;
+            // tmp2|=(uint32_t)aes_sbox[(tmp>>16)&0xff]<<24;
+            // tmp2|=(uint32_t)aes_sbox[(tmp>>24)     ];
+            tmp2 =((uint32_t)byte_of_aligned_array(aes_sbox,(tmp    )&0xff))<< 8;
+            tmp2|=((uint32_t)byte_of_aligned_array(aes_sbox,(tmp>> 8)&0xff))<<16;
+            tmp2|=((uint32_t)byte_of_aligned_array(aes_sbox,(tmp>>16)&0xff))<<24;
+            tmp2|=((uint32_t)byte_of_aligned_array(aes_sbox,(tmp>>24)     ));
             tmp=tmp2^(((unsigned int)*ip)<<24);
             ip++;
         }
 
         if ((words == 8) && ((i % words) == 4))
         {
-            tmp2 =(uint32_t)aes_sbox[(tmp    )&0xff]    ;
-            tmp2|=(uint32_t)aes_sbox[(tmp>> 8)&0xff]<< 8;
-            tmp2|=(uint32_t)aes_sbox[(tmp>>16)&0xff]<<16;
-            tmp2|=(uint32_t)aes_sbox[(tmp>>24)     ]<<24;
+            // tmp2 =(uint32_t)aes_sbox[(tmp    )&0xff]    ;
+            // tmp2|=(uint32_t)aes_sbox[(tmp>> 8)&0xff]<< 8;
+            // tmp2|=(uint32_t)aes_sbox[(tmp>>16)&0xff]<<16;
+            // tmp2|=(uint32_t)aes_sbox[(tmp>>24)     ]<<24;
+            tmp2 =((uint32_t)byte_of_aligned_array(aes_sbox,(tmp    )&0xff))    ;
+            tmp2|=((uint32_t)byte_of_aligned_array(aes_sbox,(tmp>> 8)&0xff))<< 8;
+            tmp2|=((uint32_t)byte_of_aligned_array(aes_sbox,(tmp>>16)&0xff))<<16;
+            tmp2|=((uint32_t)byte_of_aligned_array(aes_sbox,(tmp>>24)     ))<<24;
             tmp=tmp2;
         }
 
@@ -375,10 +383,15 @@ static void ICACHE_FLASH_ATTR AES_encrypt(const AES_CTX *ctx, uint32_t *data)
         /* Perform ByteSub and ShiftRow operations together */
         for (row = 0; row < 4; row++)
         {
-            a0 = (uint32_t)aes_sbox[(data[row%4]>>24)&0xFF];
-            a1 = (uint32_t)aes_sbox[(data[(row+1)%4]>>16)&0xFF];
-            a2 = (uint32_t)aes_sbox[(data[(row+2)%4]>>8)&0xFF]; 
-            a3 = (uint32_t)aes_sbox[(data[(row+3)%4])&0xFF];
+            // a0 = (uint32_t)aes_sbox[(data[row%4]>>24)&0xFF];
+            // a1 = (uint32_t)aes_sbox[(data[(row+1)%4]>>16)&0xFF];
+            // a2 = (uint32_t)aes_sbox[(data[(row+2)%4]>>8)&0xFF]; 
+            // a3 = (uint32_t)aes_sbox[(data[(row+3)%4])&0xFF];
+
+            a0 = (uint32_t)(byte_of_aligned_array(aes_sbox,(data[row%4]>>24)&0xFF));
+            a1 = (uint32_t)(byte_of_aligned_array(aes_sbox,(data[(row+1)%4]>>16)&0xFF));
+            a2 = (uint32_t)(byte_of_aligned_array(aes_sbox,(data[(row+2)%4]>>8)&0xFF)); 
+            a3 = (uint32_t)(byte_of_aligned_array(aes_sbox,(data[(row+3)%4])&0xFF));
 
             /* Perform MixColumn iff not last round */
             if (curr_rnd < (rounds - 1))
@@ -423,10 +436,15 @@ static void ICACHE_FLASH_ATTR AES_decrypt(const AES_CTX *ctx, uint32_t *data)
         /* Perform ByteSub and ShiftRow operations together */
         for (row = 4; row > 0; row--)
         {
-            a0 = aes_isbox[(data[(row+3)%4]>>24)&0xFF];
-            a1 = aes_isbox[(data[(row+2)%4]>>16)&0xFF];
-            a2 = aes_isbox[(data[(row+1)%4]>>8)&0xFF];
-            a3 = aes_isbox[(data[row%4])&0xFF];
+            // a0 = aes_isbox[(data[(row+3)%4]>>24)&0xFF];
+            // a1 = aes_isbox[(data[(row+2)%4]>>16)&0xFF];
+            // a2 = aes_isbox[(data[(row+1)%4]>>8)&0xFF];
+            // a3 = aes_isbox[(data[row%4])&0xFF];
+
+            a0 = byte_of_aligned_array(aes_isbox,(data[(row+3)%4]>>24)&0xFF);
+            a1 = byte_of_aligned_array(aes_isbox,(data[(row+2)%4]>>16)&0xFF);
+            a2 = byte_of_aligned_array(aes_isbox,(data[(row+1)%4]>>8)&0xFF);
+            a3 = byte_of_aligned_array(aes_isbox,(data[row%4])&0xFF);
 
             /* Perform MixColumn iff not last round */
             if (curr_rnd<(rounds-1))