FreeRTOS任务及信号量,自我学习,留档。
#include "esp_common.h"
#include "user_config.h"
#include "../include/freertos/FreeRTOS.h"
#include "../include/freertos/task.h"
#include "../include/freertos/queue.h"
#include "../include/freertos/semphr.h"
static xSemaphoreHandle semphr = NULL;
void taska(void *pvparameters)
{
printf("enter a\n");
xSemaphoreGive(semphr);
printf("enter abc\n");
for(;;)
{
printf("task a\n");
vTaskDelay(2000 / portTICK_RATE_MS);
}
}
void taskb(void *pvparameters)
{
printf("enter b\n");
xSemaphoreTake(semphr, portMAX_DELAY );
for(;;)
{
printf("task B\n");
vTaskDelay(2000 / portTICK_RATE_MS);
}
}
/******************************************************************************
* FunctionName : user_init
* Description : entry of user application, init user function here
* Parameters : none
* Returns : none
*******************************************************************************/
void user_init(void)
{
//os_printf("SDK version:%s %d\n", system_get_sdk_version(), system_get_free_heap_size());
//wifi_set_opmode(STATION_MODE);
//struct station_config config;
//bzero(&config, sizeof(struct station_config));
//sprintf(config.ssid, SSID);
//sprintf(config.password, PASSWORD);
//wifi_station_set_config(&config);
//wifi_set_event_handler_cb(wifi_event_handler_cb);
//wifi_station_connect();
semphr = xSemaphoreCreateCounting(3, 0);
int ret;
ret = xTaskCreate(taskb,
"taskb",
512,
NULL,
2,
NULL);
if (ret != pdPASS) {
printf("create thread %s failed\n", "taskb");
}
ret = xTaskCreate(taska,
"taska",
512,
NULL,
2,
NULL);
if (ret != pdPASS) {
printf("create thread %s failed\n", "taska");
}
}
后记:初学者实际运行结果有点意外,留贴。熟悉ESP8266的,应该看出来了,此示例基于ESP8266_RTOS_SDK-2.0.0。
运行结果:
enter b
enter a
task B
enter abc
task a
task B
task a
task B
task a
task B
task a