Freertos学习笔记(三)Task看门狗、队列传递数据、多输入单输出
第八课 Task看门狗
中断看门狗:在任务中代码运行时间过长,会触发中断看门狗,中断看门狗使用的是定时器一,
需要配置interrupt watchdog 与进行初始化
任务看门狗:针对任务,也可以重启整个系统。默认监控idle_task 5s
如果将任务优先级确定到0,则不会触发看门狗,因为与idle任务具有相同的优先级,idle可以持续运行不会造成看门狗触发
添加自定义看门狗
添加头文件"esp_task_wdt.h"
esp_task_wdt_add(NULL);添加当前任务到看门狗列表
esp_task_wdt_reset();用来喂狗
第九课 队列传递数据
整形、数组、结构体、指针
include"freertos/queue.h"
xQueueCreate() //传入参数 数据长度与数据大小
首先创建句柄QueueHandle_t QHandle;
QHandle = xQueueCreate(5,sizeof(int));
if(QHandle!=NULL)//如果队列创建成功
{
xTaskCreate(Task1,"Task1",1024*5,(void*)QHandle,1,&pxTask1);队列句柄放在传入参数上
xTaskCreate(Task2,"Task2",1024*5,(void*)QHandle,1,&pxTask2);
}
在任务函数中 也需要先定义队列句柄,然后赋值给传入参数
如下为发送任务函数:
void first_Task(void *para)
{
QueueHandle_t QHandle;//建立队列句柄
QHandle = (QueueHandle_t)(para);//传入参数赋值
BaseType_t xStatus;//新建发送状态
char i=0;
while (1)
{
xStatus = xQueueSend(QHandle,&i,0);
if(xStatus!=pdPASS)
printf("send fail!\n");
else
printf("send done\n");
i++;
vTaskDelay(1000 / portTICK_PERIOD_MS);
}
}
void second_Task(void *para)
{
QueueHandle_t QHandle;//建立队列句柄
QHandle = (QueueHandle_t)(para);//传入参数赋值
BaseType_t xStatus;//新建发送状态
char i;
while (1)
{
if(uxQueueMessagesWaiting(QHandle)!=0)
{
xStatus = xQueueReceive(QHandle,&i,0);
if(xStatus!=pdPASS)
printf("rec failed!\n");
else
printf("rec=%c\n",i);
}
vTaskDelay(1000 / portTICK_PERIOD_MS);
}
}
结构体传递大差不差
传递指针:char *p;
p=(char*)malloc(50);
snprintf(p,50,"hello=%d\r\n",123);
堆栈的宽度是指针的宽度
接受以后要把内存释放掉;
尝试自己的代码,一直重启,未找到原因(已经解决,创建任务时,传入参数强制为(void*)类型)
第十课 多输入单输出
两个任务给一个任务通过消息队列进行发送,接收函数在阻塞态。
做了一个实验,消息队列遵循先入先出原则,如果队列已满则会发送失败,但是读取时只会顺序读取头部。
本作品采用 知识共享署名-相同方式共享 4.0 国际许可协议 进行许可。