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.

[参考译文] BOOSTXL-DRV8323RH:universal_motorcontrol_lab:跳转到 Interrupt_illegalOperationHandler

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1283224/boostxl-drv8323rh-universal_motorcontrol_lab-jump-to-interrupt_illegaloperationhandler

器件型号:BOOSTXL-DRV8323RH

您好!

如果我的代码在 runMotor1Control 例程中运行,它的工作是完美的,例如设置 obj->flagEnableRunAndIdentify = false ...  

void runMotor1Control(MOTOR_Handle handle)
{
   MOTOR_Vars_t *obj = (MOTOR_Vars_t *)handle;
   MOTOR_SetVars_t *objSets = (MOTOR_SetVars_t *)(obj->motorSetsHandle);
   USER_Params *objUser = (USER_Params *)(obj->userParamsHandle);
   .
   .
   .
   if (objSets->command_MotorIdentify)
   {
      obj->flagEnableRunAndIdentify = false;
      obj->flagRunIdentAndOnLine = false;
      obj->speedRef_Hz = 0;
      obj->flagEnableMotorIdentify = true;

      objUser->motor_Rs_Ohm = 0.001f;
   }
   return;
}   

但是、当我创建子例程来处理它时、它会跳转到 Interrupt_illegalOperationHandler

void doCommandMotorIdentify(MOTOR_Handle handle)
{
   MOTOR_Vars_t *obj = (MOTOR_Vars_t *)handle;
   MOTOR_SetVars_t *objSets = (MOTOR_SetVars_t *)(obj->motorSetsHandle);
   USER_Params *objUser = (USER_Params *)(obj->userParamsHandle);

   doCommandMotorIdentify(handle);
   
   return;
}

void doCommandMotorIdentify(MOTOR_Handle handle)
{
   MOTOR_Vars_t *obj = (MOTOR_Vars_t *)handle;
   MOTOR_SetVars_t *objSets = (MOTOR_SetVars_t *)(obj->motorSetsHandle);
   USER_Params *objUser = (USER_Params *)(obj->userParamsHandle);

   if (objSets->command_MotorIdentify)
   {
      obj->flagEnableRunAndIdentify = false;
      obj->flagRunIdentAndOnLine = false;
      obj->speedRef_Hz = 0;
      obj->flagEnableMotorIdentify = true;

      objUser->motor_Rs_Ohm = 0.001f;
   }
   return;
}

在 doCommandMotorIdentify()例程内,语句  

