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 中:

_images/160849244-40fe7fa8-0e93-4791-8f14-bc044bbd0d59.png

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 内存管理算法

10.1.3.2. 示例代码: