This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

TMS320F28069 Linker issue

I am attempting to move my application code that runs out of RAM into a specific memory block. It runs just fine out of the L6 DPSARAM block.  When I setup the linker to run this function from the L4 SARAM block, the first instruction of the function changes from 00f820: B2BD MOVL *SP++, XAR1 to 00a918: 6F12 SB 18, UNC. The non-working code eventually corrupts the RPC and attempts to return to an invalid memory address and gets caught in an illegal operation interrupt. I have built this project with the same results using revisions c2000_6.2.5 and c2000_6.2.6.

How can I resolve this issue?

James

Working function:

57 MonitorSignal_Status MonitorSignal_update(MonitorSignal_Object* obj, IQ_Type currentValue){
driveCore_MonitorSignal_update__F:
00f820: B2BD MOVL *SP++, XAR1
00f821: FE02 ADDB SP, #2
00f822: 06C5 MOVL ACC, *+XAR5[0]
00f823: 1E42 MOVL *-SP[2], ACC
60 if(IQ_Var(currentValue) > IQ_Var(obj->maxValuePu) ||
00f824: C542 MOVL XAR7, *-SP[2]
00f825: A3C4 MOVL P, *+XAR4[0]
58 MonitorSignal_Status state = MonitorSignal_SignalInRange;
00f826: BE00 MOVB XAR6, #0x00
00f827: A9A9 MOVL @ACC, P
60 if(IQ_Var(currentValue) > IQ_Var(obj->maxValuePu) ||
00f828: 0FA7 CMPL ACC, @XAR7
00f829: 6414 SB C$L2, LT
00f82a: 06A7 MOVL ACC, @XAR7
00f82b: 0FD4 CMPL ACC, *+XAR4[2]
00f82c: 6411 SB C$L2, LT
65 else if(IQ_Var(currentValue) > IQ_Var(obj->maxWarningValuePU) ||
00f82d: 0FE4 CMPL ACC, *+XAR4[4]
00f82e: 6209 SB C$L1, GT
00f82f: 0FF4 CMPL ACC, *+XAR4[6]
00f830: 6407 SB C$L1, LT
71 obj->inRangeCounter++;
00f831: D00F MOVB XAR0, #0xf
00f832: 9294 MOV AL, *+XAR4[AR0]
00f833: D00E MOVB XAR0, #0xe
00f834: 9C01 ADDB AL, #1
00f835: 9394 MOV AH, *+XAR4[AR0]
00f836: 6F0E SB C$L4, UNC
67 obj->warningCounter++;
C$L1:
00f837: 83A4 MOVL XAR5, @XAR4
69 }
00f838: D00E MOVB XAR0, #0xe
68 obj->inRangeCounter = 0;
00f839: 9A00 MOVB AL, #0x0
69 }
00f83a: 9394 MOV AH, *+XAR4[AR0]
67 obj->warningCounter++;
00f83b: DD10 ADDB XAR5, #16
69 }
00f83c: 6F07 SB C$L3, UNC
62 obj->outOfRangeCounter++;
C$L2:
00f83d: D00E MOVB XAR0, #0xe
00f83e: 83A4 MOVL XAR5, @XAR4
00f83f: 9394 MOV AH, *+XAR4[AR0]
63 obj->inRangeCounter = 0;
00f840: 9A00 MOVB AL, #0x0
62 obj->outOfRangeCounter++;
00f841: 9D01 ADDB AH, #1
00f842: DD0E ADDB XAR5, #14
C$L3:
00f843: 0AC5 INC *+XAR5[0]
C$L4:
00f844: 761FF8A8 MOVW DP, #0xf8a8
74 if(obj->outOfRangeCounter >= MonitorSignal_maxOverThresholdCount){
00f846: 550B CMP AH, @0xb
00f847: 6721 SB C$L9, HIS
83 else if(obj->warningCounter >= MonitorSignal_maxOverThresholdCount){
00f848: 930B MOV AH, @0xb
00f849: D010 MOVB XAR0, #0x10
00f84a: 5594 CMP AH, *+XAR4[AR0]
00f84b: 690D SB C$L5, LOS
95 else if(obj->inRangeCounter >= MonitorSignal_maxOverThresholdCount) {
00f84c: 540B CMP AL, @0xb
00f84d: 56B80FA0 MOVB @AR0, #0x0f, LO
00f84f: 562A0894 MOV *+XAR4[AR0], AL, LO
00f851: 6823 SB C$L11, LO
96 obj->inRangeCounter = 0;
00f852: D00F MOVB XAR0, #0xf
00f853: 2B94 MOV *+XAR4[AR0], #0
98 obj->warningCounter = 0;
00f854: D110 MOVB XAR1, #0x10
97 obj->outOfRangeCounter = 0;
00f855: D00E MOVB XAR0, #0xe
00f856: 2B94 MOV *+XAR4[AR0], #0
98 obj->warningCounter = 0;
00f857: 6F1C SB C$L10, UNC
C$L5:
00f858: D00F MOVB XAR0, #0xf
00f859: 9694 MOV *+XAR4[AR0], AL
00f85a: 06A7 MOVL ACC, @XAR7
84 if(IQ_Var(currentValue) > IQ_Var(obj->maxWarningValuePU)) {
00f85b: 0FE4 CMPL ACC, *+XAR4[4]
00f85c: 6205 SB C$L6, GT
88 else if(IQ_Var(currentValue) < IQ_Var(obj->minWarningValuePU)) {
00f85d: 0FF4 CMPL ACC, *+XAR4[6]
00f85e: 6306 SB C$L8, GEQ
89 state = MonitorSignal_SignalLowWarning;
00f85f: BE04 MOVB XAR6, #0x04
90 IQ_Var(obj->lastWarningValue) = IQ_Var(currentValue);
00f860: 6F02 SB C$L7, UNC
85 state = MonitorSignal_SignalHighWarning;
C$L6:
00f861: BE03 MOVB XAR6, #0x03
86 IQ_Var(obj->lastWarningValue) = IQ_Var(currentValue);
C$L7:
00f862: D00A MOVB XAR0, #0xa
00f863: C394 MOVL *+XAR4[AR0], XAR7
93 obj->warningCounter = MonitorSignal_maxOverThresholdCount;
C$L8:
00f864: 920B MOV AL, @0xb
00f865: D010 MOVB XAR0, #0x10
00f866: 9694 MOV *+XAR4[AR0], AL
94 }
00f867: 6F0D SB C$L11, UNC
C$L9:
00f868: D00F MOVB XAR0, #0xf
00f869: 9694 MOV *+XAR4[AR0], AL
00f86a: A9A9 MOVL @ACC, P
80 obj->outOfRangeCounter = 0;
00f86b: D10E MOVB XAR1, #0xe
81 IQ_Var(obj->lastOutOfRangeValue) = IQ_Var(currentValue);
00f86c: D008 MOVB XAR0, #0x8
76 state = MonitorSignal_SignalHighFault;
00f86d: 0FA7 CMPL ACC, @XAR7
81 IQ_Var(obj->lastOutOfRangeValue) = IQ_Var(currentValue);
00f86e: C394 MOVL *+XAR4[AR0], XAR7
76 state = MonitorSignal_SignalHighFault;
00f86f: 56B401A6 MOVB @AR6, #0x01, LT
00f871: 56B302A6 MOVB @AR6, #0x02, GEQ
80 obj->outOfRangeCounter = 0;
C$L10:
00f873: 2B9C MOV *+XAR4[AR1], #0
101 obj->status = state;
C$L11:
00f874: D011 MOVB XAR0, #0x11
00f875: FE82 SUBB SP, #2
00f876: 7E94 MOV *+XAR4[AR0], AR6
103 return state;
00f877: 92A6 MOV AL, @AR6
00f878: 8BBE MOVL XAR1, *--SP
00f879: 0006 LRETR

Imbalanced Stack fail version of the function:

57 MonitorSignal_Status MonitorSignal_update(MonitorSignal_Object* obj, IQ_Type currentValue){
driveCore_MonitorSignal_update__F:
00a918: 6F12 SB 18, UNC
00a919: FE02 ADDB SP, #2
00a91a: 06C5 MOVL ACC, *+XAR5[0]
00a91b: 1E42 MOVL *-SP[2], ACC
60 if(IQ_Var(currentValue) > IQ_Var(obj->maxValuePu) ||
00a91c: C542 MOVL XAR7, *-SP[2]
00a91d: A3C4 MOVL P, *+XAR4[0]
58 MonitorSignal_Status state = MonitorSignal_SignalInRange;
00a91e: BE00 MOVB XAR6, #0x00
00a91f: A9A9 MOVL @ACC, P
60 if(IQ_Var(currentValue) > IQ_Var(obj->maxValuePu) ||
00a920: 0FA7 CMPL ACC, @XAR7
00a921: 6414 SB C$L2, LT
00a922: 06A7 MOVL ACC, @XAR7
00a923: 0FD4 CMPL ACC, *+XAR4[2]
00a924: 6411 SB C$L2, LT
65 else if(IQ_Var(currentValue) > IQ_Var(obj->maxWarningValuePU) ||
00a925: 0FE4 CMPL ACC, *+XAR4[4]
00a926: 6209 SB C$L1, GT
00a927: 0FF4 CMPL ACC, *+XAR4[6]
00a928: 6407 SB C$L1, LT
71 obj->inRangeCounter++;
00a929: D00F MOVB XAR0, #0xf
00a92a: 9294 MOV AL, *+XAR4[AR0]
00a92b: D00E MOVB XAR0, #0xe
00a92c: 9C01 ADDB AL, #1
00a92d: 9394 MOV AH, *+XAR4[AR0]
00a92e: 6F0E SB C$L4, UNC
67 obj->warningCounter++;
C$L1:
00a92f: 83A4 MOVL XAR5, @XAR4
69 }
00a930: D00E MOVB XAR0, #0xe
68 obj->inRangeCounter = 0;
00a931: 9A00 MOVB AL, #0x0
69 }
00a932: 9394 MOV AH, *+XAR4[AR0]
67 obj->warningCounter++;
00a933: DD10 ADDB XAR5, #16
69 }
00a934: 6F07 SB C$L3, UNC
62 obj->outOfRangeCounter++;
C$L2:
00a935: D00E MOVB XAR0, #0xe
00a936: 83A4 MOVL XAR5, @XAR4
00a937: 9394 MOV AH, *+XAR4[AR0]
63 obj->inRangeCounter = 0;
00a938: 9A00 MOVB AL, #0x0
62 obj->outOfRangeCounter++;
00a939: 9D01 ADDB AH, #1
00a93a: DD0E ADDB XAR5, #14
C$L3:
00a93b: 0AC5 INC *+XAR5[0]
C$L4:
00a93c: 761FF8A8 MOVW DP, #0xf8a8
74 if(obj->outOfRangeCounter >= MonitorSignal_maxOverThresholdCount){
00a93e: 550B CMP AH, @0xb
00a93f: 6721 SB C$L9, HIS
83 else if(obj->warningCounter >= MonitorSignal_maxOverThresholdCount){
00a940: 930B MOV AH, @0xb
00a941: D010 MOVB XAR0, #0x10
00a942: 5594 CMP AH, *+XAR4[AR0]
00a943: 690D SB C$L5, LOS
95 else if(obj->inRangeCounter >= MonitorSignal_maxOverThresholdCount) {
00a944: 540B CMP AL, @0xb
00a945: 56B80FA0 MOVB @AR0, #0x0f, LO
00a947: 562A0894 MOV *+XAR4[AR0], AL, LO
00a949: 6823 SB C$L11, LO
96 obj->inRangeCounter = 0;
00a94a: D00F MOVB XAR0, #0xf
00a94b: 2B94 MOV *+XAR4[AR0], #0
98 obj->warningCounter = 0;
00a94c: D110 MOVB XAR1, #0x10
97 obj->outOfRangeCounter = 0;
00a94d: D00E MOVB XAR0, #0xe
00a94e: 2B94 MOV *+XAR4[AR0], #0
98 obj->warningCounter = 0;
00a94f: 6F1C SB C$L10, UNC
C$L5:
00a950: D00F MOVB XAR0, #0xf
00a951: 9694 MOV *+XAR4[AR0], AL
00a952: 06A7 MOVL ACC, @XAR7
84 if(IQ_Var(currentValue) > IQ_Var(obj->maxWarningValuePU)) {
00a953: 0FE4 CMPL ACC, *+XAR4[4]
00a954: 6205 SB C$L6, GT
88 else if(IQ_Var(currentValue) < IQ_Var(obj->minWarningValuePU)) {
00a955: 0FF4 CMPL ACC, *+XAR4[6]
00a956: 6306 SB C$L8, GEQ
89 state = MonitorSignal_SignalLowWarning;
00a957: BE04 MOVB XAR6, #0x04
90 IQ_Var(obj->lastWarningValue) = IQ_Var(currentValue);
00a958: 6F02 SB C$L7, UNC
85 state = MonitorSignal_SignalHighWarning;
C$L6:
00a959: BE03 MOVB XAR6, #0x03
86 IQ_Var(obj->lastWarningValue) = IQ_Var(currentValue);
C$L7:
00a95a: D00A MOVB XAR0, #0xa
00a95b: C394 MOVL *+XAR4[AR0], XAR7
93 obj->warningCounter = MonitorSignal_maxOverThresholdCount;
C$L8:
00a95c: 920B MOV AL, @0xb
00a95d: D010 MOVB XAR0, #0x10
00a95e: 9694 MOV *+XAR4[AR0], AL
94 }
00a95f: 6F0D SB C$L11, UNC
C$L9:
00a960: D00F MOVB XAR0, #0xf
00a961: 9694 MOV *+XAR4[AR0], AL
00a962: A9A9 MOVL @ACC, P
80 obj->outOfRangeCounter = 0;
00a963: D10E MOVB XAR1, #0xe
81 IQ_Var(obj->lastOutOfRangeValue) = IQ_Var(currentValue);
00a964: D008 MOVB XAR0, #0x8
76 state = MonitorSignal_SignalHighFault;
00a965: 0FA7 CMPL ACC, @XAR7
81 IQ_Var(obj->lastOutOfRangeValue) = IQ_Var(currentValue);
00a966: C394 MOVL *+XAR4[AR0], XAR7
76 state = MonitorSignal_SignalHighFault;
00a967: 56B401A6 MOVB @AR6, #0x01, LT
00a969: 56B302A6 MOVB @AR6, #0x02, GEQ
80 obj->outOfRangeCounter = 0;
C$L10:
00a96b: 2B9C MOV *+XAR4[AR1], #0
101 obj->status = state;
C$L11:
00a96c: D011 MOVB XAR0, #0x11
00a96d: FE82 SUBB SP, #2
00a96e: 7E94 MOV *+XAR4[AR0], AR6
103 return state;
00a96f: 92A6 MOV AL, @AR6
00a970: 8BBE MOVL XAR1, *--SP
00a971: 0006 LRETR

  • Here is the link command I am using:

    # lnk28FP Executables/release/subc_241101_a0_c28/Ta2411Drive.x28FP ...
    C:/ti/ccsv5.5/xdctools_3_25_03_72/bin/rm -f package/cfg//Executables/release/subc_241101_a0_c28/Ta2411Drive.x28FP.map
    C:/ti/ccsv5.5/ccsv5/tools/compiler/c2000_6.2.5/bin/cl2000 -v28 -ml -mt --float_support=fpu32 -fs package/cfg/Executables/release/subc_241101_a0_c28/ -z --reread_libs --priority --disable_auto_rts --rom_model --warn_sections --diag_suppress=16002 --display_error_number -q -o Executables/release/subc_241101_a0_c28/Ta2411Drive.x28FP package/cfg/Executables/release/subc_241101_a0_c28/Ta2411Drive_p28FP.o28FP package/cfg/Executables/release/subc_241101_a0_c28/Ta2411Drive/SourceCode/Ta2411Drive/2411_main.o28FP package/cfg/Executables/release/subc_241101_a0_c28/Ta2411Drive/SourceCode/Ta2411Drive/adc.o28FP package/cfg/Executables/release/subc_241101_a0_c28/Ta2411Drive/SourceCode/Ta2411Drive/appSpecificParser.o28FP package/cfg/Executables/release/subc_241101_a0_c28/Ta2411Drive/SourceCode/Ta2411Drive/clarke.o28FP package/cfg/Executables/release/subc_241101_a0_c28/Ta2411Drive/SourceCode/Ta2411Drive/clk.o28FP package/cfg/Executables/release/subc_241101_a0_c28/Ta2411Drive/SourceCode/Ta2411Drive/cpu.o28FP package/cfg/Executables/release/subc_241101_a0_c28/Ta2411Drive/SourceCode/Ta2411Drive/cpu_usage.o28FP package/cfg/Executables/release/subc_241101_a0_c28/Ta2411Drive/SourceCode/Ta2411Drive/ctrl.o28FP package/cfg/Executables/release/subc_241101_a0_c28/Ta2411Drive/SourceCode/Ta2411Drive/drv.o28FP package/cfg/Executables/release/subc_241101_a0_c28/Ta2411Drive/SourceCode/Ta2411Drive/externalGpio.o28FP package/cfg/Executables/release/subc_241101_a0_c28/Ta2411Drive/SourceCode/Ta2411Drive/F2806x_usDelay.o28FP package/cfg/Executables/release/subc_241101_a0_c28/Ta2411Drive/SourceCode/Ta2411Drive/fanPanel.o28FP package/cfg/Executables/release/subc_241101_a0_c28/Ta2411Drive/SourceCode/Ta2411Drive/fem.o28FP package/cfg/Executables/release/subc_241101_a0_c28/Ta2411Drive/SourceCode/Ta2411Drive/filter_fo.o28FP package/cfg/Executables/release/subc_241101_a0_c28/Ta2411Drive/SourceCode/Ta2411Drive/flash.o28FP package/cfg/Executables/release/subc_241101_a0_c28/Ta2411Drive/SourceCode/Ta2411Drive/fw.o28FP package/cfg/Executables/release/subc_241101_a0_c28/Ta2411Drive/SourceCode/Ta2411Drive/gpio.o28FP package/cfg/Executables/release/subc_241101_a0_c28/Ta2411Drive/SourceCode/Ta2411Drive/ipark.o28FP package/cfg/Executables/release/subc_241101_a0_c28/Ta2411Drive/SourceCode/Ta2411Drive/memCopy.o28FP package/cfg/Executables/release/subc_241101_a0_c28/Ta2411Drive/SourceCode/Ta2411Drive/offset.o28FP package/cfg/Executables/release/subc_241101_a0_c28/Ta2411Drive/SourceCode/Ta2411Drive/osc.o28FP package/cfg/Executables/release/subc_241101_a0_c28/Ta2411Drive/SourceCode/Ta2411Drive/park.o28FP package/cfg/Executables/release/subc_241101_a0_c28/Ta2411Drive/SourceCode/Ta2411Drive/pid.o28FP package/cfg/Executables/release/subc_241101_a0_c28/Ta2411Drive/SourceCode/Ta2411Drive/pie.o28FP package/cfg/Executables/release/subc_241101_a0_c28/Ta2411Drive/SourceCode/Ta2411Drive/pll.o28FP package/cfg/Executables/release/subc_241101_a0_c28/Ta2411Drive/SourceCode/Ta2411Drive/pwm.o28FP package/cfg/Executables/release/subc_241101_a0_c28/Ta2411Drive/SourceCode/Ta2411Drive/pwr.o28FP package/cfg/Executables/release/subc_241101_a0_c28/Ta2411Drive/SourceCode/Ta2411Drive/sci.o28FP package/cfg/Executables/release/subc_241101_a0_c28/Ta2411Drive/SourceCode/Ta2411Drive/svgen.o28FP package/cfg/Executables/release/subc_241101_a0_c28/Ta2411Drive/SourceCode/Ta2411Drive/timer.o28FP package/cfg/Executables/release/subc_241101_a0_c28/Ta2411Drive/SourceCode/Ta2411Drive/trace.o28FP package/cfg/Executables/release/subc_241101_a0_c28/Ta2411Drive/SourceCode/Ta2411Drive/traj.o28FP package/cfg/Executables/release/subc_241101_a0_c28/Ta2411Drive/SourceCode/Ta2411Drive/usDelay.o28FP package/cfg/Executables/release/subc_241101_a0_c28/Ta2411Drive/SourceCode/Ta2411Drive/user.o28FP package/cfg/Executables/release/subc_241101_a0_c28/Ta2411Drive/SourceCode/Ta2411Drive/wdog.o28FP package/cfg/Executables/release/subc_241101_a0_c28/Ta2411Drive_p28FP.xdl --map_file=package/cfg//Executables/release/subc_241101_a0_c28/Ta2411Drive.x28FP.map -l C:/ti/ccsv5.5/ccsv5/tools/compiler/c2000_6.2.5/lib/libc.a