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/TMS320F28388D:ADC 版本 CLA 中断

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/955267/ccs-tms320f28388d-adc-v-s-cla-interrupt

器件型号:TMS320F28388D

工具/软件:Code Composer Studio

您好的支持团队、

我有两个关于 ADC ISR 和 CLA ISR 的问题。

1)。

青色曲线是 CLA 中的处理时间。  fuchsia 一个是 CLA ISR。 蓝色的是 ADC ISR。

EOC 事件触发 CLA 任务和 ADC ISR。 CLA ISR 由 CLA 任务触发。

C28x 花费65ns 来响应 ADC ISR (如图1所示)。 为什么需要花费251ns 来响应 CLA ISR?

2)。  

为什么 CLA ISR 在 CLA 任务触发后需要200ns 才能启动?

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

    [引用 user="Vince Lin"]为什么需要251ns 来响应 CLA ISR?

    C28x 在退出 ADC ISR 后、在该期间执行的操作是什么。 在此期间是否有任何东西可以阻止 CLA ISR?  运行的更高优先级的 ISR?  在此期间、CPU 是从 RAM 还是闪存运行?

    [引用 user="Vince Lin"] CLA 任务触发 CLA ISR 后、为什么需要200ns 才能启动 CLA ISR?[/quot]

    在本例中、我假设 ADC ISR 未运行。  与之前一样的问题-任何正在运行的东西可能会阻止 CLA ISR?  

    Lori

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

    您好、Lori、

    谢谢您的回复。

    C28x 在退出 ADC ISR 后、在该期间执行的操作是什么。 在此期间是否有任何东西可以阻止 CLA ISR?  运行的更高优先级的 ISR?  在此期间、CPU 是从 RAM 还是闪存运行?

    在本例中、它有两个中断例程。 一个是 ADC ISR、另一个是 CLA ISR。 因此、我认为 C28x 退出 ADC ISR 后、它会返回主循环。 现在主循环中没有任何内容。 从 RAM 运行的代码(ADC ISR & CLA ISR)。 EOC 事件触发 CLA 任务和 ADC ISR。 我假设 CLA 任务开始计时为 EOC 事件。 C28x 只需65ns 即可为 ADC ISR 提供服务。 但 C28x 从退出 ADC ISR 进入 CLA ISR 需要251ns (感觉时间太长)。 我不确定是不是正确的。

    在本例中、我假设 ADC ISR 未运行。  与之前一样的问题-任何正在运行的东西可能会阻止 CLA ISR?  

    是的、没错。 在借调情况下、我禁用 ADC ISR。 因此、项目只有一个中断(CLA ISR)。 我想测量从 CLA 任务结束到 CLA ISR 的时间。  

    在这种情况下、我观察到 C28x 从主循环进入 ADC ISR 需要65ns。 但它至少花费200ns 来运行 CLA ISR。 为什么 C28x 花费更多的时间用于 CLA ISR 而不是用于 ADC ISR?

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

    感谢您的反馈、Vince。   

    对于 ISR -如何在项目中定义它们?  FPU 有两种类型的中断:

    • 高优先级-使用快速上下文切换、不能嵌套
    • 低优先级-需要更多上下文保存/恢复时间

    这在 http://www.ti.com/lit/spru514中进行了说明。 在第6.10.16节- INTERRUPT pragma 中。  请注意、如果尚未使用该 pragma、则中断将默认为低优先级。  

    可能是 ADC 被定义为一个高优先级 ISR、而 CLA 被定义为一个低优先级。  

    -洛里

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

    您好、Lori、

    感谢你的答复。

    • 高优先级-使用快速上下文切换、不能嵌套
    • 低优先级-需要更多上下文保存/恢复时间

    我得到了答案。

    我想使用 CLA 来帮助我改进 ADC 例程。 CLA 似乎不能再改进了。 因为 C28x 为 CLA ISR 提供服务、它需要更多的时间。 因此、在我的项目中、可能只使用 CLA 进行并行 计算。 CLA 在完成时发送标志。 CLA ISR 可以放置一些低优先级事件。

    顺便说一下、是否有任何方法 可以通过使用 pragma 来提高性能?

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

    [引用 user="Vince Lin"]顺便说一下、是否可以使用 pragma 来提高性能?[/quot]

    Vince、

    你试过吗?  如果不嵌套中断、它们可以是高优先级。   

    此致

    Lori

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

    您好、Lori、

    在该项目中、我从未使用嵌套中断。

    void setup_EOC 中断(void (*处理程序)(void)){
    
    ADC_DisableContinuousMode (EAP_INTERRUPT_BASE、ADC_INT_NUMBER1);
    ADC_setInterruptSource (EAP_INTERRUPT_BASE、ADC_INT_NUMBER1、ADC_SOC_NUMBER7);
    ADC_enableInterrupt (EAP_INTERRUPT_BASE、ADC_INT_NUMBER1);
    ADC_clearInterruptStatus (EAP_INTERRUPT_BASE、ADC_INT_NUMBER1);
    
    INTERRUPT_REGISTER (ADC_INTERRUPT_LINE、处理程序);
    interrupt_enable (adc_interrupt_line);
    
    }
    void setup_ClaTask1 (void (* handler)(void)){
    
    EALLOW;
    
    #pragma diag_suppress=770
    CLA_mapTaskVector (CLA1_base、CLA_MVECT_1、(uint16_t)&Cla1Task1);
    #pragma diag_warning=770
    
    CLA_enableIACK (CLA1_base);
    CLA_setTriggerSource (CLA_task_1、CLA_TRIGGER_ADCA1);
    CLA_enableTasks (CLA1_base、CLA_TASKFLAG_1);
    
    interrupt_register (INT_CLA1_1、处理程序);
    
    Interrupt_enable (INT_CLA1_1);
    }
    #pragma CODE_SECTION (adcA1ISR、".TI.ramfunc");
    _ attribute _((中断)) void adcA1ISR (void){
    
    GPIO_writePin (16、1);
    
    A1 =(ResultRegs.ADCRULTCR0+
    ADCRESCR0> ADCR2 + ADCRADCRADCRESCR2 +
    ADCRADCRADCRESCR2 + ADCRADCRADCRESCR2 + ADCRADCRADCRADCRESCR2 + ADCRADCRADCRADCRADCRESCRESCR2 + ADCRADCRADCRADCRADCRESCRESCRESCR2 + ADCRADCRADCRADCRADCRADCRADCRESCRADCRADCRESCRESCRESCR2 + ADCRADCRADCRADCRADCRADCRESCRESCRESCRESCRESCRESCRESCRESCRESCR2 + ADCRADCRADCRADCRADCRADCRADCRADCRADCRADCRADCRADCRADCR
    B2 =(Adcb ResultRegs.ADCRESULT1 + Adcb ResultRegs.ADCRESULT3 + Adcb ResultRegs.ADCRESULT5 + Adcb ResultRegs.ADCRESULT7)>> 2;
    C1 =(AdcResultRegs.ADCRESULT0 + ADCCRESCRD2
    + ADCRESCRESCR2 + ADCRADCRESCRESCRD2.ADCRESCRESCR2 + ADCRADCRESCRADCRESCRESCRESCRD2 + ADCRADCRESCRESCRESCRESCR2 + ADCRESCRADCRESCRESCRESCRESCR2 + ADCRESCRADCRESCRESCRESCRESCRESCRESCRESCR2 + ADCRESCRESCRD2.ADCRESCRESCRESCRESCRESCR2 + ADCRESCRESCRESCRESCRADCRESCRESCRESCRESCRESCRESCR2 + ADCADCRESCRESCRESCRADCRESCRESCRESCRESCRESCRESCRESCRD1.ADCR2 + ADCR
    
    D2 =(AdcdResultRegs.ADCRESULT1 + AdcdResultRegs.ADCRESULT3 + AdcdResultRegs.ADCRESULT5 + AdcdResultRegs.ADCRESULT7)>> 2;
    
    ADC_clearInterruptStatus (EAP_INTERRUPT_BASE、ADC_INT_NUMBER1);
    Interrupt_Group1
    (Interrupt_GPIO_Interrupt_1);Interrupt_Interrupt_Group1 (Interrupt_1);Interrupt_Interrupt_GPIO_Interrupt_Group1 (Interr 0);
    }
    
    #pragma CODE_SECTION (cla1ISR、".TI.ramfunc");
    __attribute__((中断) void cla1ISR (void){
    GPIO_writePin (17、1);
    Interrupt_clearACKGroup (interrupt_ack_group11);
    GPIO_writePin (17、0);
    
    } 

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

    [引用 user="Vince Lin"]在此项目中,我从未使用嵌套中断。[/quot]

    然后、可以使用 pragma 将两个 ISR 设置为"高优先级"。  这应减少上下文保存期间存储的寄存器数量。

    此致

    Lori

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

    您好、Lori、

    谢谢您的回复。

    我按照 pragma 的 C 语法操作、是"#pragma INTERRUPT (func、HPI)"

    我已经改进了。 ADC ISR 的 C28x 处理时间缩短了48.8%。 另一个则改善了18.8%。

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

    您好!

    您是否对 ADC ISR 和 CLA ISR 都使用了 pragma?

    如果 CLA 任务在 ADC ISR 之前完成、那么我预计从 ADC ISR 结束到 CLA ISR 的时间将大约为2倍(假设所有内容都在 RAM 中运行)。  

    原因如下

    • 主循环 ADC ISR -->上下文保存-->引脚 A 高电平--> ADC ISR -->引脚 A 低电平-->上下文恢复
    • 几个周期的主循环 -->上下文保存-->引脚 B 高电平--> CLA ISR -->引脚 B 低电平-->竞争恢复

    从 ADC ISR 到引脚 A 的高电平有(1)个上下文保存(以红色显示)

    从引脚 A 低电平到引脚 B 高电平、有一个(1)上下文恢复(1)上下文保存(以蓝色显示)

    我假设 CLA 任务比 ADC ISR 短、因此当 ADC 中断完成时、ISR 已发送到 CPU。  是这样吗?

    您可以检查 ISR 的反汇编、以查看上下文保存/恢复的外观(View->Disassembly)。  它们是否相似?  

    -洛里

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

    您好!

    我假设 CLA 任务比 ADC ISR 短、因此当 ADC 中断完成时、ISR 已发送到 CPU。  是这样吗?

    是的。 在 CLA 中、任务只切换 GPIO (最新波形中的通道4)。 因此、我认为 C28x 可以 在 ADC ISR 完成后立即为 CLA ISR 提供服务。  我假设绿色曲线的上升时间是 ADC 触发的。 C28x 需要35ns 将上下文保存到 ADC ISR。 然而、C28x 需要206ns 的运行环境切换(运行环境恢复来退出 ADC ISR +运行环境保存来进入 CLA ISR)。 也许我 的想法是错误的。

    您可以检查 ISR 的反汇编、以查看上下文保存/恢复的外观(View->Disassembly)。  它们是否相似?

    是的、它们是相似的。

    91 __attribute__((中断) void adcA1ISR (void){
    adcA1ISR():


    00c000:761B ASP
    00c001:ABBD MOVL * SP++、XT
    00c002:A8BD MOVL *SP++,XAR4
    00c003:A0BD MOVL *SP++,XAR5
    00c004:C2BD MOVL * SP++、XAR6
    00c005:C3BD MOVL * SP++、XAR7
    00c006:FFF0按 RB
    00c007:E6700600保存 RNDF32=1、RNDF64=1
    00c009:2942 CLRC OVM|PAGE0
    00c00a:5616 CLRC AMODE
    00c00b:761F002C MOVW DP、#0x2C

    508 gpioDataReg[GPIO_GPxSET_index]=引脚掩码;
    00c00d:8F010000 MOVL XAR4、#0x010000
    *
    *
    *
    504 gpioDataReg[GPIO_GPxCLEAR_index]= pinMask;
    00c0b5:A8C5 MOVL *+XAR5[0]、XAR4

    00c0b6:E562 restore
    00c0b7:FFF1 POP RB
    00c0b8:C5BE MOVL XAR7、*--SP
    00c0b9:C4BE MOVL XAR6、*--SP
    00c0ba:83BE MOVL XAR5、*- SP
    00c0bb:8ABE MOVL XAR4、*--SP
    00c0bc:87BE MOVL XT、*- SP
    00c0bd:7617 NASP
    00c0be:7602 IRET

    --------------------------------------------------

    116 __attribute__((中断) void cla1ISR(void){
    cla1ISR():


    00c151:761B ASP
    00c152:ABBD MOVL * SP++、XT
    00c153:A8BD MOVL *SP++,XAR4
    00c154:A0BD MOVL * SP++、XAR5
    00c155:C2BD MOVL * SP++、XAR6
    00c156:C3BD MOVL * SP++、XAR7
    00c157:FFF0按 RB
    00c158:E6700600保存 RNDF32=1、RNDF64=1
    00c15a:2942 CLRC OVM|PAGE0
    00c15b:5616 CLRC AMODE

    HW824 REGH (base + ADC_O_INTFLGCLR)= 1U <<(uint16_t) adcIntNum;
    00c15c:9A01 MOVB AL、#0x
    *
    *
    *
    504 gpioDataReg[GPIO_GPxCLEAR_index]= pinMask;
    00c16c:A8C5 MOVL *+XAR5[0]、XAR4

    00c16d:E562 restore
    00c16e:FFF1 POP RB
    00c16f:C5BE MOVL XAR7、*--SP
    00c170:C4BE MOVL XAR6、*- SP
    00c171:83BE MOVL XAR5、*- SP
    00c172:8ABE MOVL XAR4、*- SP
    00c173:87BE MOVL XT、*- SP
    00c174:7617 NASP
    00c175:7602 IRET

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

    谢谢 Vince。  我不知道为什么要花费这么长的时间。  让我在美国时间周三结束前进行调查并返回给您。

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

    Vince -更新。  我在周四的第一件事是在我的待办事项上。  很抱歉耽误你的时间。   

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

    您好、Lori、

    感谢您的支持。

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

    Vince、

    今天、我花了一些时间来完成一个简单的项目:

    • 在 F2837xD 上以200MHz 运行。  这与 F28388 C28x 端非常相似。
    • C28x 通过软件触发 CLA 任务。
    • CLA 任务反过来中断 C28x。  
    • C28x ISR 被标记为高优先级。  
    • 所有内容都在 RAM 中运行。  
    • 我已确保 C28x 长时间不会阻止中断。   

    我认为这与您最初发布的第2个情景相同。  

    从 CLA 任务完成(标记为 A1)到 C28x CLA ISR 启动(标记为 A2)的时间为160ns。  

    • 对于一个大约为32个周期的200MHz 器件。
    • 写入 GPIO 后、CLA 任务末尾大约有4个周期(如下所示)
    • 上下文保存+设置大约有14个周期来写入 GPIO (如下所示)。  
    0000a04a:74E07F04 MMOV32 @0x7f04、MR2 <-写入引脚
    0000a04c:7FA00000 MNOP
    0000a04e:7FA00000 MNOP
    62. {
    $C$L2:
    0000a050:7FA00000 MNOP
    0000a052:7F800000 MSTOP 

    cla1Isr1():
    00b70f:761B ASP
    00b710:ABBD MOVL *SP++、XT
    00b711:A8BD MOVL *SP++、XAR4
    00b712:A0BD MOVL *SP++、XAR5
    00b713:C2BD MOVL *SP++、XAR6
    00b714:C3BD MOVL *SP++、XAR7
    00b715:FFF0 按 RB
    00b716:E6700600保存 RNDF32=1、RNDF64=1
    00b718:2942 CLRC OVM|PAGE0
    00b719:5616 CLRC AMODE
    597 gpioDataReg[GPIO_GPxSET_index]= pinMask;
    00b71a:BE02 MOVB XAR6、#0x02
    00b71b:8F007F02 MOVL XAR4、#0x007f02
    248 对于(claIsrProcessing = 0;claIsrProcessing < 100;claIsrProcessing++)
    00b71d:B600 MOVB XAR7、#0x00
    00b71e:761F0240 MOVW DP、#0x240
    00b720:0264 MOVB ACC、#100
    597 gpioDataReg[GPIO_GPxSET_index]= pinMask;
    00b721:C2C4 MOVL *+XAR4[0]、XAR6 

    虽然这比您的结果要好、但与您观察到的 ADC 结果不匹配、我对此没有解答。  

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

    我将附加我的.c 和.cla 文件以供您参考。

     /cfs-file/__key/communityserver-discussions-components-files/171/asin.cla

    /cfs-file/__key/communityserver-discussions-components-files/171/cla_5F00_ex1_5F00_asin.c

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

    Vince、

    由于下周美国的假期、我将在12月的第一周之前再也不能再进一步了解这一点。  

    此致

    Lori

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

    您好、Lori、

    谢谢您的回复。

    我将与您的共享文件进行比较。 我发现一个地方可能会延迟进入 CLA ISR。

    我使用了 ADC_EOC 触发 CLA 任务。 因此、我需要清除 CLA ISR 中的 ADC 中断状态。

    似乎编译器首先清除中断状态。 然后将 GPIO 设置为高电平。

    这就是为什么、我具有更长的延迟。

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

    感谢您的反馈。  如果您认为问题已解决、请告诉我?

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

    您好、Lori、

    我想我们可以关闭这个线程。 最后,我有一些结论。  

    我希望我可以使用 CLA 做一些事情来共享 C28x 负载。 但是、CLA 在软件开发方面有一些限制(如函数指针 等)。 但是 CLA 任务到 CLA ISR 的响应时间形式结束比 C28x 处理 ADC ISR 更长。 因此、我应该重新设计该程序。 在并行 计算中使用 CLA 支持简化算法以提高性能。 CLA ISR 可以放置一些行为层代码。 而不是 紧急请求代码。

    另一方面 ,"#pragma INTERRUPT ( func , HPI )"是有效的。 谢谢您的建议。

    我认为这种讨论在高频应用中很有用。

    感谢您的支持。

     

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

    尊敬的 Vince:

    很高兴看到您的主题似乎已解决。  如果出现其他问题、请随时发布。

    祝您在项目中好运!  


    谢谢、
    Brett