Подсчет до 1000 В обоих ядрах проблема времени выполнения в esp32?
Я пытаюсь считать до 1000 с одним ядром и двойным ядром с esp32, но выходная доза(время выполнения) не имеет смысла, время, которое занимает одно ядро, должно быть удвоено по сравнению с двойным ядром в теории, верно?
Вот код
TaskHandle_t Task1;
TaskHandle_t Task2;
SemaphoreHandle_t baton;
int i = 0;
long l;
void setup() {
Serial.begin(115200);
pinMode(2, OUTPUT);
pinMode(4, OUTPUT);
baton = xSemaphoreCreateMutex();
l = millis();
xTaskCreatePinnedToCore(
Task1code, /* Функция для реализации задачи */
"Task1", /* Имя задачи */
10000, /* Размер стека в словах */
NULL, /* Входной параметр задачи */
1, /* Приоритет задачи */
&Task1, /* Дескриптор задачи. */
0); /* Ядро, в котором должна выполняться задача */
//single core or dual core execution
// xTaskCreatePinnedToCore(
// Task2code, /* Функция для реализации задачи *
// "Task2", /* Имя задачи */
// 10000, /* Размер стека в словах */
// NULL, /* Входной параметр задачи */
// 1, /* Приоритет задачи */
// &Task2, /* Дескриптор задачи. */
// 1); /* Ядро, в котором должна выполняться задача */
}
void Task1code( void * parameter) {
while (true) {
xSemaphoreTake(baton, portMAX_DELAY);
xSemaphoreGive(baton);
delay(1);// Я не понимаю, что здесь без этой команды результат вывода хуже
i++;
if (i == 1000) {
l = millis()-1;
Serial.print("Done ");
Serial.print(xPortGetCoreID());
Serial.print(" ");
Serial.println(l);
}if(i>1000){
vTaskDelete(Task1);
}
}
}
void Task2code( void * parameter) {
while (true) {
xSemaphoreTake(baton, portMAX_DELAY);
xSemaphoreGive(baton);
delay(1);// Я не понимаю, что здесь без этой команды результат вывода хуже
i++;
if (i == 1000) {
l = millis()-1;
Serial.print("Done ");
Serial.print(xPortGetCoreID());
Serial.print(" ");
Serial.println(l);
}if(i>1000){
vTaskDelete(Task2);
}
}
}
void loop() {
}
Выходные данные, которые я получаю во время выполнения
Single core :- 1033 ms
Dual core :- 701 ms
Без промедления(1);
команда результат еще более очевиден
Single core :- 39 ms
Dual core :- 40 ms
Как я могу сделать так, чтобы мой алгоритм показал, что одноядерное ядро занимает в два раза больше времени, чем двухядерное, и я не хочу, чтобы оба ядра работали параллельно, а не одно за другим?
@Avon97, 👍1
Обсуждение2 ответа
Лучший ответ:
Чтобы несколько ядер обеспечивали какие-либо преимущества, они должны быть способны работать независимо. Если им требуется общий доступ к ресурсу - я
в вашем эксперименте - только одно ядро может реально участвовать в работе в любой момент времени. Но поскольку их несколько, у них есть дополнительная бухгалтерия для согласования доступа к общему ресурсу. Таким образом, общая работа занимает больше времени, чем потребовалось бы одному ядру с полным доступом к ресурсу и без накладных расходов на управление доступом, чтобы выполнить работу самостоятельно.
Спасибо, что это помогло мне, @Avon97
Вы должны использовать семафор для защиты доступа на чтение/запись к i
(Одновременно изменять переменную разрешается только одной задаче)
xSemaphoreTake(baton, portMAX_DELAY);
i = i + 1;
xSemaphoreGive(baton);
Кроме того, вы должны объединить свои предложения if. Если обе задачи увеличатся
,
это может произойти, что для второй задачи она никогда не будет иметь значения 1000
.
Но это не ускорило время выполнения? Вот обновленный код, как вы просили https://hastebin.com/ajileyiqud.cpp, @Avon97
Прямо сейчас (без задержки) вы не смогли бы ускорить время выполнения второй задачи. Только одной задаче разрешен доступ к " я " за один раз, поэтому другая задача должна ждать и ничего не может сделать. Если вы даете задание что-то сделать (задержка), вы должны увидеть разницу., @theSealion
Я не понимаю, как получить преимущество от двухъядерных процессоров, которые у него есть?, @Avon97
- esp32, platformio A fatal error occurred: Packet content transfer stopped (received 8 bytes) *** [upload] Error 2
- Как выбрать альтернативные контакты I2C на ESP32?
- Драйверы для чипа последовательного порта CH9102X
- Как преобразовать форматированный оператор print в строковую переменную?
- ESP32 - "Детектор Браунаута был активирован" при запуске Wi-Fi
- Питание esp32cam от аккумулятора
- Контакты RX и TX на esp32
- ESP32: отключить детектор отключения питания
Только одна задача может быть обновлена i сразу. Без промедления акт подсчета ничтожно мал. Это семафор, который дает вам какие-либо результаты вообще., @Majenko