作者lihgong (人生,是一句引用句)
看板Electronics
标题[心得] NIOS II 心得 -- uC-OS II (system tick)
时间Fri Aug 17 01:26:15 2007
其实打这篇文章时, 我还不会在 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 (BIG_STRUCT) 是一个大的 struct
2. 这个 struct 的第一个 element, 是 struct linked-list 的 entry
3. struct linked-list 有两笔资料: *next, *previous
4. 只要在 data struct 的第一个 element 放上 struct linked-list
就可以给 alt_alarm (BIG_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.236.184 (08/17 12:47)