哈喽,是这样的,我在main里用xTaskCreate创建了4个task任务,分别为gps_task,dht11_task,pt100_task,display_task。
gps_task任务为每秒读取gps数据,dht11_task任务为每秒读取dht11传感器数据,pt100_task任务为每秒读取pt100传感器数据,定时读取实现方式:vtaskDelay(1000/portTICK_PERIOD_MS)。
display_task任务为每30秒将上述数据通过esp_now传递给另一块自带e-paper显示屏的ESP32板子,将数据显示在墨水屏上。定时实现方式我尝试过两种,1.vtaskDelay(30000/portTICK_PERIOD_MS); 2. 用timer定时器设置30s中断,中断函数xSemaphoreGive,任务函数中xSemaphoreTake。
遇到的问题:前三个任务gps_task,dht11_task,pt100_task能正常同时运行,但当我开启display_task任务后,就会出现dht11_task任务看门狗跑飞的bug。
xTaskCreate()代码参数如图1,报错信息如图2
现象:
1.如果我在app_main中,将display_task任务前的vTaskDelay延时 时间增加为4s的话,在display_task任务启动后,dht11_task任务将会正常运行一段时间后,才会出现看门狗跑飞的报错, 如果我在display_task任务前不加延时, dht11_task任务将直接出现看门狗跑飞报错。
报错原因猜测:
1.xTaskCreate()参数中给的内存太多了,当display_task任务开启后,CPU资源没办法给到dht11,导致出现看门狗跑飞。我尝试过将内存减小为3072,但会出现task overflow报错,即内存溢出,导致直接将任务delete删除。
2.display_task任务中的30s导致cpu资源没办法给到dht11,从而出现看门狗跑飞报错。但我尝试过改为10s,结果依然如此。
想得到的知识:
1.报错原因究竟是啥。
2.如何合理使用xTaskCreate来创建任务,如何合理分配任务内存以及cpu资源,更深层次:我能人为安排task任务所属的cpu吗?
3.我的代码结构从您专业开发人员的角度来看,合理不?(可能我的代码是小学生级别,哈哈哈)
4.如何较好地实现display_task任务中的“每30s”需求?让其在等待的同时,不占用cpu资源?
乐鑫爱,哒么么!
FreeRTOS xTaskCreate 相关
Moderator: ESP_ZT
FreeRTOS xTaskCreate 相关
- Attachments
-
- 1.png (56.07 KiB) Viewed 29213 times
-
- 6.png (31.08 KiB) Viewed 29213 times
Re: FreeRTOS xTaskCreate 相关
首先先回答一下第二个吧,可以指定任务运行的核心,使用下面的函数创建task任务
xTaskCreatePinnedToCore(task_process_handler, TAG, 6 * 1024, NULL, 4, NULL, 0);
第一个参数为task函数入口,第二个是task描述符,第三个是task分配的堆栈大小,第四个默认null就行了,第五个是任务优先级,第六个默认null,最后一个就是在几号核心运行任务,这里就是0核运行
需要保证在menuconfig里面的 component config -> freertos 里面的第一个选项不被打开,这样就是双核模式了
xTaskCreatePinnedToCore(task_process_handler, TAG, 6 * 1024, NULL, 4, NULL, 0);
第一个参数为task函数入口,第二个是task描述符,第三个是task分配的堆栈大小,第四个默认null就行了,第五个是任务优先级,第六个默认null,最后一个就是在几号核心运行任务,这里就是0核运行
需要保证在menuconfig里面的 component config -> freertos 里面的第一个选项不被打开,这样就是双核模式了
- Attachments
-
- 企业微信截图_16588225139898.png (201.27 KiB) Viewed 29162 times
Re: FreeRTOS xTaskCreate 相关
你的代码确实是存在问题的,首先你在app_main里面的vtaskDelay就有问题,这里只是延迟了其他task的创建时间,并没有什么用处。
回答你一下第一个原因吧,看门狗跑飞其实不是你的dht11跑飞,而是你的核心0里面最基础的任务IDLE0 没有得到运行的时间,这个我在上一次给你发了一个讲解。具体就是,s3 的双核其实都各自有一个闲置task,IDLE0 和 LDLE1 ,他们的优先级都很低,都是0,然后你的四个task都是12级的优先级,这导致当你的dht11_task 在运行的时候,把0核占满了,没有空余的时间给到IDLE0任务去“喂狗”,所以导致报错。
那么如何去更改?
最好的task优先级是,经常忙碌的task优先级低于偶尔运行一下的task,这样当高优先级的task任务运行的时候,可以让出时间给高优先级的。其次你应该在你的dht11_task 里面使用 vtaskDelay()函数。当任务执行了vtaskdelay()函数,任务会被阻塞延时。
当任务1在阻塞延时,调度器会尝试运行任务2;此时如果任务2也在阻塞延时,调度器就会去运行空闲任务。
再回答一下最后一个问题:
可以在display_task 里面这么写
while(1){
//这里运行函数
vTaskDelay() //延时三十秒
}
回答你一下第一个原因吧,看门狗跑飞其实不是你的dht11跑飞,而是你的核心0里面最基础的任务IDLE0 没有得到运行的时间,这个我在上一次给你发了一个讲解。具体就是,s3 的双核其实都各自有一个闲置task,IDLE0 和 LDLE1 ,他们的优先级都很低,都是0,然后你的四个task都是12级的优先级,这导致当你的dht11_task 在运行的时候,把0核占满了,没有空余的时间给到IDLE0任务去“喂狗”,所以导致报错。
那么如何去更改?
最好的task优先级是,经常忙碌的task优先级低于偶尔运行一下的task,这样当高优先级的task任务运行的时候,可以让出时间给高优先级的。其次你应该在你的dht11_task 里面使用 vtaskDelay()函数。当任务执行了vtaskdelay()函数,任务会被阻塞延时。
当任务1在阻塞延时,调度器会尝试运行任务2;此时如果任务2也在阻塞延时,调度器就会去运行空闲任务。
再回答一下最后一个问题:
可以在display_task 里面这么写
while(1){
//这里运行函数
vTaskDelay() //延时三十秒
}
Re: FreeRTOS xTaskCreate 相关
如何去获得cpu的最快运行速度?
请配置成240mhz
请配置成240mhz
- Attachments
-
- 企业微信截图_16588235559769.png (67.3 KiB) Viewed 29158 times
Who is online
Users browsing this forum: No registered users and 10 guests