python解釈器実装とその組み込み応用:解釈器移植
9781 ワード
概要
micropython:Micropythonの構文の特徴、現在のアプリケーションプラットフォーム、linuxでの試用について説明し、コンパイルしました.この記事では、Micropython解釈器をexynos 4412プラットフォームに移植してreplを実行する方法について説明します.
1-1知識備蓄
最終的な実行のreplインタフェースは以下の通りです.
LANDROVER # mmc read 40000000 1800 400
MMC read: dev # 0, block # 6144, count 1024 ... 1024 blocks read: OK
LANDROVER # go 40000000
## Starting application at 0x40000000 ...
Hello, Micropython,
MicroPython v1.8.6 on 2017-01-11; minimal with exynos4412
Type "help()" for more information.
>>> A=["hello", 1, -10]
took 0 ms
qstr:
n_pool=1
n_qstr=2
n_str_data_bytes=12
n_total_bytes=60
GC: total: 1984, used: 368, free: 1616
No. of 1-blocks: 4, 2-blocks: 4, max blk sz: 8, max free sz: 55
GC: total: 1984, used: 368, free: 1616
No. of 1-blocks: 4, 2-blocks: 4, max blk sz: 8, max free sz: 55
>>> A[0]
'hello'
に移植プロセス
2-1コード選択
開発のサンプルコードとしてmininalを選択し,bare-armを考えていたが,bare-armはシリアルサポートもmallocメカニズムもなく,まったく使用できないため,ワークロードを考慮してminimalを初回試みとした方がよい.
2-2起動コード実装
minimalのmain.cファイルが実現しました_start関数は、stm 32ハードウェアを初期化するために使用され、ハードウェア関連のデバッグ時間を節約するために、ubootを直接利用しました.ubootが起動するとexynos 4412のクロック、dramコントローラなどの重要な部分が初期化されているからです.起動コードは最終的に
.global _start
_start:
//disable watch dog
ldr r0, =0x10060000
mov r1, #0
str r1, [r0]
//turn on icache
mrc p15, 0, r0, c1, c0, 0
//bic r0, r0, #0x00002300 /* clear bits 13, 9:8 (--V- --RS) */
//bic r0, r0, #0x00000087 /* clear bits 7, 2:0 (B--- -CAM) */
//orr r0, r0, #0x00000002 /* set bit 2 (A) Align */
//orr r0, r0, #0x00001000 /* set bit 12 (I) I-Cache */
#ifdef CONFIG_SYS_ICACHE_OFF
// clear bit 12 (I) I-cache
bic r0, r0, #0x00001000
#else
// set bit 12 (I) I-cache
orr r0, r0, #0x00001000
#endif
mcr p15, 0, r0, c1, c0, 0
//mcr p15, 0, r0, c7, c5, 0 @ invalidate icache
//set stack
ldr sp, =0x41000000
bl main
loop:
bl loop
halt:
b halt
2-3命令セット互換性
Micropythonはthumb命令セットを使用しています.pythonは最終的にバイトストリームにコンパイルされるため、理解しやすいです.対応するコンパイラ構成を行うには、ubootも含めて変更します.参考知識備蓄の第1条.
2.4メモリ分散の変更
flashを使用していないため、リンクスクリプトをdramに直接マッピングします.ここでは、最初の16 MBをマッピングします.コード・セグメントの例は次のとおりです.
OUTPUT_FORMAT("elf32-littlearm", "elf32-littlearm", "elf32-littlearm")
OUTPUT_ARCH(arm)
ENTRY(_start)
/* Specify the memory areas */
MEMORY
{
RAM (xrw) : ORIGIN = 0x40000000, LENGTH = 0x1000000
}
/* top end of the stack */
_estack = ORIGIN(RAM) + LENGTH(RAM);
/* define output sections */
SECTIONS
{
. = ORIGIN(RAM);
.text :
{
. = ALIGN(4);
build/start.o (.text*)
KEEP(*(.isr_vector)) /* isr vector table */
*(.text) /* .text sections (code) */
*(.text*) /* .text* sections (code) */
*(.rodata) /* .rodata sections (constants, strings, etc.) */
*(.rodata*) /* .rodata* sections (constants, strings, etc.) */
. = ALIGN(4);
_etext = .; /* define a global symbol at end of code */
_sidata = _etext; /* This is used by the startup in order to initialize the .data secion */
} >RAM
...
}
2.5インタフェース
uart_の変更core.cファイル、レジスタ互換性をよくします.同様の変更は受信関数を送信すればよい.
#if MICROPY_MIN_USE_EXYNOS4412
/* baudrate rest value */
union br_rest {
unsigned short slot; /* udivslot */
unsigned char value; /* ufracval */
};
typedef struct {
uint32_t ulcon;
uint32_t ucon;
uint32_t ufcon;
uint32_t umcon;
uint32_t utrstat; // 0x10
uint32_t uerstat;
uint32_t ufstat;
uint32_t umstat;
uint8_t utxh; // 0x20
uint8_t res1[3];
uint8_t urxh;
uint8_t res2[3];
uint32_t ubrdiv; // 0x28
union br_rest rest;
uint8_t res3[0xffd0];
} periph_uart_t;
#define SAMSUNG_UART2 ((periph_uart_t*)0x13820000)
#endif
三総括と展望
今回の開発は月曜日から水曜日まで3日間ほどかかりました.知識に比べて、考え方が最も重要で、最近alphogoがmaster連戦60名の中日韓囲碁界の達人になったのを見て、実は人の思考が実はとても限られていることを証明するのに十分です.今多くの面接者はxxxを知っていると聞かれますが、実は知らなくても大丈夫です.肝心なのは知らない状況でどのように未知の問題を発見し、徐々に解決することができるかです.これが一番大切です.最近また友达と仕事の问题を交流して、私は発表した観点は:実は人と人の间の知能の上の格差は仕事に対する影响はそんなに大きくありません.本当に影響する要素は実はシステムの合理的な訓練を受ける程度である.多くの優秀な表現をしている人は、意図的にも無意識にもシステム的な訓練を受けてこそ、仕事でより優れた表現をすることができます.それに、現代社会は実は反知的社会だと思います.タバコを吸ったり、お酒を飲んだり、トランプをしたりしても、いろいろなアナウンサー、フィットネスの達人などを混ぜることができます.次に、その上でもっと自分のideaを実現したいと思います.より多くの挑戦を迎える準備ができています.