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/TM4C1294KCPDT:静态创建时不给出 Hwi 参数

Guru**** 2473960 points
Other Parts Discussed in Thread: EK-TM4C1294XL

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/684132/rtos-tm4c1294kcpdt-hwi-argument-not-given-when-statically-created

器件型号:TM4C1294KCPDT
Thread 中讨论的其他器件:EK-TM4C1294XL

工具/软件:TI-RTOS

通过.cfg 文件设置 HWI 时、我不会收到正确的数字。 值参数随随机值一同提供。 HWI 设置为:

/*========================= 应用程序特定实例========================= //
var halHwi0Params = new halHwi.Params ();
halHwi0Params.instance.name ="ResetIP";
halHwi0Params.arg = 6;
halHwi0Params.priority = 5;
Program.global.ResetIP = halHwi.create (68、 "IPButtonISR"、halHwi0Params); 

这是 XGCONF GUI 自动为我生成的。 根据用户指南、它看起来是正确的。 我的 HWI 代码是:

//切换调试 LED,使其变为
void IPButtonISR (UArg){

uint32_t ui32Status = GPIOIntStatus (GPIO_PORTK_base、true);
GPIOIntClear (GPIO_PORTK_base、ui32Status);

uint32_t debugLEDState = GPIOPinRead (GPIO_PORTP_BASE、GPIO_PIN_4);
GPIOPinWrite (GPIO_PORTP_BASE、GPIO_PIN_4、~debugLEDState);
} 

我注意到该错误、因为我对 HWI 的形式感到困惑。 我已经看到以 void HWI_function (void)形式出现的示例代码、但我不理解当您将参数传递给不接受参数的函数时会发生什么情况。 GCC 不允许我这么做。

HWI 每次动态创建时都会成功获取正确的参数值:

//这是 main()末尾的代码
InitTimer();

hwi_handle hwi0;
Hwi_Params HwiParams;
ERROR_Block EB;
ERROR_INIT (&EB);
Hwi_Params_init (hwiParams);
hwiParams.arg = 5;
hwiParams.priority = 7;
hwiParams.instance->name ="示例 HWI";
hwi0 = Hwi_create (39、myTimerISR、&hwiParams、&EB);
if (hwi0 == NULL){
while (1);
}


/*启动 BIOS */
BIOS_start();

return (0);
}

void myTimerISR (UARg 参数){
虚拟= 0;
虚拟++;
}

