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.

[参考译文] TM4C1294NCPDT:此 SVCall 异常是什么?

Guru**** 2468610 points


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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/677406/tm4c1294ncpdt-what-is-this-svcall-exception

器件型号:TM4C1294NCPDT

大家好、

当我在 CCS 下调试代码时、我进入 SVCall 异常、但我不知道我是如何触发它的

SVCall 异常的常见原因是什么?

谢谢!

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    尊敬的 David:
    通常情况下、SVC 是由 SVC 指令触发的异常。 应用程序可以使用 SVC 指令来访问 OS 内核函数和器件驱动程序。 您是否说这仅在调试模式下发生、而不是在运行模式下发生? 您没有运行任何操作系统、对吧?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我正在调试代码、它没有任何操作系统。 我没有验证它是否会在运行模式下发生
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您可以在运行模式下尝试吗? 是否可以添加一个小型 SVC 处理程序来捕获 SVC 异常?

    您能否在调试模式下重复 SVC 异常、以及 CCS 控制台是否有任何提示?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    运行模式、您的具体意思是什么? (编译代码并让其自由运行?)
    您希望我向处理程序添加什么内容? (我已验证它是 SVCall 异常)
    之后 CCS 控制台通信中断、但我忘记了它所说的内容

    如果我在调试模式下编译、TiVAware 是否嵌入了 SVC 指令?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    是的、我打算自由运行、SVC 处理程序可以只是 while (1)循环。 一旦您进入 SVC 处理程序、您就可以使用 LR 寄存器回溯。 如您所述、您在调试模式下看到了问题。 您知道哪一行代码会导致 SVC 异常吗? 您可能需要单步执行并缩小将您转至 SVC 异常的代码区域。 默认的 startup_ccs.c 没有单独的 SVC 处理程序。 SVC 异常将指向 IntDefaultHandler。 您是否已经在 startup_ccs.c 文件中定义了单独的 SVC 处理程序? 如果不是,如果代码只在 IntDefaultHandler()中结束,您如何知道它是 SVCall 异常?

    我看不到 TivaWare 调用 SVC 的任何原因。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    是的、我只为 SVC 分配了一个处理程序来进行陷阱处理
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    swupdate.h 调用 SVC。 如果 ROM_UpdateEMAC 未定义,则 SoftwareUpdateBegin()调用地址0x2C。 如果您在 statup_ccs.c 中查看 g_pfnVectors、您将看到第11个函数(0x2C/4 = 11)被称为 SVCall 处理程序。

    我在 Tiva ROM 用户指南中找不到与 SVC 相关的内容。 您能否详细说明一下这是什么?

    编辑:我可以在同一个文件中看到、这只是一个 while (1)循环。 我对 SVC 的含义仍然有点模糊

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

    usbdfu-rt.c 中有一个类似的示例:

    //
    //将控制权返回给引导加载程序。 这是对 SVC 的调用
    //引导加载程序中的处理程序。
    //
    (*(void (*)(void))(*(uint32_t *) 0x2C))(); 

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    根据 David 的描述、他似乎不是在运行引导加载程序。 如果是、如果他使用 TivaWare 引导加载程序示例作为起点、他本来会为它创建一个服务。 我建议他使用 LR 寄存器跟踪回呼者。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    你让我明白了、我忘记了我的电话隐藏在我的代码的一个位置、谢谢!
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    很高兴为您提供帮助。 我找到了 Charles 在引导加载程序中的含义。 引导加载程序的 statup_ccs.s 是一个汇编文件、但您可以获得以下列表:

    向量:
    .ref __stack_top
    .word __stack_top ;;偏移00:初始堆栈指针
    .word ResetISR - 0x20000000 ;;偏移04:重置处理程序
    .word NmiSR - 0x20000000 ;;偏移08: NMI 处理程序
    .word FaultISR - 0x20000000 ;;偏移0C:硬故障处理程序
    .word IntDefaultHandler ;;偏移10:MPU 故障处理程序
    .word IntDefaultHandler ;;偏移14:总线故障处理程序
    .word IntDefaultHandler ;;偏移量18:用法故障处理程序
    .word 0 ;偏移1C:保留
    .word 0 ;;偏移20:保留
    .word 0 ;;偏移24:保留
    .word 0 ;;偏移28:保留
    .word UpdateHandler - 0x20000000 ;;偏移2C:SVCall 处理程序 

    基于一些谷歌搜索、SVC 似乎与 SWI 同义。 我假设 TI 使用了该术语来专门指引导加载程序中断向量。