分享到plurk 分享到twitter 分享到facebook

版本 2671f83b26396fcd6117201eaa0efb1867f0c852

embedded/Lab36

Changes from 2671f83b26396fcd6117201eaa0efb1867f0c852 to 586de04d11a0236b8d29efe5feed6b2659d4ec4e

---
title: Lab36: ELF
toc: no
...

預期目標
-------------
* 在 `STM32F429i Discovery</embedded/STM32F429>`_ 開發簡易 ELF loader
* 學習 OpenOCD 和 gdb
* 複習 `Week #7: ELF</embedded/2014q3w7>`_ 學習進度

預先準備
------------
* 確認 ``$PATH`` 可找到 `Lab 35</embedded/Lab35>`_ 設定的 GNU Toolchain
  - ``arm-none-eabi-gcc -v`` 預期輸出 ``4.8.3-11ubuntu1`` 一類包含 ubuntu 的字串
  - 若否,請重新設定 PATH 環境變數

* 確認 `STM32F429i Discovery</embedded/STM32F429>`_ 板子已經由 USB 線接上裝有 GNU/Linux 的開發環境,並確保 `Lab 35</embedded/Lab35>`_ 所提及的工具均已正確安裝,如 openocd 與 gdb

取得 ELF loader 並在 STM32 驗證
--------------------------------------------
* ``cd workspace`` # 假設工作目錄為 ``workspace``
* ``git clone https://github.com/embedded2014/elf-loader.git && elf-loader``
* 開啟兩個虛擬終端機,在其中一個終端機執行以下 ``make openocd``,預期輸出為

.. code-block:: prettyprint

     CC main.c
     CC start.c
     LINK app.elf
       text	   data	    bss	    dec	    hex	filename
        164	      8	      4	    176	     b0	app.elf
     Creating list...
     ...
     Launch OpenOCD for stm32f4discovery
     Open On-Chip Debugger 0.9.0-dev-00105-ge1bc7f4 (2014-08-08-20:38)
     ...

* 在另外一個終端機執行 ``make run``
  - ``cd workspace/elf-loader && make run``

* 切換到原本執行 OpenOCD 的視窗,可見到以下輸出 (請保持耐心)

.. code-block:: prettyprint

    ELF: Scan ELF indexs...
    ELF: Examining section 1 .text
    ELF: Examining section 2 .rel.text
    ELF: Examining section 3 .rodata
    ...
    ELF: Examining section 11 .symtab
    ELF: Examining section 12 .strtab
    ELF: Done
    ELF: Relocating section .text
    ELF:  Offset   Info     Type             Name
    ELF:  00000034 00001202 R_ARM_ABS32      i
    ...
    ELF: Relocating section .rodata
    ELF:  Offset   Info     Type             Name
    ELF:  00000038 00001502 R_ARM_ABS32      banner
    ...
    ELF:   symAddr=20000F48 relAddr=20000F8C
    ELF:   R_ARM_ABS32 relocated is 0x20000F54
    Hello world on Oct 30 2014 at 17:28:11 (0)
    ...
    Done
    semihosting: *** application exited ***

* 看到 ``Hello world`` 字樣出現 10 次,表示 ``app/main.c`` 編譯與連結出來的 ``app-striped.elf`` 已正確載入並執行

參考作業要求
-----------------
* 擴充 `Lab 35 STM32F429</embedded/Lab35>`_ 作業的 `freertos-stm32<https://github.com/embedded2014/freertos-stm32>`_,允許在執行時期透過 OpenOCD,從 host 端載入 ELF 執行檔 (可視為遊戲程式的 plugin) 並執行 
* 整合 `Lab 32</embedded/Lab32>`_ 開發的檔案系統與 shell,除了 ``ls`` 和``cat`` 命令外,額外提供 ``exec`` 命令

繳交作業
-------------
* 截止日期
  - Nov 8, 2014 (含) 之前

* 更新作業提案到共筆網站: `Lab 36 / 作業共筆<https://embedded2014.hackpad.com/2014q3-Week-7-lzIBL1fkunQ>`_,需要標注自己的 ID
  - 將符合作業提案的程式碼,提交到自行 fork 的 `freertos-stm32<https://github.com/embedded2014/freertos-stm32>`_

參考資料
------------
* `BeagleBoard OpenOCD<http://elinux.org/BeagleBoardOpenOCD>`_
* `GDB and OpenOCD<http://openocd.sourceforge.net/doc/html/GDB-and-OpenOCD.html>`_
* `Anatomy of Linux dynamic libraries<http://www.ibm.com/developerworks/library/l-dynamic-libraries/>_