[已解决] 在bootloader中如何使用定时器和串口

Kx_Kevin
Posts: 27
Joined: Mon Jul 25, 2022 2:33 am

Re: 在bootloader中如何使用定时器和串口

Postby Kx_Kevin » Tue Jul 26, 2022 4:28 am

Hi

非常感谢,根据你的建议我知道该怎么做了 :D
boot运行完,我会把使能了的都关掉的~

Kx_Kevin
Posts: 27
Joined: Mon Jul 25, 2022 2:33 am

Re: 在bootloader中如何使用定时器和串口

Postby Kx_Kevin » Wed Jul 27, 2022 11:47 am

Hi

我尝试重新写了一遍调用hal接口层的timer使用流程,我在app测试了一遍,可以看到打印出回调中的timer_callback_cnt值是有递增的。
但当我在bootloader_start.c的call_start_cpu0函数末尾调用时,无法看到我希望得到的结果,也就是递增cnt值大于2之后退出while,程序跳转到app,那这是怎么回事呢?是否在boot中不能这样用?
微信图片_20220727194322.png
微信图片_20220727194322.png (45.38 KiB) Viewed 11013 times
感谢答复

ESP_Gargamel
Posts: 786
Joined: Wed Nov 14, 2018 8:45 am

Re: 在bootloader中如何使用定时器和串口

Postby ESP_Gargamel » Tue Aug 02, 2022 1:39 am

boot 里面这个 timer 的中断是否进入了?中断是否配置正确?

Kx_Kevin
Posts: 27
Joined: Mon Jul 25, 2022 2:33 am

Re: 在bootloader中如何使用定时器和串口

Postby Kx_Kevin » Tue Aug 02, 2022 3:34 am

Hi

boot中没有进入该中断,看不到cnt值递增带来的while条件满足后退出进入app的现象。

我修改的timer文件已经上传附件,可以直接放到app中调用abup_tg_timer_init运行,看得到进入回调函数,boot却不行。
麻烦检查一下是否我修改的中断配置有问题。

非常感谢
Attachments
custom_timer.zip
(3.8 KiB) Downloaded 702 times

ESP_Gargamel
Posts: 786
Joined: Wed Nov 14, 2018 8:45 am

Re: 在bootloader中如何使用定时器和串口

Postby ESP_Gargamel » Wed Aug 03, 2022 2:37 am

你的代码,中断正常触发是没有问题的。这里主要的原因是:

Code: Select all

while (1)
{
    if (abup_timer_callback_cnt > 2) {
        break;
    }
}
编译完被优化成了:

Code: Select all

        if (abup_timer_callback_cnt > 2) {
403ce088:	3fcd67b7          	lui	a5,0x3fcd6
403ce08c:	0007a703          	lw	a4,0(a5) # 3fcd6000 <abup_timer_callback_cnt>
403ce090:	4789                	li	a5,2
403ce092:	00e7d063          	bge	a5,a4,403ce092 <call_start_cpu0+0x92>
从汇编上看,abup_timer_callback_cnt > 2 的逻辑只正常判断了一次,后面直接都在 403ce092 死循环了,没有去再获取 abup_timer_callback_cnt 的值。
所以这里代码可以改成:

Code: Select all

while (1)
{
    if (abup_timer_callback_cnt > 2) {
        break;
    } else {
        ets_delay_us(1);
    }
}
你的代码放到 bootloader 在编译上会有一点问题,要略做修改。

ESP_Gargamel
Posts: 786
Joined: Wed Nov 14, 2018 8:45 am

Re: 在bootloader中如何使用定时器和串口

Postby ESP_Gargamel » Wed Aug 03, 2022 2:45 am

或者把变量 abup_timer_callback_cnt 加个 volatile 也行,因为这个变量是在 isr 里面被改写的,这个属于 volatile 的常规用法和注意点之一。优先推荐这个改法。

Kx_Kevin
Posts: 27
Joined: Mon Jul 25, 2022 2:33 am

Re: 在bootloader中如何使用定时器和串口

Postby Kx_Kevin » Wed Aug 03, 2022 3:56 am

Hi

感谢解答,根据你的建议,我分别尝试了cnt值增加volatile修饰,在while中加入了ets_delay_us,但运行出来log都显示停在while中没有进行跳转app,如下图:
如果定时器配置都没问题,那这里面,还有啥原因呢?
微信图片_20220803114723.png
微信图片_20220803114723.png (16.26 KiB) Viewed 10590 times
感谢回复

ESP_Gargamel
Posts: 786
Joined: Wed Nov 14, 2018 8:45 am

Re: 在bootloader中如何使用定时器和串口

Postby ESP_Gargamel » Wed Aug 03, 2022 6:20 am

你用的哪个版本的 idf?具体 tag 或者 commit,对齐一下。

Kx_Kevin
Posts: 27
Joined: Mon Jul 25, 2022 2:33 am

Re: 在bootloader中如何使用定时器和串口

Postby Kx_Kevin » Wed Aug 03, 2022 6:25 am

Hi

我只知道是idf-4.0的,具体的commit也比较久远了,我不清楚。IDF中是否有方法可以查询到?

感谢回复

ESP_Gargamel
Posts: 786
Joined: Wed Nov 14, 2018 8:45 am

Re: 在bootloader中如何使用定时器和串口

Postby ESP_Gargamel » Wed Aug 03, 2022 9:10 am

idf 4.0 还没支持 C3 呢。
你可以用 git describe --tags 或者用 git log -1 看下。
或者系统启动 log 里面有类似:I (24) boot: ESP-IDF v4.4.1-dirty 2nd stage bootloader。

Who is online

Users browsing this forum: No registered users and 72 guests