objUser->MOTOR_MOTOR_0.001f Rs_Ohm 肯定导致了故障:(

另请注意此语句  

如果(objSets->COMMAND_MotorIdentify == true)将导致故障  

但是这个声明是有效的  

if (objSets->COMMAND_MotorIdentify)  

有人能帮助解释造成这种情况 的原因吗?

丹尼

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

    您好 Danny:

    我有一个简单说明的问题。

    在您的第二个代码片段中, doCommandMotorIdentify()应该调用() doCommandMotorIdentify吗? 我将假定这意味着 runMotor1Control改用()调用您的函数。

    放置一个电阻器、这很有趣。 我一定会首先推荐您浏览 C28x 中断常见问题解答- ITRAP 中断部分其中详细介绍了一些初始调试步骤。 如果不了解整个系统、就很难隔离调试这类器件。 此外,其他有关的帖子可能有助于找到 ITRAP 的共同原因- 此 e2e 搜索应该会对您有所帮助。

    您会注意到 ITRAP 问题通常与堆栈溢出、错误配置的闪存和内存分配问题有关。

    请告诉我是否有任何帮助、如果没有帮助、我将继续尝试提供帮助!

    此致、
    杰森·奥斯博尔恩

    (顺便说一下、确保该 doCommandMotorIdentify()motor1_drive.crunMotor1Control()函数位于文件中。 我不认为这是基于症状的问题、但它绝对重要。)

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

    大家好、Jason、

    对不起,这是我的错字,第二个代码片段不在那里,只需要调用 doCommandMotorIdentify()一次。

    void runMotor1Control(MOTOR_Handle handle)
    {
        MOTOR_Vars_t *obj = (MOTOR_Vars_t *)handle;
        MOTOR_SetVars_t *objSets = (MOTOR_SetVars_t *)(obj->motorSetsHandle);
        USER_Params *objUser = (USER_Params *)(obj->userParamsHandle);
    
        doCommandMotorIdentify(handle);
        .
        .
        .
        return;
    }

    是的, doCommandMotorIdentify()和 runMotor1Control()都在 motor1_drive.c 文件中。

    见下文 doCommandMotorIdentify (),我把一些没有逻辑或计算的基本语句放在那里,一些尝试后,我发现如果随机删除一个行/分配,程序 可以运行而不中断。

    因此它的内存问题对吗?  

    void doCommandMotorIdentify(MOTOR_Handle handle)
    {
        MOTOR_Vars_t *obj = (MOTOR_Vars_t *)handle;
        MOTOR_SetVars_t *objSets = (MOTOR_SetVars_t *)(obj->motorSetsHandle);
        USER_Params *objUser = (USER_Params *)(obj->userParamsHandle);
    
        objUser->motor_Rs_Ohm = 0.001f;
        obj->flagEnableRunAndIdentify = false;
    	obj->flagRunIdentAndOnLine = false;
    	obj->speedRef_Hz = 0;
    	obj->flagEnableMotorIdentify = true;
        objUser->motor_Ls_d_H = 0.001f;
    	objUser->motor_Ls_q_H = 0.001f;
    	objUser->Rr_min_Ohm = (float32_t)0.0f;
    	objUser->Rr_max_Ohm = (float32_t)1000.0f;
    
    
    	return;
    }

    谨随函附上 我的 f28002x_flash_lib_is.cmd

    MEMORY
    {
    
        RAMM0S                    : origin = 0x000128, length = 0x000158
        RAMM1D                    : origin = 0x000280, length = 0x000578
        RAMLS4                    : origin = 0x00A000, length = 0x000800
        RAMLS567                  : origin = 0x00A800, length = 0x001800 /* end address 0x00C000 6k in size */
        RAMGS0                    : origin = 0x00C000, length = 0x0007F8
        CANMRAM					  : origin = 0x049000, length = 0x0007F8
        FLASHBANK0_BOOT           : origin = 0x080000, length = 0x001000
        FLASHBANK0_CODE           : origin = 0x081000, length = 0x00C000
        FLASHBANK0_DATA           : origin = 0x08D000, length = 0x001000
    	FLASHBANK0_VAR  		  : origin = 0x08E000, length = 0x001000
        FLASHBANK0_PRMS           : origin = 0x08F000, length = 0x000FF0
        RESET                     : origin = 0x3FFFC0, length = 0x000002
    }
    
    /* .ebss = global variable; cinit = initial value; .stack = local variable; .text = code*/
    SECTIONS
    {
    
        .reset               : >  RESET, TYPE = DSECT /* not used, */
        codestart            : >  0x080000
        .text                : >  FLASHBANK0_CODE,
                                  ALIGN(8)
    
       GROUP
       {
        .TI.ramfunc
         ramfuncs
        }
        						  LOAD >  FLASHBANK0_CODE,
                                  RUN  >  RAMLS567,
                                  LOAD_START(RamfuncsLoadStart),
                                  LOAD_END(RamfuncsLoadEnd),
                                  LOAD_SIZE(RamfuncsLoadSize),
                                  RUN_START(RamfuncsRunStart),
                                  RUN_END(RamfuncsRunEnd),
                                  RUN_SIZE(RamfuncsRunSize),
                                  ALIGN(8)
    
        ctrlfuncs            :    LOAD >  FLASHBANK0_CODE,
                                  RUN  >  RAMLS567,
                                  LOAD_START(loadStart_ctrlfuncs),
                                  LOAD_END(loadEnd_ctrlfuncs),
                                  LOAD_SIZE(loadSize_ctrlfuncs),
                                  RUN_START(runStart_ctrlfuncs),
                                  RUN_END(runEnd_ctrlfuncs),
                                  RUN_SIZE(runSize_ctrlfuncs),
                                  ALIGN(8)
    
        .binit                : >  FLASHBANK0_DATA,
                                  ALIGN(8)
        .cinit                : >  FLASHBANK0_DATA,
                                  ALIGN(8)
        .stack                : >  RAMM0S
        .init_array           : >  FLASHBANK0_CODE,
                                  ALIGN(8)
        .bss                  : >  RAMM1D
        .const                : >  FLASHBANK0_CODE,
                                  ALIGN(8)
        .data                 : >  RAMM1D
        .switch               : >  FLASHBANK0_CODE,
                                  ALIGN(8)
        .sysmem               : >  RAMM1D
    
        est_data             : >  RAMLS4,
                                  LOAD_START(loadStart_est_data),
                                  LOAD_END(loadEnd_est_data),
                                  LOAD_SIZE(loadSize_est_data)
    
        hal_data             : >  RAMM1D,
                                  LOAD_START(loadStart_hal_data),
                                  LOAD_END(loadEnd_hal_data),
                                  LOAD_SIZE(loadSize_hal_data)
    
        user_data            : >  RAMM1D,
                                  LOAD_START(loadStart_user_data),
                                  LOAD_END(loadEnd_user_data),
                                  LOAD_SIZE(loadSize_user_data)
    
        foc_data             : >  RAMM1D,
                                  LOAD_START(loadStart_foc_data),
                                  LOAD_END(loadEnd_foc_data),
                                  LOAD_SIZE(loadSize_foc_data)
    
        sys_data             : >  RAMM1D,
                                  LOAD_START(loadStart_sys_data),
                                  LOAD_END(loadEnd_sys_data),
                                  LOAD_SIZE(loadSize_sys_data)
    
    	ble_data             : >  RAMGS0,
                                  LOAD_START(loadStart_ble_data),
                                  LOAD_END(loadEnd_ble_data),
                                  LOAD_SIZE(loadSize_ble_data)
    
       DataBufferSection : > RAMGS0, ALIGN(8)
    .DevOpt_Array (NOLOAD) : {} > 0x08E000, ALIGN(8)
    }
    

    和存储器分配  

    您可以帮助查看一下吗?  

    丹尼

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

    Danny:

    我在这里的本能是、看看您到目前为止提供的内容、最初只是增加堆栈分配的大小。{忽略这个、请见下面}为了测试这是否有用、在自定义函数的开头有一个断点来运行程序。 在该网站上、您应该能够使用 CCS 的内置调试视图来查看堆栈上当前的内容、此操作(与"堆栈使用"选项卡结合使用)应该可以帮助您跟踪问题的位置/位置。  尽管如此,即使它起作用,这可能是一个更大问题的临时解决方案。

    我注意到有一个名为 Opt_Array 的段、它 与 FLASHBANK0_VAR 内存目标分配在同一位置。 什么是 FLASHBANK0_VAR 用于存储?

    此致、
    杰森·奥斯博尔恩

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

    大家好、Jason、

    我的直觉在这里看一下您目前提供的内容,最初只是为了增加堆栈分配的大小。 为了测试这是否会有所帮助、请在自定义函数的开头使用断点来运行程序。 在该网站上、您应该能够使用 CCS 的内置调试视图来查看堆栈上当前的内容、此操作(与"堆栈使用"选项卡结合使用)应该可以帮助您跟踪问题的位置/位置。  话虽如此,即使它工作,这可能是一个更大的问题的临时解决方案。

    如何增加堆栈分配的大小 ?

    I notes:您有一个名为 Opt_Array 的段,该段 被分配到与 FLASHBANK0_VAR 内存目标相同的位置。 什么是 FLASHBANK0_VAR 用于存储?

    缓冲区位置声明为:Opt_Array:

    #define FLASHBANK0_var        0x08E000U

    uint16_t uint16_Buffer[100]__attribute__(section(".4519")) Opt_Array

    我的所有变量均存储并从0x08E000U 位置检索  

    丹尼

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

    您好 Danny:

    堆栈分配是.stack 内存段-尽管再次查看该文件、我发现您在这方面没有问题、请忽略该指令。 我误读了您文件的一部分。

    对于 FLASHBANK0_var 部分、根据所张贴的文件、est_data、hal_data 等不全都位于 FLASHBANK0_var 中。 例如、est_data 位于 RAMLS4中:

        est_data             : >  RAMLS4,

    哪些变量专门存储在那里? 此外、我强烈建议使用 CCS 调试视图进行实时调试。

    此致、
    杰森·奥斯博尔恩

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

    大家好、Jason、

    感谢您的回复、我刚刚重新安装了 CCS 和 UNIVERSAL_MOTORCONTROL_LAB、问题解决了、所以我会重新添加我自己的代码、并查看您的建议以供进一步使用!  

    丹尼

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

    大家好、Jason、

    我已重新安装 CCS 和  universal_motorcontrol_lab 示例、 逐一添加我自己的代码、直到遇到错误点。  

    下面的红线表示 了许多奇怪的事情。

    void doSendBTInitCmd (UARTHandle 句柄)

    {

      uart_Vars_t * obj =(uart_Vars_t *) uartHandle;

      uint8_t charUartTxCount;

      memset (obj->bleVarObj.msg_14_Obj.charDeviceName、0x00、20);

      sprintf ((char*) obj->bleVarObj.msg_14_Obj.charDeviceName、TI-SCI-DEMO);

      。

      。

      。  

      返回;

    下面的红线被删除,程序正常运行!   

    下面是红线、程序行为怪异、您可以看到_c_int00函数 inclusive 的大小太大了?  

    在 _c_int00内部、包含_ TI_Printfi 的尺寸占用最多!

    charDeviceName 是 uint8_t,您认为它是由问题还是 sprintf 函数不兼容?

    typedef 结构_Msg_14_t_

    {

      uint8_t   charDeviceName [20];

    Msg_14_t

    sprintf ((char*) obj->bleVarObj.msg_14_Obj.charDeviceName、TI-SCI-DEMO);

    编辑:  

    在 e2e 论坛上学习后、我已将 sprintf 更改为 snprintf  

    来自  

    charuartTxCount = sprintf ((char*) obj->bleVarObj.charUartTxBuffer"at+name%s\r\n "obj->bleVarObj.msg_14_Obj.charDeviceName);

    charUartTxCount = snprintf (obj->bleVarObj.charUartTxBuffersizeof (obj->bleVarObj.charUartTxBuffer)、"at+name%s\r\n"obj->bleVarObj.msg_14_Obj.charDeviceName);

    但仍然不工作!!!!  

    更新:  

    我 现在使用我自己的代码来替换 snprintf 和 sprintf

    丹尼

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

    Danny:

    很抱歉耽误你的时间。 我很高兴您好像能够解决这个问题-我不知道这些函数为什么会发生这种情况。

    此致、
    杰森·奥斯博尔恩