精華區beta Electronics 關於我們 聯絡資訊
其實打這篇文章時, 我還不會在 uC-OS II 上寫程式 XD (那怎麼敢打這篇文章 ?) ---- 一般OS的設計, 會透過一個 timer 產生 interrupt 用這個 interrupt 去呼叫 OS 起床 OS 可能會呼叫 scheduler 切換目前工作, 或是其他的 maintain routine 所以 1. 系統裡一定會有一個 timer 負責產生中斷 2. 中斷的 ISR 會呼叫 OS 以我手邊這片 NIOS 來講, CPU 工作時脈 50Mhz timer 每 10ms 產生一個 tick (timer 中斷), 每秒 100 次中斷 也就是 tick 之間, CPU 一共有 0.5M cycles 可以做事 ---- 根據上面的機制, 我把 HAL (Hardware Abstraction Layer) 對應的程式碼找出來 寫成這篇 note 這個主題關係到大量的 source code 因為程式碼是最好的說明書, 我把所有相關的 source code 列下來... Device Drivers [NIOS II]/ altera_hal/ HAL/ inc/ sys/ alt_alarm.h Device Drivers [NIOS II]/ altera_hal/ HAL/ inc/ sys/ alt_llist.h Device Drivers [NIOS II]/ altera_hal/ HAL/ inc/ priv/ alt_alarm.h Device Drivers [NIOS II]/ altera_hal/ HAL/ src/ alt_tick.c Device Drivers [NIOS II]/ altera_hal/ HAL/ src/ alt_alarm_start.c Device Drivers [SOPC Builder]/ altera_avalon_timer/ HAL/ src/ altera_avalon_timer_sc.c Debug/ SystemDescription/ alt_sys_init.c 相關的文件 Quartus II v7.1 Handbook Volumn 5: Embedded Peripherals 14 Timer Core Nios II Software Developer's Handbook 5-9 Using Timer Devices 5-10 System Clock Driver ---- 下面是我對 system tick 的理解 如果要瞭解這個主題, 可以照下面的順序看 code alt_sys_init.c 這個檔案是開機流程裡重要的檔案, 他會初始化很多硬體和軟體 從這個檔案可以看得到 System Clock (tick) 是怎麼被初始化的 ALTERA_AVALON_TIMER_INIT(name, dev) 呼叫以下的函數去初始化 timer alt_avalon_timer_sc_init(base addr, IRQ #, Freq of tick) sc 表示 system clock, 這是 timer 初始化函數 alt_sysclk_init(freq) 設定每秒有幾個 tick -> freq=100 Set up timer control register { Interrupt Enable Continuous (non-stop) mode Timer GO } Set up timer ISR alt_irq_register(IRQ #, base, ISR-function) ISR-function 是 tick 中斷會呼叫的... alt_avalon_timer_sc_irq(void *base, alt_u32 id) { IOWR_ALTERA_AVALON_TIMER_STATUS(base, 0); //clear interrupt ALT_LOG_SYS_CLK_HEARTBEAT(); alt_tick(); //每次中斷都要呼叫 !! } 所以這個 alt_tick() 是一定要追蹤的... !! alt_tick() @ alt_tick.c 這個函數可以分成兩部分, 前半段在執行其他的 periodic ALARM 最後有一行很關鍵 ALT_OS_TIMER_TICK(); 這一行會去把 OS 叫起來, 相當重要 !!!! ---- 這篇 note 寫到這裡其實已經可以結束了 OS和硬體的連結已經藉著 ALT_OS_TIMER_TICK() 展現出來 這一系列 library 裡, 還有一部份 code 值得研究 HAL 提供了 periodic ALARM 的支援, 實作的程式碼值得一讀 sys/alt_alarm.h priv/alt_alarm.h alt_llist.h alt_tick.c alt_alarm_start.c ---- 透過 linked-list, 利用一個 timer, 可以支援多個 periodic task 他的技巧簡述如下... 1. alt_alarm 是一個大的 struct 2. 這個 struct 的第一個 element, 是 linked-list struct 的 entry 3. linked-list struct 有兩筆資料: *next, *previous 4. 只要在 data struct 的第一個 element 放上 linked-list struct 就可以給 data struct 提供 linked-list 支援 他的資料結構像下面那樣 struct BIG_STRUCT { struct linked_list LIST data1 data2 data3 ... } struct linked_list { struct linked_list *next; struct linked_list *previous; } ---- 以下是'猜'的 以PC來說, 也有某個timer會固定產生 system tick 當 tick 出現, 會跳到類似 alt_tick() 這樣的函數 這個函數很有可能由 BIOS 提供 alt_tick() 前半段執行一些 periodice ALARM BIOS 碰到 tick 的時候, 可能也跑些日常的 maintain 比如監控 CPU 溫度, 監控風扇溫度之類的 跑完以後, 才呼叫類似 ALT_OS_TIMER_TICK() 這樣的東西 把控制權還給 OS 如果上面這樣猜是對的, 那 HAL 部分程式碼的地位 就有點像 PC 上的 BIOS 嗯... 隨便亂猜... 有錯請告訴我 如果有 BIOS 相關的資料可以看 (簡介類的) 也請板友推薦, 謝謝 :) -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 140.113.138.231 ※ 編輯: lihgong 來自: 140.113.138.231 (08/17 08:12) ※ 編輯: lihgong 來自: 140.113.236.184 (08/17 11:04)