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/TM4C1292NCPDT:如何编写关键段代码以防止任务抢占

Guru**** 2484615 points


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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/725170/rtos-tm4c1292ncpdt-how-to-write-critical-section-code-to-prevent-the-task-preemption

器件型号:TM4C1292NCPDT

工具/软件:TI-RTOS

您好!

我将 tirtos_tivac_2_16_01_14和 TivaWare_C_Series-2.1.4.178用于工程。 我正在使用其中一个闪存段来存储应用的非易失性数据、该数据将从应用中的任务之一写入。 我的应用程序中还运行其他更高优先级的任务和 ISR。

我想防止下面的代码块在完成之前不应被任何其他任务或 ISR 抢先。

void flashWrite (boot_struct * stFlashData)
{
内转台;

RET = FlashErase (((uint32_t) flash_common_memory_address);
if (ret!=空)
{
system_printf ("闪存未成功擦除\n"\n);
}

RET = FlashProgram (((uint32_t *) stFlashData、
FLASH_common_memory_address、2048);
if (ret!=空)
{
system_printf ("闪存未成功编程\n"\n);
}

system_flush();
} 

有人有建议、怎么做?

一段时间、闪存擦除完成后、任务在完成闪存程序之前被其他任务/ISR 取代、并且其他任务需要这些闪存数据才能运行。

此致

巴拉

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

    其他哪些线程将访问该非易失性存储器?
    1.没有人:那么你不需要任何保护
    其他任务:我要使用 GateMutex 或 GateMutexPri 作为阻止机制。 因此、在上面的闪存擦除之前执行 GateMutex_enter、在编程完成后执行 GateMutex_leave。 然后在另一个任务访问该存储器的代码中使用相同的 ENTER/Leave。
    SWI 和/ Hwi:虽然可以禁用中断、但这可能会导致更大的中断延迟。 我会考虑更改设计、以限制 HwI/Swi 通过全局变量或信标对存储器的访问、并让 HwI/Swi 使用零的超时、如果未获得信标、则相应地执行操作。

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

    您好 Todd、

    访问这个闪存存储器区域、甚至这个代码段、没有其他任务。 我想、闪存擦除和闪存程序之间可能存在任务抢占。 因此,我想把这一节带到关键区域,这样其他任务就不会占先。

    根据您的建议、我使用了 GateMutex 功能来实现该目的。

    问题是、在几次背靠背闪存写入后、闪存擦除始终在 TIvaware 驱动程序库中的 flah.c 行第152处的以下代码处挂起。

    //
    //等待块被擦除。
    //
    while (HWREG (FLASH_FMC)和 FLASH_FMC_ERASE)
    {
    }
    

    这是从基于外部事件的任务上下文中调用的例程。

    void flashWrite (boot_struct * stFlashData)
    {
    内转台;
    
    /*禁用硬件中断*/
    RET = FlashErase (((uint32_t) flash_common_memory_address);
    if (ret!=空)
    {
    system_printf ("闪存未成功擦除\n"\n);
    }
    
    RET = FlashProgram (((uint32_t *) stFlashData、
    FLASH_common_memory_address、2048);
    if (ret!=空)
    {
    system_printf ("闪存未成功编程\n"\n);
    }
    } 

    我已经浏览过这个论坛链接。  

    https://e2e.ti.com/support/microcontrollers/tiva_arm/f/908/t/671683?TM4C1294NCPDT-TM4C1294NCPDT-flash-write-issue

    在这种情况下、有人建议添加一些 NOP 指令、使其正常工作。

    与此类似、我在闪存访问之间添加了大约10毫秒的任务睡眠(未通过进一步缩短睡眠时间进行检查)、其工作正常。 我们希望了解此问题的确切根本原因。

    此致

    巴拉

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

    您好、Bala、

    添加 GateMutex 或始终添加 GateMutex 时是否会出现问题? 显然、如果闪存扇区中有正在执行的代码、则不能对其执行操作。 如果我记得正确的话、我认为 TM4C 的闪存扇区非常大。

    或者更好的是、您能否附加存在问题的小型 CCS 项目。

    Todd

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

    您好 Todd、

    [引用 user="ToddMullanix"]在您添加 GateMutex 或始终添加 GateMutex 时是否会出现问题? [/引述]否 问题就在前面、我们认为这个闪存擦除/写入可能被其他任务抢先。 这就是我们要求在关键部分执行代码的原因。 添加 GateMutex 后无法解决问题[引用 USER="ToddMullanix"]显然,如果闪存扇区中有正在执行的代码,则无法对其执行操作。。 目前、代码被编程到闪存中、并且只从闪存中执行、而不是从 RAM 中执行。 您是否意味着这不应该是?

    [引用 user="ToddMullanix"]如果我记错了,我认为 TM4C 的闪存扇区非常大。是的。 它是1MB。

    [引用 user="ToddMullanix"]更好的是、能否附加存在问题的小型 CCS 工程让我检查是否可以使用最小 CCS 工程在 Evaluation 板中重新创建该工程。

    此致

    巴拉

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

    您好 Todd、

    [引用 user="ToddMullanix"]如果闪存扇区中有正在执行的代码,则无法对其执行操作。执行代码可用于不同的闪存扇区。

    巴拉

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

    您好、Bala、

    抱歉、这是我们一侧的裂缝所导致的。 这仍然是一个问题。

    Todd

    [9/24更新:将此标记为 TI 认为已解决、因为原始海报中没有活动。]

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

    您好 Todd、

    这还没有解决。 我们只是增加了延迟及其工作... 但我们还无法找到根本原因... 与 TI 的本地 FAE 合作。

    此致

    巴拉