IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 嵌入式 -> 关于FreeRTOS的延时函数vTaskDelay使用问题 -> 正文阅读

[嵌入式]关于FreeRTOS的延时函数vTaskDelay使用问题

项目场景:

` 最近在准备找工作,没有实际的项目和经验,就买了几个模块结合FreeRTOS来拼凑拼凑整成一个项目——基于ESP8266的远程温度监控,使用MQTT协议和搭载FreeRTOS系统。

省流:vTaskDelay的使用需要放在任务中,否则运行不了!


问题描述:

使用ESP8266时候,按照oneNET的例程移植到STM32上,能够很好的运行,但是把代码复制到FreeRTOS时候却一直初始化不了,等于说是卡在初始化了。下图为初始化函数摆放位置。

在这里插入图片描述

原因分析:

在使用串口函数一步一步的在每一个函数内外部设置打印信息后,初步发现问题是出在vTaskDelay函数上,如下图所示
在这里插入图片描述

就是进入了延时函数vTaskDelay之后就没出来。
分析:
进入延时函数查看问题(函数是官方的,不可能有问题,所以问题大概出在哪里任务没弄好或者其他冲突),发现延时函数有vTaskSuspendAll函数和xTaskResumeAll函数的,初步感觉到了问题应该是出在任务的调度上,所以就把ESP8266_Init函数放在开启任务调度函数vTaskStartScheduler后边,结果还是没有用,查资料后才知道任务调度函数后不执行后边的语句。
再接着看延时函数里面的后续函数时候发现prvAddCurrentTaskToDelayedList,看着名字想起来了问题所在了:由于ESP8266_Init函数在主函数内,而且里面还有延时函数,所以此时没有任务创建和运行,无法进行延时函数里面的任务阻塞。延时函数vTaskDelay里的prvAddCurrentTaskToDelayedList是将当前任务加入到延时列表中。所以任务都没有,何来的延时。更具体的后续函数和原理我也疏于学习就没有了解,就不分析了,直到这一步已经能够解决问题了。

	延时函数部分内容:
	void vTaskDelay( const TickType_t xTicksToDelay )
	{
	BaseType_t xAlreadyYielded = pdFALSE;
		if( xTicksToDelay > ( TickType_t ) 0U )
		{
			configASSERT( uxSchedulerSuspended == 0 );
			vTaskSuspendAll();    //任务挂起
			{
				traceTASK_DELAY();
				prvAddCurrentTaskToDelayedList( xTicksToDelay, pdFALSE );//问题就出在这里
			}
			xAlreadyYielded = xTaskResumeAll();//任务恢复
		}
		else
		{
			mtCOVERAGE_TEST_MARKER();
		}


总结:

由于目前主要任务是找工作而完成项目,对于更深层次的学习就只能在后边学了。目前对于FreeRTOS的掌握程度只是要求会移植会使用,满足项目的需求而已。
最后的解决方式:将ESP8266的初始化有关函数放在一个任务里,完成后删除该任务或者放在创建任务的函数中,例如:

void start_task(void *pvParameters)
{
	
    taskENTER_CRITICAL();           //进入临界区
    //创建TASK1任务
    xTaskCreate((TaskFunction_t )task1_task,             
                (const char*    )"task1_task",           
                (uint16_t       )TASK1_STK_SIZE,        
                (void*          )NULL,                  
                (UBaseType_t    )TASK1_TASK_PRIO,        
                (TaskHandle_t*  )&Task1Task_Handler);   
    //创建TASK2任务
    xTaskCreate((TaskFunction_t )task2_task,     
                (const char*    )"task2_task",   
                (uint16_t       )TASK2_STK_SIZE,
                (void*          )NULL,
                (UBaseType_t    )TASK2_TASK_PRIO,
                (TaskHandle_t*  )&Task2Task_Handler); 
								
	ESP8266_Init();					//初始化ESP8266
	while(OneNet_DevLink())			//接入OneNET
		vTaskDelay(500);
	OneNet_Subscribe(topics, 1);
	
    vTaskDelete(StartTask_Handler); //删除开始任务
    taskEXIT_CRITICAL();            //退出临界区
								
}

最后运行成功:
在这里插入图片描述

  嵌入式 最新文章
基于高精度单片机开发红外测温仪方案
89C51单片机与DAC0832
基于51单片机宠物自动投料喂食器控制系统仿
《痞子衡嵌入式半月刊》 第 68 期
多思计组实验实验七 简单模型机实验
CSC7720
启明智显分享| ESP32学习笔记参考--PWM(脉冲
STM32初探
STM32 总结
【STM32】CubeMX例程四---定时器中断(附工
上一篇文章      下一篇文章      查看所有文章
加:2022-04-24 09:36:52  更:2022-04-24 09:36:56 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 3:46:30-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码