ROV 同意.cfg 文件中定义的参数、但相同的屏幕截图显示给定的值不是我期望的值:  

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

    实际上、动态任务也无法始终如一地获得正确的值。 我从未清除中断、因此它一直在重新进入。 没有任何机会改变 arg. 当动态 HWI 更改为时、随机值进入 arg

    void myTimerISR (UARg arg){
    
    uint32_t ui32Status = TimerIntStatus (TIMER2_base、true);
    TimerIntClear (TIMER2_base、ui32Status);
    
    虚拟= 0;
    虚拟++;
    } 

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

    尊敬的 Peter:

    您能否在函数中使用 arg 并查看它是否发生了变化。 也许只有一个易失性全局变量、此变量在 Hwi 函数中被分配了 arg 的值。

    Volatile UArgmyGlobalArg;

    空 IPButtonISR (UArg-参数)

      myGlobalArg = arg;

      (笑声)

    根据您的优化设置、有时编译器会执行 CCS Variable 窗口无法理解的技巧。 ROV 中的参数值被从 Hwi_Object 中拉出。  

    可能最好快速执行 ROV->BIOS->Scan for Errors,这样也可以解决任何有趣的问题,如堆栈溢出。

    为什么在运行时创建 Hwi...no时看不到这种行为。 可能是不同的优化级别。

    Todd

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

    注释掉设置优先级的行会使问题"消失"

    //hwiParams.priority = 7; 

    如果没有此行、优先级设置为-1。

    同样、在静态创建时、在 XGCONF 中将优先级设置为-1会每次产生正确的参数。

    /*========================= 应用程序特定实例========================= //
    var halHwi0Params = new halHwi.Params ();
    halHwi0Params.instance.name ="ResetIP";
    halHwi0Params.arg = 6;
    halHwi0Params.priority =-1;
    Program.global.ResetIP = halHwi.create (68、 "IPButtonISR"、halHwi0Params); 

    关于 HWI 优先级、有哪些规则? 它们是否需要为负? 我的理解是、较高的任务优先级更重要、但较低的 HWI 优先级更重要、但这是一个模糊的存储器、我目前无法在编写时找到。

    XGCONF 验证在中断优先级字段中似乎没有发现错误。 设置一个荒谬的大数字将成为一个荒谬的大负数。

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

    您可以附加导出项目吗? 这里有些东西看起来很鱼 右键单击项目->导出->常规->归档文件->下一步,然后为其命名并完成。

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

    Todd、

    我遵循了您的调试步骤。 这是验证表达式窗口、一切都将检查的好方法。 文件已附加。 该项目有一个到我的 driverlib.lib 的相对链接。

    我从空(最小)项目模板中重新创建了 EK-TM4C1294XL 开发套件上的错误、因为我不能从家里访问上面的确切代码。 按 USR sw1按钮以触发 hwi。 将优先级更改为-1以获得0xBEEF。

     e2e.ti.com/.../hwi_5F00_arg_5F00_error.zip

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

    尊敬的 Peter:

    感谢您的示例。 问题是、你创建的 Hwi 是一个零延迟中断(内核不对它进行管理、所以它会增加零延迟)。 这是由于 hwiParams.priority = 2。 2小于 Hwi.disablePriority (对于 TM4C 为32)。 因此内核会单独保留 ISR。 因此、当它触发时、CPU 直接调用您的函数、而不是通过内核的存根。 内核的存根执行以下高级操作
    -保存一些寄存器
    -获取参数并调用您的函数
    -恢复一些寄存器并结束

    因此、不会为 ISR 设置 arg、因此栈上的任何内容都将是它的值。

    以下是有关零延迟中断的更多详细信息: processors.wiki.ti.com/.../BIOS_for_Stellaris_Devices

    很抱歉我之前没有看到这一点。 通常、用户使用0作为优先级、使其成为零延迟中断。

    Todd

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

    在调整优先级阈值后、静态和动态 HWI 均按预期工作。 说实话、该参数对我的应用没有太大影响、但 post() API 和上下文保存非常重要。 勤奋会带来红利。

    Resource Explorer 中的示例是混合的优先级阈值。 观察三个半随机的情况、TCP 回波和 UART 回波的优先级阈值设置为0、但 hello 示例设置为32。 CCS 工程创建向导中的空最小 RTOS 工程模板将阈值设置为32。 空的最小模板是我发送给您的项目的基础。

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

    我不确定您在空、您好、TCP 回波和 UART 回波中引用的优先级。 您能给我提供更多详细信息吗、以确保我们都位于同一页上?

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

    您好 Todd、

    我在上面讲错了。 我从 Resource Explorer 下载的所有示例工程都将优先级阈值设置为32。 此字段在加载实际值之前显示 NULL。 当将.cfg 文件视为原始文本时、此字段中的值变为 Hwi.disablePriority。 该字段是我更改的内容、以获得具有各种优先级的成功 HWI 参数。

    但是! Hwi.disablePriority 在从默认值更改之前根本不会显示在原始文本中。 如果您将其从32更改为其他内容、然后再返回到32、它将保持不变。

    下面是一个说明屏幕截图:



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

    Peter、

    感谢您的澄清。 它应该在您的图片中的红色圆圈和 XGCONF 中的"高级"选项卡中显示32 (这是默认值)。 关于.cfg,当被视为文本文件时....我们有很多(有些可能会争论太多)配置设置。 绝大多数文件具有默认值、因此如果未在.cfg 文件中明确设置、则会采用默认值。 图形视图显示的是显式设置值和未显式设置的默认值。

    因此、当您更改默认值并在图形工具中将其改回时、它会显式存储在.cfg 中。

    通常、即使我们使用的值是默认值、我们也会尝试在.cfg 中显式包含通用配置参数。 这是为了帮助将.cfg 作为文本文件而不是图形工具进行编辑的人员。 我个人仅在忘记配置参数的确切名称或语法时才使用图形工具。

    Todd