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.

[参考译文] RTOS/TI-RTOS-MCU:具有 C2000的 SYS/BIOS

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/628899/rtos-ti-rtos-mcu-sys-bios-with-c2000

器件型号:TI-RTOS-MCU
Thread 中讨论的其他器件:SYSBIOS

工具/软件:TI-RTOS

尊敬的:

 

我们正在项目中使用 Piccolo F28069 DSP,该固件平台是 TI SYS/BIOS–版本6.50。 ADC ISR 为35KHz、每20ms 将有一个事件发布或从 ADC ISR 到任务的 Swi 发布。

 

我发现、有时 Event_post () Swi_post ()需要很长时间、这会影响正常的 ADC ISR 频率- 35KHz。 在这种情况下,它将丢失一个 ADC ISR。 如果从任务中布置事件或 Swi、似乎没有发生这样的问题。

 

在 坏情况下,例如 Event_post ()花费45us,ADC ISR 运行60us,Swi_post ()花费56us,ADC ISR 运行70us,比正常时间更长。

 

测试代码如下:

 

#pragma CODE_SECTION ("ramfuncs");

_interrupt void ADC_ISR (void)

 GPIO_ISR_HIGH ();

 

 //其他代码。 。 。 。 。 。

 

 if (ac_zero_accacc2000)// 20ms 周期

       GPIO_POST_HIGH ();

EVENT_POST (task_event_PFC、EVENT_ID_PFC_UTILITYZERO);

GPIO_POST_LOW();

 

 //其他代码。 。 。 。 。 。

 

 GPIO_ISR_LOW ();

 

 AdcRegs.ADCINTFLGCLR.bit.ADCINT1 = 1; //清除 ADCINT1标志为下一个 SOC 重新初始化

 PieCtrlRegs.PIEACX.ALL = PIEACK_Group1;//清除 INT1的 PIE 确认位

 

