第八课 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*)类型)

第十课 多输入单输出

两个任务给一个任务通过消息队列进行发送,接收函数在阻塞态。
做了一个实验,消息队列遵循先入先出原则,如果队列已满则会发送失败,但是读取时只会顺序读取头部。