diff --git a/bsp/stm32g030c8/MDK-ARM/stm32g030c8.uvprojx b/bsp/stm32g030c8/MDK-ARM/stm32g030c8.uvprojx index b3f756212..daf837913 100644 --- a/bsp/stm32g030c8/MDK-ARM/stm32g030c8.uvprojx +++ b/bsp/stm32g030c8/MDK-ARM/stm32g030c8.uvprojx @@ -313,7 +313,7 @@ 1 - 2 + 6 0 0 1 @@ -332,7 +332,7 @@ 3 1 1 - 0 + 1 0 0 @@ -840,11 +840,6 @@ 1 ..\pikascript\pikascript-core\PikaObj.c - - method.c - 1 - ..\pikascript\pikascript-core\method.c - dataStrs.c 1 @@ -885,11 +880,6 @@ 1 ..\pikascript\pikascript-core\BaseObj.c - - pikaPlatform.c - 1 - ..\pikascript\pikascript-core\pikaPlatform.c - dataQueue.c 1 @@ -915,6 +905,11 @@ 1 ..\pikascript\pikascript-core\dataStack.c + + PikaPlatform.c + 1 + ..\pikascript\pikascript-core\PikaPlatform.c + diff --git a/package/STM32/STM32_Code.c b/package/STM32/STM32_Code.c index c06003533..83a412a1f 100644 --- a/package/STM32/STM32_Code.c +++ b/package/STM32/STM32_Code.c @@ -62,10 +62,10 @@ void STM32_Code_flashHandler() { printf("[info]: Programing... \r\n"); HAL_FLASH_Unlock(); /* Get the 1st page to erase */ - FirstPage = GetPage(FLASH_CODE_START_ADDR); + FirstPage = GetPage(FLASH_SCRIPT_START_ADDR); /* Get the number of pages to erase from 1st page */ - NbOfPages = GetPage(FLASH_USER_END_ADDR) - FirstPage + 1; + NbOfPages = GetPage(FLASH_SCRIPT_END_ADDR) - FirstPage + 1; /* Fill EraseInit structure*/ EraseInitStruct.TypeErase = FLASH_TYPEERASE_PAGES; @@ -81,7 +81,7 @@ void STM32_Code_flashHandler() { printf("[ OK ]: Erase flash ok! \r\n"); printf("[info]: Writing flash... \r\n"); - uint32_t baseAddress = FLASH_CODE_START_ADDR; + uint32_t baseAddress = FLASH_SCRIPT_START_ADDR; uint32_t writeAddress = 0; uint64_t writeData64 = 0; while (writeAddress < codeHeap.size + 1) { @@ -104,7 +104,7 @@ void STM32_Code_flashHandler() { HAL_FLASH_Lock(); printf("[ OK ]: Write flash ok! \r\n"); - baseAddress = FLASH_CODE_START_ADDR; + baseAddress = FLASH_SCRIPT_START_ADDR; MemoryProgramStatus = 0x0; printf("[info]: Checking flash... \r\n"); @@ -136,4 +136,68 @@ void STM32_Code_flashHandler() { printf("\r\n"); HAL_NVIC_SystemReset(); } + + +int32_t __saveStrToFlash(char *str, uint32_t flashStart, uint32_t flashEnd){ + uint32_t FirstPage = 0, NbOfPages = 0; + uint32_t PageError = 0; + __IO uint32_t data32 = 0, MemoryProgramStatus = 0; + static FLASH_EraseInitTypeDef EraseInitStruct = {0}; + + HAL_FLASH_Unlock(); + /* Get the 1st page to erase */ + FirstPage = GetPage(flashStart); + + /* Get the number of pages to erase from 1st page */ + NbOfPages = GetPage(flashEnd) - FirstPage + 1; + + /* Fill EraseInit structure*/ + EraseInitStruct.TypeErase = FLASH_TYPEERASE_PAGES; + EraseInitStruct.Page = FirstPage; + EraseInitStruct.NbPages = NbOfPages; + + if (HAL_FLASHEx_Erase(&EraseInitStruct, &PageError) != HAL_OK) { + return 1; + } + + uint32_t baseAddress = flashStart; + uint32_t writeAddress = 0; + uint64_t writeData64 = 0; + uint32_t size = strGetSize(str); + while (writeAddress < size + 1) { + writeData64 = 0; + for (int i = 7; i >= 0; i--) { + char ch = str[writeAddress + i]; + writeData64 = writeData64 << 8; + writeData64 += ch; + } + if (HAL_FLASH_Program(FLASH_TYPEPROGRAM_DOUBLEWORD, + baseAddress + writeAddress, + writeData64) == HAL_OK) { + writeAddress = writeAddress + 8; + } else { + return 1; + } + } + HAL_FLASH_Lock(); + + baseAddress = flashStart; + MemoryProgramStatus = 0x0; + + char* codeInFlash = (char*)baseAddress; + + if (!strEqu(codeInFlash, str)) { + return 1; + } + return 0; +} + +char* __platformLoadPikaAsm(){ + return (char *)FLASH_PIKA_ASM_START_ADDR; +} + +int32_t __platformSavePikaAsm(char *PikaAsm){ + return __saveStrToFlash(PikaAsm, FLASH_PIKA_ASM_START_ADDR, FLASH_PIKA_ASM_END_ADDR); +} + #endif \ No newline at end of file diff --git a/package/STM32/STM32_common.h b/package/STM32/STM32_common.h index 8470cd5d5..960701f08 100644 --- a/package/STM32/STM32_common.h +++ b/package/STM32/STM32_common.h @@ -44,11 +44,12 @@ #define RX_BUFF_LENGTH 64 -#define FLASH_CODE_START_ADDR \ - (FLASH_BASE + \ - ((FLASH_PAGE_NB - 1) * FLASH_PAGE_SIZE)) /* Start @ of user Flash area */ -#define FLASH_USER_END_ADDR \ - (FLASH_BASE + FLASH_SIZE - 1) /* End @ of user Flash area */ +#define FLASH_SCRIPT_START_ADDR (FLASH_BASE + ((FLASH_PAGE_NB - 1) * FLASH_PAGE_SIZE)) +#define FLASH_SCRIPT_END_ADDR (FLASH_BASE + FLASH_SIZE - 1) + +#define FLASH_PIKA_ASM_START_ADDR (FLASH_BASE + ((FLASH_PAGE_NB - 2) * FLASH_PAGE_SIZE)) +#define FLASH_PIKA_ASM_END_ADDR (FLASH_BASE + ((FLASH_PAGE_NB - 1) * FLASH_PAGE_SIZE)) + uint32_t GetPage(uint32_t Addr); #define DATA_64 ((uint64_t)0x1234567812345678) #define DATA_32 ((uint32_t)0x12345678) diff --git a/package/STM32G030Booter/main.c b/package/STM32G030Booter/main.c index 118d86086..b0508824d 100644 --- a/package/STM32G030Booter/main.c +++ b/package/STM32G030Booter/main.c @@ -96,7 +96,7 @@ int main(void) { SCB->VTOR = FLASH_BASE | 0x2000; __enable_irq(); - char* code = (char*)FLASH_CODE_START_ADDR; + char* code = (char*)FLASH_SCRIPT_START_ADDR; uint16_t codeOffset = 0; if (code[0] == 'i') { /* boot from flash */ @@ -104,22 +104,10 @@ int main(void) { obj_run(pikaMain, "uart = STM32.UART()"); obj_run(pikaMain, "uart.init()"); obj_run(pikaMain, "uart.setId(1)"); - obj_run(pikaMain, "uart.setBaudRat e(115200)"); + obj_run(pikaMain, "uart.setBaudRate(115200)"); obj_run(pikaMain, "uart.enable()"); obj_run(pikaMain, "print('[info]: boot from flash.')"); - while (1) { - char lineBuff[64] = {0}; - char* codePointer = code + codeOffset; - char* line = strGetFirstToken(lineBuff, codePointer, '\n'); - codeOffset += strGetSize(line) + 1; - - obj_run(pikaMain, line); - /* not any line in code */ - if (!strIsContain(codePointer, '\n')) { - break; - } - } - obj_run(pikaMain, ""); + obj_run(pikaMain, code); } else { /* boot from firmware */ pikaMain = pikaScriptInit(); diff --git a/src/PikaPlatform.c b/src/PikaPlatform.c index d24643ec6..e67efe741 100644 --- a/src/PikaPlatform.c +++ b/src/PikaPlatform.c @@ -27,3 +27,13 @@ PIKA_WEAK void __platformPrintf(char* fmt, ...) { vprintf(fmt, args); va_end(args); } + +PIKA_WEAK char* __platformLoadPikaAsm(){ + /* faild */ + return NULL; +} + +PIKA_WEAK int32_t __platformSavePikaAsm(char *PikaAsm){ + /* faild */ + return 1; +} diff --git a/src/PikaPlatform.h b/src/PikaPlatform.h index 02517b9b8..bcb02cb67 100644 --- a/src/PikaPlatform.h +++ b/src/PikaPlatform.h @@ -1,6 +1,7 @@ #ifndef __PIKA_PALTFORM__H #define __PIKA_PALTFORM__H #include +#include #if defined(__CC_ARM) || defined(__CLANG_ARM) /* ARM Compiler */ #define PIKA_WEAK __attribute__((weak)) @@ -16,4 +17,7 @@ void __platformFree(void* ptr); void __platformEnableIrqHandle(); void __platformDisableIrqHandle(); +char* __platformLoadPikaAsm(); +int32_t __platformSavePikaAsm(char *PikaAsm); + #endif \ No newline at end of file diff --git a/src/PikaVM.c b/src/PikaVM.c index 4b2a612a5..e2485acac 100644 --- a/src/PikaVM.c +++ b/src/PikaVM.c @@ -370,11 +370,33 @@ nextLine: return nextAddr; } +static char *useFlashAsBuff(char *pikaAsm, Args*buffs){ + /* not write flash when asm is old */ + if (strEqu(pikaAsm, __platformLoadPikaAsm())){ + args_deinit(buffs); + buffs = NULL; + return __platformLoadPikaAsm(); + } + /* write flash */ + if (0 == __platformSavePikaAsm(pikaAsm)) + { + args_deinit(buffs); + buffs = NULL; + return __platformLoadPikaAsm(); + } + return pikaAsm; +} + Args* pikaVM_run(PikaObj* self, char* multiLine) { Args* buffs = New_strBuff(); char* pikaAsm = pikaParseMultiLineToAsm(buffs, multiLine); + if (strCountSign(multiLine,'\n') > 1){ + pikaAsm = useFlashAsBuff(pikaAsm, buffs); + } Args* sysRes = pikaVM_runAsm(self, pikaAsm); - args_deinit(buffs); + if (NULL != buffs){ + args_deinit(buffs); + } return sysRes; }