请帮您解决此问题吗? 谢谢!

 

 陈德芳

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

    如何创建 ISR? 如果你不使用 Hwi、你不能调用内核(例如 Event_post 或 Swi_post)。

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

    我使用 Hwi 创建 ISR、但直接配置寄存器、而不是.cfg 文件、如下所示:

    EALLOW;
    (笑声)
    PieVectTable.ADCINT1 = ADC_ISR; // ADC 中断

    EDIS;

    //在 PIE:组1中启用 ADC 中断1
    PieCtrlRegs.PIEIER1.bit.INTx1 = 1;//快速 ADC 中断
    //根据 PIE 组启用相关的 CPU 中断
    IER = M_INT1;
    IFR = 0x0000;
    //初始化后启用 PIE
    PieCtrlRegs.PIECTRL.bit.ENPIE = 1;

    此致
    陈德芳
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    如果你使用 Hwi 创建 ISR、你不需要中断关键字。 你能给我展示你在哪里创建 Hwi 的代码吗? 注意:您可以在运行时创建、而不是.cfg 文件。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    抱歉、Todd、我认为我已经使用中断关键字创建了 ISR、而不是 TI RTOS 的 Hwi。 我已经如上所述发布了该代码。

    你是说 Event_post 和 Swi_post 不能调用到内核中吗? 但它在我的系统中确实起作用。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您正变得很幸运。 不由内核管理的 ISR 不应进行内核调用。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我已经尝试过 RTOS 的 Hwi、很好的做法是 Event_post 花费的时间(< 20us)要比以前少得多。

    但发现了一个新问题、如果使用系统的 Hwi、ADC ISR 将不会在35KHz 精确触发、运行期间频率会发生变化、例如30kHz ~ 40KHz。 在我们的应用中、数字控制是实时系统、ADC ISR 应精确地以35KHz 触发。

    我尝试了 c28.Hwi 和 hal.Hwi、结果是相同的、.cfg 文件中的代码如下所示:
    示例1:
    VAR Hwi = xdc.useModule('ti.sysbios.family.c28.Hwi');
    var hwi0Params = new hwi.Params();
    hwi0Params.instance.name ="hwi0";
    program.global.hwi0 = Hwi.create (32、"&ADC_ISR"、hwi0Params);

    示例2:
    VAR Hwi = xdc.useModule('ti.sysbios.family.c28.Hwi');
    var ti_sysbios_hal_hwi = xdc.useModule('ti.sysbios.hal.Hwi');
    var ti_sysbios_hal_hwi0Params =新 ti_sysbios_hal_hwi.Params ();
    ti_sysbios_hal_Hwi0Params.instance.name ="ti_sysbios_hal_hwi0";
    program.global.ti_SYSBIOS_hal_Hwi0 = ti_SYSBIOS_hal_Hwi.create (32、"&ADC_ISR"、ti_SYSBIOS_hal_Hwi0Params);
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    是否有其他可能会干扰的中断? 如何测量抖动?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    除了 CPU 定时器2 (供 TI/RTOS 使用)、系统中只有一个 ISR、即 ADCINT1。

    我在进入 ADCINT1时编写测试代码并将一个 GPIO 设置为高电平、在退出此 ISR 时设置为低电平。 振荡器用于捕捉频率。 该代码的编写方式如下:

    #pragma CODE_SECTION ("ramfuncs");
    void ADC_ISR (UArg_arg)

    GPIO_ISR_HIGH ();

    //其他代码。 。 。 。 。 。

    GPIO_ISR_LOW ();

    AdcRegs.ADCINTFLGCLR.bit.ADCINT1 = 1;//清除 ADCINT1标志为下一个 SOC 重新初始化
    PieCtrlRegs.PIEACX.ALL = PIEACK_Group1;//清除 INT1的 PIE 确认位
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好!

    那么、您要测量从 GPIO_ISR_HIGH 到 GPIO_ISR_HIGH 的时间...对吗? GPIO_ISR_HIGH 到 GPIO_ISR_LOW 的最大/保存/最小时间是多少?

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

    是的、您是对的、我将测量从 GPIO_ISR_HIGH GPIO_ISR_LOW 的时间。 测量的时间如下:
    最长时间- 14uS
    平均时间- 7uS
    最短时间- 6uS

    ADCINT1以35KHz 的频率触发、频率应为固定频率。 当我使用中断关键字直接配置 ISR 时、 每个 ISR 之间的间隔时间(GPIO_ISR_HIGH -> GPIO_ISR_HIGH)为28.6us、非常精确。 但是、如果我使用的是 RTOS 的 Hwi、则间隔时间非常不稳定、这介于18us ~ 36us 之间。

    如果使用 RTOS 的 Hwi、ISR 似乎无法及时触发。

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

    您能否禁用时钟模块正在使用的计时器? 我想排除这种情况。 您可以将以下内容添加到.cfg 文件中。

    clock.tickSource = Clock.tickSource_user;

    注意:您会失去时序(例如 Task_sleep 将永远睡眠)。 如果这是问题、我们将研究几个选项。

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

    没关系、Todd。

    我尝试了禁用时钟模块的计时器的方法、比以前更好。 虽然两个 ADC ISR 之间仍然存在差距、但这一差距已发生了大约1us ~ 2us 的变化。

    我使用 中断关键字而不是 OS Hwi 测试了代码、 有时 两个 ADC ISR 之间也存在1us ~ 2us 的间隔。 我 想这可能 是由操作系统内核引起的、在 某些情况下、操作系统内核会禁用全局中断、例如 任务的上下文切换等  
     
    此致
    更方便

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您可以查看 SYS/BIOS 版本说明中的基准测试部分、了解可以禁用中断的时间。 它位于 API 计时链路中。

    您可以在内核中使用零延迟中断。 内核不会在这些中断上增加延迟。 缺点是这些中断无法进行内核调用(基本上与使用中断关键字时的问题相同)。 零延迟中断可能会导致另一个中断运行、但该中断可以进行内核调用。

    Todd
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    此外...如果您对抖动满意、则可以在发生抖动时看到(~1-2us)
    clock.tickSource = Clock.tickSource_user;

    如果需要计时、您仍可以自行驱动计时。 您可以为所需的周期配置时钟,并在该期间自己调用 Clock_tick()。

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

    如基准测试中所示、SYS/BIOS 内核上下文切换期间的最大中断延迟为181 (~ 2us)、这会禁用可屏蔽中断。 这意味着、如果使用 SYS/BIOS 系统、我们必须接受 ADC ISR 的此抖动时间(< 2us)。

    我可以使用中断关键字添加无延迟 ISR、但不知道如何在内核中使用零延迟中断。 请向我提供指南吗?

    谢谢
    陈德芳
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    本页将介绍这些工具: processors.wiki.ti.com/.../BIOS_for_the_28x

    此外、中还有一个写操作 docs/cdoC/index.html 并导航至 ti.sysbios.family.c28.Hwi 并搜索"zero"。

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

    在我的系统中、ADCINT1位于 PIE 组1中、Hwi 的中断号为32。 我尝试将 Hwi.zeroLatencyIERMask 设置为1、它显示错误消息"Hwi 32 Conflicts with IER Mask 0x1"。 配置零延迟中断是否存在任何问题?

    在配置文件中、代码如下所示:
    VAR Hwi = xdc.useModule('ti.sysbios.family.c28.Hwi');
    var hwi0Params = new hwi.Params();
    hwi0Params.instance.name ="hwi0";
    program.global.hwi0 = Hwi.create (32、"&ADC_ISR"、hwi0Params);
    Hwi.zeroLatencyIERMask = 1;

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

    我的坏! 对于 C28器件、只需设置 Hwi.zeroLatencyIERMask、然后使用 interrupt 关键字。 在 CortexM 器件上、我们添加了调用 Hwi_create 并将其指定为零延迟中断的支持。

    因此、基本上返回中断关键字并设置 Hwi.zeroLatencyIERMask、然后不要在该 ISR 中进行任何内核调用。

    Todd
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    这很好、现在我的系统可以很好地进行以下更改:

    对关键 ISR 使用零延迟中断、以确保最短延迟时间、从而避免 ISR 抖动
    零延迟中断会导致需要调用内核的另一个中断
    3、对于无关键 ISR、使用 SYS/BIOS 的 Hwi 而不是中断关键字、这将花费更少的时间布置事件或 Swi

    感谢 Todd 的大力支持、希望您能玩得开心!

    非常感谢
    陈德芳
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    很酷! 感谢您的更新!