[已解决] 在bootloader中如何使用定时器和串口
[已解决] 在bootloader中如何使用定时器和串口
Hi
如题,我的基线是IDF-4.0,硬件是ESP32-C3-WROOM-02,正在bootloader上进行第三方SDK的集成,已经完成一部分功能正常运行。还需要使用到定时器和一路串口。
我先进行了定时器的使用,发现bootloader中无法使用软件定时器,因为内部有freertos的相关接口调用。看了文档对“自定义引导程序”的描述,我要把使用到的其他组件源码放到bootloader目录中,于是我按照已经完成移植运行的那部分,把\components\driver\timer.c等相关源文件和头文件放过去,但总是出现各种报错,比如还需要我添加heap相关的源码。 现在还报错找不到_vector_table这些东西,如下图,我不知道该怎么办。
请问我真的需要这么麻烦吗?你们推荐用什么方式在boot中使用定时器和串口等外设呢?
感谢答复
如题,我的基线是IDF-4.0,硬件是ESP32-C3-WROOM-02,正在bootloader上进行第三方SDK的集成,已经完成一部分功能正常运行。还需要使用到定时器和一路串口。
我先进行了定时器的使用,发现bootloader中无法使用软件定时器,因为内部有freertos的相关接口调用。看了文档对“自定义引导程序”的描述,我要把使用到的其他组件源码放到bootloader目录中,于是我按照已经完成移植运行的那部分,把\components\driver\timer.c等相关源文件和头文件放过去,但总是出现各种报错,比如还需要我添加heap相关的源码。 现在还报错找不到_vector_table这些东西,如下图,我不知道该怎么办。
请问我真的需要这么麻烦吗?你们推荐用什么方式在boot中使用定时器和串口等外设呢?
感谢答复
- Attachments
-
- 报错的一部分截图
- 微信图片_20220725142405.png (174.67 KiB) Viewed 11350 times
Last edited by Kx_Kevin on Tue Aug 09, 2022 3:34 am, edited 1 time in total.
-
- Posts: 786
- Joined: Wed Nov 14, 2018 8:45 am
Re: 在bootloader中如何使用定时器和串口
为何要在 bootloader 中集成这些功能?当前在 bootloader 中并未支持太多功能,IDF 中很多功能在 bootloader 里是不可用的。
Re: 在bootloader中如何使用定时器和串口
Hi
感谢你的回复。
因为我司正在集成的第三方SDK中有这方面的功能需求,在boot中用到了定时器和串口。
其实定时器的作用就是产生一个滴答心跳的能力。 该SDK中有超时业务的处理,通常是使用定时器来完成的。
串口就是完成所有业务数据的收发,需要一个干净数据的串口,我注意到UART_NUM_0和开发板USB的log似乎是连接在一起的。
那么,是否有办法使用外设的硬件操作接口或者其他什么方式,来完成该SDK需要的功能呢?
感谢答复
感谢你的回复。
因为我司正在集成的第三方SDK中有这方面的功能需求,在boot中用到了定时器和串口。
其实定时器的作用就是产生一个滴答心跳的能力。 该SDK中有超时业务的处理,通常是使用定时器来完成的。
串口就是完成所有业务数据的收发,需要一个干净数据的串口,我注意到UART_NUM_0和开发板USB的log似乎是连接在一起的。
那么,是否有办法使用外设的硬件操作接口或者其他什么方式,来完成该SDK需要的功能呢?
感谢答复
-
- Posts: 786
- Joined: Wed Nov 14, 2018 8:45 am
Re: 在bootloader中如何使用定时器和串口
bootloader 里应该是可以用到 IDF 中 hal 这层的接口,但不能用到 driver 这层接口。一种方式是你直接使用 hal 的接口实现 bootloader 里的 定时器和串口 驱动。
另外,这个 SDK 的集成为什么不在应用中做,要在 bootloader 里实现?这是什么考量?
UART 要干净的话,可以用其他的 UART 口,默认 UART0 作为整个系统的打印口,从 ROM bootloader 开始。
另外,这个 SDK 的集成为什么不在应用中做,要在 bootloader 里实现?这是什么考量?
UART 要干净的话,可以用其他的 UART 口,默认 UART0 作为整个系统的打印口,从 ROM bootloader 开始。
Re: 在bootloader中如何使用定时器和串口
Hi
感谢回复。
太好了,我会尝试用hal层的接口完成SDK的移植工作。
该套第三方SDK需要boot和app应用的配合,app也已经集成了它的一部分,boot是剩下的一部分。
是的,app中我两个串口都试过。只有UART1是干净的,boot中我也只能用它了。
再次感谢
感谢回复。
太好了,我会尝试用hal层的接口完成SDK的移植工作。
该套第三方SDK需要boot和app应用的配合,app也已经集成了它的一部分,boot是剩下的一部分。
是的,app中我两个串口都试过。只有UART1是干净的,boot中我也只能用它了。
再次感谢
-
- Posts: 786
- Joined: Wed Nov 14, 2018 8:45 am
Re: 在bootloader中如何使用定时器和串口
不客气的。
这是个新的尝试,静候佳音。
另外,bootloader 里加东西多的话,size 也会变大,相关的 partiton 也需要进行调整,这个也请自行注意。
这是个新的尝试,静候佳音。
另外,bootloader 里加东西多的话,size 也会变大,相关的 partiton 也需要进行调整,这个也请自行注意。
Re: 在bootloader中如何使用定时器和串口
Hi
好的,谢谢提醒。partition调整这块在编程指南的bootloader章节有提到,我会注意的。
另外,我提问中截图位置的编译报错,刚刚我检查了一下调用hal层这方面是否涉及,发现在注册回调函数时还是会用到内存申请的接口,而且和中断控制器的处理有关系,如下图位置内部的实现,这部分即使调用了hal层,报错中断控制器方面的恐怕我也没法搞定。
请问这部分是要怎么办?
感谢答复
好的,谢谢提醒。partition调整这块在编程指南的bootloader章节有提到,我会注意的。
另外,我提问中截图位置的编译报错,刚刚我检查了一下调用hal层这方面是否涉及,发现在注册回调函数时还是会用到内存申请的接口,而且和中断控制器的处理有关系,如下图位置内部的实现,这部分即使调用了hal层,报错中断控制器方面的恐怕我也没法搞定。
请问这部分是要怎么办?
感谢答复
- Attachments
-
- 微信图片_20220726104300.png (24.84 KiB) Viewed 11712 times
-
- Posts: 786
- Joined: Wed Nov 14, 2018 8:45 am
Re: 在bootloader中如何使用定时器和串口
这个同样不能用,需要自己管理中断。原则是 IDF 中 hal 层之上的,当前在 bootloader 中都不能用。在 bootloader 里的中断,都不需要动态 alloc 了,直接找个空的,固定就行了。
Re: 在bootloader中如何使用定时器和串口
Hi
好的,内存申请在boot不是必要的,也没法使用,我了解了。
那怎么知道哪些中断号是空闲的?
我找到了下图这里的interrupt_controller_hal接口,应该就是直接设置中断服务函数的位置了,是否还需要使能中断,清除中断标志这些工作?因为不清楚是否boot里面其他位置有做这个事情,我多做会不会引起什么影响。 感谢答复
好的,内存申请在boot不是必要的,也没法使用,我了解了。
这里你提到直接找个空的固定,是什么意思?—— 按照MCU的使用方式,每个外设都应该对应了一个相应的中断号。在这里是没有一对一的关系了,随便在0-31找个空闲的中断号就行,是这样理解吗?ESP_Gargamel wrote:在 bootloader 里的中断,都不需要动态 alloc 了,直接找个空的,固定就行了。
那怎么知道哪些中断号是空闲的?
我找到了下图这里的interrupt_controller_hal接口,应该就是直接设置中断服务函数的位置了,是否还需要使能中断,清除中断标志这些工作?因为不清楚是否boot里面其他位置有做这个事情,我多做会不会引起什么影响。 感谢答复
-
- Posts: 786
- Joined: Wed Nov 14, 2018 8:45 am
Re: 在bootloader中如何使用定时器和串口
是的,intr alloc 这块,你可以把 idf 中的 log 放开,看是怎么个过程。
中断使能、清除这块是针对具体外设的,比如 UART。
建议你现在 idf 中把你所需要的外设先用起来,然后看他是怎么初始化中断、怎么初始化外设本身的。清楚流程后,再用到 bootloader 中。另外,你也可以用 gdb 来跟踪应用中对 intr 和 所用外设 的寄存器设置。
还有,你 bootloader 跑完后,需要把 定时器和串口 停了,否则跑到应用可能会有异常。
中断使能、清除这块是针对具体外设的,比如 UART。
建议你现在 idf 中把你所需要的外设先用起来,然后看他是怎么初始化中断、怎么初始化外设本身的。清楚流程后,再用到 bootloader 中。另外,你也可以用 gdb 来跟踪应用中对 intr 和 所用外设 的寄存器设置。
还有,你 bootloader 跑完后,需要把 定时器和串口 停了,否则跑到应用可能会有异常。
Who is online
Users browsing this forum: No registered users and 69 guests