/* The example of esp-idf
*
* This sample code is in the public domain.
*/
#include <stdio.h>
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "esp_log.h"
//時間稼ぎ
//コア番号が変化した回数を戻す
int ConsumptionTick(int delay, int startID) {
TickType_t startTick;
TickType_t endTick;
TickType_t nowTick;
startTick = xTaskGetTickCount();
endTick = startTick + delay;
int _currentID = startID;
int _swCount = 0;
int _nowID;
while(1) {
__asm__ volatile (
"rsr.prid %0\n"
:"=r"(_nowID));
if (_currentID != _nowID) {
_swCount++;
_currentID =
_nowID;
}
nowTick =
xTaskGetTickCount();
if (nowTick > endTick)
break;
}
return _swCount;
}
void task(void *pvParameter)
{
int CoreId;
int RealId;
char * my_name = pcTaskGetTaskName(
NULL );
UBaseType_t my_prio =
uxTaskPriorityGet( NULL );
CoreId = xPortGetCoreID();
__asm__ volatile (
"rsr.prid %0\n"
:"=r"(RealId));
ESP_LOGI(my_name, "start RealId=%d
CoreId=%d Priority=%d",RealId, CoreId, my_prio);
ConsumptionTick(200, CoreId );
CoreId = xPortGetCoreID();
__asm__ volatile (
"rsr.prid %0\n"
:"=r"(RealId));
ESP_LOGI(my_name, "end RealId=%d
CoreId=%d Priority=%d",RealId, CoreId, my_prio);
vTaskDelete( NULL );
}
void app_main()
{
char * my_name = pcTaskGetName(NULL);
int CoreId = xPortGetCoreID();
UBaseType_t my_prio =
uxTaskPriorityGet( NULL );
int RealId;
__asm__ volatile (
"rsr.prid %0\n"
:"=r"(RealId));
ESP_LOGI(my_name, "start RealId=%d
CoreId=%d Priority=%d",RealId,CoreId,my_prio);
ESP_LOGI(my_name,
"portTICK_PERIOD_MS=%d[ms]",portTICK_PERIOD_MS);
ESP_LOGI(my_name,
"configMAX_PRIORITIES=%d",configMAX_PRIORITIES);
ESP_LOGI(my_name,
"configMINIMAL_STACK_SIZE=%d",configMINIMAL_STACK_SIZE);
#if 0
// Task1を優先度=1で起動
xTaskCreate(&task, "Task1", 2048,
NULL, 1, NULL);
#endif
#if 0
// Task1を優先度=1で起動
// Task2を優先度=1で起動
xTaskCreate(&task, "Task1", 2048,
NULL, 1, NULL);
xTaskCreate(&task, "Task2", 2048,
NULL, 1, NULL);
#endif
#if 0
// Task1を優先度=1で起動
// Task2を優先度=1で起動
// Task3を優先度=1で起動
xTaskCreate(&task, "Task1", 2048,
NULL, 1, NULL);
xTaskCreate(&task, "Task2", 2048,
NULL, 1, NULL);
xTaskCreate(&task, "Task3", 2048,
NULL, 1, NULL);
#endif
#if 0
// Task1を優先度=1で起動
// Task2を優先度=1で起動
// Task3を優先度=1で起動
// Task4を優先度=1で起動
xTaskCreate(&task, "Task1", 2048,
NULL, 1, NULL);
xTaskCreate(&task, "Task2", 2048,
NULL, 1, NULL);
xTaskCreate(&task, "Task3", 2048,
NULL, 1, NULL);
xTaskCreate(&task, "Task4", 2048,
NULL, 1, NULL);
#endif
#if 0
// Task1を優先度=1で起動
// Task2を優先度=2で起動
xTaskCreate(&task, "Task1", 2048,
NULL, 1, NULL);
xTaskCreate(&task, "Task2", 2048,
NULL, 2, NULL);
#endif
#if 0
// Task1を優先度=1で起動
// Task2を優先度=2で起動
// Task3を優先度=3で起動
xTaskCreate(&task, "Task1", 2048,
NULL, 1, NULL);
xTaskCreate(&task, "Task2", 2048,
NULL, 2, NULL);
xTaskCreate(&task, "Task3", 2048,
NULL, 3, NULL);
#endif
#if 0
// Task1を優先度=1で起動
// Task2を優先度=2で起動
// Task3を優先度=3で起動
// Task4を優先度=4で起動
xTaskCreate(&task, "Task1", 2048,
NULL, 1, NULL);
xTaskCreate(&task, "Task2", 2048,
NULL, 2, NULL);
xTaskCreate(&task, "Task3", 2048,
NULL, 3, NULL);
xTaskCreate(&task, "Task4", 2048,
NULL, 4, NULL);
#endif
#if 0
// Task1を優先度=1,Core1で起動
// Task2を優先度=1,Core1で起動
xTaskCreatePinnedToCore(&task,
"Task1", 2048, NULL, 1, NULL, 1);
xTaskCreatePinnedToCore(&task,
"Task2", 2048, NULL, 1, NULL, 1);
#endif
#if 0
// Task1を優先度=1,Core1で起動
// Task2を優先度=1,Core1で起動
// Task3を優先度=1,Core1で起動
xTaskCreatePinnedToCore(&task,
"Task1", 2048, NULL, 1, NULL, 1);
xTaskCreatePinnedToCore(&task,
"Task2", 2048, NULL, 1, NULL, 1);
xTaskCreatePinnedToCore(&task,
"Task3", 2048, NULL, 1, NULL, 1);
#endif
#if 0
// Task1を優先度=1,Core1で起動
// Task2を優先度=1,Core1で起動
// Task3を優先度=1,Core1で起動
// Task4を優先度=1,Core1で起動
xTaskCreatePinnedToCore(&task,
"Task1", 2048, NULL, 1, NULL, 1);
xTaskCreatePinnedToCore(&task,
"Task2", 2048, NULL, 1, NULL, 1);
xTaskCreatePinnedToCore(&task,
"Task3", 2048, NULL, 1, NULL, 1);
xTaskCreatePinnedToCore(&task,
"Task4", 2048, NULL, 1, NULL, 1);
#endif
#if 0
// Task1を優先度=1,Core1で起動
// Task2を優先度=2,Core1で起動
xTaskCreatePinnedToCore(&task,
"Task1", 2048, NULL, 1, NULL, 1);
xTaskCreatePinnedToCore(&task,
"Task2", 2048, NULL, 2, NULL, 1);
#endif
#if 0
// Task1を優先度=1,Core1で起動
// Task2を優先度=2,Core1で起動
// Task3を優先度=3,Core1で起動
xTaskCreatePinnedToCore(&task,
"Task1", 2048, NULL, 1, NULL, 1);
xTaskCreatePinnedToCore(&task,
"Task2", 2048, NULL, 2, NULL, 1);
xTaskCreatePinnedToCore(&task,
"Task3", 2048, NULL, 3, NULL, 1);
#endif
#if 0
// Task1を優先度=1,Core1で起動
// Task2を優先度=2,Core1で起動
// Task3を優先度=3,Core1で起動
// Task4を優先度=4,Core1で起動
xTaskCreatePinnedToCore(&task,
"Task1", 2048, NULL, 1, NULL, 1);
xTaskCreatePinnedToCore(&task,
"Task2", 2048, NULL, 2, NULL, 1);
xTaskCreatePinnedToCore(&task,
"Task3", 2048, NULL, 3, NULL, 1);
xTaskCreatePinnedToCore(&task,
"Task4", 2048, NULL, 4, NULL, 1);
#endif
#if 0
// Task1を優先度=1,Core1で起動
// Task2を優先度=2,Core0で起動
xTaskCreatePinnedToCore(&task,
"Task1", 2048, NULL, 1, NULL, 1);
xTaskCreatePinnedToCore(&task,
"Task2", 2048, NULL, 2, NULL, 0);
#endif
#if 0
// Task1を優先度=1,Core1で起動
// Task2を優先度=2,Core0で起動
// Task2を優先度=3,Core1で起動
xTaskCreatePinnedToCore(&task,
"Task1", 2048, NULL, 1, NULL, 1);
xTaskCreatePinnedToCore(&task,
"Task2", 2048, NULL, 2, NULL, 0);
xTaskCreatePinnedToCore(&task,
"Task3", 2048, NULL, 3, NULL, 1);
#endif
#if 1
// Task1を優先度=1,Core0で起動
// Task2を優先度=2,Core1で起動
// Task2を優先度=3,Core0で起動
xTaskCreatePinnedToCore(&task,
"Task1", 2048, NULL, 1, NULL, 0);
xTaskCreatePinnedToCore(&task,
"Task2", 2048, NULL, 2, NULL, 1);
xTaskCreatePinnedToCore(&task,
"Task3", 2048, NULL, 3, NULL, 0);
#endif
}
|