我对Cortex-M0+有一个奇怪的问题(STM32 G 0 B1 RETx)运行FreeRTOS时(10.3.1堆3)和使用lvgl的图形用户界面(v8.3),工具链GNU Tools for STM32 9-2020-q2-update,从STM32 CubeIDE生成的配置。它出现在随机位置,主要与代码大小有关-更改会将其移动到不同的位置。当前问题出现在负责处理按钮事件的代码中:
static void leftEventHandler(lv_event_t *e) {
lv_event_code_t code = lv_event_get_code(e);
uint8_t index = (uint8_t)e->user_data;
if (code == LV_EVENT_CLICKED) {
onLeftPressed(index);
}
}
通过随机按下按钮,甚至进入视图,使用它有时函数将不会返回并执行内存中的下一个代码,这恰好是:
static void fragmentAttach(lv_fragment_t *self) {
Presenter_onStart();
}
拆卸:
leftEventHandler:
08040700: push {r4, lr}
08040702: movs r4, r0
08040704: bl 0x800f1f0 <lv_event_get_code>
168 if (code == LV_EVENT_CLICKED) {
08040708: cmp r0, #7
0804070a: bne.n 0x8040714 <leftEventHandler+20>
169 Presenter_onLeftPressed(index);
0804070c: ldr r0, [r4, #12]
0804070e: uxtb r0, r0
08040710: bl 0x8047080 <Presenter_onLeftPressed>
08040714: pop {r4, pc}
120 Presenter_onStart();
fragmentAttach:
08040716: push {r4, lr}
08040718: bl 0x8046fbc <Presenter_onStart>
0804071c: pop {r4, pc}
0804071e: movs r0, r0
看起来“pop {r4,pc}”有时不更新pc,r4被正确恢复。“push {r4,lr}”确实正确地将寄存器放置在堆栈上,并且当调用“pop”时,这些值不变。“Presenter_onLeftPressed”未被调用,当出现问题时,通常为“code!= LV_EVENT_CLICKED”。
“片段连接”08040716处的断点:
registersmemory
增加线程的堆栈大小无法解决此问题。禁用所有线程,仅保留空闲和计时器任务将导致计划程序任务出现硬故障。
1条答案
按热度按时间lmvvr0a81#
经过长时间与这个问题的斗争,我找到了修复。禁用STM32CubeMX中的“预取缓冲区”修复了问题:)