ESP32使用双cpu同时工作测试-arduino开发环境

本文介绍了如何在ESP32-Devkitc-v4开发板上使用两个内核进行并发操作,通过代码示例展示了如何在两个CPU之间共享数据,并通过调整循环周期实现同步输出。实验结果显示,两个CPU可以访问并修改同一变量,从而实现数据的共通。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

开发板ESP32-Devkitc-v4有两个内核,如何让他们同时工作呢?两个cpu处理的数据可不可以共通呢?找遍也没有资料讲这个事情,也可能时我没找对。这里分享给大家。

目录

实验

 总结


实验

废话不多说,直接上代码,就是这么简单粗暴!

#include"string.h"
int testdata0 = 10;
int testdata1 = 0;

void appCpuLoop(void *pvParameters){
  while(1){
    Serial.println("appCpu1 "+(String)testdata0);
    testdata1 ++;
    if(testdata1 == 10)
    testdata1 = 0;
    delay(1000);
  }

  vTaskDelete(NULL);
}
void setup() {
    Serial.begin(9600);
    xTaskCreatePinnedToCore(appCpuLoop,    //具体实现的函数
                            "APP_CPU_LOOP",  //任务名称
                            8192,       //堆栈大小
                            NULL,       //输入参数
                            1,          //任务优先级
                            NULL,       //
                            1           //核心  0\1
                            );
}

void loop() {
  Serial.println("main core0 "+(String)testdata1);
  testdata0 --;
  if(testdata0 == 0)
    testdata0 = 10;
  delay(1000);
}

做一个解释,就是两个变量,分别在两个cpu核内操作,然后在另外一个核内调用。最后在串口看输出,cpu0轮询周期大约1s,cpu1内函数轮询周期1s。但是输出有点让我迷惑,想了想,原来是执行周期,或者说两个核时序的问题,所数值不是交替出现的。看下图

 修改一下loop,但是执行过程还是有可能再次出现上边的情况的(当时间不断变长时)

void loop() {
  delay(500);
  Serial.println("main core0 "+(String)testdata1);
  testdata0 --;
  if(testdata0 == 0)
    testdata0 = 10;
  delay(500);
}

 这下看着就舒服多了

修改一下执行周期,再看看。

#include"string.h"
int testdata0 = 10;
int testdata1 = 0;

void appCpuLoop(void *pvParameters){
  while(1){
    Serial.println("appCpu1 "+(String)testdata0);
    testdata1 ++;
    if(testdata1 == 10)
    testdata1 = 0;
    delay(2000);
  }

  vTaskDelete(NULL);
}
void setup() {
    Serial.begin(9600);
    xTaskCreatePinnedToCore(appCpuLoop,    //具体实现的函数
                            "APP_CPU_LOOP",  //任务名称
                            8192,       //堆栈大小
                            NULL,       //输入参数
                            1,          //任务优先级
                            NULL,       //
                            1           //核心  0\1
                            );
}

void loop() {
  Serial.println("main core0 "+(String)testdata1);
  testdata0 --;
  if(testdata0 == 0)
    testdata0 = 10;
  delay(1000);
}

做一个解释,就是两个变量,分别在两个cpu核内操作,然后在另外一个核内调用。最后在串口看输出,cpu0轮询周期大约1s,cpu1内函数轮询周期2s。没有问题,每输出两次cpu0再一次cpu1的数据,如下图

 总结

两个cpu使用的变量数据是可以共通的,cpu调用的方法也在上边了,原loop是默认cpu0的。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值