- harvard architecture -- seperate program and data bus
- single level pipeline, one executed, one pre-fetch (這樣不就是 2 level ?)
- 是 8/16 bit risc microcontrollers (8/16 是什麼意思?)
- 32 個8bit general purpose working registers.
- 有 program memory (flash),EEPROM 和 SRAM
- Stack in RAM
- Stack pointer accessible in I/O memory space
- direct addressing 16MB , both data and program memory
- 16/24 bit I/O registers (?)
- I/O status & control registers 位於 lowest 4KB data memory addess
- SRAM 的位置是由 0x2000 開始
- EEPROM 是 0x1000 到 0x1FFF
- program memory 被分成兩部份:boot program section, application program section
跟 context switch 最有關係的是 stack 和 status register。
Status Register : SREG
- 在 interrupt 發生時,cpu 並不會作 save-restore 的動作,需要寫出code來作
- SREG 也被mapping 在 I/O memory space,所以可以自由存取
Stack & Stack Register : SP
- Stack Register 的size 是兩個 byte,一樣mapping 到 I/O memory 的位置,佔兩個位址
- 和一般 Stack 一樣,初始在高位址,push 時減少address。
- CPU reset 時,SP 的初始值是 SRAM 的最高位址
- SP 也可以由軟體更改,但是必須要在0x2000 以上
- 執行中斷和call指令時,return address 會自行 push 到 stack,同樣的 RET, RETI 指令會自動 pop
- 執行 中斷, call, RET, RETI 命令時,每次push/pop 的size 隨裝置的program memory 大小而有不同,program memory 小於 128k 的裝置,每次 push/pop 2 個 byte,大於 128k 的,每次三個 byte
- 值行單純的 push, pop 命令時,每次只能對 1 個 byte 操作
- 當變更 SPL (SP 內容) 時,會自動 disable interrupt 4 個 instruction cycle
這樣的架構是可以support rtos 的,
這篇文章有說明在 interrupt routine 中,preserve/restore context 的code:
Preserving sreg in AVR interrupts
在avrfreak 有一篇 freeRTOS , atxmega128a1 port 的code,
這段是寫在 include/FreeRTOS v6.1.0/ISR_Support.h 中。
沒有留言:
張貼留言