标题: DSP 烧写程序 进入非法中断 [打印本页] 作者: CLBuu 时间: 2022-1-10 10:36 标题: DSP 烧写程序 进入非法中断 编写dsp程序时,由于代码较长,超过片内RAM空间,所以改为烧写flash ; T& J& D: U9 N c) _ 开始烧写代码,运行程序,结果均正常;然后在此基础上添加一段代码(代码内容类似,没有错误),结果运行程序后,程序跳入非法中断 interrupt void ILLEGAL_ISR(void),不知为何。仅仅是添加一段代码,结果出现非法中断,百思不得其解,请高手指点一下。多谢多谢。 - L4 L' p" k4 b 程序中cmd文件如下:; S3 H8 v9 s8 \
MEMORY5 j( ~/ y8 v( G7 N
{7 ^; y: x# ~8 U% C# F) w) l# ?
PAGE 0: /* Program Memory */* y3 b" p7 n$ _3 @
/* Memory (RAM/FLASH/OTP) blocks can be moved to PAGE1 for data allocation */ 2 p# }: \9 L3 z# A+ _) C 5 ~: d: H# @* a! }: ~8 U# _; Q ZONE0 : origin = 0x004000, length = 0x001000 /* XINTF zone 0 */. b }3 J7 Z6 p5 w/ j. i$ e5 w
RAML0 : origin = 0x008000, length = 0x005000 /* on-chip RAM block L0 */ / V) r$ d# C% L/ ~& A /*RAML1 : origin = 0x009000, length = 0x001000*/ /* on-chip RAM block L1 */ & m3 B8 i) D! p( K7 z) k8 `; |0 t8 d /*RAML2 : origin = 0x00A000, length = 0x001000*/ /* on-chip RAM block L2 */ / [" {& f; i0 d: T y. m8 {5 P /*RAML3 : origin = 0x00B000, length = 0x001000*/ /* on-chip RAM block L3 */2 |& N G# I0 V. l
ZONE6 : origin = 0x0100000, length = 0x100000 /* XINTF zone 6 */1 }# \; E9 M+ I
ZONE7A : origin = 0x0200000, length = 0x00FC00 /* XINTF zone 7 - program space */ - C) q w" X) b4 U7 f& T) s0 u7 t FLASHH : origin = 0x300000, length = 0x008000 /* on-chip FLASH */' Y( ?, _& p2 j' v' ]& d4 r: M
/*FLASHG : origin = 0x308000, length = 0x008000*/ /* on-chip FLASH */ 5 c# ~% T9 h0 [( L /*FLASHF : origin = 0x310000, length = 0x008000*/ /* on-chip FLASH */ ~. A: I7 v2 G. _3 C6 P! ?
/*FLASHE : origin = 0x318000, length = 0x008000*/ /* on-chip FLASH */) _) _; V& C% E/ E2 |% b0 S
/*FLASHD : origin = 0x320000, length = 0x008000*/ /* on-chip FLASH */' C" }6 I* O& \
/*FLASHC : origin = 0x328000, length = 0x008000*/ /* on-chip FLASH */, X4 f$ M# `+ Z- j: I
FLASHA : origin = 0x308000, length = 0x012000 /* on-chip FLASH */ ! T [% ?, J( s9 Q CSM_RSVD : origin = 0x33fF80, length = 0x000076 /* Part of FLASHA. Program with all 0x0000 when CSM is in use. */ 8 t0 S. m* ~* }$ L. H2 z BEGIN : origin = 0x33FFF6, length = 0x000002 /* Part of FLASHA. Used for "boot to Flash" bootloader mode. */ ! }4 Z! @( K0 F' v8 A CSM_PWL : origin = 0x33FFF8, length = 0x000008 /* Part of FLASHA. CSM password locations in FLASHA */ 2 m, ]$ J* O( U& u. k OTP : origin = 0x380400, length = 0x000400 /* on-chip OTP */ 7 j p6 V( t6 D$ I7 w ADC_CAL : origin = 0x380080, length = 0x000009 /* ADC_cal function in Reserved memory */7 Q: Z1 w3 M2 f
K$ g& p p% j. }3 n
IQTABLES : origin = 0x3FE000, length = 0x000b50 /* IQ Math Tables in Boot ROM */, U$ t7 h+ W) v
IQTABLES2 : origin = 0x3FEB50, length = 0x00008c /* IQ Math Tables in Boot ROM */ ! X7 ]1 k5 e/ c+ [" ^" l FPUTABLES : origin = 0x3FEBDC, length = 0x0006A0 /* FPU Tables in Boot ROM */$ N J5 c# o8 o' [
ROM : origin = 0x3FF27C, length = 0x000D44 /* Boot ROM */ % X6 P$ `8 \" l( w% T RESET : origin = 0x3FFFC0, length = 0x000002 /* part of boot ROM */ ( t3 m5 L' r# r1 ~6 v8 U, v! j VECTORS : origin = 0x3FFFC2, length = 0x00003E /* part of boot ROM */ 2 R& }" _" x8 _+ ?' V$ v. k# Y( e. W5 J" Q( ~
PAGE 1 : /* Data Memory */ . R$ L( b) U5 s+ D; M! W r& @ /* Memory (RAM/FLASH/OTP) blocks can be moved to PAGE0 for program allocation */; o1 u! G4 [5 U: U+ h
/* Registers remain on PAGE1 */ 6 E2 t7 h/ y8 K+ X9 p4 l ) {* L, {4 V! ^* q BOOT_RSVD : origin = 0x000000, length = 0x000050 /* Part of M0, BOOT rom will use this for stack */ # n: P$ ?# o u9 O RAMM0 : origin = 0x000050, length = 0x0003B0 /* on-chip RAM block M0 */# l0 Z# X9 K! f6 A5 z4 M
RAMM1 : origin = 0x000400, length = 0x000400 /* on-chip RAM block M1 */. H: o, L" M9 i; y6 S- D
/*RAML4 : origin = 0x00C000, length = 0x001000*/ /* on-chip RAM block L1 */, P$ E8 z) F3 h# a {1 y
RAML5 : origin = 0x00D000, length = 0x001000 /* on-chip RAM block L1 */. D8 p% x8 ]+ b
RAML6 : origin = 0x00E000, length = 0x001000 /* on-chip RAM block L1 */( ~ W& O' h! c% H1 Q+ S! v
RAML7 : origin = 0x00F000, length = 0x001000 /* on-chip RAM block L1 */, T, ]3 m& q: v5 U5 x$ Q
ZONE7B : origin = 0x20FC00, length = 0x000400 /* XINTF zone 7 - data space */ - {% A" \" `8 {' o* s- A ZONE7A : origin = 0x210000, length = 0x0100003 O, B1 m& J8 r& T& X& L
/*FLASHB : origin = 0x330000, length = 0x008000*/ /* on-chip FLASH */ ) p% |9 B4 n: e& J}3 s0 W; ^5 i7 k) ?4 O
; p c2 @) W/ H' {6 e- }+ X( W6 f/* Allocate sections to memory blocks.+ f! t3 N' N9 x
Note: ; ?! ~0 P4 j: l, m% H codestart user defined section in DSP28_CodeStartBranch.asm used to redirect code! A% Y# R3 V5 m4 a
execution when booting to flash + A2 _- J) t; z! r$ A ramfuncs user defined section to store functions that will be copied from Flash into RAM & U8 ]. c+ F! g8 o( D*/. T1 Z8 R$ S& U* e
4 p5 L4 |( c) O( E
SECTIONS N5 P& ~9 a4 j; K/ o
{ , A0 a' I7 G$ O5 ?9 ? ; j( ?8 t9 W# C" F: h$ Y /* Allocate program areas: */ ' I- b- V. s h1 {$ b2 `- X L' a .cinit : > FLASHA PAGE = 0* I: m" I* [7 b+ y
.pinit : > FLASHA, PAGE = 0 * L. h/ p# ~8 d2 j .text : > FLASHA PAGE = 0 4 g3 x& l4 G$ N codestart : > BEGIN PAGE = 0 7 f! R: c* C8 z) q) X ramfuncs : LOAD = FLASHA,4 K6 O+ I5 a+ A$ v8 A5 n% T
RUN = RAML0,! l+ g# ^/ s. F% y
LOAD_START(_RamfuncsLoadStart),. T2 M( x4 e$ u) a; W2 _+ r
LOAD_END(_RamfuncsLoadEnd), , Q9 a+ _ q( G RUN_START(_RamfuncsRunStart), & U; M" `9 F' F0 y" d PAGE = 00 q( M- i4 y( p! i
2 |( B2 e. c2 g' m: A" E
csmpasswds : > CSM_PWL PAGE = 0 X! Z( D$ |, m, y4 a$ E, V
csm_rsvd : > CSM_RSVD PAGE = 0$ U* y5 N! h1 }$ s
8 A+ w/ L! N B7 k7 S* ^
/* Allocate uninitalized data sections: */' ^* l3 F9 D( X
.stack : > RAMM1 PAGE = 1( R& G) w7 j! Q1 M7 r
.ebss : > RAML5 PAGE = 1 , Z/ _8 [ w s .esysmem : > RAMM1 PAGE = 1 " p1 d! K6 ^# n0 j6 y3 P3 v# Z4 Z0 r: o
/* Initalized sections go in Flash */9 F/ @; b( p0 R
/* For SDFlash to program these, they must be allocated to page 0 */ ) u2 i5 f0 M% j) g1 k: q .econst : > FLASHA PAGE = 0 2 v+ P8 o' ^6 z. a+ @$ U2 I& n. e .switch : > FLASHA PAGE = 0 0 c+ d, j1 I3 P, Q5 G2 X r1 b2 o ) [; [- M. a: K; } /* Allocate IQ math areas: */# y0 Q$ f4 i: `( }2 H9 Z
IQmath : > FLASHA PAGE = 0 /* Math Code */) I, [( E3 k3 O3 a1 m+ F: _
IQmathTables : > IQTABLES, PAGE = 0, TYPE = NOLOAD0 }% Z/ R2 Y. z: z7 ^" o$ l! O
IQmathTables2 : > IQTABLES2, PAGE = 0, TYPE = NOLOAD% I$ m2 k5 p( H% X3 J7 y& z3 D
FPUmathTables : > FPUTABLES, PAGE = 0, TYPE = NOLOAD y, k3 E6 G3 A
& V P7 ?1 y' @1 F /* Allocate DMA-accessible RAM sections: */7 r! U; t% W4 S6 q6 t
DMARAML4 : > RAML5, PAGE = 1 0 }) a- m. R/ c! p7 ?5 Y DMARAML5 : > RAML5, PAGE = 1 $ d; W2 S2 @0 f, }/ Q DMARAML6 : > RAML6, PAGE = 1 8 {0 K/ w* t9 p' W DMARAML7 : > RAML7, PAGE = 1 * }* N2 ~) e% p- Q, g # M) g2 s! j6 k6 h5 p w$ _9 O: O /* Allocate 0x400 of XINTF Zone 7 to storing data */7 [0 G& n' {$ E. h$ c
data : > ZONE7A, PAGE = 1 9 C4 F' n I3 Z" M ZONE7DATA : > ZONE7B, PAGE = 1# L, V* ~, P0 K2 E1 y6 a. e5 a
7 w2 _$ P9 j I
/* .reset is a standard section used by the compiler. It contains the */ & h- u5 X- o" M+ U /* the address of the start of _c_int00 for C Code. /*9 D0 s& C: o; I8 n
/* When using the boot ROM this section and the CPU vector */: h- L1 B1 D/ t0 Q6 i0 Z0 T, T
/* table is not needed. Thus the default type is set here to */; }" Q) ]; w( ?7 T$ `6 J8 L
/* DSECT */ % u- n0 M2 r1 G+ G .reset : > RESET, PAGE = 0, TYPE = DSECT% ]! L: W1 M: `- N6 K" x
vectors : > VECTORS PAGE = 0, TYPE = DSECT 3 x, l9 U3 X, Z+ r3 R: g * w( Z0 y2 i7 B0 m. a5 i /* Allocate ADC_cal function (pre-programmed by factory into TI reserved memory) */ c! x3 p D& ?4 M% E2 @! b' ?
.adc_cal : load = ADC_CAL, PAGE = 0, TYPE = NOLOAD * \ {1 J7 T5 E J$ t1 h 9 q1 J4 n+ |6 H}) }! _" d, N4 W" C( w: L 作者: faker12 时间: 2022-1-10 11:20
这个问题可以从这个思路走一下: W! j/ o' V( D* q- j
(1)检查一下,新添加的代码是否在某个中断内不?原因是因为中断没有执行完,异常结束了。 # S. l5 s3 F$ J. m4 k(2)找问题,首先不找cmd文件的问题。/ f- B# ?: x* }7 L
我个人见解。作者: guanshen 时间: 2022-1-10 13:11
是和程序的代码长度有关,或者是类似堆栈缓存空间不足作者: xiananUZI 时间: 2022-1-10 13:32
如果方便,可以把你添加的代码和被添加的部分,粘出来,我看一下作者: kiygb 时间: 2022-1-10 13:53
利用单步执行,看程序执行情况