乐鑫技术交流
直播中

罗星

8年用户 1566经验值
擅长:模拟技术
私信 关注
[问答]

请问ESP32的io作业和cpu作业是并行进行的吗?

我在esp32 drone的工程里面,用写寄存器的方式控制io输出。结果发现在两次输出io之前插入一些for循环语句延时,在示波器上的波形和没有加入延时语句的波形是一样的,高低电平的持续时间并没有延长。
1.请问ESP32的io作业和cpu作业是并行进行的吗?
2.请问这样的情况下,如何能实现50ns级的软件延时的效果(不需要很精确).
                                                                                                                                                                 

回帖(1)

微风挽雨

2024-6-24 16:33:10
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级的软件延时效果。请注意,实际效果可能受到编译器优化和硬件性能的影响。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分