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.

[参考译文] MSP432E401Y:在TIRTOS中使用闪存访问操作挂起XDS110 UART_WRITE函数

Guru**** 2539500 points
Other Parts Discussed in Thread: MSP-EXP432E401Y

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1096097/msp432e401y-xds110-uart_write-function-hanged-using-flash-access-operation-in-tirtos

部件号:MSP432E401Y
主题中讨论的其他部件:MSP-EXP432E401Y

您好,

为了测试闪存操作,我导入了“nvsinternal”作为TIRTOS CCS项目,并将“nvsinternal.c”替换为“flash_access-c”。

/*
 *  ======== flash_access.c ========
 */

#include <string.h>
#include <stdlib.h>
#include <stdio.h>
#include <stdint.h>

/* DriverLib Header files */
#include <ti/devices/msp432e4/driverlib/driverlib.h>

/* Driver Header files */
#include <ti/display/Display.h>
#include <ti/drivers/UART.h>
#include <ti/drivers/NVS.h>

#include <xdc/runtime/System.h>

/* Driver configuration */
#include "ti_drivers_config.h"

typedef struct _rtConfig {
    uint32_t programmed;          // Deve ter um valor 0x0000ABCD quando programada e nao podemos zerar
    uint8_t  serverIp4Addr[4];    // Endereco IP do servidor
    uint16_t serverPort;          // Porta do servidor
    uint16_t localServerPort;     // Porta local de config
    uint32_t equipmentId[8];      // ID do Equipamento
    uint8_t  serialNumber[16];    // SerialNumber (string)
    uint32_t partNumber[4];       // PartNumber
    uint32_t reserved[45];        // Reservado Scientts = (256 - Numero de uint32_t acima)
} rtConfig;

#define FOOTER "=================================================="
#define FLASH_STRT_ADDR     0xFC000

/*
 *  ======== mainThread ========
 */
void *mainThread(void *arg0)
{
    uint32_t pui32Data[2], aaa, i, siz;
    char     buf[64];
    rtConfig sv_remoteConf, remoteConf;
    uint8_t  *ptr;

    UART_Params uartParams;
    UART_Handle uart;

    // Initialize the UART driver and UART parameters
    UART_init();

    UART_Params_init(&uartParams);
    uartParams.writeDataMode  = UART_DATA_BINARY;       // UART_DATA_BINARY;
    uartParams.readDataMode   = UART_DATA_BINARY;       // UART_DATA_TEXT;
    uartParams.readReturnMode = UART_RETURN_NEWLINE;    // UART_RETURN_FULL;
//  uartParams.readEcho       = UART_ECHO_ON;           /*!< Echo received data back */
    uartParams.baudRate = 115200;

    /* Create a UART for the console */
    uart = UART_open(CONFIG_UART_0, &uartParams);
    if (uart == NULL) {
        while (1);
    }
//    UART_write(uart, "Hello, Flash Access Test PGM\n", 29);

    // Erase a block of the flash.
    FlashErase(FLASH_STRT_ADDR);

    // Program some data into the newly erased block of the flash.
    aaa = sizeof sv_remoteConf;
    memset(&sv_remoteConf, 0x00, sizeof sv_remoteConf);
    sv_remoteConf.programmed = 0x35353535;
    sv_remoteConf.serverIp4Addr[0] = 192;
    sv_remoteConf.serverIp4Addr[1] = 168;
    sv_remoteConf.serverIp4Addr[2] = 59;
    sv_remoteConf.serverIp4Addr[3] = 132;
    sv_remoteConf.serverPort = 5555;
    sv_remoteConf.localServerPort = 5556;
    sv_remoteConf.equipmentId[0] = 70;
    sv_remoteConf.equipmentId[1] = 71;
    sv_remoteConf.equipmentId[2] = 72;
    sv_remoteConf.equipmentId[3] = 73;
    sv_remoteConf.equipmentId[4] = 74;
    sv_remoteConf.equipmentId[5] = 75;
    sv_remoteConf.equipmentId[6] = 76;
    sv_remoteConf.equipmentId[7] = 77;
    memset(sv_remoteConf.serialNumber, 0x00, sizeof sv_remoteConf.serialNumber);
    strcpy((char *)&sv_remoteConf.serialNumber[0], "SN:1234567890");
    sv_remoteConf.partNumber[0] = 80;
    sv_remoteConf.partNumber[1] = 81;
    sv_remoteConf.partNumber[2] = 82;
    sv_remoteConf.partNumber[3] = 83;

    FlashProgram((uint32_t *)&sv_remoteConf, FLASH_STRT_ADDR, sizeof sv_remoteConf);

    SysCtlDelay(100);

    // read data from flash designated by FLASH_STRT_ADDR
    siz = sizeof sv_remoteConf ;
    i = 0;
    ptr = (uint8_t  *)&remoteConf;
    while (i < siz) {
        aaa = HWREG(FLASH_STRT_ADDR + i);
        memcpy((void *)ptr, (void *)&aaa, 4);
        i = i + 4;
        ptr = ptr + 4;
    }

    // output to XDS110 UART
    i = remoteConf.programmed;
    sprintf((char *)&buf[0], (char *)" programmed = 0x%x\n", i);
    aaa = strlen((const char *)&buf[0]);
//    UART_write(uart, buf, aaa);

    i = remoteConf.serverIp4Addr[0];    // Endereco IP do servidor
    i = remoteConf.serverIp4Addr[1];    // Endereco IP do servidor
    i = remoteConf.serverIp4Addr[2];     // Endereco IP do servidor
    i = remoteConf.serverIp4Addr[3];    // Endereco IP do servidor
    sprintf((char *)&buf[0], (char *)" Server IP = %d.%d.%d.%d\n",
            remoteConf.serverIp4Addr[0], remoteConf.serverIp4Addr[1],
            remoteConf.serverIp4Addr[2], remoteConf.serverIp4Addr[3]);
    aaa = strlen((const char *)&buf[0]);
//    UART_write(uart, buf, aaa);

    i = remoteConf.serverPort;         // Porta do servidor
    i = remoteConf.localServerPort;    // Porta local de configuration
    sprintf((char *)&buf[0], (char *)" Server ports = %d and %d\n",
            remoteConf.serverPort, remoteConf.localServerPort);
    aaa = strlen((const char *)&buf[0]);
//    UART_write(uart, buf, aaa);

    i = remoteConf.equipmentId[0];      // ID do Equipamento
    i = remoteConf.equipmentId[1];      // ID do Equipamento
    i = remoteConf.equipmentId[2];      // ID do Equipamento
    i = remoteConf.equipmentId[3];      // ID do Equipamento
    i = remoteConf.equipmentId[4];      // ID do Equipamento
    i = remoteConf.equipmentId[5];      // ID do Equipamento
    i = remoteConf.equipmentId[6];      // ID do Equipamento
    i = remoteConf.equipmentId[7];      // ID do Equipamento
    sprintf((char *)&buf[0], (char *)" Equip IDs = %d %d %d %d %d %d %d %d\n",
            remoteConf.equipmentId[0], remoteConf.equipmentId[1],
            remoteConf.equipmentId[2], remoteConf.equipmentId[3],
            remoteConf.equipmentId[4], remoteConf.equipmentId[5],
            remoteConf.equipmentId[6], remoteConf.equipmentId[7]);
    aaa = strlen((const char *)&buf[0]);
//    UART_write(uart, buf, aaa);

    sprintf((char *)&buf[0], (char *)" SerialNumber = %s\n", (char *)&(remoteConf.serialNumber[0]));
    aaa = strlen((const char *)&buf[0]);
//    UART_write(uart, buf, aaa);

    i = remoteConf.partNumber[0];      // PartNumber
    i = remoteConf.partNumber[1];      // PartNumber
    i = remoteConf.partNumber[2];      // PartNumber
    i = remoteConf.partNumber[3];      // PartNumber
    sprintf((char *)&buf[0], (char *)" Part NOs = %d %d %d %d\n",
            remoteConf.partNumber[0], remoteConf.partNumber[1],
            remoteConf.partNumber[2], remoteConf.partNumber[3]);
    aaa = strlen((const char *)&buf[0]);
//    UART_write(uart, buf, aaa);

    SysCtlDelay(500);

    UART_close(uart);
    return (NULL);
}

 此C程序非常简单:

  1.打开配置为XDS 110 UART的UART0  

  2.闪擦除(0xFC000)

  3.在名为 SV_remoteConf的C结构中填充数据

  4.  使用FlashProgram()函数保存SV_remoteConf结构的此内容

  5.访问存储在闪存中的数据并加载到数据结构中

  6.使用UART_WRITE将加载的数据输出到COM端口

