update Core STM32 package and STM32Booter to support flash buffer for

asm
This commit is contained in:
lyon1998 2021-10-19 21:52:46 +08:00
parent 51eaeced1c
commit 30110a8d58
7 changed files with 121 additions and 37 deletions

View File

@ -313,7 +313,7 @@
</ArmAdsMisc>
<Cads>
<interw>1</interw>
<Optim>2</Optim>
<Optim>6</Optim>
<oTime>0</oTime>
<SplitLS>0</SplitLS>
<OneElfS>1</OneElfS>
@ -332,7 +332,7 @@
<v6LangP>3</v6LangP>
<vShortEn>1</vShortEn>
<vShortWch>1</vShortWch>
<v6Lto>0</v6Lto>
<v6Lto>1</v6Lto>
<v6WtE>0</v6WtE>
<v6Rtti>0</v6Rtti>
<VariousControls>
@ -840,11 +840,6 @@
<FileType>1</FileType>
<FilePath>..\pikascript\pikascript-core\PikaObj.c</FilePath>
</File>
<File>
<FileName>method.c</FileName>
<FileType>1</FileType>
<FilePath>..\pikascript\pikascript-core\method.c</FilePath>
</File>
<File>
<FileName>dataStrs.c</FileName>
<FileType>1</FileType>
@ -885,11 +880,6 @@
<FileType>1</FileType>
<FilePath>..\pikascript\pikascript-core\BaseObj.c</FilePath>
</File>
<File>
<FileName>pikaPlatform.c</FileName>
<FileType>1</FileType>
<FilePath>..\pikascript\pikascript-core\pikaPlatform.c</FilePath>
</File>
<File>
<FileName>dataQueue.c</FileName>
<FileType>1</FileType>
@ -915,6 +905,11 @@
<FileType>1</FileType>
<FilePath>..\pikascript\pikascript-core\dataStack.c</FilePath>
</File>
<File>
<FileName>PikaPlatform.c</FileName>
<FileType>1</FileType>
<FilePath>..\pikascript\pikascript-core\PikaPlatform.c</FilePath>
</File>
</Files>
</Group>
<Group>

View File

@ -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

View File

@ -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)

View File

@ -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();

View File

@ -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;
}

View File

@ -1,6 +1,7 @@
#ifndef __PIKA_PALTFORM__H
#define __PIKA_PALTFORM__H
#include <stdlib.h>
#include <stdint.h>
#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

View File

@ -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;
}