2021-04-22 20:00:17 -04:00
|
|
|
/* Pthread Example
|
|
|
|
|
|
|
|
This example code is in the Public Domain (or CC0 licensed, at your option.)
|
|
|
|
|
|
|
|
Unless required by applicable law or agreed to in writing, this
|
|
|
|
software is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR
|
|
|
|
CONDITIONS OF ANY KIND, either express or implied.
|
|
|
|
*/
|
|
|
|
#include <stdio.h>
|
|
|
|
#include <unistd.h>
|
|
|
|
#include <pthread.h>
|
2022-12-09 02:04:55 -05:00
|
|
|
#include <inttypes.h>
|
2021-04-22 20:00:17 -04:00
|
|
|
#include "freertos/FreeRTOS.h"
|
|
|
|
#include "freertos/task.h"
|
|
|
|
#include "esp_pthread.h"
|
|
|
|
|
|
|
|
static void *example_thread(void * arg);
|
|
|
|
|
|
|
|
void app_main(void)
|
|
|
|
{
|
|
|
|
pthread_attr_t attr;
|
|
|
|
pthread_t thread1, thread2;
|
|
|
|
esp_pthread_cfg_t esp_pthread_cfg;
|
|
|
|
int res;
|
|
|
|
|
|
|
|
// Create a pthread with the default parameters
|
|
|
|
res = pthread_create(&thread1, NULL, example_thread, NULL);
|
|
|
|
assert(res == 0);
|
2022-12-09 02:04:55 -05:00
|
|
|
printf("Created thread 0x%"PRIx32"\n", thread1);
|
2021-04-22 20:00:17 -04:00
|
|
|
|
|
|
|
// Create a pthread with a larger stack size using the standard API
|
|
|
|
res = pthread_attr_init(&attr);
|
|
|
|
assert(res == 0);
|
|
|
|
pthread_attr_setstacksize(&attr, 16384);
|
|
|
|
res = pthread_create(&thread2, &attr, example_thread, NULL);
|
|
|
|
assert(res == 0);
|
2022-12-09 02:04:55 -05:00
|
|
|
printf("Created larger stack thread 0x%"PRIx32"\n", thread2);
|
2021-04-22 20:00:17 -04:00
|
|
|
|
|
|
|
res = pthread_join(thread1, NULL);
|
|
|
|
assert(res == 0);
|
|
|
|
res = pthread_join(thread2, NULL);
|
|
|
|
assert(res == 0);
|
|
|
|
printf("Threads have exited\n\n");
|
|
|
|
|
|
|
|
// Use the ESP-IDF API to change the default thread attributes
|
|
|
|
esp_pthread_cfg = esp_pthread_get_default_config();
|
|
|
|
esp_pthread_cfg.stack_size = 32768;
|
|
|
|
esp_pthread_cfg.prio += 2;
|
|
|
|
ESP_ERROR_CHECK( esp_pthread_set_cfg(&esp_pthread_cfg) );
|
|
|
|
|
|
|
|
res = pthread_create(&thread1, NULL, example_thread, NULL);
|
|
|
|
assert(res == 0);
|
2022-12-09 02:04:55 -05:00
|
|
|
printf("Created thread 0x%"PRIx32" with new default config\n", thread1);
|
2021-04-22 20:00:17 -04:00
|
|
|
res = pthread_join(thread1, NULL);
|
|
|
|
assert(res == 0);
|
|
|
|
printf("Thread has exited\n\n");
|
|
|
|
}
|
|
|
|
|
|
|
|
static void *example_thread(void * arg)
|
|
|
|
{
|
|
|
|
usleep(250 * 1000);
|
2022-12-09 02:04:55 -05:00
|
|
|
printf("This thread has ID 0x%"PRIx32" and %u bytes free stack\n", pthread_self(), uxTaskGetStackHighWaterMark(NULL));
|
2021-04-22 20:00:17 -04:00
|
|
|
|
|
|
|
sleep(1);
|
2022-12-09 02:04:55 -05:00
|
|
|
printf("Thread 0x%"PRIx32" exiting\n", pthread_self());
|
2021-04-22 20:00:17 -04:00
|
|
|
|
|
|
|
return NULL;
|
|
|
|
}
|