TI毫米波雷达IWR/AWR1642 L3 RAM内存优化实战:从原理到配置

news2026/5/16 15:02:23
1. 项目概述为何要动L3 RAM这块“蛋糕”如果你正在基于TI的IWR1642或AWR1642毫米波雷达芯片进行开发尤其是当你的应用代码量越来越大或者数据处理任务越来越重时你可能会遇到一个瓶颈内存不够用了。不是DSPC674x的L1/L2缓存不够也不是ARM R4F内核的TCM紧耦合内存不够而是那块关键的共享内存——L3 RAM。默认情况下mmWave SDK的配置可能并不完全符合你的项目需求这时手动调整L3 RAM的分布就成了一个必须掌握的“硬核”技能。这就像在一块固定的蛋糕总共768KB的L3 RAM上重新划分给不同的“食客”DSS、MSS TCMA、MSS TCMB、BSS让每个模块都能吃饱又不至于浪费。我最近在一个需要为MSS主子系统即ARM R4F增加代码空间的AWR1642项目上就遇到了这个问题。默认配置下所有可共享的L3 RAM bank都分配给了DSS从子系统即C674x DSP导致MSS的TCMA指令紧耦合内存空间紧张一些新增的算法模块无处安放。经过一番摸索和实测我成功地从共享区域“抠”出了一个128KB的bank分配给了MSS TCMA。这个过程涉及SDK环境变量、链接脚本、驱动编译等多个环节任何一个步骤出错都可能导致程序无法启动或运行异常。下面我就把这次“动蛋糕”的完整流程、背后的原理、踩过的坑以及验证方法毫无保留地分享出来。无论你是想为MSS腾出更多代码空间还是为BSS雷达硬件子系统或数据区扩容这篇指南都能为你提供清晰的路径。2. 核心原理拆解IWR/AWR1642的L3 RAM内存地图在动手修改之前我们必须先彻底理解我们要修改的对象。IWR1642/AWR1642芯片内部的L3 RAM是一个共享资源池总容量为768KB。TI为了管理方便将其物理上划分为6个Bank每个Bank大小固定为128KB。这6个Bank的编号从Bank1到Bank6注意有些文档可能从0开始编号但原理相通。关键点在于这6个Bank的用途是有固定划分和灵活配置区的Bank1, Bank2, Bank3这三个Bank是DSS专用的。也就是说无论你怎么配置这384KB3*128KB的内存都固定归属DSS使用主要用来存放DSS的数据.bss段和部分代码。这部分我们无法改变。Bank4, Bank5, Bank6这三个Bank是可配置的共享区域。这才是我们“动蛋糕”的操作空间。每个Bank都可以被独立地配置给以下四个“主人”之一使用DSS继续给DSS使用扩大其数据或代码空间。MSS TCMA扩展ARM R4F的指令紧耦合内存。TCMA是R4F内核执行代码最快的内存区域扩展它能显著提升MSS的性能尤其适合存放对实时性要求高的关键函数。MSS TCMB扩展ARM R4F的数据紧耦合内存。用于存放频繁访问的全局变量、堆栈等。BSS TCMA扩展雷达硬件子系统BSS的代码内存。这部分通常用于存放雷达前端配置、低级别控制固件等普通应用开发较少改动。那么系统如何知道我们想把哪个Bank分给谁呢答案就在一个关键的硬件寄存器SHMEMBANKSEL7TO4名称可能因文档版本略有差异。这个寄存器的每8个比特控制一个Bank通常控制Bank4~7Bank1~3是固定的所以实际是控制共享的Bank4~6。通过写入特定的值如0x01代表DSS0x02代表MSS TCMA0x04代表MSS TCMB0x10代表BSS就可以在硬件层面完成内存归属的映射。听起来很简单但为什么我们通常不直接去写这个寄存器呢因为mmWave SDK为我们封装了一层更便捷的抽象——环境变量MMWAVE_SDK_SHMEM_ALLOC。SDK的构建系统会根据这个环境变量的值在最终生成的二进制镜像.bin文件的元数据Meta Header中写入对应的L3 RAM配置信息。当芯片上电ROM Bootloader加载这个镜像时会自动解析这些信息并正确配置SHMEMBANKSEL7TO4寄存器。这样开发者就无需在应用代码中显式操作硬件寄存器降低了复杂度也避免了错误。我们的修改核心就是正确地设置这个环境变量并确保SDK构建链中所有相关部分都能同步这个变更。3. 环境变量详解MMWAVE_SDK_SHMEM_ALLOC的位域奥秘MMWAVE_SDK_SHMEM_ALLOC是一个32位的十六进制数它的每一个字节8个比特都有明确的定义共同决定了那3个可配置Bank的最终去向。理解它的位域定义是成功修改的第一步。这个32位数从高位到低位Bit 31到Bit 0可以分为4个8位字段比特位范围含义说明Bit [31:24]分配给BSS使用的L3 RAM Bank数量范围0-3。例如设为1表示将1个共享Bank128KB分配给BSS TCMA。Bit [23:16]分配给MSS TCMB使用的L3 RAM Bank数量范围0-3。例如设为1表示将1个共享Bank128KB分配给MSS TCMB。Bit [15:8]分配给MSS TCMA使用的L3 RAM Bank数量范围0-3。例如设为1表示将1个共享Bank128KB分配给MSS TCMA。Bit [7:0]分配给DSS使用的L3 RAM Bank数量注意这个数量包含了DSS专用的那3个BankBank1~3。因此它的值至少为3。计算与组合示例假设我们想把Bank6分配给MSS TCMABank5和Bank4留给DSS保持默认。那么DSS Bank数量 专用3个 共享的2个 5 - Bit[7:0] 0x05MSS TCMA Bank数量 1 - Bit[15:8] 0x01MSS TCMB Bank数量 0 - Bit[23:16] 0x00BSS Bank数量 0 - Bit[31:24] 0x00将它们组合起来0x00 00 01 05写成32位十六进制数就是0x00000105。这就是我本次示例中要设置的值。SDK的Makefile里已经预定义了一些常见场景比如默认的0x000000066个Bank全给DSS或者0x000002042个Bank给MSS TCMA剩下4个给DSS。我们需要做的就是根据我们的目标计算出对应的值并确保它被SDK的构建系统识别和处理。注意这三个共享Bank的分配数量之和不能超过3。例如你不能同时分配2个给TCMA、2个给TCMB这加起来是4超过了可用的共享Bank总数。4. 实操步骤一修改SDK构建系统的核心配置理论清晰后我们开始动手。所有操作基于mmWave SDK 2.1路径以C:\ti\mmwave_sdk_02_01_00_04\为例请根据你的实际安装路径调整。4.1 定位并修改主Makefile定义首先我们需要修改SDK中定义MMWAVE_SDK_SHMEM_ALLOC环境变量及其处理逻辑的文件。这个文件是C:\ti\mmwave_sdk_02_01_00_04\packages\ti\common\mmwave_sdk_xwr16xx.mak用文本编辑器如VS Code、Notepad打开它搜索MMWAVE_SDK_SHMEM_ALLOC。你会看到一系列ifeq/else ifeq的条件判断语句。这些语句检查MMWAVE_SDK_SHMEM_ALLOC的值并据此设置几个内部变量SHMEM_ALLOC最终值、MMWAVE_L3RAM_NUM_BANKDSS可用的L3 Bank总数、MMWAVE_SHMEM_TCMA_NUM_BANK扩展的TCMA Bank数、MMWAVE_SHMEM_TCMB_NUM_BANK扩展的TCMB Bank数。我们需要添加对我们自定义配置0x00000105的支持。找到类似下面的代码块通常在文件后半部分ifeq ($(MMWAVE_SDK_SHMEM_ALLOC), 0x00000006) # default case SHMEM_ALLOC $(MMWAVE_SDK_SHMEM_ALLOC) MMWAVE_L3RAM_NUM_BANK 6 MMWAVE_SHMEM_TCMA_NUM_BANK 0 MMWAVE_SHMEM_TCMB_NUM_BANK 0 else ifeq ($(MMWAVE_SDK_SHMEM_ALLOC), 0x00000204) # scenario where more MSS code space is needed SHMEM_ALLOC $(MMWAVE_SHMEM_ALLOC) MMWAVE_L3RAM_NUM_BANK 4 MMWAVE_SHMEM_TCMA_NUM_BANK 2 MMWAVE_SHMEM_TCMB_NUM_BANK 0 ... else $(error Invalid SHMEM_ALLOC setting! Please check the environment variable MMWAVE_SDK_SHMEM_ALLOC.) endif在默认配置0x00000006的判断分支之后添加我们新场景的分支else ifeq ($(MMWAVE_SDK_SHMEM_ALLOC), 0x00000006) # default case SHMEM_ALLOC $(MMWAVE_SDK_SHMEM_ALLOC) MMWAVE_L3RAM_NUM_BANK 6 MMWAVE_SHMEM_TCMA_NUM_BANK 0 MMWAVE_SHMEM_TCMB_NUM_BANK 0 # --- 新增我们的配置分支 --- else ifeq ($(MMWAVE_SDK_SHMEM_ALLOC), 0x00000105) # Assign 1 shared bank to MSS TCMA SHMEM_ALLOC $(MMWAVE_SDK_SHMEM_ALLOC) MMWAVE_L3RAM_NUM_BANK 5 # DSS gets 5 banks in total (3 fixed 2 shared) MMWAVE_SHMEM_TCMA_NUM_BANK 1 # MSS TCMA gets 1 extended bank MMWAVE_SHMEM_TCMB_NUM_BANK 0 # --- 新增结束 --- else ifeq ($(MMWAVE_SDK_SHMEM_ALLOC), 0x00000204) # scenario where more MSS code space is needed ...修改要点与避坑指南顺序很重要确保把你的新else ifeq分支添加在默认分支之后在其他预定义分支之前。Makefile条件判断是顺序执行的。变量赋值SHMEM_ALLOC直接传递环境变量的值。MMWAVE_L3RAM_NUM_BANK必须等于MMWAVE_SDK_SHMEM_ALLOC最低字节的值即DSS Bank数本例中是5。注释清晰写上清晰的注释说明这个配置的目的方便日后维护或团队协作。检查语法Makefile对空格和Tab非常敏感。确保SHMEM_ALLOC ...等赋值语句前面用的是Tab键而不是空格。这是最常见的编译错误来源之一。4.2 联动修改一链接器命令文件.cmd修改了环境变量后SDK会通过内部变量MMWAVE_L3RAM_NUM_BANK,MMWAVE_SHMEM_TCMA_NUM_BANK等传递到链接器用于决定各内存段Section的起始地址和长度。主要有两个链接文件受影响1. MSS链接文件 (r4f_linker.cmd): 路径C:\ti\mmwave_sdk_02_01_00_04\packages\ti\platform\xwr16xx\r4f_linker.cmd这个文件定义了MSSARM R4F的内存布局。我们需要关注PROG_RAM程序内存即TCMA、DATA_RAM数据内存即TCMB和L3_RAM这几个段。理论上的自动调整在标准的SDK流程中这个文件使用了预定义符号如MMWAVE_SHMEM_TCMA_NUM_BANK其length字段应该是自动计算的。例如PROG_RAM (RX) : origin0x00000100, length0x0003FF00 (MMWAVE_SHMEM_TCMA_NUM_BANK * MMWAVE_SHMEM_BANK_SIZE)理论上当我们设置了MMWAVE_SHMEM_TCMA_NUM_BANK1链接器会自动将PROG_RAM的长度增加128KB0x20000。在大多数情况下你不需要手动修改这个文件。为什么原文提到了手动修改原文中手动修改r4f_linker.cmd是为了测试验证。他们创建了一个新的内存区域PROG_RAM2并手动将一个测试函数my_delay()通过#pragma CODE_SECTION指令放置到这个区域以此来直观地证明扩展的TCMA区域确实可以被使用。这是一种非常有效的调试和验证手段。MEMORY { ... // 其他原有定义 PROG_RAM (RX) : origin0x00000100 length0x0003FF00 // 原始的256KB TCMA PROG_RAM2 (RX): origin0x00040000 length0x0001FFFF // 新增的128KB扩展TCMA区域 } SECTIONS { ... // 其他原有段 .mySection: {} PROG_RAM2 // 将自定义段映射到新区域 }实操建议对于初次修改不建议直接动链接脚本。先依赖SDK的自动机制完成整体配置并验证功能。只有在需要精确控制特定函数/变量的位置或者进行深度调试时才考虑手动调整链接脚本。这可以避免引入不必要的复杂性。2. DSS链接文件 (c674x_linker.cmd): 路径C:\ti\mmwave_sdk_02_01_00_04\packages\ti\platform\xwr16xx\c674x_linker.cmd这个文件定义了DSSC674x DSP的内存布局主要关注L3SRAM段。它同样使用MMWAVE_L3RAM_NUM_BANK这个变量来自动计算长度。#define MMWAVE_L3RAM_SIZE (MMWAVE_L3RAM_NUM_BANK * MMWAVE_SHMEM_BANK_SIZE) ... MEMORY { PAGE 0: { ... L3SRAM: o 0x20000000, l MMWAVE_L3RAM_SIZE ... } }在我们的例子中MMWAVE_L3RAM_NUM_BANK变成了5所以MMWAVE_L3RAM_SIZE会自动变为5 * 0x20000 0xA0000(640KB)。这个文件通常也无需手动修改。4.3 联动修改二系统公共头文件头文件sys_common_xwr16xx_mss.h是MSS侧代码获取内存布局信息的权威来源。路径在C:\ti\mmwave_sdk_02_01_00_04\packages\ti\common\sys_common_xwr16xx_mss.h。这个文件内部会引用我们在.mak文件中定义的MMWAVE_SHMEM_TCMA_NUM_BANK等变量并计算出最终的绝对大小常量供其他驱动和应用程序使用。例如#define SOC_XWR16XX_MSS_SHMEM_TCMA_SIZE MMWAVE_SHMEM_TCMA_NUM_BANK*MMWAVE_SHMEM_BANK_SIZE #define SOC_XWR16XX_MSS_TCMA_SIZE MMWAVE_SHMEM_TCMA_NUM_BANK*MMWAVE_SHMEM_BANK_SIZE0x40000USOC_XWR16XX_MSS_TCMA_SIZE的值就是“扩展的TCMA大小” “基础的256KB TCMA”。当我们设置MMWAVE_SHMEM_TCMA_NUM_BANK1后这个值会自动变为0x20000 0x40000 0x60000(384KB)。这个文件是自动生成的或由构建系统包含的我们通常不需要也不应该手动编辑它。确保你修改的.mak文件被正确引用即可。4.4 联动修改三镜像生成脚本最后我们需要确保在最终生成可烧录的.bin文件时我们的SHMEM_ALLOC值被写入镜像的元数据。这发生在makefile中调用$(GENERATE_METAIMAGE)工具的时候。检查以下两个文件C:\ti\mmwave_sdk_02_01_00_04\packages\ti\utils\ccsdebug\makefileC:\ti\mmwave_sdk_02_01_00_04\packages\ti\demos\xwr16xx\mmw\makefile在这两个文件的mmwDemo:或all:目标中你会看到类似下面的命令$(GENERATE_METAIMAGE) $(MMW_DEMO_BIN) $(SHMEM_ALLOC) $(MSS_MMW_DEMO_OUT) $(XWR16XX_RADARSS_IMAGE_BIN) $(DSS_MMW_DEMO_OUT)注意第二个参数就是$(SHMEM_ALLOC)。只要我们正确修改了mmwave_sdk_xwr16xx.mak文件使得SHMEM_ALLOC变量的值变成了0x00000105那么这里传递的就是正确的值镜像生成工具会将其打包。这部分通常也无需手动修改。5. 实操步骤二重新编译SOC驱动——最关键的步骤这是整个流程中最容易忽略但却是至关重要、必不可少的一步。为什么SOC驱动位于C:\ti\mmwave_sdk_02_01_00_04\packages\ti\drivers\soc\中有一个关键函数SOC_deviceInit()它负责初始化芯片的底层硬件包括MPU内存保护单元配置。这个函数在初始化时会使用sys_common_xwr16xx_mss.h中定义的那些内存大小常量如SOC_XWR16XX_MSS_TCMA_SIZE来配置MPU区域。如果我们只修改了环境变量和应用程序但没有重新编译SOC驱动那么驱动里记录的还是旧的内存布局信息。当应用程序使用了新布局尝试访问扩展的TCMA区域时可能会因为MPU没有正确配置该区域为可执行/可访问而导致内存访问错误或程序跑飞。重新编译SOC驱动的步骤打开一个命令行窗口CMD或PowerShell。导航到SOC驱动目录cd C:\ti\mmwave_sdk_02_01_00_04\packages\ti\drivers\soc执行清理和编译命令。通常SDK会提供make clean和make all命令。请参考你的SDK文档 (mmwave_sdk_user_guide.pdf) 中 “Building drivers/control/alg components” 章节的具体指令。一个典型的命令是gmake -s all COREm4f或者如果你在Windows上使用CCS的编译工具链可能是make -s all COREm4f编译成功后你会在packages/ti/drivers/soc/lib/目录下找到新生成的库文件如soc_xwr16xx.ae674和soc_xwr16xx.am4f。核心原则必须在编译你的应用程序如mmw demo或ccsdebug之前先完成SOC驱动的重新编译。因为应用程序链接时会依赖驱动库文件。如果顺序错了应用程序链接的仍然是旧的驱动库修改就不会生效。6. 实操步骤三修改、编译与验证测试代码现在所有底层配置都已就绪我们可以修改应用程序来使用新分配的内存了。这里以SDK自带的mmw demo为例在MSS主程序中添加测试代码。6.1 添加测试代码到mss_main.c打开C:\ti\mmwave_sdk_02_01_00_04\packages\ti\demos\xwr16xx\mmw\mss\mss_main.c。声明并定义测试函数在文件顶部函数声明区域或main函数之前添加一个测试函数。为了验证它被放到了扩展的TCMA我们使用#pragma CODE_SECTION指令强制将其放置到一个自定义段这个段将在链接时被映射到扩展的内存区域如果你像4.2节那样修改了链接脚本并创建了.mySection。如果没改链接脚本编译器可能会自动将其分配到扩展的TCMA空间如果默认的TCMA已满。#pragma CODE_SECTION(my_delay, .mySection) // 如果创建了自定义段 // 或者不加pragma让链接器自动分配 void my_delay(void) { volatile int i; // 一个简单的延时循环防止被编译器优化掉 for (i 0; i 0x1000; i) { __asm( NOP); // 可选插入空操作确保循环有实质内容 } System_printf(Debug: [MSS] Delay function executed from extended TCMA area!\n); }在main函数中调用在main()函数中BIOS_start()之前调用这个测试函数。int main(void) { /* 初始化代码 ... */ Task_create(MmwDemo_mssInitTask, taskParams, NULL); /* 【添加测试调用】 */ my_delay(); System_printf(Debug: [MSS] Proceeding to BIOS start...\n); /* Start BIOS */ BIOS_start(); return 0; }6.2 编译应用程序并检查MAP文件清理并编译在mmw演示目录下执行以下命令cd C:\ti\mmwave_sdk_02_01_00_04\packages\ti\demos\xwr16xx\mmw make clean make all检查MAP文件编译成功后在输出目录通常是C:\ti\mmwave_sdk_02_01_00_04\packages\ti\demos\xwr16xx\mmw\mss\binary\或xwr16xx\mmw\mss\下的.map文件中找到MSS的map文件如mss_mmw_demo.xer4f.map。 用文本编辑器打开它搜索my_delay函数名或者搜索内存区域名称如PROG_RAM2或.mySection。你应该能看到类似下面的输出证明你的函数被分配到了预期的地址范围例如从0x00040000开始这是扩展TCMA的典型起始地址my_delay 0x00040000 Code GLOBAL同时在MEMORY CONFIGURATION部分确认PROG_RAM或你定义的新区域的大小是否正确例如PROG_RAM2的length是否为0x1ffff。6.3 烧录与运行测试将编译生成的mmw_demo.bin文件烧录到AWR1642 EVM板的QSPI Flash中。可以使用Uniflash工具或SDK提供的脚本。给板上电通过串口终端如Tera Term、PuTTY连接MSS的UART端口。观察串口输出。如果一切正常你应该能在启动日志中看到你添加的打印信息Debug: [MSS] Delay function executed from extended TCMA area!。进一步你可以通过mmWave Visualizer连接雷达发送标准配置验证完整的雷达功能如检测、点云输出是否正常。这确保了内存重分配没有破坏原有的核心功能。7. 实操步骤四在CCS调试环境下深入验证为了获得更确凿的证据我们可以在CCSCode Composer Studio调试环境下进行验证。编译CCS Debug工程同样需要先重新编译SOC驱动然后清理并编译ccsdebug工程。cd C:\ti\mmwave_sdk_02_01_00_04\packages\ti\utils\ccsdebug make clean make all烧录与调试将生成的ccsdebug.bin烧录到Flash。断开板卡电源将SOP跳线设置为[1-0-1]JTAG模式。通过JTAG连接器将板卡连接到电脑并上电。在CCS中分别创建MSS和DSS的调试会话并加载之前编译好的mmw_demo的.out文件注意不是ccsdebug的.out。查看寄存器与内存在CCS的寄存器视图中找到并查看SHMEMBANKSEL7TO4寄存器地址可能是0xFFFF 1B34请以最新TRM为准。其值应该反映你的配置。例如对于0x00000105的配置你可能看到类似0x02010101的值具体位域对应关系需查TRM表示Bank6分配给了MSS TCMA0x02Bank5和Bank4分配给了DSS0x01。在内存浏览器中查看地址0x00040000扩展TCMA起始地址。你应该能看到你编写的my_delay函数的机器码。单步执行或设置断点到my_delay函数确认程序能正常跳转并执行到该函数。查看串口输出在CCS的Console中同样应该看到测试函数的打印信息。完成以上所有步骤并且功能正常寄存器值符合预期就铁证如山了——你已经成功修改了L3 RAM的分布8. 高级话题与避坑指南MPU配置与更多可能性8.1 MPU配置内存访问的守门员MPU是内存保护单元它定义了不同内存区域的访问属性可读、可写、可执行、缓存策略等。SDK在soc_xwr16xx_mss.c文件的SOC_mpu_config()函数中默认配置了MPU。为什么我的例子没提MPU在本次示例中我们将TCMA从默认的256KB扩展到了384KB。而SDK默认的MPU配置中TCMA区域被配置为512KB当DOWNLOAD_FROM_CCS定义时。因为384KB 512KB所以扩展的区域仍然在默认MPU配置的覆盖范围内具有正确的属性可执行、可读、不缓存因此无需修改。什么时候需要改MPU扩展TCMB默认TCMB的MPU区域配置为256KB实际TCMB基础大小为192KB。如果你将一个共享Bank分配给TCMB那么TCMB总大小变为320KB超过了默认的256KB MPU区域。你必须修改SOC_mpu_config()函数中对应区域通常是Region 3的大小例如从MPU_256_KB改为MPU_512_KB。改变内存属性默认TCMB配置为不可执行 (MPU_PRIV_RW_USER_RW)。如果你想把代码也放到TCMB中就需要将其属性改为可执行 (MPU_PRIV_RW_USER_RW_EXEC)。修改MPU示例增大TCMB并设为可执行// 在 SOC_mpu_config() 函数中找到配置 TCMB 的区域例如 Region 3 _mpuSetRegion_(mpuREGION3); _mpuSetRegionBaseAddress_(SOC_XWR16XX_MSS_TCMB_BASE_ADDRESS); // 基地址不变 // 修改类型、权限和大小 _mpuSetRegionTypeAndPermission_(MPU_NORMAL_OINC_NONSHARED, MPU_PRIV_RW_USER_RW_EXEC); // 改为可执行 _mpuSetRegionSizeRegister_(mpuREGION_ENABLE | MPU_512_KB); // 大小改为512KB重要修改MPU配置后必须重新编译SOC驱动并确保应用程序链接了新的驱动库。8.2 其他分配场景掌握了基本方法你可以灵活配置其他场景为BSS分配内存计算MMWAVE_SDK_SHMEM_ALLOC时设置高字节Bit[31:24]为需要的Bank数。例如分配1个Bank给BSS其余2个给DSS0x01000005。同时为TCMA和TCMB分配内存例如各分配1个BankMMWAVE_SDK_SHMEM_ALLOC 0x00010104(DSS:4, TCMA:1, TCMB:1, BSS:0)。同时需要检查并可能修改TCMB的MPU配置。极端情况将所有3个共享Bank都分配给MSS TCMAMMWAVE_SDK_SHMEM_ALLOC 0x00000303。这时DSS只剩下3个专用Bank务必评估DSS代码和数据是否够用。8.3 常见问题排查FAQ编译失败提示Invalid SHMEM_ALLOC setting!原因在mmwave_sdk_xwr16xx.mak中添加的新else ifeq分支语法错误、顺序不对或者环境变量名拼写错误。解决仔细检查Makefile语法确保使用Tab缩进。确认添加的分支位于默认分支之后且条件判断的值与你设置的环境变量值完全一致包括大小写十六进制前缀0x。程序烧录后无法启动或启动后很快跑飞原因A没有重新编译SOC驱动。这是最常见的原因。解决A务必按照步骤二先清理并重新编译SOC驱动库。原因BMPU配置错误。如果扩展了TCMB或分配方案涉及非默认区域而MPU未相应调整会导致非法内存访问。解决B检查SOC_mpu_config()函数确保所有使用的内存区域尤其是扩展的部分都被正确、完整地覆盖且属性正确。原因C链接脚本中内存区域定义有重叠或计算错误如果手动修改过。解决C仔细核对链接脚本中各个内存区域的origin和length确保它们没有重叠且总和不超过物理内存大小。测试函数没有在扩展内存中执行原因链接器没有将函数分配到预期区域。可能#pragma CODE_SECTION指令的段名与链接脚本中定义的段名不匹配或者该段没有被正确映射到扩展的内存区域。解决检查MAP文件确认my_delay函数的加载地址。如果不在预期范围检查链接脚本和#pragma指令。也可以尝试不使用#pragma让链接器自动分配然后查看它被分配到了哪里这有助于理解默认的内存布局。雷达功能异常如Visualizer无法连接、无点云数据原因DSS内存不足。L3 RAM是DSS进行大量雷达信号处理FFT、CFAR、聚类等的主要工作内存。过度削减DSS的L3 RAM可能导致数据处理缓冲区不足算法失败。解决重新评估内存分配。使用CCS调试器连接到DSS查看其L3堆Heap L3的剩余情况。如果Heap L3的free值在运行时变得非常小接近0说明DSS内存紧张。你需要减少分配给MSS/BSS的Bank或者优化DSS侧的代码和数据内存使用。修改L3 RAM分布是一个精细活需要统筹考虑MSS、DSS、BSS各子系统的需求。最好的实践是在项目早期就进行内存规划并通过类似本文的测试方法进行验证确保在增加新功能前内存布局是合理且稳定的。希望这篇详细的指南能帮助你在IWR/AWR1642的内存优化之路上走得更加顺畅。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2618552.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SpringBoot-17-MyBatis动态SQL标签之常用标签

