Hackpads are smart collaborative documents. .

Don

846 days ago
Unfiled. Edited by coldnew , Dong Lin Lee , Charles Lee 846 days ago
coldnew
  • 其實這一直都是我的最終目標,也不是因為看了nand2tetris 才萌生的念頭,不過畢竟因為吃飯重要+還是容易渾渾噩噩的(下班後)...還沒開始動手....不過CPU倒是已經選好用MyHDL實現就是了,剩下的就是學習怎樣把這些都搞定。
 
 
 
 
 
Interrupt Vector Table 來看會比較清楚,不過先讓我們快速的跳到 hello.ld 去。
 
在 hello.ld 會發現到在 MEMORY layout 裡面多了 SRAM section, 這是因為存放在 Flash 裡面的東西會是唯讀(Read-only)的,我們想要讓東西可以讀寫就必須讓資料存放到 RAM 等地方。
 
而在 SECTION 欄位則增加了 .data 以及 .bss 區塊,將資料存放到 RAM 中,並將  `_estack` 指向了 RAM 的頂端,而那些 `_sdata` , `_edata` 的用途就要對應回 startup.c 的 `reset_handler()` ,用來將存放在 FLASH 理的 .data 複製到 RAM 中。
 
回到 startup.c,在 `rcc_clock_init()` 這裡才是這一題看起來很嚇人的原因,這邊在做什麼呢?其實要對應電路設計比較好理解,就是我們使用 HSE ( external clock source),從電路來看就是那顆很可愛的石英振盪器。為什麼要用外部的時脈呢,這是因為內建的因為製成等因素,產生出來的時脈和石英振盪器比起來相對不準很多,如果是簡單的專案,為了省成本都會使用內部的振盪器來取代。
 
  • 雖然這樣說...外部振盪器用在 Hello world 太大材小用了......
  • 另外一顆常見的震盪器就是就是接在 RTC IC 的 32KHz 的石英振盪器,想想為什麼要 32kHz !!
  • (這邊就不劇透了)
 
  • 02-ContextSwitch-1
閱讀流程:   context_switch.S -> os.c -> os.ld -> startup.c -> Makefile
  • 改成 os.c -> context_switch.S 可能比較好 !?
 
這邊大多的東西都和 01-HelloWorld 一樣,所以我們只要關注那些新來的就好,因此這次我們從 context_switch.S 來開始看。不過其實從檔名也可以猜到 context_switch.S 是作啥的,我們要寫 OS,所以自然會把執行的程式切分為 user mode 和 kernel mode 兩個環境執行,所以你可以看到 context_switch.S 裡面就會存放目前的 kernel state,並切換到 user state (然後就回不來了 XD)
 
問題來了,我們在這切換過程中存放了 `r4, r5, r6, r7, r8, r9, r10, r11, ip, lr` 這幾個暫存器,這是為什麼呢?
  • 雖然覺得這段理所當然,可是目前不會用 "說" 的,回頭再想
  •  
總之,在 context_switch.S 裡面的 `activate` 作用就是從 kernel state 切換到 user state,並執行送過來的 task。
 
結束了 context_switch.S ,讓我們來看看 os.c 做了什麼,裡面除了進行USART2的初始化外,另外定義了一個 user_task 要透過 context_switch.S 的 `activate` 來切換到 user space 去,這邊最重要的地方就是在 `main()`
 
  • 03-ContextSwitch-2
 
  • 04-Multitasking
 
  • 05-TimerInterrupt
閱讀流程:  Makefile -> startup.c -> hello.ld -> reg.h -> hello.c
 
這一題和 01-HelloWorld 很像,不同的是他會隨著 timer 的結束,觸發 hello.c 的 `systick_handler`
 
`main()`裡面會定義  systick 定時器的一些設定,為什麼這邊設定 systick 的數值為 72M 呢?這裡要用硬體的觀點來看,stm32-p103 外部石英振盪器為 8MHz, 經過 CPU 內建的 PLL 後,因為我們的設定倍頻到 72MHz, 所以為了對應一秒的時間,我們的 systick 也要設定為 72M 才行。
  •         /* SysTick configuration */
  •         *SYSTICK_LOAD = 7200000;
  •         *SYSTICK_VAL = 0;
  •         *SYSTICK_CTRL = 0x07;
 
  • 06-Preemptive
 
  • 07-Threads
 
870 days ago
Unfiled. Edited by Dong Lin Lee 870 days ago
Gapry
  • 計算機組織結構
To Do List
 

Contact Support



Please check out our How-to Guide and FAQ first to see if your question is already answered! :)

If you have a feature request, please add it to this pad. Thanks!


Log in