我一直在查看如何将任务/功能分配给ESP32上可用的特定内核之一的示例。
我找到的例子主要是Arduino的c++。
它使用xTaskCreatedPinnedToCore(,,,0)
或xTaskCreatedPinnedToCore(,,,1)
函数将任务固定到特定的核心。
是否有一个等效的在纳米框架或这是自动处理的线程类?
我读过这个关于多线程的博客,它没有提到任何关于跳核的事情,而是提到以一种循环和罗宾的方式运行它。
我用一个小应用程序测试了它,它工作得很好,但是因为它并没有真正以并发方式运行,我想知道我是否可以将一个进程奉献给第1(第0)或第2(第1)核心?
测试代码:
public static void Main()
{
new Thread(() =>
{
PrimCalcBadly badCalc = new PrimCalcBadly();
badCalc.DoCalc("first thread");
}).Start();
//new Thread(() =>
//{
// PrimCalcBadly badCalc = new PrimCalcBadly();
// badCalc.DoCalc("second thread");
//}).Start();
Thread.Sleep(Timeout.Infinite);
}
class PrimCalcBadly
{
public void DoCalc(string calName) {
Debug.WriteLine($"start {calName}");
while (true)
{
var sDate = DateTime.UtcNow;
for (int a = 2; a <= 1000; a++)
{
for (int b = 2; b <= 1000; b++)
{
if (a != b && a % b == 0)
{
break;
}
}
}
var eDate = DateTime.UtcNow;
var ts = TimeSpan.FromTicks(eDate.Ticks - sDate.Ticks);
Debug.WriteLine($"calculation for {calName} --> {ts.TotalSeconds}");
}
}
}
如果我只运行一个计算实例,则需要大约2秒才能完成执行并重新开始。
调试窗口输出:
start first thread
calculation for first thread --> 2.020124999
calculation for first thread --> 2.020197
如果我运行2个计算实例,则需要4秒。调试窗口输出:
start first thread
start second thread
calculation for first thread --> 4.74040799
calculation for second thread --> 4.04035
calculation for first thread --> 4.040268
calculation for second thread --> 4.040204999
如果我运行3,它需要6秒等等…
start first thread
start second thread
start third thread
calculation for first thread --> 7.26084799
calculation for second thread --> 6.66085599
calculation for third thread --> 6.020959999
calculation for first thread --> 6.06095
calculation for second thread --> 6.060862999
calculation for third thread --> 6.060842
就像在完整的。net上一样,您没有办法控制哪个核心运行特定的线程。如果你担心这没有充分利用2核设备的优势,不用担心。在拥有它们的ESP32设备上,工作在内核之间分配,例如在一个内核上运行CLR和执行引擎,在另一个内核上运行Wi-Fi和网络内容,驱动程序特定任务,执行长时间运行操作的次要任务等等。