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.

[参考译文] CCS/TMS320F2.8379万D:集成CLA,ADC和HRPWM时的Illegal _ISR

Guru**** 2042910 points
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/575694/ccs-tms320f28379d-illegal_isr-when-integrating-cla-adc-and-hrpwm

部件号:TMS320F2.8379万D

尊敬的各位:

当我尝试将HRPWM,ADC和CLA全部集成在一起时,我遇到了一个非法的ISR,尽管它们似乎占用了PieVectorTable中的不同中断插槽。 在论坛中进行搜索后,我怀疑某个注册表值被指向illegal _ISR例程的值覆盖。 请看一下下面我的代码(摘自主{}例程),因为我无法找出错误的位置。

提前感谢。
Giel Van den Broeck

 

工具/软件:Code Composer Studio

////
初始化控制和模拟子系统的系统控制
//启用外设时钟
//此示例函数可在F2837xD_sysctrl.c文件中找到。
//
EALLOW;//这是写入EALLOW保护寄存器所必需的
InitSysCtrl();
EDIS;

//禁用CPU中断
	DINT;

////
初始化GPIO
//

// PWM
InitEPwmGpio();

//设置LED2.
GPIO_SetupPinMux (31,GPIO _MUX_CPU1,0);
	GPIO _SetupPinOptions (31,GPIO输出, GPIO_PushPull);

//
//将PIE控制寄存器初始化到其默认状态。
//默认状态是禁用所有PIE中断,
并清除标志//。
//////


此函数位于F2837xD_PIECTRL.c文件中。
//
InitPieCtrl();////


禁用CPU中断并清除所有CPU中断标志:
//
EALLOW;
IER = 0x0000;
IFR = 0x0000;

////
使用指向shell Interrupt
//服务例程(ISR)的指针初始化PIE矢量表。
//这将填充整个表,即使在此
示例中未使用中断//。 这对于调试非常有用。
// shell ISR例程位于F2837xD_DefaultIsr.C.中
//此函数位于F2837xD_PieVect.C.中
//
InitPieVectorTable();
EDIS;

//
// CLA配置
//首先配置CLA内存空间,然后配置
// CLA任务向量
//
	CLA_configClaMemory();
	CLA_initCpu1Cla1();

//启用中断

	EALLOW;
	PieVectorTable.ADCA1_INT		=&adca1_ISR;// ADCA中断1
	PieVectorTable.EPWM1_INT		=&epwm1_ISR;// EPTM1中断
	函数PieVectorTable.CLA1_INT	=&clclclclclclava1Isr1;PieVecm1_IN1 = PieVect1
	;表	
	1	= 1
		
	= 1;表1;表1 = 1;表1;表1 = 	
	PieVectorTable.CLA1_6_INT	=&cla1Isr6;
	PieVectorTable.CLA1_7_INT	=&cla1Isr7;
	PieVectorTable.CLA1_8_INT	=中断1Isr8;
	EDIS;

	//启用全局中断和较高优先级实时调试事件
	IER || M_INT1;/INT/INCLA组
	IE11/
	启用E11 (ETR1)中断IN_IN11 (EIN_IN14) IN_IN13 (ETRA组) IER)
	//启用全局中断INTM
	//ERTM;//启用全局实时中断DBGM

	//启用PIECtrlRegs.PIEER1.bit.INTx1
	= 1;	//启用ADCA1中断(请参阅技术参考手册第94页)
	PieCtrlRegs.PIEIEER3.INTx1 = 1;	//启用EPWIEr1.Ctrl/PIE1.IE1 =
	
	PIE1.IE1。 //启用CLA中断

////
初始化系统变量,启用HRPWM
//
	UpdateFine =1;
	PeriodFine =0;
	状态= SFO_INCOMPLETE;

////
启用全局中断和更高优先级的实时调试事件:
//
EINT;//启用全局中断INTM
ERTM; //启用全局实时中断DBGM

