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.
您好,
为了测试闪存操作,我导入了“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之间是否存在任何已知冲突?
欢迎提前提供任何帮助/线索。
海升