如果我注释掉所有UART_WRITE语句,则此程序在CCS调试模式下工作正常。

但是,如果我将所有 UART_WRITE语句都激活,则CCS调试将在第一 个UART_WRITE语句中挂起。  

我无法继续调试。 所以我停止调试。

在TI-RTOS下,闪存操作和UART操作之间是否有冲突?

请告诉我解决这个问题的线索。

我的测试环境是:

  -操作系统:Windows 10 64位

  - CCS:  版本:11.2 .0.0.0007万  

  - simplelink_msp432e4_SDK: 版本4_20_00_12

  - MSP-EXP432E401Y LaunchPad

任何帮助/建议都应提前获得。   

海升

  

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

    你好,HaeSeung

    请考虑将断点设置为内部函数"UART_WRITE (UART_WRITE)",并检查该函数是否在该函数上正常运行(通过逐步进入和重新执行)

    谢谢!

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

    您好,Xiaodong,

    要使用ROV,我将引用的项目从"tirtos_build_MSP_EXP432E401Y_debug_CCS"更改为"tos_build_MSP_EXP432E401Y_release_CCS"

    然后我发现 UART_OPEN ()在 UART_WRITE ()操作挂起之前导致java.lang.Exception,说:

       错误:java.lang.exception: target memory read failed at address: 0x8, length:76 This read is at an invalid address.(java.lang.exception:目标内存读取失败,地址:0x8,长度:76此读取位于无效

        根据应用程序的分区地图。 应用程序可能未初始化或已损坏。

    我附上了所有可用的屏幕截图(RAW,BASIC,CallStacks和Module),如下所示:

    如果我注释掉所有闪存驱动程序库API,那么UART_OPEN ()和UART_WRITE ()运行良好,没有问题。

    仅当在TI-RTOS下同时使用UART驱动程序API和闪存驱动程序库API时,才会发生此错误。

     UART驱动程序API和闪存驱动程序库API之间是否存在任何已知冲突?

    欢迎提前提供任何帮助/线索。

    海升