開發紀錄(A)
 
經過好幾天的亂看之後決定重新寫一篇比較跟作業相關的整理
 
首先是作業要求

作業要求 (A)

  • 安裝和設定 QEMU
  • 依據指示,將 00-Semihosting, 00-HelloWorld, …, 07-Threads 均實際測試並研讀程式碼
  • 在 github 上 fork mini-arm-os,並修改 07-Threads (不要增加新的目錄!),提供基本的 shell,然後能夠用新建立的 thread 計算 fibonacci 數列
  • shell 程式碼可參照 rtenv+ 的 main.c,裡頭提供 shell 實做
  • 建立新的 Hackpad,列於「+作業區」,需要標注「開發紀錄 (A)」
 
一開始沒有很了解每個目錄的相關性,但就目前的理解是為了讓我們了解STM32相關的配置與程式的執行流程
 
我的很多東西都是參考別人的寫法而來的,自己實在是沒有抓到方向,
主要是參考:瞿旭民同學與張家榮同學+(1)+(2)
 

程式怎麼跑的?

參考
 

00-HelloWorld

首先要從makefile下手,makefile給的資訊很多,也告訴了我程式編譯的流程
Makefile
CROSS_COMPILE ?= arm-none-eabi- =>我把?= 改成 = 
因為我以前再弄別的專案時有先設定成其他的如果沒有改的話會產生如下錯誤
arm-none-linux-gnueabi-gcc -fno-common -ffreestanding -O0 -gdwarf-2 -g3 -Wall -Werror -mcpu=cortex-m3 -mthumb -Wl,-Thello.ld -nostartfiles  hello.c startup.c -o hello.elf
make: arm-none-linux-gnueabi-gcc: Command not found
make: *** [hello.bin] Error 127
如果有這種錯誤的話有兩種可能
1.是沒有裝arm-none-linux-gnueabi-* 
  • 如果是這種的話請下:sudo apt-get install gcc-arm-none-eabi
  • 再檢查PATH有沒有設定好
  • 如果設定好的話可以下:arm-none-linux-gnueabi-gcc -version確定看看
2. 就是CROSS_COMPILE的設定問題了,可以用echo $CROSS_COMPILE來確定自己環境變數的設定
 
CFLAGS = -fno-common -ffreestanding -O0 \
     -gdwarf-2 -g3 -Wall -Werror \
     -mcpu=cortex-m3 -mthumb \
     -Wl,-Thello.ld -nostartfiles \
看完瞿旭民同學的共筆後才發現這段很好玩原來這段有很重要的意思
(參考徐朝逸的說明)
  • -mcpu: 要求gcc針對ARM Cortex-M3產生對應的指令
  • -mthumb: 指定產生Thumb指令,而非ARM指令;ARM Cortex-M3/M4只支援Thumb2指令
  • -nostartfile: 要求連結階段不要使用標準系統起始檔案(starup file),這在沒有作業系統支援的環境是必要的,因為我們自己處理C語言程式main()函式之前的種種準備動作
  • -fno-common: 編譯器預設會把沒初始化的變數放在common block,加這個選項會強迫編譯器放到.data區段