文章目录 1 代码1.1 实体User.java1.2 接口UserMapper.java1.3 映射UserMapper.xml1.3.1 标签if1.3.2 标签if和where1.3.3 标签choose和when和otherwise1.4 UserController.java2 常用动态SQL标签2.1 标签set2.1.1 UserMapper.java2.1.2 UserMapper.xml2.1.3 UserController.ja…

wordpress后台更新后 前端没变化的解决方法

使用siteground主机的wordpress网站,会出现更新了网站内容和修改了php模板文件、js文件、css文件、图片文件后,网站没有变化的情况。 不熟悉siteground主机的新手,遇到这个问题,就很抓狂,明明是哪都没操作错误&#x…

网络编程(Modbus进阶)

思维导图 Modbus RTU(先学一点理论) 概念 Modbus RTU 是工业自动化领域 最广泛应用的串行通信协议,由 Modicon 公司(现施耐德电气)于 1979 年推出。它以 高效率、强健性、易实现的特点成为工业控制系统的通信标准。 包…

UE5 学习系列(二)用户操作界面及介绍

这篇博客是 UE5 学习系列博客的第二篇,在第一篇的基础上展开这篇内容。博客参考的 B 站视频资料和第一篇的链接如下: 【Note】:如果你已经完成安装等操作,可以只执行第一篇博客中 2. 新建一个空白游戏项目 章节操作,重…

