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.

[参考译文] FreeRTOS:在 vApplicationGetIdleTaskMemory()和 portRESTORE_FIRST_Context ()之后、TMS320F28377D 进入非法的 ISR

Guru**** 2460850 points
Other Parts Discussed in Thread: TMS320F28377D

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1505015/freertos-tms320f28377d-going-into-illegal-isr-after-vapplicationgetidletaskmemory-and-portrestore_first_context

器件型号:TMS320F28377D

工具/软件:Code Composer Studio

大家好:

我在 TMS320F28377D 控制器上使用 FreeRTOS、在调用 vTaskStartScheduler ()后、遇到系统进入"非法 ISR"的问题。

下面是到目前为止我调试过的内容:

-当 vApplicationGetIdleTaskMemory()函数被定义和使用时、在 xPortStartScheduler()内调用 portRESTORE_FIRST_Context()后、代码进入非法的 ISR。

-如果我注释掉 vApplicationGetIdleTaskMemory (),那么它不会进入非法的 ISR ,但我的任务(ControlLoopTask)永远不会执行。

-我们使用 xTaskCreateStatic ()来创建任务,并将 configUSE_STATIC_ALLOCATION 设置为1。

我们配置了 CPUTIMER2和注册的 portTICK_ISR、启用了计时器和中断。

-任务创建:

TaskHandle_t 句柄= xTaskCreateStatic (ControlLoopTask、

                                        "ControlTask"、

                                        configMINIMAL_STACK_SIZE、

                                        空、

                                        tskIDLE_PRIORITY + 2、

                                        xControlTaskStack、

                                        &xControlTaskTCB);

 -  vApplicationGetIdleTaskMemory ():

void vApplicationGetIdleTaskMemory( StaticTask_t ** ppxIdleTaskTCBBuffer,

                                     StackType_t ** ppxIdleTaskStackBuffer、

                                     uint32_t *pulIdleTaskStackSize)

    *ppxIdleTaskTCBBuffer =&idleTaskBuffer;

    *ppxIdleTaskStackBuffer = idleTaskStack;

    *pulIdleTaskStackSize = stack_size;

}

如有任何建议、将不胜感激。

谢谢!

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

    器件型号:TMS320F28377D

    工具/软件:Code Composer Studio

    大家好:

     我正在使用 TMS320F28377D 控制器开发基于 FreeRTOS 的应用程序。 我正在使用静态任务分配 xTaskCreateStatic ()、并且我已经根据空闲任务的静态内存分配的要求实现了 vApplicationGetIdleTaskMemory ()函数。

    但是,一旦调度程序启动 vTaskStartScheduler (),控制器就会进入"非法 ISR"陷阱。 如果我注释掉 task.c 中调用 vApplicationGetIdleTaskMemory()的行、则代码不会崩溃、但当然 Idle Task 不起作用、我的主任务也不起作用(ControlLoopTask())。

    以下是设置摘要:

    -FreeRTOSConfig.h 的 configSUPPORT_STATIC_ALLOCATION 设置为"1"

    -我正在定义 vApplicationGetIdleTaskMemory()与 main()在同一个.c 文件中

    -我正在使用 xTaskCreateStatic ()来创建我的任务

    - freeRTOS tick 通过 vPortSetupTimerInterrupt ()配置 CPUTIMER2

    -我的计时器 ISR 正确注册了 Interrupt_register(INT_TIMER2,&portTICK_isr);

    -我的任务是一个基本的无限循环调用 vTaskDelay ()

    下面是我定义的功能:

    #define STACK_SIZE 256

    静态 StaticTask_t idleTaskTCB;

    静态 StackType_t idleTaskStack[stack_size];

     

    void vApplicationGetIdleTaskMemory (StaticTask_t ppxIdleTaskTCBBuffer、

                                       StackType_t ppxIdleTaskStackBuffer、

                                       uint32_t *pulIdleTaskStackSize)

        *ppxIdleTaskTCBBuffer =&idleTaskTCB;

        *ppxIdleTaskStackBuffer = idleTaskStack;

        *pulIdleTaskStackSize = stack_size;

    }

    问题:

    1.为什么执行 vApplicationGetIdleTaskMemory()会导致程序进入`非法 ISR`?

    2. 当我包含 vApplicationGetIdleTaskMemory()函数时、控制器会在 vTaskStartScheduler()之后立即进入非法 ISR。

       但是、如果我注释掉该函数、系统不会崩溃、但我的任务也不会运行。

     

    提前感谢您的帮助!

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

    尊敬的 Vaishnav:

    当 configSUPPORT_STATIC_ALLOCATION 设置为1时、vApplicationGetIdleTaskMemory()必须由应用程序定义。 因此、您不能在代码中排除它。 您实现函数本身看起来不错。 需要检查的几个事项:

    1)所有任务栈(以及堆、如果使用)都必须放置在较低的64KB RAM 存储器中并正确对齐。 可通过以下方式完成此操作:

    static StaticTask_t idleTaskBuffer;
    static StackType_t  idleTaskStack[STACK_SIZE];
    #pragma DATA_SECTION(idleTaskStack,   ".freertosStaticStack")
    #pragma DATA_ALIGN ( idleTaskStack , portBYTE_ALIGNMENT )

    在这里、.freertosStaticStack 是在 linker.cmd 文件中适当分配的段

    2)如果您有 F28377D Launchpad、请在中定义所需的符号 "Project Properties">"Compiler">"Predefined symbols"

    3)确保您的控制任务不会退出循环。 另请检查应用程序是否在没有您的控制任务的情况下工作(即仅运行空闲任务)

    如果仍然遇到错误、可以尝试在复制工程 [C 2000ware]/kernel/FreeRTOS/Demo/C2000_F2837xs_C28x_CCS  (除特定于设备的设置外、应用程序。 代码将保持不变)。 如果这样可以解决您的问题、请告诉我。

    此致、
    Arnav