開發紀錄(A)

作業要求(A)

  • 安裝和設定 QEMU
  • 依據指示,將 00-Semihosting, 00-HelloWorld, …, 07-Threads 均實際測試並研讀程式碼
  • 在 github 上 fork mini-arm-os,並修改 07-Threads (不要增加新的目錄!),提供基本的 shell,然後能夠用新建立的 thread 計算 fibonacci 數列
  • shell 程式碼可參照 rtenv+ 的 main.c,裡頭提供 shell 實做
 

NOTE

1.目的檔(ELF)格式
 
2.object file裡data section跟global variables的關係
 
3.volatile使用時機
當變數加上volatile,會告知compiler變數具有揮發性,再optimize時會不對這個變數作最佳化
 
 
5.Linker Script:
 
 
00-HelloWorld分析
  • hello.ld
ENTRY Point為"reset_handler"
Memory 設定flash的操作限制,起始位置與長度
SECTIONS裡.text這個section裡
  • KEEP(*(.isr_vector))設定此section不可以被garbage collect回收
  • 所有object file裡.text開頭的的section都放在這個section
  • 最後將這些全部丟進flash裡
 
  • startup.c
__attribute((section(".isr_vector"))) 再看了一些資料以後我的理解是將中斷向量串列存到.isr_vector這個section
 
  • reg.h
Obviously,reg.h裡定義了各種memory map的資料
P41:Memory map
P95~96:RCC_APBENR(peripheral clock enable register)
P148~149:GPIOx_CRH and GPIOx_CRL (x=A....G)
P683~686:USART的status register,data register,control register 1