10.1. PikaPython 配置手册
10.1.1. 何时需要配置
PikaPython 本身是 免配置 的,所以通常情况下 不需要 了解这部分内容。
当你有以下的需求时,则可以考虑配置 PikaPython:
更快的速度
更小的内存占用
替换依赖项( libc, pinrtf 等)
替换内存管理算法( malloc )
更安全的中断保护
10.1.2. 优化配置
[注意]:进行优化配置,需要内核版本不低于 v1.5.4
类似 GCC, PikaPython 也提供了不同的优化模式,目前可以使用的优化模式有:
PIKA_OPTIMIZE_SIZE
体积模式 最小化运行内存PIKA_OPTIMIZE_SPEED
性能模式 最大化运行速度
10.1.2.1. 启用用户配置
默认不启用用户配置,启用用户配置的方式为添加编译时宏定义 PIKA_CONFIG_ENABLE
。然后创建 pika_config.h
头文件。
需要注意的是, PIKA_CONFIG_ENABLE
宏要添加在编译选项中,例如 keil 中:
10.1.2.2. 配置项
可用的配置项和默认的配置在 pika_config_valid.h
头文件中。
https://gitee.com/Lyon1998/pikapython/blob/master/src/pika_config_valid.h
截取重要的部分进行说明:
/* optimize options */
#define PIKA_OPTIMIZE_SIZE 0
#define PIKA_OPTIMIZE_SPEED 1
/* syntax support level */
#define PIKA_SYNTAX_LEVEL_MINIMAL 0
#define PIKA_SYNTAX_LEVEL_MAXIMAL 1
/* use user config */
#ifdef PIKA_CONFIG_ENABLE
#include "pika_config.h"
#endif
/* default optimize */
#ifndef PIKA_OPTIMIZE
#define PIKA_OPTIMIZE PIKA_OPTIMIZE_SIZE
#endif
/* default syntax support level */
#ifndef PIKA_SYNTAX_LEVEL
#define PIKA_SYNTAX_LEVEL PIKA_SYNTAX_LEVEL_MAXIMAL
#endif
...
/* default configuration */
#ifndef PIKA_STACK_BUFF_SIZE
#define PIKA_STACK_BUFF_SIZE 256
#endif
default configuration
是配置项的默认值,当 PIKA_CONFIG_ENABLE
宏被定义后,pika_config_valid.h
会引入 pika_config.h
,因此用户可以在 pika_config.h
中覆盖上面的默认配置。
例如,如果想要将增大 PikaPython 虚拟机的运行时栈,则可以在 pika_config.h
中写入
#define PIKA_STACK_BUFF_SIZE 512
从 pika_config_valid.h
中可以看到,PikaPython 的默认优化选项 PIKA_OPTIMIZE
的值是 PIKA_OPTIMIZE_SIZE
,如果需要切换到 speed 优化,则可以在 pika_config.h
中写入
#define PIKA_OPTIMIZE PIKA_OPTIMIZE_SPEED
10.1.2.3. 示例代码
https://gitee.com/Lyon1998/pikapython/blob/master/bsp/stm32g070cb/Booter/pika_config.h
10.1.3. 依赖项配置
可以通过创建 pika_config.c
,重写 PikaPlagform.h 里面的弱函数来配置 PikaPython 的依赖项。
/* interrupt config */
void __platform_enable_irq_handle(void);
void __platform_disable_irq_handle(void);
/* printf family config */
#ifndef __platform_printf
void __platform_printf(char* fmt, ...);
#endif
int __platform_sprintf(char* buff, char* fmt, ...);
int __platform_vsprintf(char* buff, char* fmt, va_list args);
int __platform_vsnprintf(char* buff,
size_t size,
const char* fmt,
va_list args);
/* libc config */
void* __platform_malloc(size_t size);
void __platform_free(void* ptr);
void* __platform_memset(void* mem, int ch, size_t size);
void* __platform_memcpy(void* dir, const void* src, size_t size);
/* pika memory pool config */
void __platform_wait(void);
uint8_t __is_locked_pikaMemory(void);
/* support shell */
char __platform_getchar(void);
/* file API */
FILE* __platform_fopen(const char* filename, const char* modes);
int __platform_fclose(FILE* stream);
size_t __platform_fwrite(const void* ptr, size_t size, size_t n, FILE* stream);
/* error */
void __platform_error_handle(void);
10.1.3.1. 配置项:
中断保护 —— 提供中断总开关,保护PikaScript内存安全
libC —— 选择libC的实现
内存管理 —— 替换 malloc free 内存管理算法