2012年1月10日 星期二

[Embedded] Cortex M3 上的第一個程式


以下介紹如何在Cortex M3上,開發一個簡單程式

軟體:
Ø  使用Keli Evaluation Kit

硬體:(若沒有硬體,可先用simulator模擬執行)
Ø  開發產品時所使用的是Luminary Micro公司生產,型號為LM3S3748的微控制器,此晶片規格如下:
² Cortex-M3 based Microcontroller:
u  50MHz, 128KB Flash ROM, 64KB SRAM, MPU
u  4 Timers
u  8 Motion Control PWM
u  8 Capture Compare Pins
u  USB HOST
u  2 * UART
u  2 * I2C
u  2 * SSI
u  1 * QEI
u  8 * 10-bit ADC
u  Temperature Sensor
u  2 * Analog Comparator
u  61 GPIO Pins
u  Battery-backed Hibernation Module
u  Watchdog Timer, Power saving modes,
u  JTAG and Serial Wire debug


實作步驟:

1.       執行 Keli uVision4

2.       選擇 [Project] -> [New uVision Project],選擇要放專案檔案的路徑。

3.       選擇要執行的硬體平台,此時選擇 Luminary Micro出廠的 LM3S811,接著畫面會詢問是否要使用預設的Startup Code (startup.s),選擇。此時便會生成一個專案,並且已經寫好Startup Code

4.       接著,在此專案中加入一個簡單的小程式。步驟為 [File] –> [New],並且加入下列程式碼,將檔案存成 hello.c
#include "stdio.h"
int main(void)
{
   printf("Hello!\n");
   while(1);
}

5.       按下F7,開始編譯Image,編譯成功後的log如下,這個程式共佔了3404Bytes
Build target 'Target 1'
compiling hello.c...
linking...
Program Size: Code=3404 RO-data=44 RW-data=12 ZI-data=596 
"C121A-OSD.axf" - 0 Error(s), 0 Warning(s).

6.       根據此專案的linker option,可以得知解此程式的空間配置方式,0x000000000x20000000放置RO資料,0x20000000之後放置RW資料。並且第一個將會執行的程式進入點為Reset_Handler
--cpu Cortex-M3 *.o
--ro-base 0x00000000 --entry 0x00000000
--rw-base 0x20000000
--entry Reset_Handler
--first __Vectors --strict --autoat --summary_stderr --info summarysizes --map --xref --callgraph --symbols --info sizes --info totals --info unused --info veneers

參考Startup.s得知Reset_Handler所作的事情主要有三:
Ø   .dataFlash複製到 SRAM (若不清楚.data, .bss等觀念,請參考ELF)
Ø   .bss 區域清空
Ø   呼叫 main() 函數,開始執行使用者所寫的程式。

7.       執行程式,利用 simulator 執行程式。
TI所提供燒錄image的程式需要使用 .bin 檔案格式,因此當作好了 .axf 檔案之後,需要轉換檔案格式,可以手動執行下列命令,或是在[project] -> [option]中的User欄位設定編譯完成後需執行下列命令。
fromelf --bin --output .\C121A-OSD.bin .\C121A-OSD.axf

        編譯成功後的log如下
Build target 'Target 1'
linking...
Program Size: Code=440 RO-data=32 RW-data=4 ZI-data=260 
User command #1: fromelf --bin --output .\C121A-OSD.bin .\C121A-OSD.axf
"C121A-OSD.axf" - 0 Error(s), 0 Warning(s).

8.       如果沒有開發用的硬體,也可以先使用simulator的方式,看看程式是否能夠如預期運作。
設定的方式是選擇 [project] -> [option] -> [debug] -> [simulator]


注意:
Ø   使用Keli Evaluation Kit建立的專案,只能當做練習。若要開發商業化的產品,則需要購買Keli產品。或是自己撰寫startup code
Ø   測試時發現程式執行結果不會顯示任何畫面,因為此環境下printf()會呼叫fputc(),而fputc()並沒有實作,以下是使用keli設定中斷點所看到的組語
0x00000122 F000F817  BL.W     __I$use$semihosting$fputc (0x00000154)
此牽涉到 semihost 的觀念,後續再聊。