Sunday, October 14, 2007

UART RX interrupt

因接收端產生的中斷, ISR會將UART FIFO所Buffer的資料移到Queue.
如果Queue已滿了(無法將FIFO所buffer的資料量降至INT trigger level)然後離開ISR。
若再接收到資料還會再產生中斷嘛?
答案是會的,即使FIFO & Queue都滿了,在ISR中正確的將INT Flag清除後,每收到一個位元組依舊會產生中斷。

Wednesday, October 10, 2007

UART Failure

bool
UART_Putc( c, delay)
{
if( QU_IsEmpty(&TxQu_Uart1) )
{
if( !(UART1->FR & UART_FR_TXFF_MASK) ) {
UART1->DR = c;
return true;
}
}

if( !QU_IsFull(&TxQu_Uart1) ) ---> 若這時中斷產生,跳躍至IRQ handler,IRQ handler將
{ Queue的資料填入UART FIFO, 所填入的資料量依舊無
taskENTER_CRITICAL(); 法使INT flag清除, 所以只好強制清除INT flag.
QU_Append(&TxQu_Uart1, c); 問題出現,把資料Append至Queue後,這時再也不會產
taskEXIT_CRITICAL(); 生中斷。 再次再進入UART_Putc便不會把資料Put至
return true; FIFO, 而是放到Queue。----> UART function failed.
}

} /* UART_Putc */


P.S.
清除UART INT flag的方式,
I. 填入UART FIFO的資料大於INT trigger level.
Ex: trigger level == 8,則當中斷發生的時候,FIFO所buffer的資料已小於8,這時必須將FIFO的資料填入超過8,方可清除INT flag。
II. UART1->ICR = UART_ICR_TXIC_MASK; /* Clear interruption flag. */

Saturday, October 6, 2007

Hardware breakpoint / Software breakpoint

ARM7 & ARM9分有2個Hardware breakpoint (called "watchpoint units" in ARM's documentation), Hardware breakpoint不需要修改code, 但是Software breakpoint則不同, debugger會更改breakpoint所在的指令, 填一入特定的值. 如此便沒有breakpoint數量的限制, 但唯一的限制就是Code是必須run在RAM才行。

但是如果沒有External RAM的話, 還有其它辦法可以解決Breakpoint不足的問題.
請參考(C:\Program Files\SEGGER\JLinkARM_V374i\Doc\Manuals\JLinkRDI.pdf).

J-Link Usage

J-Link Introduction
IAR的J-Link就是Segger作的.

J-Link Utility Download
JLinkARM.dll
要檢查目前IAR所使用的版本是不是較新的.

J-Mem.exe
CPU run起來後, 可透過它更改memory的資料.

JLinkRDI
由於ARM core本身只有兩個Hardware breakpoint, 如果需要更多的Breakpoint就可以使用RDI, IAR project->option->RDI.
PS. RDI: Remote Debug Interface
Q: Manual(C:\Program Files\SEGGER\JLinkARM_V374i\Doc\Manuals\JLinkRDI.pdf)上有講到, Download into Flash without the need for a Flash loader. What's that mean?

JLinkTCPIPServer.exe
跟ARM Multi-ICE一樣可透過TCP/IP使用J-Link/J-Trace

Reference:
JLinkARM.pdf, 該文件中有介紹在一台PC上同時使用兩個以上的ICE (J-Trace/J-Link). 依照該文件的設定無法使用。使用jlinkarm.dll版本為:3.56.6.0便可行。