Cortex-M0+(STM32 G 0 B1 RETx)有时无法从函数返回并执行后续指令

ghhaqwfi  于 2022-12-17  发布在  其他
关注(0)|答案(1)|浏览(122)

我对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
增加线程的堆栈大小无法解决此问题。禁用所有线程,仅保留空闲和计时器任务将导致计划程序任务出现硬故障。

lmvvr0a8

lmvvr0a81#

经过长时间与这个问题的斗争,我找到了修复。禁用STM32CubeMX中的“预取缓冲区”修复了问题:)

相关问题