HW7 開發紀錄(A)

mini-arm-os

這次的作業有點跟不上,先看了+Build minimal ARM Kernel from Scratch並稍微看過00~06的程式碼,後參考+張家榮+莊彥宣+蔣亞翰瞿旭民同學的筆記,文件中諸多連結如linked script、STM32的設定等也一一看過,並印證規格書(RM0008)的內容。
 
00-HelloWorld
  • Makefile
  • startup.c
  • 設定uint32_t *isr_vectors[]屬性為.isr_vector 
  • 0x0 的地方 stack 位址
  • 0x4 的地方是 reset interrupt handler,指向 handler 位址,也就是 reset_handler
  • 想到之前老師提過interrupt table的故事,如果發生reset interrupt就會跑到handler這個位置。
  • hello.c
  • RCC_APB2ENR: bit 0與bit 2設為1
  • bit 2: I/O port A clock enable
  • RCC_APB1ENR:
  • USART 2 clock enable
  • GPIOx_CRL
  • port 2: output mode, Alternate function output Push-pull
  • port 3: Floating input
  • 當input pin被處在高阻抗的模式下,若沒有外部訊號源進來的話,此時是無法確定pin的狀態(不能確定現在處在高電位或低電位),除非有外部訊號來驅動電路。換句話說,input floating,這個input電位狀態完全是由外部訊號來決定,沒有訊號驅動的話,就會呈現高阻抗狀態。(Wiki GPIO)
  • 了解Push-Pull,Open-drain,高阻抗
  • GPIOx_CRH
  • port 8~15為Floating input
  • USART2_CR1
  • 開啟TE, RE, USART2
  • puts(const char *)
  • 輸出時沒有不正常狀態(USART_SR)及沒有在輸出,才會輸出下一個字元。
 
00-Semihosting
  • semi.c
  • 不太懂為什麼SYS_WRITE傳入的第一個word會是1,依照文件的說法Contains a handle for a file previously opened with SYS_OPEN.是第1個handler,但先前有用SYS_OPEN開過檔案嗎?
 
01-HelloWorld
  • startup.c
  • 在hello.ld中_sidata在FLASH內,reset_handler把.data segments從FLASH移到SRAM,只是不知道移過去的用意為何,以及為什麼.bss的值要改0。rtenv的linker script解釋只說了幾句這些symbol是有意義的,你需要查詢程式原始碼看他們在做三小。相信我,這值得一看
  • rcc_clock_init
  • 初始化內部的 8MHz 振盪器
 
02-ContextSwitch 1
  • 在 main.c 中把usertask()的位置放到 lr 的位置,並把 stack pointer 傳到 activate
  • context_switch.S
  • 文件中提到read all of the registers using PSR with the MRS instruction,意思是把 APSR, IPSR, EPSR 透過 mrs 存到 ip ?
  • 先把目前狀態 push 起來
  • 把之前的 stack pointer 載入到 PSP。control [1]  1 表示stack pointer 改由psp 接手, 0表示為mspcontrol [0] 1 表示為unprivileged mode
  • 把 PSP 的內容 pop 出來。branch 到 lr