IDEA运行Tomcat出现乱码问题解决汇总

最近正值期末周,有很多同学在写期末Java web作业时,运行tomcat出现乱码问题,经过多次解决与研究,我做了如下整理: 原因: IDEA本身编码与tomcat的编码与Windows编码不同导致,Windows 系统控制台…

利用最小二乘法找圆心和半径

#include <iostream> #include <vector> #include <cmath> #include <Eigen/Dense> // 需安装Eigen库用于矩阵运算 // 定义点结构 struct Point { double x, y; Point(double x_, double y_) : x(x_), y(y_) {} }; // 最小二乘法求圆心和半径 …

使用docker在3台服务器上搭建基于redis 6.x的一主两从三台均是哨兵模式

一、环境及版本说明 如果服务器已经安装了docker,则忽略此步骤,如果没有安装,则可以按照一下方式安装: 1. 在线安装(有互联网环境): 请看我这篇文章 传送阵>> 点我查看 2. 离线安装(内网环境):请看我这篇文章 传送阵>> 点我查看 说明&#xff1a;假设每台服务器已…

XML Group端口详解

在XML数据映射过程中&#xff0c;经常需要对数据进行分组聚合操作。例如&#xff0c;当处理包含多个物料明细的XML文件时&#xff0c;可能需要将相同物料号的明细归为一组&#xff0c;或对相同物料号的数量进行求和计算。传统实现方式通常需要编写脚本代码&#xff0c;增加了开…

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器的上位机配置操作说明

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器专为工业环境精心打造&#xff0c;完美适配AGV和无人叉车。同时&#xff0c;集成以太网与语音合成技术&#xff0c;为各类高级系统&#xff08;如MES、调度系统、库位管理、立库等&#xff09;提供高效便捷的语音交互体验。 L…

