|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
参照嵌入式软件的开发流程。第一步:工程建立和配置。第二步:编辑源文件。第三步:工程编译和链接。第四步:软件的调试。第五步:执行文件的固化。
& \* @: H" m( h$ N+ s% U8 d( t) t- b- s; t+ E9 i+ r1 f
在整个流程中,用户首先需要建立工程并对工程做初步的配置,包括配置处理器和配置调试设备。编辑工程文件,包括自己编写的汇编和C语言源程序,还有工程编译时需要编写的链接脚本文件,调试过程中需要编写存储区映像文件和命令脚本文件,以及上电复位时的程序运行入口的启动程序文件。
. ?9 T& B6 z) P- J" D' S, q- _9 c( d5 Z7 K( K
对后四种文件的理解很重要,其作用解释如下。
9 o# D1 h' x7 g$ W
% n2 s% M4 k/ p" `8 v! K1 b5 z: P5 J(1) 链接脚本文件:在程序编译时起作用。该文件描述代码链接定位的有关信息,包括代码段,数据段,地址段等,链接器必须使用该文件对整个系统的代码做正确的定位。在SDRAM中调试程序、在FLASH中调试或固化后运行的链接脚本文件应加以区分。(在IDE开发环境中使用扩展名*.ld)
# C" e' e/ Y$ v' Q) q
$ @$ Y3 i+ B* a, X. V- U: ~2 x0 m- H3 Z(2)命令脚本文件:在SDRAM中调试程序时起作用。在集成环境与目标连接时、软件调试过程中以及目标板复位后,有时需要集成环境自动完成一些特定的操作,比如复位目标板、清除看门狗、屏蔽中断寄存器、存储区映射等。这些操作可以通过执行一组命令序列来完成,保存一组命令序列的文本文件称为命令脚本文件(在 IDE开发环境中使用扩展名*.cs)。
7 P2 V0 ~9 V4 z( |7 j/ M3 G4 l# w
6 a b, t7 h7 G(3)存储区映像文件:在SDRAM中调试程序时起作用。在软件调试过程中访问非法存储区在部分处理器和目标板上会产生异常,如果异常没有处理,则会导致软件调试过程无法继续,为了防止以上问题并调整仿真器访问速度以达到最合适的水平,提供这样一种用于描述各个存储区性质的文件叫存储区映像文件(在IDE开发环境中使用扩展名*.map)。
( L6 w) \) X. v2 x
3 h0 v9 ]# r5 U5 @8 U0 m$ |7 W4 p在程序的调试过程中可以选择使用存储区映像文件*.map和命令脚本文件*. cs配合程序的调试。
9 R9 E+ ?& P0 o6 \
7 G+ U- A- b% \2 e9 i(4) 启动文件:它主要是完成一些和硬件相关的初始化的工作,为应用程序做准备。一般,启动代码的第一步是设置中断和异常向量;第二步是完成系统启动所必须的寄存器配置;第三步设置看门狗及用户设计的部分外围电路;第四步是配置系统所使用的存储区分配地址空间;第五步是变量初始化;第六步是为处理器的每个工作模式设置栈指针;最后一步是进入高级语言入口函数(Main函数)。
1 ]! ?' K+ N& H" H8 O. B( Z; ~" \: ^
中断程序设计; \8 Q, c5 S+ Z+ H8 P9 Q5 N
; {8 K' L8 G1 F% ^( { k1 ^' J1 m$ G中断调试方面可以采用类似矢量中断动态处理方式,让中断对应的确定地址代码调转到RAM的固定地址处,定义一个函数指针指向该固定地址,就可以随时通过替换RAM固定地址处的代码,实现动态改变中断处理函数。' \ j# o/ G' P7 ~ W! S
& K: c/ r y( a% N具体方法是:嵌入式技巧:ARM的三种中断调试方法介绍6 e8 c0 a. ` D. X; `4 z
嵌入式软件开发流程% K" r6 h. T" Z
9 C- G+ g: |9 h" Z$ W% C
参照嵌入式软件的开发流程。第一步:工程建立和配置。第二步:编辑源文件。第三步:工程编译和链接。第四步:软件的调试。第五步:执行文件的固化。- e5 @$ S0 `: ?1 H+ F/ x3 W* R
; Q$ M$ M3 C/ S. _3 O: m在整个流程中,用户首先需要建立工程并对工程做初步的配置,包括配置处理器和配置调试设备。编辑工程文件,包括自己编写的汇编和C语言源程序,还有工程编译时需要编写的链接脚本文件,调试过程中需要编写存储区映像文件和命令脚本文件,以及上电复位时的程序运行入口的启动程序文件。( f. z. W( `1 P& z9 y
# w0 C7 z, D9 ^, i9 o/ L对后四种文件的理解很重要,其作用解释如下。6 `6 U) K( V% F7 ^+ S; T. \/ u2 t
7 w- g0 x" `% W5 o5 M- ] O
(1) 链接脚本文件:在程序编译时起作用。该文件描述代码链接定位的有关信息,包括代码段,数据段,地址段等,链接器必须使用该文件对整个系统的代码做正确的定位。在SDRAM中调试程序、在FLASH中调试或固化后运行的链接脚本文件应加以区分。(在IDE开发环境中使用扩展名*.ld)+ G3 p) G" E% k, c
9 y2 W; b% y1 a) a(2)命令脚本文件:在SDRAM中调试程序时起作用。在集成环境与目标连接时、软件调试过程中以及目标板复位后,有时需要集成环境自动完成一些特定的操作,比如复位目标板、清除看门狗、屏蔽中断寄存器、存储区映射等。这些操作可以通过执行一组命令序列来完成,保存一组命令序列的文本文件称为命令脚本文件(在 IDE开发环境中使用扩展名*.cs)。
8 g, J" Z) D- W% T0 {% K5 ~& v4 T1 h; K: k
(3)存储区映像文件:在SDRAM中调试程序时起作用。在软件调试过程中访问非法存储区在部分处理器和目标板上会产生异常,如果异常没有处理,则会导致软件调试过程无法继续,为了防止以上问题并调整仿真器访问速度以达到最合适的水平,提供这样一种用于描述各个存储区性质的文件叫存储区映像文件(在IDE开发环境中使用扩展名*.map)。
4 {1 | e4 w8 _% w o E4 K7 y; ^& V1 s. G
在程序的调试过程中可以选择使用存储区映像文件*.map和命令脚本文件*. cs配合程序的调试。
% W7 b6 T4 t5 P2 k8 ~: K1 o, b, i( l6 l
(4) 启动文件:它主要是完成一些和硬件相关的初始化的工作,为应用程序做准备。一般,启动代码的第一步是设置中断和异常向量;第二步是完成系统启动所必须的寄存器配置;第三步设置看门狗及用户设计的部分外围电路;第四步是配置系统所使用的存储区分配地址空间;第五步是变量初始化;第六步是为处理器的每个工作模式设置栈指针;最后一步是进入高级语言入口函数(Main函数)。
$ @( T, s8 E* Y* } p$ a9 {7 F4 \, N5 v- Q2 @$ y, \" d; i
中断程序设计
3 @! p* t1 \8 Y. o3 E
0 y5 |# l/ M4 |; d7 D. k j2 o中断调试方面可以采用类似矢量中断动态处理方式,让中断对应的确定地址代码调转到RAM的固定地址处,定义一个函数指针指向该固定地址,就可以随时通过替换RAM固定地址处的代码,实现动态改变中断处理函数。
4 q- Z/ b6 H5 H- N* j7 d- y8 |4 k$ ~) ^8 a$ B% v
具体方法是:9 H# _6 M' M5 C
- t9 ]" K+ y) y: q" d(1)将中断源函数指针定义在RAM中相对的固定地址,建立中断矢量表;( a v. A( D7 y/ f) s
* d! E: s. V7 P1 ^& \- ^
void SetInterrupt (U32 vector, void (*handler)()){ InterruptHandlers[vector] = handler;}% t! S: s* [/ }
+ M0 Q+ x; o3 e- b(2)在程序中,调用具体某中断源的中断处理函数;( D2 y9 o: V9 z8 a# ~8 ^
: |* _6 Q. w- }; e 如:SetInterrupt(IIC_INT,IICWriteIsr);
" [/ }$ t7 u; o1 S3 U; | /* 声明IIC中断处理函数,其中IIC_INT为 IIC中断源序号,IICWriteIsr为 IIC的写中断处理函数 */
( ~8 y: I( E Y/ v @( q l% N0 r Z+ _4 V& J7 V$ C
(3)在0x18处的IRQ或0x1C处的FIQ中断入口函数中,获取中断源、清除中断挂起标志、通过已定义的中断源函数指针进入用户具体某中断处理程序。
# i" v) j$ G$ | j" _2 r% F. A) n$ u: R! Q; Z" ?
void ISR_IrqHandler(void){ IntOffSet = (unsigned int)INTOFFSET; Clear_PendingBit(IntOffSet>>2) ;(*InterruptHandlers[IntOffSet>>2])();// 调用具体某中断处理程序}* G4 x$ p/ b* G
x s* g: t; E: U$ J- R. f/ ]! v采用动态的中断处理方法,在中断源较多的情况下,中断响应时间和程序性能得到优化。另外,在调试方面,此处理方法具有便于跟踪调试的优点,并且根据需要,可以方便变换中断处理函数。6 u8 r4 k, q( C$ d
' j- o3 b; R1 [- {' o中断调试
, Y& \0 a7 v6 d/ x) W
: D. x6 M7 |) A. f软件调试可以在SDRAM中或FLASH中进行。在SDRAM中,读写方便,访问速度快。一般软件调试应在RAM中完成,但当RAM空间小于FLASH程序空间,程序只能在FLASH运行和调试时,或者用户希望了解程序在FLASH中实际运行情况时,就可以在FLASH中进行程序调试。$ A2 r! b, l: ?( ?2 U) [ X7 o
5 O# i% I/ x/ V( D4 |
进行中断调试时,应注意中断入口位于SDRAM中或FLASH中0x18或0x1c地址,链接脚本文件必须使整个系统的代码正确定位于0x0起始处,但SDRAM或FLASH对应的链接脚本文件及工程配置注意区别。
* `8 P; [7 J# H* r! V( }
4 h {2 M8 @1 L. l! {- i5 t9 B+ s(1)程序在SDRAM中运行 O" \& i# a# C" a8 G7 ~' d
4 f/ g4 t/ A+ o) ?* A/ S0 Q
在SDRAM中调试,使用SDRAM对应的链接脚本文件。调试过程需要以下几步:编译、链接工程;连接仿真器和电路板;下载程序(在IDE开发环境中使用扩展名*.elf);调试。
1 D5 o5 A! I1 t% I$ ^* Q3 [$ [% |# e: d! [; I) C- F
下载程序前必须启动命令脚本文件完成前述的一些特定的操作,命令脚本文件的启动在连接仿真器时自动进行,其中存储区映射应与程序在SDRAM中运行时相同,保证整个系统的代码正确定位于0x0起始处。下载程序的起始地址也为0x0,下载成功后便可进行调试工作。
* e* Q4 _: x! d
, @: D' {! ]& Y6 \+ L1 j7 z2 l(2)程序在FLASH中运行6 Z# m" |+ j% {5 f" a2 s
' }. y/ J+ m! @0 Q( U在FLASH中调试,使用FLASH对应的链接脚本文件。调试过程需要以下几步:编译、链接工程;连接仿真器和电路板;程序格式转换(*.elf转换为*.bin);固化*.bin程序;调试。
; c5 V4 f) l" E0 L- p5 [$ z# [) h, d
连接仿真器后不需要下载程序,存储区映射由本身工程中启动文件运行完成,不需要命令脚本文件。在本环境调试过程中,可以设置两个硬件断点。
' K+ o8 I1 h- q! T( S8 ?4 o. o, w) [# z9 l+ u# J( U6 ?; W
(3)程序从FLASH中调到SDRAM中运行
( k* k" C# r" D4 T* S: z/ O# G5 G% Y, f- `! ?7 Y
在某些应用场合,强调程序运行速度的情况下,希望程序在SDRAM中运行,这样就需要将FLASH中存储的程序,在系统上电后搬运到SDRAM某空间位置,然后自动运行。这种所谓的Bootloader技术,在DSP系统中常被采用。( K% U* h/ K8 X& f# t6 d
% l- w$ b- A, P1 ]9 v, m* T; `调试过程分两步:
0 G$ z+ p" i4 l/ w( y
( g- ^7 L3 h: y. d(a)首先将用户程序在SDRAM中调试通过,然后将*.bin文件固化到FLASH某一非0扇区地址空间;
3 x2 N! A( Y2 O
, @7 n$ }* W3 _1 @( U( \(b) 将自己编写的Bootloader搬运程序调试通过并将Bootloader.bin文件固化到FLASH的 0扇区地址空间,搬运程序在系统上电后,将(a)中FLASH某一非0扇区地址空间存储的程序,搬运到在SDRAM调试中同样的空间位置,实现程序在SDRAM中运行的目的。+ e! ^; g0 a3 z2 t
嵌入式技巧:ARM的三种中断调试方法介绍! t1 S5 j) x8 u' t" C3 E3 W! ^5 |
嵌入式软件开发流程( I! w+ s- r! }& l2 V6 v6 q
$ V( X6 u, |, A( X/ X参照嵌入式软件的开发流程。第一步:工程建立和配置。第二步:编辑源文件。第三步:工程编译和链接。第四步:软件的调试。第五步:执行文件的固化。
/ D4 |; l2 q! \4 f& T
/ P& f$ X- ~* |; m2 G$ s在整个流程中,用户首先需要建立工程并对工程做初步的配置,包括配置处理器和配置调试设备。编辑工程文件,包括自己编写的汇编和C语言源程序,还有工程编译时需要编写的链接脚本文件,调试过程中需要编写存储区映像文件和命令脚本文件,以及上电复位时的程序运行入口的启动程序文件。
& F: [' w1 n* H$ D4 g1 R! l- {1 L4 k! d+ Y c$ t+ ]
对后四种文件的理解很重要,其作用解释如下。1 E8 H( w7 G. J% Y
) D9 Y1 E& i# h; V+ L q$ M, \(1) 链接脚本文件:在程序编译时起作用。该文件描述代码链接定位的有关信息,包括代码段,数据段,地址段等,链接器必须使用该文件对整个系统的代码做正确的定位。在SDRAM中调试程序、在FLASH中调试或固化后运行的链接脚本文件应加以区分。(在IDE开发环境中使用扩展名*.ld)
7 F% V- L4 ~ S2 ]8 l: a$ ~% r- ?" P' L
(2)命令脚本文件:在SDRAM中调试程序时起作用。在集成环境与目标连接时、软件调试过程中以及目标板复位后,有时需要集成环境自动完成一些特定的操作,比如复位目标板、清除看门狗、屏蔽中断寄存器、存储区映射等。这些操作可以通过执行一组命令序列来完成,保存一组命令序列的文本文件称为命令脚本文件(在 IDE开发环境中使用扩展名*.cs)。
: b: u8 i* r' x- |4 W; Z4 q8 {' B1 h9 f# K. V. F+ B( B- [
(3)存储区映像文件:在SDRAM中调试程序时起作用。在软件调试过程中访问非法存储区在部分处理器和目标板上会产生异常,如果异常没有处理,则会导致软件调试过程无法继续,为了防止以上问题并调整仿真器访问速度以达到最合适的水平,提供这样一种用于描述各个存储区性质的文件叫存储区映像文件(在IDE开发环境中使用扩展名*.map)。/ _% G0 j4 N( ?) \# g
) t7 Z& U; T/ Z+ j( Y在程序的调试过程中可以选择使用存储区映像文件*.map和命令脚本文件*. cs配合程序的调试。
3 P5 {7 m1 f2 N: V! A$ k3 m( Q/ x# l
0 C( I0 V2 v3 A& l1 h! Q(4) 启动文件:它主要是完成一些和硬件相关的初始化的工作,为应用程序做准备。一般,启动代码的第一步是设置中断和异常向量;第二步是完成系统启动所必须的寄存器配置;第三步设置看门狗及用户设计的部分外围电路;第四步是配置系统所使用的存储区分配地址空间;第五步是变量初始化;第六步是为处理器的每个工作模式设置栈指针;最后一步是进入高级语言入口函数(Main函数)。6 e) Z8 {- a! r- b2 V+ ~7 N3 L
( ~, H. v; |$ k \ z
中断程序设计
( H/ V% c' s1 J5 z: \# q3 a4 R. b) |; o y& b G
中断调试方面可以采用类似矢量中断动态处理方式,让中断对应的确定地址代码调转到RAM的固定地址处,定义一个函数指针指向该固定地址,就可以随时通过替换RAM固定地址处的代码,实现动态改变中断处理函数。$ c% V$ f9 H8 k( v% o: Q
$ ]5 B; R* w! U( R: K. w具体方法是:
: W' `, |% X9 y/ F9 z0 Q: l8 r5 j5 o1 R. U
(1)将中断源函数指针定义在RAM中相对的固定地址,建立中断矢量表;& Z. F1 l0 r/ n0 h+ [7 W1 ]
. U4 v/ n; V0 B" y/ P void SetInterrupt (U32 vector, void (*handler)()){ InterruptHandlers[vector] = handler;}
+ f" ~6 V7 i" H/ p4 _0 t1 J- s9 D) ?: p# d4 F6 U. l
(2)在程序中,调用具体某中断源的中断处理函数;
3 A: U* s4 _! `& d2 Z; @1 q
1 g: A+ I/ U) g- O. h. S 如:SetInterrupt(IIC_INT,IICWriteIsr);
q: m( ?1 N' n% L0 W/ x' N /* 声明IIC中断处理函数,其中IIC_INT为 IIC中断源序号,IICWriteIsr为 IIC的写中断处理函数 */- B4 D0 w9 m3 f/ f& s
! b2 o2 ~% |6 }4 v, B C' B1 e2 p(3)在0x18处的IRQ或0x1C处的FIQ中断入口函数中,获取中断源、清除中断挂起标志、通过已定义的中断源函数指针进入用户具体某中断处理程序。
# N# w6 i" ]6 h' z" |! x2 _
" a$ p/ D5 C- z/ c9 l, q' y void ISR_IrqHandler(void){ IntOffSet = (unsigned int)INTOFFSET; Clear_PendingBit(IntOffSet>>2) ;(*InterruptHandlers[IntOffSet>>2])();// 调用具体某中断处理程序}
" m k; u) ? L( n, W+ w4 m4 T) K @! L' _0 I
采用动态的中断处理方法,在中断源较多的情况下,中断响应时间和程序性能得到优化。另外,在调试方面,此处理方法具有便于跟踪调试的优点,并且根据需要,可以方便变换中断处理函数。$ \. d# K) N% p
1 \/ a. b5 C4 _
中断调试7 e( `. g9 y ?4 x. U. S9 y( K
9 P6 w! F( W" q# [软件调试可以在SDRAM中或FLASH中进行。在SDRAM中,读写方便,访问速度快。一般软件调试应在RAM中完成,但当RAM空间小于FLASH程序空间,程序只能在FLASH运行和调试时,或者用户希望了解程序在FLASH中实际运行情况时,就可以在FLASH中进行程序调试。
( I9 K; I1 U$ @
$ b1 V/ w9 {( E进行中断调试时,应注意中断入口位于SDRAM中或FLASH中0x18或0x1c地址,链接脚本文件必须使整个系统的代码正确定位于0x0起始处,但SDRAM或FLASH对应的链接脚本文件及工程配置注意区别。
' K% k e" b( J* U v' F& N: \) W3 y* V9 F6 d3 m1 U; E
(1)程序在SDRAM中运行
. i& J- I- q+ n# D# F, _& t
" A. L; E; ]4 D) b! z在SDRAM中调试,使用SDRAM对应的链接脚本文件。调试过程需要以下几步:编译、链接工程;连接仿真器和电路板;下载程序(在IDE开发环境中使用扩展名*.elf);调试。% e p# a: `$ g& Z' W
3 l( X' K/ [" W# j下载程序前必须启动命令脚本文件完成前述的一些特定的操作,命令脚本文件的启动在连接仿真器时自动进行,其中存储区映射应与程序在SDRAM中运行时相同,保证整个系统的代码正确定位于0x0起始处。下载程序的起始地址也为0x0,下载成功后便可进行调试工作。
}5 U/ |7 |/ [. s# A$ N% h7 Z" f. [% L7 {5 K3 _0 i
(2)程序在FLASH中运行
7 _! P6 ?$ B' U6 ^/ T- ]9 ]
! y0 d {4 g8 w, I在FLASH中调试,使用FLASH对应的链接脚本文件。调试过程需要以下几步:编译、链接工程;连接仿真器和电路板;程序格式转换(*.elf转换为*.bin);固化*.bin程序;调试。
) e* G, s8 H0 X4 T4 `2 t7 q( _* }3 Q5 K& a/ e" D: E; O4 T$ g1 h4 b
连接仿真器后不需要下载程序,存储区映射由本身工程中启动文件运行完成,不需要命令脚本文件。在本环境调试过程中,可以设置两个硬件断点。
6 T, S, I2 Y! u2 o; m# Y+ r/ g4 U* Z7 ?
/ ] x g% N: O. p: |7 S" d7 {(3)程序从FLASH中调到SDRAM中运行
5 H6 U4 @% a) Y& o" w( m/ Z; I1 C/ R- S( U
在某些应用场合,强调程序运行速度的情况下,希望程序在SDRAM中运行,这样就需要将FLASH中存储的程序,在系统上电后搬运到SDRAM某空间位置,然后自动运行。这种所谓的Bootloader技术,在DSP系统中常被采用。
- M" ?9 L7 y& q& L5 s! W8 v x$ ?
8 i! \3 G/ n4 _1 X6 D2 u调试过程分两步:
2 [0 d9 Y2 g4 h- W2 C1 p; ]
5 s5 i* `1 v1 h' R- ]! N4 c(a)首先将用户程序在SDRAM中调试通过,然后将*.bin文件固化到FLASH某一非0扇区地址空间;& D; s* H& r% d/ p' I5 G, s" D
8 A) q5 E$ Z/ o* H ~(b) 将自己编写的Bootloader搬运程序调试通过并将Bootloader.bin文件固化到FLASH的 0扇区地址空间,搬运程序在系统上电后,将(a)中FLASH某一非0扇区地址空间存储的程序,搬运到在SDRAM调试中同样的空间位置,实现程序在SDRAM中运行的目的。2 J" d/ |% j0 c# {& O
4 x: W! ^& d- r( Z! Q, N5 r% J另外注意,因为用户实际的程序中断入口必须位于FLASH的0x18或0x1c地址,所以Bootloader搬运程序还应具有中断入口的跳转功能,即把PC指针由此转向处于SDRAM空间的中断程序入口表,就是整个用户程序被搬运到SDRAM的那一位置。. L" k% _5 S" \+ U3 k: H
; I, @( m8 c) b5 s
如:LDR PC, =HandleIRQ
) c- r" \: b6 M+ s // HandleIRQ位于SDRAM空间中断程序入口表
) ?% y& E k9 e4 Z$ d2 t. w3 \( T/ U0 T
另外注意,因为用户实际的程序中断入口必须位于FLASH的0x18或0x1c地址,所以Bootloader搬运程序还应具有中断入口的跳转功能,即把PC指针由此转向处于SDRAM空间的中断程序入口表,就是整个用户程序被搬运到SDRAM的那一位置。9 P c" P& U' P L: C5 q8 I
* o x* ?8 g' D0 Y6 r% w: E' y
如:LDR PC, =HandleIRQ$ U: K3 A) h& k
// HandleIRQ位于SDRAM空间中断程序入口表; n! O; U/ k( {! U8 {8 x9 L
8 t$ J& t V6 \- M
- E! j: X% H! ~* c2 C. ?3 i(1)将中断源函数指针定义在RAM中相对的固定地址,建立中断矢量表;. L6 z/ e2 I- X7 Z: m
, M, s( A# p& o+ ], \+ ^3 d void SetInterrupt (U32 vector, void (*handler)()){ InterruptHandlers[vector] = handler;}
) W; o) @& k" k0 z- u7 g5 U0 ]) ~7 Y, s) [ t5 i
(2)在程序中,调用具体某中断源的中断处理函数;6 F- Z& J) E* u, c d7 v# D
. f" ], @! r: e5 `5 |/ ^! T 如:SetInterrupt(IIC_INT,IICWriteIsr);
m6 H$ x! d7 j z( `6 e /* 声明IIC中断处理函数,其中IIC_INT为 IIC中断源序号,IICWriteIsr为 IIC的写中断处理函数 */. w" w! P1 Q$ t) c+ V; P, z
& b' |! L$ f: D$ [(3)在0x18处的IRQ或0x1C处的FIQ中断入口函数中,获取中断源、清除中断挂起标志、通过已定义的中断源函数指针进入用户具体某中断处理程序。
# Z7 r# d+ [* Z, ~' j' |4 C; p3 }* z, I
void ISR_IrqHandler(void){ IntOffSet = (unsigned int)INTOFFSET; Clear_PendingBit(IntOffSet>>2) ;(*InterruptHandlers[IntOffSet>>2])();// 调用具体某中断处理程序}% f$ f) C! \( g2 p' k- i
/ Y: o" j3 ~. l+ n
采用动态的中断处理方法,在中断源较多的情况下,中断响应时间和程序性能得到优化。另外,在调试方面,此处理方法具有便于跟踪调试的优点,并且根据需要,可以方便变换中断处理函数。; f4 N/ e1 r3 L. w. W
T V8 A0 G/ m! g( ^
中断调试
9 q5 ]% j8 N# S; Y/ q6 E! z& t2 o) h
软件调试可以在SDRAM中或FLASH中进行。在SDRAM中,读写方便,访问速度快。一般软件调试应在RAM中完成,但当RAM空间小于FLASH程序空间,程序只能在FLASH运行和调试时,或者用户希望了解程序在FLASH中实际运行情况时,就可以在FLASH中进行程序调试。
5 ?! y5 t, z1 t. ]6 L* U6 @
3 v# F' b4 S& l& j- f; {3 a进行中断调试时,应注意中断入口位于SDRAM中或FLASH中0x18或0x1c地址,链接脚本文件必须使整个系统的代码正确定位于0x0起始处,但SDRAM或FLASH对应的链接脚本文件及工程配置注意区别。" N5 G8 F- n( t$ C' W) P
( s# b i: k5 ~9 b(1)程序在SDRAM中运行
5 h9 [& L3 |5 f, e7 [- N' o
) N8 V1 ?3 X8 U5 {( w9 D在SDRAM中调试,使用SDRAM对应的链接脚本文件。调试过程需要以下几步:编译、链接工程;连接仿真器和电路板;下载程序(在IDE开发环境中使用扩展名*.elf);调试。
- v0 o7 n; ], w3 U5 ~3 t0 m& ~/ Z* A8 e1 V2 r% V* v
下载程序前必须启动命令脚本文件完成前述的一些特定的操作,命令脚本文件的启动在连接仿真器时自动进行,其中存储区映射应与程序在SDRAM中运行时相同,保证整个系统的代码正确定位于0x0起始处。下载程序的起始地址也为0x0,下载成功后便可进行调试工作。! \) W e& H# Y( H9 U% ~9 D
4 B6 {" N- g$ g) a; ~
(2)程序在FLASH中运行
. [& [( k d- @9 T! O# Y
, h4 Q+ F5 K4 f* s( S在FLASH中调试,使用FLASH对应的链接脚本文件。调试过程需要以下几步:编译、链接工程;连接仿真器和电路板;程序格式转换(*.elf转换为*.bin);固化*.bin程序;调试。1 a% U& }' \* X, R) [$ L
0 {0 a n* F# M' X' X( O3 n
连接仿真器后不需要下载程序,存储区映射由本身工程中启动文件运行完成,不需要命令脚本文件。在本环境调试过程中,可以设置两个硬件断点。
+ _4 T9 \/ h" L% R2 J
: X; @1 P3 N6 U/ D% z. v; b' S(3)程序从FLASH中调到SDRAM中运行
8 K2 z' u2 c2 P, z# l) ]# Z( d% c \0 L& D) s, ?# E+ x* d
在某些应用场合,强调程序运行速度的情况下,希望程序在SDRAM中运行,这样就需要将FLASH中存储的程序,在系统上电后搬运到SDRAM某空间位置,然后自动运行。这种所谓的Bootloader技术,在DSP系统中常被采用。4 G# l- ?# R# m7 U @% N
+ l+ N" f6 ?7 A+ I; y调试过程分两步:' z! ]+ h8 r( H: |- T
4 H& N* G* }8 n. d8 h# K(a)首先将用户程序在SDRAM中调试通过,然后将*.bin文件固化到FLASH某一非0扇区地址空间;
' U$ l1 Z" X: |( z8 E/ r5 X2 I0 y! A4 w+ G+ o) }
(b) 将自己编写的Bootloader搬运程序调试通过并将Bootloader.bin文件固化到FLASH的 0扇区地址空间,搬运程序在系统上电后,将(a)中FLASH某一非0扇区地址空间存储的程序,搬运到在SDRAM调试中同样的空间位置,实现程序在SDRAM中运行的目的。
8 S. ? ~1 T- _- p) `' X% F) v" G$ v4 d+ h \+ e6 m3 d
另外注意,因为用户实际的程序中断入口必须位于FLASH的0x18或0x1c地址,所以Bootloader搬运程序还应具有中断入口的跳转功能,即把PC指针由此转向处于SDRAM空间的中断程序入口表,就是整个用户程序被搬运到SDRAM的那一位置。" ~8 z6 f8 s$ G
6 Z) k! v0 Q" R/ \4 q0 @. R
如:LDR PC, =HandleIRQ
5 M! E* R& J- h" U$ Q // HandleIRQ位于SDRAM空间中断程序入口表
; `* q+ ^/ g4 M5 f第三步:工程编译和链接。第四步:软件的调试。第五步:执行文件的固化。, z& `7 {8 \1 e0 n1 T
! Q E+ R/ z% L" T2 h+ ?在整个流程中,用户首先需要建立工程并对工程做初步的配置,包括配置处理器和配置调试设备。编辑工程文件,包括自己编写的汇编和C语言源程序,还有工程编译时需要编写的链接脚本文件,调试过程中需要编写存储区映像文件和命令脚本文件,以及上电复位时的程序运行入口的启动程序文件。
3 ~: t. |% R a# v4 D# x, w6 D9 F/ N% {8 l
对后四种文件的理解很重要,其作用解释如下。% b# G# U; |, {* s
6 ?/ ]6 s& R! G `(1) 链接脚本文件:在程序编译时起作用。该文件描述代码链接定位的有关信息,包括代码段,数据段,地址段等,链接器必须使用该文件对整个系统的代码做正确的定位。在SDRAM中调试程序、在FLASH中调试或固化后运行的链接脚本文件应加以区分。(在IDE开发环境中使用扩展名*.ld)0 k! g; n B2 G
8 } {6 h# O$ {; E$ |- H
(2)命令脚本文件:在SDRAM中调试程序时起作用。在集成环境与目标连接时、软件调试过程中以及目标板复位后,有时需要集成环境自动完成一些特定的操作,比如复位目标板、清除看门狗、屏蔽中断寄存器、存储区映射等。这些操作可以通过执行一组命令序列来完成,保存一组命令序列的文本文件称为命令脚本文件(在 IDE开发环境中使用扩展名*.cs)。
g! P) r+ S8 L! d P z
" r4 I V! j3 a2 T3 j. o. G1 o(3)存储区映像文件:在SDRAM中调试程序时起作用。在软件调试过程中访问非法存储区在部分处理器和目标板上会产生异常,如果异常没有处理,则会导致软件调试过程无法继续,为了防止以上问题并调整仿真器访问速度以达到最合适的水平,提供这样一种用于描述各个存储区性质的文件叫存储区映像文件(在IDE开发环境中使用扩展名*.map)。+ m0 r/ c, J3 |) l5 I$ {, [
( x( u1 i& y8 ~/ k4 M/ V* H/ T在程序的调试过程中可以选择使用存储区映像文件*.map和命令脚本文件*. cs配合程序的调试。' Z9 q* I2 b% Z. M, E% n
6 n% E! r& ]1 A _- i: k
(4) 启动文件:它主要是完成一些和硬件相关的初始化的工作,为应用程序做准备。一般,启动代码的第一步是设置中断和异常向量;第二步是完成系统启动所必须的寄存器配置;第三步设置看门狗及用户设计的部分外围电路;第四步是配置系统所使用的存储区分配地址空间;第五步是变量初始化;第六步是为处理器的每个工作模式设置栈指针;最后一步是进入高级语言入口函数(Main函数)。
5 Y. X* l0 y5 g4 g% d
. Y4 R7 O% P. e$ h7 f中断程序设计
% b; @' X# o2 b/ h" W2 e) o# R& X' n* M4 z4 n
中断调试方面可以采用类似矢量中断动态处理方式,让中断对应的确定地址代码调转到RAM的固定地址处,定义一个函数指针指向该固定地址,就可以随时通过替换RAM固定地址处的代码,实现动态改变中断处理函数。
0 B1 K5 n) ~3 C" _' y- l
6 I4 o' q1 Q# q0 F8 I具体方法是:
9 ~8 e9 \8 g5 h+ c( x* E% k
% p( x/ h! r; {, }; G" l: d(1)将中断源函数指针定义在RAM中相对的固定地址,建立中断矢量表;( X! u2 Z$ b% m9 z; T9 A+ |
7 O; l1 R+ t8 I7 ^1 Q* U" a# X void SetInterrupt (U32 vector, void (*handler)()){ InterruptHandlers[vector] = handler;}
4 Z/ A& \/ U4 a; o
( M+ g( B. B. Z7 c(2)在程序中,调用具体某中断源的中断处理函数;
/ Z4 R' j& v- A) q7 ^, Y
5 H3 n9 }0 o' o7 f; Q 如:SetInterrupt(IIC_INT,IICWriteIsr);9 y8 H9 F( H; w; j, ^4 O! F
/* 声明IIC中断处理函数,其中IIC_INT为 IIC中断源序号,IICWriteIsr为 IIC的写中断处理函数 */
8 b. j8 T/ H) p/ @, ]; S( y; F9 _8 b: N+ B/ }
(3)在0x18处的IRQ或0x1C处的FIQ中断入口函数中,获取中断源、清除中断挂起标志、通过已定义的中断源函数指针进入用户具体某中断处理程序。+ R+ [: x, w6 m
! O/ Z1 I! z. e# y6 x void ISR_IrqHandler(void){ IntOffSet = (unsigned int)INTOFFSET; Clear_PendingBit(IntOffSet>>2) ;(*InterruptHandlers[IntOffSet>>2])();// 调用具体某中断处理程序}
. d* ~9 O. ?9 ^
% n9 f! J1 c5 Y' j- t% ~! n采用动态的中断处理方法,在中断源较多的情况下,中断响应时间和程序性能得到优化。另外,在调试方面,此处理方法具有便于跟踪调试的优点,并且根据需要,可以方便变换中断处理函数。
1 a' a' q, ?# l& @! I1 o+ h4 u) Q3 \ h% R; {# O% Q
中断调试" T" e) B3 {) A+ O. b3 g/ @0 ~
6 y" m$ P' _" q0 j g
软件调试可以在SDRAM中或FLASH中进行。在SDRAM中,读写方便,访问速度快。一般软件调试应在RAM中完成,但当RAM空间小于FLASH程序空间,程序只能在FLASH运行和调试时,或者用户希望了解程序在FLASH中实际运行情况时,就可以在FLASH中进行程序调试。
, i7 l8 k: T5 x0 v8 W; |) Q
) E' P/ v8 X9 \1 W进行中断调试时,应注意中断入口位于SDRAM中或FLASH中0x18或0x1c地址,链接脚本文件必须使整个系统的代码正确定位于0x0起始处,但SDRAM或FLASH对应的链接脚本文件及工程配置注意区别。0 G# U) }8 z# N/ \
5 `5 T( D: G5 J( _) [: C(1)程序在SDRAM中运行
3 V* o' D* e9 e% k9 `$ f4 z; B
在SDRAM中调试,使用SDRAM对应的链接脚本文件。调试过程需要以下几步:编译、链接工程;连接仿真器和电路板;下载程序(在IDE开发环境中使用扩展名*.elf);调试。
6 r: P' B' C9 V( G; M$ q1 t
1 r& B2 f; X) v& B下载程序前必须启动命令脚本文件完成前述的一些特定的操作,命令脚本文件的启动在连接仿真器时自动进行,其中存储区映射应与程序在SDRAM中运行时相同,保证整个系统的代码正确定位于0x0起始处。下载程序的起始地址也为0x0,下载成功后便可进行调试工作。* B8 ]6 V, g' ~9 U# e
) ?2 T6 R Q" r# l _(2)程序在FLASH中运行
7 D% L+ o/ Z5 C
7 y. } v. Y0 |2 I在FLASH中调试,使用FLASH对应的链接脚本文件。调试过程需要以下几步:编译、链接工程;连接仿真器和电路板;程序格式转换(*.elf转换为*.bin);固化*.bin程序;调试。! e; D( |4 ]7 E* n6 S5 F, n# i/ C! U: I
) v. {$ I& O5 p" G* ~ H ^3 i
连接仿真器后不需要下载程序,存储区映射由本身工程中启动文件运行完成,不需要命令脚本文件。在本环境调试过程中,可以设置两个硬件断点。- [5 ~; w; M# H/ q- c8 D
# }: B7 z% K) H+ A; |! ?1 I(3)程序从FLASH中调到SDRAM中运行; k, S/ Z5 A2 s& Z7 e# e
% A3 t9 ~; N/ t( ~4 j
在某些应用场合,强调程序运行速度的情况下,希望程序在SDRAM中运行,这样就需要将FLASH中存储的程序,在系统上电后搬运到SDRAM某空间位置,然后自动运行。这种所谓的Bootloader技术,在DSP系统中常被采用。
& p9 O' H/ }$ i
! ]4 }1 |% G2 P9 ?; Q- @( t) z调试过程分两步:% C* L6 G. t0 f
2 E) _+ j6 }- d
(a)首先将用户程序在SDRAM中调试通过,然后将*.bin文件固化到FLASH某一非0扇区地址空间;
0 l3 C' M' K4 ?* q% b! _" r. V$ G( H! C
(b) 将自己编写的Bootloader搬运程序调试通过并将Bootloader.bin文件固化到FLASH的 0扇区地址空间,搬运程序在系统上电后,将(a)中FLASH某一非0扇区地址空间存储的程序,搬运到在SDRAM调试中同样的空间位置,实现程序在SDRAM中运行的目的。
/ D" N% b# F0 P& B+ H7 P3 p& M' l% w" L |: i/ q
另外注意,因为用户实际的程序中断入口必须位于FLASH的0x18或0x1c地址,所以Bootloader搬运程序还应具有中断入口的跳转功能,即把PC指针由此转向处于SDRAM空间的中断程序入口表,就是整个用户程序被搬运到SDRAM的那一位置。7 {8 G' P" `7 C" \4 n
( _0 n# j* {) y! i9 P7 H/ h: l8 n+ @如:LDR PC, =HandleIRQ
2 f# Z9 C7 Y% U' O3 L) G/ { } // HandleIRQ位于SDRAM空间中断程序入口表% a0 L! I2 c) J; v, V1 d. K
|
|