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.

[参考译文] TMS570LC4357:TI FEE 函数在 FreeRTOS 任务中挂起。

Guru**** 2455560 points
Other Parts Discussed in Thread: HALCOGEN

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1191642/tms570lc4357-ti-fee-functions-hang-inside-the-freertos-task

器件型号:TMS570LC4357
主题中讨论的其他器件:HALCOGEN

我的项目正在使用 FreeRTOS 运行、FreeRTOS 由 Hercules 开发套件上的 HalCoGen 生成。 设计中正在运行多个任务。 任务之一是使用 TI FEE 函数从闪存读取和写入。
当我尝试使用 FreeRTOS 任务中的 TI FEE 函数时、我遇到了一个问题。 该任务在 TI_FEE ()中永久挂起。  TI FEE 函数在任务外运行时工作正常。

我的问题与以下帖子类似。
https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/632209/rtos-tms570ls1224-call-fee-functions-from-freertos-tasks-hangs

无法访问帖子中提到的所有链接和文件。 有人可以向我发送正确的链接和文件吗?

此外、根据该帖子、我应该从用户模式切换到监控模式以执行 TI FEE 功能。 是否有人可以帮助我了解如何将处理器切换到监控模式?

#include "FreeRTOS.h"
#include "os_task.h"
#include "ti_fee.h"
#include "HL_sci.h"
#include "stdio.h"

xTaskHandle xTestTaskHandler

void vTestTask();

int main(void)
{
/* USER CODE BEGIN (3) */
    sciInit();

    xTaskCreate(vTestTask, "TestTask", 5 * configMINIMAL_STACK_SIZE, NULL, 1 , &xTestTaskHandler);
    vTaskStartScheduler();
    
    while(1);
    
/* USER CODE END */
    return 0;
}


