mirror of
https://gitee.com/Lyon1998/pikapython.git
synced 2025-02-05 17:28:23 +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>
|
</ArmAdsMisc>
|
||||||
<Cads>
|
<Cads>
|
||||||
<interw>1</interw>
|
<interw>1</interw>
|
||||||
<Optim>2</Optim>
|
<Optim>6</Optim>
|
||||||
<oTime>0</oTime>
|
<oTime>0</oTime>
|
||||||
<SplitLS>0</SplitLS>
|
<SplitLS>0</SplitLS>
|
||||||
<OneElfS>1</OneElfS>
|
<OneElfS>1</OneElfS>
|
||||||
@ -332,7 +332,7 @@
|
|||||||
<v6LangP>3</v6LangP>
|
<v6LangP>3</v6LangP>
|
||||||
<vShortEn>1</vShortEn>
|
<vShortEn>1</vShortEn>
|
||||||
<vShortWch>1</vShortWch>
|
<vShortWch>1</vShortWch>
|
||||||
<v6Lto>0</v6Lto>
|
<v6Lto>1</v6Lto>
|
||||||
<v6WtE>0</v6WtE>
|
<v6WtE>0</v6WtE>
|
||||||
<v6Rtti>0</v6Rtti>
|
<v6Rtti>0</v6Rtti>
|
||||||
<VariousControls>
|
<VariousControls>
|
||||||
@ -840,11 +840,6 @@
|
|||||||
<FileType>1</FileType>
|
<FileType>1</FileType>
|
||||||
<FilePath>..\pikascript\pikascript-core\PikaObj.c</FilePath>
|
<FilePath>..\pikascript\pikascript-core\PikaObj.c</FilePath>
|
||||||
</File>
|
</File>
|
||||||
<File>
|
|
||||||
<FileName>method.c</FileName>
|
|
||||||
<FileType>1</FileType>
|
|
||||||
<FilePath>..\pikascript\pikascript-core\method.c</FilePath>
|
|
||||||
</File>
|
|
||||||
<File>
|
<File>
|
||||||
<FileName>dataStrs.c</FileName>
|
<FileName>dataStrs.c</FileName>
|
||||||
<FileType>1</FileType>
|
<FileType>1</FileType>
|
||||||
@ -885,11 +880,6 @@
|
|||||||
<FileType>1</FileType>
|
<FileType>1</FileType>
|
||||||
<FilePath>..\pikascript\pikascript-core\BaseObj.c</FilePath>
|
<FilePath>..\pikascript\pikascript-core\BaseObj.c</FilePath>
|
||||||
</File>
|
</File>
|
||||||
<File>
|
|
||||||
<FileName>pikaPlatform.c</FileName>
|
|
||||||
<FileType>1</FileType>
|
|
||||||
<FilePath>..\pikascript\pikascript-core\pikaPlatform.c</FilePath>
|
|
||||||
</File>
|
|
||||||
<File>
|
<File>
|
||||||
<FileName>dataQueue.c</FileName>
|
<FileName>dataQueue.c</FileName>
|
||||||
<FileType>1</FileType>
|
<FileType>1</FileType>
|
||||||
@ -915,6 +905,11 @@
|
|||||||
<FileType>1</FileType>
|
<FileType>1</FileType>
|
||||||
<FilePath>..\pikascript\pikascript-core\dataStack.c</FilePath>
|
<FilePath>..\pikascript\pikascript-core\dataStack.c</FilePath>
|
||||||
</File>
|
</File>
|
||||||
|
<File>
|
||||||
|
<FileName>PikaPlatform.c</FileName>
|
||||||
|
<FileType>1</FileType>
|
||||||
|
<FilePath>..\pikascript\pikascript-core\PikaPlatform.c</FilePath>
|
||||||
|
</File>
|
||||||
</Files>
|
</Files>
|
||||||
</Group>
|
</Group>
|
||||||
<Group>
|
<Group>
|
||||||
|
@ -62,10 +62,10 @@ void STM32_Code_flashHandler() {
|
|||||||
printf("[info]: Programing... \r\n");
|
printf("[info]: Programing... \r\n");
|
||||||
HAL_FLASH_Unlock();
|
HAL_FLASH_Unlock();
|
||||||
/* Get the 1st page to erase */
|
/* 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 */
|
/* 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*/
|
/* Fill EraseInit structure*/
|
||||||
EraseInitStruct.TypeErase = FLASH_TYPEERASE_PAGES;
|
EraseInitStruct.TypeErase = FLASH_TYPEERASE_PAGES;
|
||||||
@ -81,7 +81,7 @@ void STM32_Code_flashHandler() {
|
|||||||
printf("[ OK ]: Erase flash ok! \r\n");
|
printf("[ OK ]: Erase flash ok! \r\n");
|
||||||
|
|
||||||
printf("[info]: Writing flash... \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;
|
uint32_t writeAddress = 0;
|
||||||
uint64_t writeData64 = 0;
|
uint64_t writeData64 = 0;
|
||||||
while (writeAddress < codeHeap.size + 1) {
|
while (writeAddress < codeHeap.size + 1) {
|
||||||
@ -104,7 +104,7 @@ void STM32_Code_flashHandler() {
|
|||||||
HAL_FLASH_Lock();
|
HAL_FLASH_Lock();
|
||||||
printf("[ OK ]: Write flash ok! \r\n");
|
printf("[ OK ]: Write flash ok! \r\n");
|
||||||
|
|
||||||
baseAddress = FLASH_CODE_START_ADDR;
|
baseAddress = FLASH_SCRIPT_START_ADDR;
|
||||||
MemoryProgramStatus = 0x0;
|
MemoryProgramStatus = 0x0;
|
||||||
|
|
||||||
printf("[info]: Checking flash... \r\n");
|
printf("[info]: Checking flash... \r\n");
|
||||||
@ -136,4 +136,68 @@ void STM32_Code_flashHandler() {
|
|||||||
printf("\r\n");
|
printf("\r\n");
|
||||||
HAL_NVIC_SystemReset();
|
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
|
#endif
|
@ -44,11 +44,12 @@
|
|||||||
|
|
||||||
#define RX_BUFF_LENGTH 64
|
#define RX_BUFF_LENGTH 64
|
||||||
|
|
||||||
#define FLASH_CODE_START_ADDR \
|
#define FLASH_SCRIPT_START_ADDR (FLASH_BASE + ((FLASH_PAGE_NB - 1) * FLASH_PAGE_SIZE))
|
||||||
(FLASH_BASE + \
|
#define FLASH_SCRIPT_END_ADDR (FLASH_BASE + FLASH_SIZE - 1)
|
||||||
((FLASH_PAGE_NB - 1) * FLASH_PAGE_SIZE)) /* Start @ of user Flash area */
|
|
||||||
#define FLASH_USER_END_ADDR \
|
#define FLASH_PIKA_ASM_START_ADDR (FLASH_BASE + ((FLASH_PAGE_NB - 2) * FLASH_PAGE_SIZE))
|
||||||
(FLASH_BASE + FLASH_SIZE - 1) /* End @ of user Flash area */
|
#define FLASH_PIKA_ASM_END_ADDR (FLASH_BASE + ((FLASH_PAGE_NB - 1) * FLASH_PAGE_SIZE))
|
||||||
|
|
||||||
uint32_t GetPage(uint32_t Addr);
|
uint32_t GetPage(uint32_t Addr);
|
||||||
#define DATA_64 ((uint64_t)0x1234567812345678)
|
#define DATA_64 ((uint64_t)0x1234567812345678)
|
||||||
#define DATA_32 ((uint32_t)0x12345678)
|
#define DATA_32 ((uint32_t)0x12345678)
|
||||||
|
@ -96,7 +96,7 @@ int main(void) {
|
|||||||
SCB->VTOR = FLASH_BASE | 0x2000;
|
SCB->VTOR = FLASH_BASE | 0x2000;
|
||||||
__enable_irq();
|
__enable_irq();
|
||||||
|
|
||||||
char* code = (char*)FLASH_CODE_START_ADDR;
|
char* code = (char*)FLASH_SCRIPT_START_ADDR;
|
||||||
uint16_t codeOffset = 0;
|
uint16_t codeOffset = 0;
|
||||||
if (code[0] == 'i') {
|
if (code[0] == 'i') {
|
||||||
/* boot from flash */
|
/* boot from flash */
|
||||||
@ -104,22 +104,10 @@ int main(void) {
|
|||||||
obj_run(pikaMain, "uart = STM32.UART()");
|
obj_run(pikaMain, "uart = STM32.UART()");
|
||||||
obj_run(pikaMain, "uart.init()");
|
obj_run(pikaMain, "uart.init()");
|
||||||
obj_run(pikaMain, "uart.setId(1)");
|
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, "uart.enable()");
|
||||||
obj_run(pikaMain, "print('[info]: boot from flash.')");
|
obj_run(pikaMain, "print('[info]: boot from flash.')");
|
||||||
while (1) {
|
obj_run(pikaMain, code);
|
||||||
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, "");
|
|
||||||
} else {
|
} else {
|
||||||
/* boot from firmware */
|
/* boot from firmware */
|
||||||
pikaMain = pikaScriptInit();
|
pikaMain = pikaScriptInit();
|
||||||
|
@ -27,3 +27,13 @@ PIKA_WEAK void __platformPrintf(char* fmt, ...) {
|
|||||||
vprintf(fmt, args);
|
vprintf(fmt, args);
|
||||||
va_end(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
|
#ifndef __PIKA_PALTFORM__H
|
||||||
#define __PIKA_PALTFORM__H
|
#define __PIKA_PALTFORM__H
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
|
#include <stdint.h>
|
||||||
|
|
||||||
#if defined(__CC_ARM) || defined(__CLANG_ARM) /* ARM Compiler */
|
#if defined(__CC_ARM) || defined(__CLANG_ARM) /* ARM Compiler */
|
||||||
#define PIKA_WEAK __attribute__((weak))
|
#define PIKA_WEAK __attribute__((weak))
|
||||||
@ -16,4 +17,7 @@ void __platformFree(void* ptr);
|
|||||||
void __platformEnableIrqHandle();
|
void __platformEnableIrqHandle();
|
||||||
void __platformDisableIrqHandle();
|
void __platformDisableIrqHandle();
|
||||||
|
|
||||||
|
char* __platformLoadPikaAsm();
|
||||||
|
int32_t __platformSavePikaAsm(char *PikaAsm);
|
||||||
|
|
||||||
#endif
|
#endif
|
24
src/PikaVM.c
24
src/PikaVM.c
@ -370,11 +370,33 @@ nextLine:
|
|||||||
return nextAddr;
|
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* pikaVM_run(PikaObj* self, char* multiLine) {
|
||||||
Args* buffs = New_strBuff();
|
Args* buffs = New_strBuff();
|
||||||
char* pikaAsm = pikaParseMultiLineToAsm(buffs, multiLine);
|
char* pikaAsm = pikaParseMultiLineToAsm(buffs, multiLine);
|
||||||
|
if (strCountSign(multiLine,'\n') > 1){
|
||||||
|
pikaAsm = useFlashAsBuff(pikaAsm, buffs);
|
||||||
|
}
|
||||||
Args* sysRes = pikaVM_runAsm(self, pikaAsm);
|
Args* sysRes = pikaVM_runAsm(self, pikaAsm);
|
||||||
args_deinit(buffs);
|
if (NULL != buffs){
|
||||||
|
args_deinit(buffs);
|
||||||
|
}
|
||||||
return sysRes;
|
return sysRes;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user