python解釈器実装とその組み込み応用:解釈器移植

9781 ワード

  • の概要
  • 1-1知識備蓄
  • -2成果展示
  • 二移植プロセス
  • 2 2-1コード選択
  • 2-2起動コード実装
  • -3命令セット互換
  • 4メモリ分散を変更する
  • 5インターフェース
  • 三総括と展望

  • 概要
    micropython:Micropythonの構文の特徴、現在のアプリケーションプラットフォーム、linuxでの試用について説明し、コンパイルしました.この記事では、Micropython解釈器をexynos 4412プラットフォームに移植してreplを実行する方法について説明します.
    1-1知識備蓄
  • arm gccコンパイラに関する知識
  • リンクスクリプトに関する知識
  • Makefileに関する知識は、『GNU make中国語マニュアル』
  • 参照
  • Exynos 4412ハードウェア、特にuartおよびmemマッピングは、Exynos 4412クロックモジュールおよびUARTクロック構成およびチップマニュアルを参照することができる.
  • bootに関する知識:Exynos 4412 u-bootデバッグおよびExynos 4412 sdカード起動uboot
  • Micropythonのコード構造:micropython:紹介とコンパイル
  • 1-2成果展示
    最終的な実行の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を実現したいと思います.より多くの挑戦を迎える準備ができています.