////
调用SFA()使用已校准的MEP_ScaleFactor更新HRMSTEP寄存器。
//在启用
//高分辨率期间控制之前,HRMSTEP必须填入比例因子值。
//
//while (status == SFO_INCOMPLETE)//呼叫直到完成
//{
//status = SFA();
//IF (状态== SFO_ERROR)
//{
//error();//如果发生错误,SFO函数返回2,并且MEP的编号为
//} //步长/粗步长超过最大值255。
//}////


ADC配置
//
	ADC_Config();		//配置ADC SOC信道
	ADCChannels();	//将SOC信道链接到ADCIN信道

////
eCLA和HRPWM寄存器配置
//
	HRPWM_Config(PWM_Period);// ePWMx目标
	EALLOW;

// Setuptest
	//CLA和HRPWM寄存器配置// 

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我想补充以下信息:

    在调试过程中,我发现禁用CLA_configClaMemory功能后问题消失。 但是,我们当然失去了CLA的功能。

    void CLA_configClMemore(void)
    {
    	extern UINT32_t Cla1funcsRunStart, Cla1funcsLoadSize;
    
    	EALLOW;
    
    	#ifdef _flash
    		//将代码从闪存复制到RAM
    		memcpy((UINT32_t *)&Cl1MemClemsRunStart; UCM.C1=
    				
    	
    
    	
    	
    	
    
    	
    	
    	正在初始化CMSS1=正在初始化状态/U1CD.CD1.I =
    
    	//选择LS5RAM作为CLA的编程空间
    	//首先将CLA配置为主LS5,然后
    	//将空间设置为程序块
    	//MemCfgRegs.LSxMSEL.bit.MSEL_LS5 =1;
    	//MemCfgRegs.LSxCLAPGM.bit.CLAPGM_LS5 =1;
    
    	//
    	//选择LS4和LS5RAM作为CLA的编程空间
    	//首先将CLA配置为主LS4/LS5,然后
    	//将空间设置为程序块
    	//
    	MemCfgRegs.LSxMSEL.Bit.MSEL_LS4 =1;MemCfgRegs.LSxCLAPGM.Bit_LS1.MSCASP_LS1.1=
    	
    
    	1.CASP_LS1.1= 1.CASP_LS1.fgf_LS1=
    	
    
    	//下一步,将LS0RAM和LS1RAM配置为CLA的数据空间
    	//首先将CLA配置为LS0(1)的主控制器,然后再配置
    //将空格设置为代码块
    	MemCfgRegs.LSxMSEL.bit.MSEL_LS0 = 1;
    	MemCfgRegs.LSxCLAPGM.bit.CLAPGM_LS0 = 0;
    
    	MemCfgRegs.LSxMSEL.bit.MSEL_LS1 = 1;MemCfgRegs.LSxCLAPGM.LS0
    	=
    
    	
    
    0 

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好,

    您是否能够通过该代码来查找您最终进入illegal _ISR()的位置? ilical_isR()通常表示已解码无效指令,因此您开始执行的某一行内存不足,不包含实际代码。

    您是从闪存还是RAM运行?

    Whitney
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的Whitney:

    感谢您的回复。

    我尝试评论不同的代码块,以确定何时输入非法中断服务例程,实际上,在评论不同的代码块时,它一直显示在不同的行中。 例如,在行status = SFA()时,出现错误。

    我正在从RAM运行代码。

    为了确定哪一行准确触发了illegal _ISR,我找到了以下代码:

    void ilical_isr (void)
    //非法操作陷阱
    {//
    在此处插入ISR代码
    //接下来的两行用于调试,仅用于在此处停止处理器
    ASM (“ESTOP0”);
    //以便代码在未处于调试模式
    时也停止ASM (“B $,UNC”);
    //将PC放在此处以继续执行
    ASM (“NOP”);
    } 

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    是否可以使用内存浏览器查找可能的堆栈溢出或缓冲区溢出? 这些都是《国际贸易和区域行动方案》的共同原因。

    Whitney
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好,Whitney,

    根据您的建议(谢谢!),我在调试后得出以下结论:

    • Illegal _ISR发生在ADC_ISR,该ADC_ISR处理ADC转换的完成(请参阅下面的屏幕截图)。
    • 没有堆栈溢出:我已将监视点添加到_stack_end-2并在内存浏览器中监视堆栈。
    • 我找不到应用程序注释来检查缓冲区溢出

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我真的找不到代码中的错误。 因此,我上传整个main.c file.e2e.ti.com/.../5344.main.c

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    是否仅在启用CLA功能时才会看到问题?

    我浏览了您的代码,问题不是直接向我提出。 您是否介意共享为存在问题的版本生成的.cmd文件和.map文件?

    Whitney

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的Whitney:

    当我禁用配置CLA内存和CLA寄存器的行时,出现错误disappears.e2e.ti.com/.../TLC_5F00_CONTROL_5F00_DELFINO.zip

    请在附件中找到这两个文件。 感谢您的帮助!

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我有点困惑,为什么地图文件有一个名为RAMLS4_LS5的内存区域,但链接程序命令文件却没有。 您确定这些文件正确吗?

    无论采用哪种方式,都好像adca1_ISR被放置在LS4 RAM中--您已经说过,您想将其用作CLA程序空间。 CPU被阻止访问配置为CLA程序内存的内存,因此这似乎解释了illegal _ISR(),以及为什么它只在您配置了内存所有权时才弹出。

    您需要修复cmd文件,以便.text不使用您分配给CLA的任何部分。 如果您需要示例,请查看我们的CLA示例使用的cmd文件。

    Whitney
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的Whitney:

    感谢您指出这一点。 我更改了链接程序cmd文件,以便CLA不再使用LS4程序空间。 也许我需要在将来重新配置链接器文件,以便为CLA保留更多空间,但到目前为止,问题已经解决。

    对于遇到类似问题的其他用户,我将包括更新的链接程序文件。

    //如果使用
    // CLA C编译器
    //项目属性-> C2000链接器->高级选项->命令文件
    //预处理->--用户必须在项目链接器设置中定义CLA_C 定义
    #ifdef CLA_C
    //定义CLA暂存器区域的大小,
    CLA编译器将使用该区域的本地符号和临时工
    //也会强制引用标记
    //暂存器的特殊符号。
    CLA_ScratchPad_size = 0x100;
    --UNDEF_SYM=__CLA_scratchpad_end
    --UNDEF_SYm=__CLA_scratchpad_start
    #endif //CLA_C
    
    memory
    {
    第0页:/*
    begin用于“引导至SARAM”引导加载程序模式*/
    
    begin 	:Origin = 0x0万,length = 0x0.0002万
    RAMM0 	:原点= 0x0.0122万,长度= 0x0002DE
    RAMD0 	:原点= 0x00B000,长度= 0x0.08万
    RAMD1 :原点= 0x00B800,长度= 0x0.08万
    RAMLS4 		:原点= 0x00A000,长度= 0x0.08万
    RAMLS5 :原点= 0x00A800,长度= 0x0.08万
    //RAMLS4_LS5 	:原点= 0x00A000,长度= 0x0.1万
    重置 	:Origin = 0x3FFFC0,length = 0x0.0002万
    
    page 1:
    
    boot_rsvd :原点= 0x0.0002万,长度= 0x0.012万 /* M0的一部分,引导ROM将使用此堆栈*/
    RAMM1 :原点= 0x0.04万,长度= 0x0.04万 /*片上RAM块M1 */
    
    RAMLS0 	:原点= 0x0.8万,长度= 0x0.08万
    RAMLS1 	:原点= 0x0.88万,长度= 0x0.08万
    RAMLS2 		:原点= 0x0.9万,长度= 0x0.08万
    RAMLS3 		:原点= 0x0.98万,长度= 0x0.08万
    
    RAMGS0 :原点= 0x00C000,长度= 0x0.1万
    RAMGS1 :原点= 0x00D000,长度= 0x0.1万
    RAMGS2 :原点= 0x00E000,长度= 0x0.1万
    RAMGS3 :原点= 0x00F000,长度= 0x0.1万
    RAMGS4 :原点= 0x1万,长度= 0x0.1万
    RAMGS5 :原点= 0x1.1万,长度= 0x0.1万
    RAMGS6 :原点= 0x1.2万,长度= 0x0.1万
    RAMGS7 :原点= 0x1.3万,长度= 0x0.1万
    RAMGS8 :原点= 0x1.4万,长度= 0x0.1万
    RAMGS9 :原点= 0x1.5万,长度= 0x0.1万
    RAMGS10 :原点= 0x1.6万,长度= 0x0.1万
    RAMGS11 :原点= 0x1.7万,长度= 0x0.1万
    RAMGS12 :原点= 0x1.8万,长度= 0x0.1万 /*仅在F2.8379万D,F2.8377万D和F2.8375万D设备上可用。 删除其它设备上的线路。 *
    RAMGS13 :原点= 0x1.9万,长度= 0x0.1万 /*仅在F2.8379万D,F2.8377万D和F2.8375万D设备上可用。 删除其它设备上的线路。 *
    RAMGS14 :原点= 0x01A000,长度= 0x0.1万 /*仅在F2.8379万D,F2.8377万D和F2.8375万D设备上可用。 删除其它设备上的线路。 *
    RAMGS15 :原点= 0x01B000,长度= 0x0.1万 /*仅在F2.8379万D,F2.8377万D和F2.8375万D设备上可用。 删除其它设备上的线路。 */
    
    Cana_MSG_RAM :原始= 0x4.9万,长度= 0x0.08万
    CANB_MSG_RAM :原点= 0x04B000,长度= 0x0.08万
    
    CLA1_MSGRAMLOW:原点= 0x0.148万,长度= 0x0.008万
    CLA1_MSGRAMHIGH:原点= 0x0.15万,长度= 0x0.008万
    }
    
    节
    {
    codegstart :>开始, 页面= 0
    //.text :>> RAMD0|RAMD1|RAMLS4_LS5,页面= 0
    .text :>> RAMD0|RAMD1|RAMLS4,page = 0
    //.text :>> RAMD0|RAMD1,页面= 0
    .cit :> RAMM0, 页面= 0
    。Pinit :> RAMM0, 页面= 0
    。switch :> RAMM0, 页面= 0
    。重置 :>重置, Page =0,type = DSECT /* not used,*/
    
    .stack :> RAMM1, 页面= 1
    .ebss :> RAMLS2,页面= 1
    。econst :> RAMLS3,第= 1页
    。esysmem :> RAMLS3,页=1
    Filter_RegsFile:> RAMGS0,	页=1
    
    /* CLA特定章节*//Cla1Prog
    :> RAMLS4_LS5,Page=0
    Cla1Prog :> RAMLS5,页面=0
    
    CLADataLS0		:> RAMLS0,页面=1
    CLADataLS1		:> RAMLS1,页面=1
    
    Cla1ToCpuMsgRAM:> CLA1_MSGRAMLS1,页面=1
    CpuToMG1MsgRAM:> CLA1_MSGRAMHIGH,页面=1/*过滤器
    
    
    ,区域= 1文件	:
    > RAMGS2,	页=1,FILLE=0x2222
    Filter3_RegsFile :> RAMGS3,	页=1,FILLE=0x3333
    Filter4_RegsFile :> RAMGS4,	页=1,FILLE=0x4444
    
    #ifdef __TI_Compiler_version__
    #if __TI_Compiler_version__>= 1500.9万
    .ti.ramfunc :{}> RAMM0, 页= 0
    #else
    ramfuncs:> RAMM0 Page =0
    #endif
    #endif
    
    #ifdef CLA_C
    /* CLA C编译器节*////
    
    必须分配给内存CLA具有对
    //
    CLAskatch的写入访问权限 :
    {*。obj (CLAskatch)
    。 += CLA_ScratchPad_Size;
    *.obj(CLAScratch_end)}> RAMLS1,页面=1
    
    个.scratchpad :> RAMLS1, 页面= 1
    .bss_CLA 		:> RAMLS1, 页面= 1
    .const_CLA 	:> RAMLS1, 第= 1页
    #endif //CLA_C
    }/*
    
    
    //===================================================
    //文件结束。
    //===========================================================================================================================================
    */
    

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    很好。 感谢您分享更新后的cmd代码。

    Whitney