mirror of
https://gitee.com/Lyon1998/pikapython.git
synced 2025-01-29 17:22:56 +08:00
update Core STM32 package and STM32Booter to support flash buffer for
asm
This commit is contained in:
parent
51eaeced1c
commit
30110a8d58
@ -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>
|
||||
|
@ -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
|
@ -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)
|
||||
|
@ -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();
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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
|
24
src/PikaVM.c
24
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;
|
||||
}
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user