(LeetCode 每日一题) 3442. 奇偶频次间的最大差值 I (哈希、字符串)

题目&#xff1a;3442. 奇偶频次间的最大差值 I 思路 &#xff1a;哈希&#xff0c;时间复杂度0(n)。 用哈希表来记录每个字符串中字符的分布情况&#xff0c;哈希表这里用数组即可实现。 C版本&#xff1a; class Solution { public:int maxDifference(string s) {int a[26]…

【大模型RAG】拍照搜题技术架构速览:三层管道、两级检索、兜底大模型

摘要 拍照搜题系统采用“三层管道&#xff08;多模态 OCR → 语义检索 → 答案渲染&#xff09;、两级检索&#xff08;倒排 BM25 向量 HNSW&#xff09;并以大语言模型兜底”的整体框架&#xff1a; 多模态 OCR 层 将题目图片经过超分、去噪、倾斜校正后&#xff0c;分别用…

【Axure高保真原型】引导弹窗

今天和大家中分享引导弹窗的原型模板&#xff0c;载入页面后&#xff0c;会显示引导弹窗&#xff0c;适用于引导用户使用页面&#xff0c;点击完成后&#xff0c;会显示下一个引导弹窗&#xff0c;直至最后一个引导弹窗完成后进入首页。具体效果可以点击下方视频观看或打开下方…