void vTestTask(){
    //varialbes
    
    //========== flash initialization ==========
    TI_Fee_Init();
    do
    {
        TI_Fee_MainFunction();
        delay();
        Status = TI_Fee_GetStatus(0);
    }
    while (Status != IDLE);
    
    //========== write to flash ==========
    blockNumber = 0x1;
    TI_Fee_WriteAsync(blockNumber, &memoryBlock[0]);
    do
    {
        TI_Fee_MainFunction();
        delay();
        Status = TI_Fee_GetStatus(0);
    }
    while (Status != IDLE);
    
    //========== read flash ===========
    blockOffset = 0x00;
    length = 68;
    outputResult = TI_Fee_Read(blockNumber, blockOffset, Read_Ptr, length);
    do
    {
        TI_Fee_MainFunction();
        delay();
        Status = TI_Fee_GetStatus(0);
    }
    while (Status != IDLE);
    while(1){
        sciDisplayData(sciREG1, (uint8*) Read_Ptr, 4);
    }
}

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

    您好!

    请参阅以下应用手册、了解如何从用户模式进入 SVC 模式。

    基于 Hercules ARM Cortex-R4/5的微控制器上的中断和异常处理

    我还将尝试为您提供一个示例代码。

    --

    谢谢、此致、
    Jagadish。

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

    您好!

    以下线程包含示例代码

    (+) TMS570闪存 API 1.0.5、在 API 函数内部生成的 DataEntry 错误 Flash_Erase_sector_B ()-基于 Arm 的微控制器论坛-基于 Arm 的微控制器- TI E2E 支持论坛

    --

    谢谢、此致、

    Jagadish。

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

    谢谢 Jagadish 的回复。
    阅读文档后、我根据自己的理解在代码中添加了几行以进入 SVC 模式。

    //...
    //...
    //...
    #pragma SWI_ALIAS(switchCpuMode, 1);
    extern void switchCpuMode(uint32_t mode);
    //...
    //...
    
    int main(){
        //...
        //...
    
        switchCpuMode(1); //calling function to enter SVC 
    
        TI_Fee_Format(0x5A5A5A5AU); //Format all EEPROM
        TI_Fee_Init(); //flash initialization
        do
        {
            TI_Fee_MainFunction();
            delay();
            Status = TI_Fee_GetStatus(0);
        }
        while (Status != IDLE);
    
        xTaskCreate(...); //writing and reading the flash
        vTaskStartScheduler();
    }


    但问题未得到解决。 您能告诉我这是否是解决此问题的正确方法吗?  

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

    您好、U A、

    我刚才创建了一个示例代码、用于进入监控器模式  

    它运行正常、您能否添加此代码并在您的末尾对其进行测试

    基本上、您需要添加3个文件来使用这个项目  Svc.c、 _Svc.asm 和 svc.h

    还应注意以下修改

    e2e.ti.com/.../USERMODE_5F00_TO_5F00_SVCMODE_5F00_LC4357.zip

    --

    谢谢、此致、
    Jagadish。

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

    非常感谢您的帮助。

    我现在可以按照您的方法更改 ARM 模式。 但又出现了另一个问题。 此方法在 FreeRTOS 任务中不起作用。
    按照您的指令、我更改了 hL_sys_intvecs.asm 文件。

    默认代码:


    修改的代码:

    此修改允许我更改 ARM 模式、但在 xTaskCreate (...)中挂起。  如果我切换回缺省代码, xTaskCreate(...) 开始工作、模式保持在用户模式。 您能帮我解决这个问题吗?

    我正在连接我的测试项目。
    e2e.ti.com/.../ppm_5F00_flash_5F00_test.zip

    感谢您抽出宝贵时间为您提供帮助。


    此致
    Ua

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

    您好、UA、

    现在我调试您的项目、注意到它在 "undefEntry"挂起、您遇到的问题是否相同?

    --
    谢谢、此致、
    Jagadish。

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

    你好 
    执行   MPU_xTaskCreate (...)后、我的代码在 resetEntry 中挂起 功能。

    //os_mpu_wrappers.c
    
    BaseType_t MPU_xTaskCreate( TaskFunction_t pxTaskCode, 
                                const char * const pcName, 
                                const uint16_t usStackDepth, 
                                void * const pvParameters, 
                                UBaseType_t uxPriority, 
                                TaskHandle_t * const pxCreatedTask )
    {
    	BaseType_t xReturn;
    	BaseType_t xRunningPrivileged = prvRaisePrivilege();
    	xReturn = xTaskCreate( pxTaskCode, pcName, usStackDepth, pvParameters, uxPriority, pxCreatedTask );
    	portRESET_PRIVILEGE( xRunningPrivileged );
    	return xReturn;
    }



    如果上一次出现问题、我将再次连接该项目。
    e2e.ti.com/.../5822.ppm_5F00_flash_5F00_test.zip

    该项目目前处于"重新安置"状态。 如果我用 vPortSWI (在 undefEntry 中)替换_Svc (在 svcEntry 中)、则代码开始工作(打印0x41)。

    在 HalCoGen 中 MPU 被禁用。



    您能给我一个解决方案吗?我可以转到监控器模式使用闪存读取/写入、而 FreeRTOS 任务可以正常工作?

    感谢你的帮助。

    此致
    Ua

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

    您好、UA、

    感谢您共享代码、我开始调试您的问题、我将尽快提供更新。

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

    我处于项目的一个非常关键的阶段。
    如果您需要我提供的更多信息、请告诉我。

    Jagadish、感谢您的帮助和时间。

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

    您好、UA、

    我创建了一个满足您要求的演示。 那么、您能否使用我随附的演示进行一次测试?

    e2e.ti.com/.../RTOS_5F00_FEE_5F00_LC4357.zip

    以上演示与我的 Launchpad 完美配合。

    --

    谢谢、此致、
    Jagadish。

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

    谢谢 Jagadish 的回复。  

    您附加的项目在我的计算机上运行。 但我认为这不能解决我的问题。 在 FreeRTOS 任务之外运行 TI_FEE 驱动器时、我从未遇到任何问题。 我的问题仅在我尝试在任务中使用 TI_FEE 驱动器时出现、并且我的项目要求严格需要从 FreeRTOS 任务中读取/写入闪存。

    下面是我的要求的简要说明。



    如果您需要更多信息或希望我澄清任何内容、请告诉我。

    再次感谢你。

    此致
    Ua

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

    您好、UA、

    [引用 userid="522078" URL"~/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1191642/tms570lc4357-ti-fee-functions-hang-inside-the-freertos-task/4503840 #4503840"]在 FreeRTOS 任务之外运行 TI_FEE 驱动器时从未遇到任何问题。

    好的、我想您最初附加的代码执行相同的操作、这就是我根据该操作进行修改的原因。

    感谢您的要求、让我尝试一下。

    --

    谢谢、此致、
    Jagadish。

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

    谢谢  

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

    您好、UA、

    我找到了如何执行该操作、执行以下操作。

    在调用 FEE 写入函数之前、在任务本身中将模式更改为主管。

    并在完成上述写入功能后切换回用户模式。

    我进行了测试、结果对我来说很有用、我正在附上我的项目供您参考。

    e2e.ti.com/.../RTOS_5F00_FEE_5F00_LC4357-_2800_2_2900_.zip 

    --

    谢谢、此致、
    Jagadish。

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

    您的附加项目在我的计算机上无法正常运行。 但在遵循您的方法后、问题在我的项目中得到解决。

    非常感谢 Jagadish 抽出宝贵的时间耐心等待我们的节目。 感谢你的帮助。
    太棒了!!!

    Ua