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/TM4C1294NCPDT:将参数传递给 HWI 的正确方法

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/605638/rtos-tm4c1294ncpdt-proper-way-to-pass-argument-to-hwi

器件型号:TM4C1294NCPDT
Thread 中讨论的其他器件:SYSBIOS

工具/软件:TI-RTOS

您好!

我正在尝试构建一个简单的 TI-RTOS 计时器 HWI。 我的 ISR 会执行、但我无法确定向函数传递参数(例如、简单 int)的正确方法。

这是我的 ISR (简单):

///-----------------------------------------------------

void timer0_ISR (int i){

   if (i){
      GPIO_WRITE (Board_LED0、Board_LED_ON);
      GPIO_WRITE (Board_LED1、Board_LED_ON);
   }

///-----------------------------------------------------

在我的计时器配置文件中、我将"Timer ISR 函数"字段设置为"timer0_ISR"。

现在,如果我在 main()中定义了一个变量,并在“传递给计时器 ISR 函数的参数”中输入该变量的名称,则无论传递变量(0或1)的值如何,LED 都会亮起。

我认为我没有正确地将变量传递给 ISR。 执行该操作的正确方法是什么?

谢谢、

svl123

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

    [引用 user="svl123">我认为我没有正确地将变量传递给 ISR。 执行该操作的正确方法是什么? [/报价]

    你不是。 想一想、硬件如何知道要通过什么?

    您要尝试做什么?

    Robert

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

    我需要一个程序、在计时器每次过期时根据变量的值将 LED 设置为打开或关闭。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    好的。  还记得您何时被告知从不使用全局变量? 它们的简化过了。

    在 RTOS 中、您可以使用队列或信标。 尽管它们仍然是全球性的,但它们有一些保护。 在您的简单案例中、一个简单的全局 int 将起作用。 需要记住的是、写入必须受到保护、以便不会被读取到的并行数据中断。 在这个架构上、这不是 INT 的问题、因为写入不能被中断。

    Robert

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    好的、我可以使用全局变量。 那么、"传递给 ISR 函数的参数"字段是如何工作的? 它只接受一个常量值吗?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    [引用 user="svl123"]那么,“传递给 ISR 函数的参数”字段如何工作?

    哪个参数传递到 ISR 函数字段???

    Robert

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

    "附加设置"中的"传递给计时器 ISR 函数的参数"字段。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我复制/粘贴了一张图片、但它没有出现-如果您打开项目.cfg 文件并使用 GUI (而不是脚本文件)、则会显示一个名为计时器-实例设置的页面。 本页中有一个子部分"附加设置"、其中包含一个字段"传递给计时器 ISR 函数的参数"。 它的用途是什么?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我不知道你在说什么。 这听起来像是某种 RTOS 配置工具、在这种情况下、它可能与 RTOS 计时器有关、而不是与微计时器有关。

    Robert
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    是的、这是一个 RTOS 配置工具。 我将按照您的建议来做、谢谢。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    在 TI-RTOS 中创建 A 计时器时、可以指定参数。 例如、要动态创建它:

    Timer_Params timerParams;
    Timer_Params_init (&timerParams);
    timerParams.period = 100000;// 100、000 uSecs = 100ms */
    timerParams.arg = 5;
    Timer_con构(&timer0Struct, Timer_Any,(Timer_Functr) timerFunc,&timerParams,NULL);

    这是将参数 ARG 作为参数的计时器函数。 这使您可以对多个计时器使用相同的计时器功能。
    空 timerFunc (UArg-参数)

    (笑声)

    您也可以在.cfg 文件中创建计时器。


    注意:缺省情况下、内核创建一个定时器来驱动它的计时(例如、Task_sleep、带有一个超时的 Semaphore_pend、等)。 内核具有可将函数插入的时钟模块。 这样就无需创建您自己的计时器。 当然、您需要的周期必须是时钟模块计时器的倍数(默认情况下为1ms、但您可以更改它)。

    Todd

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

    Todd、

    也许您可以提供帮助-海报的主题行注释:"将论据传递给 HWI。"   (假定为硬件中断)

    然而、"beor"(硬件)在哪里-而是他寻求、"Pass an argent"(传递参数)-我注意到的(唯一)硬件是2个无源 LED -通过进入看起来是(严格)"值或基于软件的中断!"来控制它!    任何/所有硬件在最佳情况下都显示为"附带"-在最坏情况下不存在。

    请(善意)澄清-填写空白部分。   (什么硬件?)    谢谢...

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

    为 Hwi 提供 arg 的方法基本相同。 当你创建 Hwi 时、Hwi_Params 结构中有一个可被指定的参数字段。 当该中断被置为有效时、内核会调用用户提供的函数(在 Hwi_create 或 Hwi_con构 中提供)以及 arg。

    有关更多详细信息、请参阅 SYS/BIOS (TI-RTOS 内核) API 参考。 例如、在 ti.sysbios.hal.hwi 中、您将看到以下示例代码:

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

    那么 HWI 是受管理的中断、而实际的硬件中断就是我们所看到的所谓(严重命名)零延迟中断?

    Robert
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    不完全是。 内核中的 Hwi 可以被管理或不受管理(我们称之为零延迟中断)。 我们已经对"零延迟"这个名称进行了相当多的辩论:)当您使用 TI-RTOS 创建零延迟中断时、内核不会向 ISR 添加额外的延迟、它永远不会禁用它们、因此称为零延迟。 不过、请注意零延迟中断。 您不能进行任何影响调度的内核调用(例如 Semaphore_post、Task_setPri 等)。 当然、对于某些实时应用、可能需要零延迟中断(例如、C2000应用在处理电机控制时始终使用它们)。

    基本上、当您使用 TI-RTOS 时、内核需要注意系统中的所有中断(受管和非受管/零延迟)。 这与仅使用 driverlib 或 FreeRTOS 不同。 在这里、您可以自己插入矢量表并进行相应的管理。

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

    感谢您的答复-我最后只使用在 main()循环之外声明的易失性变量,而不将任何内容传递到 HWI 本身。

    -svl123