接口测试中缓存处理策略

在接口测试中&#xff0c;缓存处理策略是一个关键环节&#xff0c;直接影响测试结果的准确性和可靠性。合理的缓存处理策略能够确保测试环境的一致性&#xff0c;避免因缓存数据导致的测试偏差。以下是接口测试中常见的缓存处理策略及其详细说明&#xff1a; 一、缓存处理的核…

龙虎榜——20250610

上证指数放量收阴线&#xff0c;个股多数下跌&#xff0c;盘中受消息影响大幅波动。 深证指数放量收阴线形成顶分型&#xff0c;指数短线有调整的需求&#xff0c;大概需要一两天。 2025年6月10日龙虎榜行业方向分析 1. 金融科技 代表标的&#xff1a;御银股份、雄帝科技 驱动…

观成科技:隐蔽隧道工具Ligolo-ng加密流量分析

1.工具介绍 Ligolo-ng是一款由go编写的高效隧道工具&#xff0c;该工具基于TUN接口实现其功能&#xff0c;利用反向TCP/TLS连接建立一条隐蔽的通信信道&#xff0c;支持使用Let’s Encrypt自动生成证书。Ligolo-ng的通信隐蔽性体现在其支持多种连接方式&#xff0c;适应复杂网…

铭豹扩展坞 USB转网口 突然无法识别解决方法

