完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
我在esp32 drone的工程里面,用写寄存器的方式控制io输出。结果发现在两次输出io之前插入一些for循环语句延时,在示波器上的波形和没有加入延时语句的波形是一样的,高低电平的持续时间并没有延长。
1.请问ESP32的io作业和cpu作业是并行进行的吗? 2.请问这样的情况下,如何能实现50ns级的软件延时的效果(不需要很精确). |
|
相关推荐
1个回答
|
|
1. ESP32的I/O作业和CPU作业并不是完全并行进行的。ESP32具有两个CPU核心,分别是主核(PRO CPU)和从核(APP CPU)。这两个核心可以同时运行不同的任务,但在I/O操作方面,它们并不是完全独立的。I/O操作通常是由CPU核心控制的,因此I/O作业和CPU作业之间可能存在一定的依赖关系。
2. 要在ESP32上实现50ns级的软件延时效果,可以尝试以下方法: a. 使用循环计数器:通过编写一个简单的循环,使用一个计数器来控制循环的次数。例如,使用以下代码实现50ns的延时: ```c #define DELAY_50NS 80000 // 假设每次循环耗时约0.625ns void delay_50ns() { uint32_t i; for (i = 0; i < DELAY_50NS; i++) { __asm__ volatile ("nop"); } } ``` 请注意,这种方法的精度可能受到编译器优化和实际硬件性能的影响。 b. 使用ESP32的定时器:ESP32具有多个定时器,可以用来实现更精确的延时。例如,使用ESP32的系统定时器(SysTick)来实现延时。首先,初始化SysTick,然后使用它来计算延时时间。 ```c #include "esp32/rom/ets_sys.h" void delay_50ns() { uint32_t start = xthal_get_ccount(); uint32_t end = start + (50 * (80000000 / 1000)); // 50ns * 8MHz = 400 cycles while (xthal_get_ccount() < end) { // 等待计数器达到指定值 } } ``` 这种方法的精度较高,但可能需要根据实际硬件性能进行调整。 总之,虽然ESP32的I/O作业和CPU作业不是完全并行的,但通过使用循环计数器或ESP32的定时器,可以实现50ns级的软件延时效果。请注意,实际效果可能受到编译器优化和硬件性能的影响。 |
|
|
|
只有小组成员才能发言,加入小组>>
142个成员聚集在这个小组
加入小组529浏览 6评论
446浏览 5评论
有没有办法在不使用混杂模式的情况下实现Wifi驱动程序接收缓冲区访问中断呢?
428浏览 5评论
424浏览 4评论
401浏览 4评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-10 16:07 , Processed in 0.656669 second(s), Total 79, Slave 63 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号