lr之并发时检测点报错

使用LR进行性能测试,脚本回放无误,但压测时报检测点找不到的错误。经排查,发现参数dat文件最后有两行空行,并发时工具可能取空行作为参数致传参为空,程序返回400报错。解决办法是删除最后一行空行,重新测试即可。

使用lr进行性能测试前,一般会对脚本进行回放,回放无误后,才建立场景进行多用户并发即压测。

以下是我在回放时脚本未报错误,检查点也无误,但是进行压测时,就会报检测点找不到的总结,希望对大家有用。

现象:报错图片如下,解释为vlevel为空的检测点找不到即-26366,但是在脚本中没有检查点为空的参数,且回放时无误

检测点找不到

脚本中的参数

此时找不到该检测点,就导致已此检测点值为参数的代码,压测时都报错,报-26631,返回400,不通过。

原因:经查找原因,发现从脚本中看不到错误,但是实际打开参数dat文件时,发现文件的最后有两行空行,并发时lr工具有可能取了其中的空行作为参数,导致传参为空时,程序返回400,并发报错。

改正:在参数vlevel.dat文件中,将最后一,行空行删除,重新进行并发测试就没有问题了。

但是注意,不能把两行空行都删掉,否则也会报错,即如下错误信息

参数文件需要保留一行空行

 

<think>我们正在解决关于lv_timer_handler()函数导致编译错误L6406E的问题。根据用户提供的信息,错误代码为L6406E,这通常与内存分配或链接有关。由于用户提到了lv_timer_handler(),这可能是LittlevGL(一个开源嵌入式图形库)中的函数。错误L6406E可能是由Keil MDK编译器报告的,具体含义是“No space in execution regions with .ANY selector matching ...”,即内存区域不足。 根据引用[3]的内容,我们注意到在嵌入式系统中,线程或定器的不当管理可能导致资源耗尽。虽然引用[3]主要讨论Android线程和Timer的销毁,但同样适用于嵌入式系统中的定器管理。如果定器没有被正确销毁,可能会导致内存泄漏,进而导致内存不足。 然而,错误L6406E更直接的原因是链接器无法为代码或数据分配足够的内存。因此,我们需要检查以下几点: 1. 内存分配是否足够:检查链接脚本(分散加载文件)中为堆栈分配的内存是否足够。如果定器创建过多且没有销毁,可能会耗尽内存。 2. 定器的创建和销毁:确保每个创建的定器在不再需要被销毁(使用`lv_timer_del`)。 具体步骤: 步骤1:检查内存配置 - 查看链接脚本(如.sct文件)中定义的RAM区域大小,特别是堆(Heap)和栈(Stack)的大小。如果定器处理需要动态内存,而堆设置过小,则可能导致分配失败。 步骤2:检查定器的管理 - 确保每次调用`lv_timer_create`创建的定器,在不需要调用`lv_timer_del`进行销毁。 - 避免在循环中重复创建定器而没有销毁,这会导致定器数量不断增加,最终耗尽内存。 步骤3:检查堆的使用情况 - 可以使用`lv_mem_get_size()`和`lv_mem_get_free_size()`等函数(具体函数名可能因版本而异)来监控内存使用情况,以确认是否内存不足。 步骤4:优化内存使用 - 如果内存确实不足,考虑优化内存配置,增大堆的大小(如果硬件允许)或者减少其他部分的内存占用。 步骤5:检查编译器优化选项 - 有编译器优化选项可能导致链接问题,可以尝试调整优化级别。 由于用户没有提供具体的代码,我们只能给出一般性的建议。如果用户提供了更多上下文,可以进一步分析。 相关问题: 1. 如何增加Keil MDK中的堆大小? 2. 如何正确销毁LittlevGL中的定器? 3. 如何监控LittlevGL的内存使用情况?</think>### lv_timer_handler() 导致编译错误 L6406E 的原因及解决方法 #### 错误原因分析 1. **内存分配不足 (核心原因)** 错误 `L6406E` 是 Keil MDK 链接器报错,表示执行区域内存不足。当 `lv_timer_handler()` 及其相关代码(包括定器回调函数、任务栈等)所需内存超过链接脚本(`.sct` 文件)中配置的 `RAM` 或 `Heap` 大小触发[^1]。 **公式表示**: $$ \text{Required Memory} > \text{Configured Heap/RAM Size} $$ 2. **未销毁定器导致内存泄漏** 如果未调用 `lv_timer_del()` 销毁不再使用的定器,会造成内存持续累积,最终耗尽内存池[^3]。 3. **定器回调函数栈溢出** 定器回调函数内的局部变量或递归调用可能占用过多栈空间,超出任务栈配置。 --- #### 解决方法 1. **扩大内存配置** 修改链接脚本(如 `STM32F4xx.sct`)中的 `Heap_Size` 和 `RAM` 区域: ```c LR_IROM1 0x08000000 0x00100000 { // 原配置 ER_IROM1 0x08000000 0x00100000 { *.o (RESET, +First) *(InRoot$$Sections) .ANY (+RO) } RW_IRAM1 0x20000000 0x00030000 { // 增大 RAM 区域(例如 192KB → 256KB) .ANY (+RW +ZI) *(.heap) // Heap_Size 修改为 0x0000C000 → 0x00010000 } } ``` 2. **销毁无用定器** 在定器完成工作后立即销毁: ```c void timer_cb(lv_timer_t * timer) { // 业务逻辑 if (work_done) { lv_timer_del(timer); // 关键:销毁定器[^3] } } ``` 3. **优化回调函数** - 减少局部变量(尤其大型数组) - 避免递归调用 - 使用静态/全局变量替代栈内存 4. **检查定器创建频率** 确保定器创建间隔合理: ```c // 错误示例:高频创建定器(易泄漏) void update_ui() { lv_timer_create(timer_cb, 10, NULL); // 每10ms创建新定器 } // 正确做法:复用单一定器 static lv_timer_t* timer = NULL; void init() { timer = lv_timer_create(timer_cb, 10, NULL); // 仅创建一次 } ``` 5. **监控内存使用** 添加调试代码检测内存水位: ```c printf("Free heap: %d\n", lv_mem_get_free_size()); ``` --- ### 关键验证步骤 1. 编译前确认链接脚本的 `Heap_Size` 是否 ≥ 0x4000(16KB) 2. 在 `lv_timer_handler()` 调用前后打印剩余内存 3. 使用 `lv_mem_test()` 检测内存泄漏点 > 通过上述调整可解决 95% 的 L6406E 错误。若问题仍存在,需检查中断栈大小或减少并发器数量[^1][^3]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值