三、PikaScript移植
rt-thread 和 pikascript都支持交互式运行,因此必须先增加串口输入方法。
1、增加rx端口定义
2、端口初始化
3、UART_PrintfInit 串口初始化中增加rx使能
4、增加串口接收函数实现
static void UsartRxErrProcess(void)
{
if (Set == USART_GetStatus(BSP_PRINTF_DEVICE, UsartFrameErr))
{
USART_ClearStatus(BSP_PRINTF_DEVICE, UsartFrameErr);
}
if (Set == USART_GetStatus(BSP_PRINTF_DEVICE, UsartParityErr))
{
USART_ClearStatus(BSP_PRINTF_DEVICE, UsartParityErr);
}
if (Set == USART_GetStatus(BSP_PRINTF_DEVICE, UsartOverrunErr))
{
USART_ClearStatus(BSP_PRINTF_DEVICE, UsartOverrunErr);
}
}
char __platform_getchar(){
char res = 0;
while(Set!= USART_GetStatus(BSP_PRINTF_DEVICE, UsartRxNoEmpty)) /* Warit Rx data register no empty */
{
UsartRxErrProcess();
rt_thread_mdelay(10);
};
return (char)USART_RecData(BSP_PRINTF_DEVICE);
}
char rt_hw_console_getchar(void)
{
/* Note: the initial value of ch must < 0 */
int ch = -1;
return __platform_getchar();
}
5、编译运行,使用putty,链接对应的串口,按回车健,控制台切换到下一行
6、在工程文件夹下新建文件夹pikascript,并把pikaPackage.exe 和 requestment.txt复制到目录中。requestment.txt 文件定义了需要的版本号,然后运行exe
7、在工程中添加相应的目录
8、在目录中添加文件
pikascript的core和lib目录中所有文件添加到相应目录
9、接下来编写 pikascript 运行的 python 脚本,我们在 pikascript 文件夹新建一个 main.py 文件。
然后写入:
import PikaStdLib print('hello PikaScript!')
其中import PikaStdLib
表示导入标准库,标准库是必须要导入的,即使没有直接用到,而print('hello PikaScript!')
用于测试pikascript是否正常启动。
10、 接下来运行 rust-msc-latest-win10.exe,将 main.py 和导入的模块预编译为 pikascript 的 api 文件,预编译后的文件在 pikascript-api 文件夹内。
我们打开 pikascript-api 文件夹,发现里面有一些 .c 和 .h 文件,就说明预编译是成功的,pikascript 预编译器可以把 python 模块预编译为 .c 和 .h 文件。
11、pikascript-api目录中添加目录下的源文件
12、调整引用目录
13、调整堆栈
打开工程的启动文件, 在 stm32 中, 这是一个 startup_stm32xxxx.s 的文件,而在其他平台上,你要自己弄清楚如何调整堆栈。
建议分配 4K 的栈空间和 16K 的堆空间,最少也需要分配 1K 的栈空间和 4K 的堆空间
4K 栈空间对应 0x1000, 16K 堆空间对应 0x4000,如下图所示
14、添加控制台的pika启动入口
PikaObj *pikaMain = 0;
uint8_t pika_is_inited = 0;
static void pikascript_rt_init(void *parameter){
rt_kprintf("------------------------------------------------------------------\r\n");
rt_kprintf("| |\r\n");
rt_kprintf("| ____ _ __ _____ _ __ |\r\n");
rt_kprintf("| / __ \\ (_) / /__ ____ _ / ___/ _____ _____ (_) ____ / /_ |\r\n");
rt_kprintf("| / /_/ // / / //_// __ `/ \\__ \\ / ___// ___// / / __ \\ / __/ |\r\n");
rt_kprintf("| / ____// / / ,< / /_/ / ___/ // /__ / / / / / /_/ // /_ |\r\n");
rt_kprintf("| /_/ /_/ /_/|_| \\__,_/ /____/ \\___//_/ /_/ / .___/ \\__/ |\r\n");
rt_kprintf("| /_/ |\r\n");
rt_kprintf("| PikaScript - An Ultra Lightweight Python Engine |\r\n");
rt_kprintf("| |\r\n");
rt_kprintf("| [ https://github.com/pikastech/pikascript ] |\r\n");
rt_kprintf("| [ https://gitee.com/lyon1998/pikascript ] |\r\n");
rt_kprintf("| |\r\n");
rt_kprintf("------------------------------------------------------------------\r\n");
pikaMain = pikaScriptInit();
pika_is_inited = 1;
}
static void pikascript_entry(void *parameter){
if(!pika_is_inited){
pikascript_rt_init(NULL);
}
pikaScriptShell(pikaMain);
}
static int pika_main(int argc, char *argv[]){
pikascript_entry(NULL);
return 0;
}
MSH_CMD_EXPORT_ALIAS(pika_main, pika, run PikaScript);
15、编译运行,在控制台输入pika按回车
修改宏定义增加finsh的栈空间 不然很容易溢出, #define FINSH_THREAD_STACK_SIZE 4096