当 USB 转网口扩展坞在一台笔记本上无法识别,但在其他电脑上正常工作时,问题通常出在笔记本自身或其与扩展坞的兼容性上。以下是系统化的定位思路和排查步骤,帮助你快速找到故障原因: 背景: 一个M-pard(铭豹)扩展坞的网卡突然无法识别了,扩展出来的三个USB接口正常。…

未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?

编辑&#xff1a;陈萍萍的公主一点人工一点智能 未来机器人的大脑&#xff1a;如何用神经网络模拟器实现更智能的决策&#xff1f;RWM通过双自回归机制有效解决了复合误差、部分可观测性和随机动力学等关键挑战&#xff0c;在不依赖领域特定归纳偏见的条件下实现了卓越的预测准…

Linux应用开发之网络套接字编程(实例篇)

服务端与客户端单连接 服务端代码 #include <sys/socket.h> #include <sys/types.h> #include <netinet/in.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <arpa/inet.h> #include <pthread.h> …

华为云AI开发平台ModelArts

华为云ModelArts&#xff1a;重塑AI开发流程的“智能引擎”与“创新加速器”&#xff01; 在人工智能浪潮席卷全球的2025年&#xff0c;企业拥抱AI的意愿空前高涨&#xff0c;但技术门槛高、流程复杂、资源投入巨大的现实&#xff0c;却让许多创新构想止步于实验室。数据科学家…

深度学习在微纳光子学中的应用

深度学习在微纳光子学中的主要应用方向 深度学习与微纳光子学的结合主要集中在以下几个方向&#xff1a; 逆向设计 通过神经网络快速预测微纳结构的光学响应&#xff0c;替代传统耗时的数值模拟方法。例如设计超表面、光子晶体等结构。 特征提取与优化 从复杂的光学数据中自…