Подсчет до 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
- Драйверы для чипа последовательного порта CH9102X
- Контакты RX и TX на esp32
- Как выбрать альтернативные контакты I2C на ESP32?
- ESP32 - "Детектор Браунаута был активирован" при запуске Wi-Fi
- Как преобразовать форматированный оператор print в строковую переменную?
- Питание esp32cam от аккумулятора
- Использование esp-wroom-32 без платы разработки
Только одна задача может быть обновлена i сразу. Без промедления акт подсчета ничтожно мал. Это семафор, который дает вам какие-либо результаты вообще., @Majenko