ucosIII下创建任务读取DS18B20采集到的温度数据

学习链接:ucosIII下创建任务读取并输出DHT11采集到的温湿度数据

相关代码及事项:

首先,需要添加下面两个文件,
在这里插入图片描述
其次,main.c 中如下的代码:

#include "led.h"
#include "delay.h"
#include "sys.h"
#include "usart.h"
#include "ds18b20.h"
#include "includes.h"

//UCOSIII中以下优先级, 用户程序不能使用.
//将这些优先级分配给了UCOSIII的5个系统内部任务
//优先级0:中断服务服务管理任务 OS_IntQTask()
//优先级1:时钟节拍任务 OS_TickTask()
//优先级2:定时任务 OS_TmrTask()
//优先级OS_CFG_PRIO_MAX-2:统计任务 OS_StatTask()
//优先级OS_CFG_PRIO_MAX-1:空闲任务 OS_IdleTask()

u8 rom1[]={0x28, 0x95, 0x73, 0xe5, 0x07, 0x00, 0x00, 0xd5,}; //64 ROM
u8 rom2[]={0x28, 0x13, 0xbf, 0x45, 0xd4, 0x49, 0x66, 0x4b,};

//任务优先级
#define START_TASK_PRIO		3
// 定义任务堆栈大小	
#define START_STK_SIZE 		512
// 定义任务控制块
OS_TCB StartTaskTCB;	// OS_TCB是结构体类型
// 任务堆栈	
CPU_STK START_TASK_STK[START_STK_SIZE]; // CPU_STK 是重新定义的数据类型 实质是 unsigned int
// 声明任务函数实体
void start_task(void *p_arg);

//任务优先级
#define LED0_TASK_PRIO		4
//任务堆栈大小	
#define LED0_STK_SIZE 		128
//任务控制块
OS_TCB Led0TaskTCB;
//任务堆栈 CPU_STK 为 CPU_INT32U 类型, 也就是 unsigned int 类型, 为4 Byte,
CPU_STK LED0_TASK_STK[LED0_STK_SIZE];  //  那么任务堆栈 LED0_TASK_STK 的大小为 128 * 4 = 512 Byte.
//声明任务函数实体
void led0_task(void *p_arg);

//任务优先级
#define LED1_TASK_PRIO		5
//任务堆栈大小	
#define LED1_STK_SIZE 		128
//任务控制块
OS_TCB Led1TaskTCB;
//任务堆栈	
CPU_STK LED1_TASK_STK[LED1_STK_SIZE];
//声明任务函数实体
void led1_task(void *p_arg);

//任务优先级
#define FLOAT_TASK_PRIO		6
//任务堆栈大小
#define FLOAT_STK_SIZE		128
//任务控制块
OS_TCB	FloatTaskTCB;
//任务堆栈
__align(8) CPU_STK	FLOAT_TASK_STK[FLOAT_STK_SIZE];
//声明任务函数实体
void float_task(void *p_arg);

//任务优先级
#define DS18B20_TASK_PRIO		6
//任务堆栈大小
#define DS18B20_STK_SIZE		128
//任务控制块
OS_TCB	DS18B20TaskTCB;
//任务堆栈
CPU_STK	DS18B20_TASK_STK[DS18B20_STK_SIZE];
//声明任务函数实体
void ds18b20_task(void *p_arg);

int main(void)
{
	OS_ERR err;  // 定义返回错误的变量
	
	CPU_SR_ALLOC();
	
	delay_init();       //延时初始化
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //中断分组配置
	uart_init(115200);    //串口波特率设置
	LED_Init();         //LED初始化
	
	printf("System Going !\r\n");
	
	OSInit(&err);		//初始化UCOSIII系统及其相关的全局变量 
	
	OS_CRITICAL_ENTER();//进入临界区
	
	/*
		任务的栈,任务的函数实体,任务的TCB最终需要联系起来才能由系统统一调度。
		这个联系工作就由任务创建函数OSTaskCreat来实现。
		任务创建函数OSTaskCreat在os_task.c中。
	 */
	OSTaskCreate((OS_TCB 	* )&StartTaskTCB,					//任务控制块
							 (CPU_CHAR	* )"start task", 				//任务名字
							 (OS_TASK_PTR )start_task, 					//任务函数
							 (void		* )0,											//传递给任务函数的参数,无参数指向NULL,即 0
							 (OS_PRIO	  )START_TASK_PRIO,     	//任务优先级
							 (CPU_STK   * )&START_TASK_STK[0],	//任务堆栈基地址
							 (CPU_STK_SIZE)START_STK_SIZE/10,		//任务堆栈深度限位, 意思是当任务堆栈剩余多少时, 就表示任务堆栈快用完了。通常为堆栈大小的 1/10
							 (CPU_STK_SIZE)START_STK_SIZE,			//任务堆栈大小
							 (OS_MSG_QTY  )0,										//任务内部消息队列能够接收的最大消息数目,为0时禁止接收消息
							 (OS_TICK	  )0,											//当使能时间片轮转时的时间片长度,为0时为默认长度,
							 (void   	* )0,											//用户补充的存储区
							 (OS_OPT      )OS_OPT_TASK_STK_CHK|OS_OPT_TASK_STK_CLR, //任务选项
							 (OS_ERR 	* )&err);									//存放该函数错误时的返回值
	OS_CRITICAL_EXIT();															//退出临界区	 
							 
	OSStart(&err);  																//开启UCOSIII, 将不再返回
	while(1);
}

//开始任务函数
void start_task(void *p_arg)
{
	OS_ERR err;
	CPU_SR_ALLOC();// 进入临界区代码须调用该函数来声明一个变量。
	p_arg = p_arg; // 因为参数 p_arg 没有使用, 这样做之后是为了防止编译器报警告。

	CPU_Init();
#if OS_CFG_STAT_TASK_EN > 0u
   OSStatTaskCPUUsageInit(&err);  	//统计任务                
#endif
	
#ifdef CPU_CFG_INT_DIS_MEAS_EN		//如果使能了测量中断关闭时间
    CPU_IntDisMeasMaxCurReset();	
#endif
	
#if	OS_CFG_SCHED_ROUND_ROBIN_EN  //当使用时间片轮转的时候
	 //使能时间片轮转调度功能,时间片长度为1个系统时钟节拍,既1*5=5ms
	OSSchedRoundRobinCfg(DEF_ENABLED,1,&err);  
#endif		
	
	OS_CRITICAL_ENTER();	//进入临界区
	
	//创建LED0任务
	OSTaskCreate ((OS_TCB 	* )		&Led0TaskTCB,		
							 (CPU_CHAR	* )		"led0 task", 		
							 (OS_TASK_PTR )		led0_task, 			
							 (	void		* )		0,									// 无参数写0即可
							 (	OS_PRIO	  )		LED0_TASK_PRIO,     
							 (CPU_STK   * )		&LED0_TASK_STK[0],	// 任务栈的基地址
							 (CPU_STK_SIZE)		LED0_STK_SIZE/10,	
							 (CPU_STK_SIZE)		LED0_STK_SIZE,		
							 (OS_MSG_QTY  )		0,					
							 (OS_TICK	  	)		0,					
							 (void   	* 	)		0,					
							 (OS_OPT    	)		OS_OPT_TASK_STK_CHK|OS_OPT_TASK_STK_CLR,
							 (OS_ERR 	* )&err);				
				 
	//创建LED1任务
	OSTaskCreate((OS_TCB 	* )&Led1TaskTCB,		
							 (CPU_CHAR	* )"led1 task", 		
							 (OS_TASK_PTR )led1_task, 			
							 (void		* )0,					
							 (OS_PRIO	  )LED1_TASK_PRIO,     	
							 (CPU_STK   * )&LED1_TASK_STK[0],	
							 (CPU_STK_SIZE)LED1_STK_SIZE/10,	
							 (CPU_STK_SIZE)LED1_STK_SIZE,		
							 (OS_MSG_QTY  )0,					
							 (OS_TICK	  )0,					
							 (void   	* )0,				
							 (OS_OPT      )OS_OPT_TASK_STK_CHK|OS_OPT_TASK_STK_CLR, 
							 (OS_ERR 	* )&err);	
			 
	//创建浮点数任务
	OSTaskCreate((OS_TCB 	* )&FloatTaskTCB,		
							 (CPU_CHAR	* )"float task", 		
							 (OS_TASK_PTR )float_task, 			
							 (void		* )0,					
							 (OS_PRIO	  )FLOAT_TASK_PRIO,     	
							 (CPU_STK   * )&FLOAT_TASK_STK[0],	
							 (CPU_STK_SIZE)FLOAT_STK_SIZE/10,	
							 (CPU_STK_SIZE)FLOAT_STK_SIZE,		
							 (OS_MSG_QTY  )0,					
							 (OS_TICK	  )0,					
							 (void   	* )0,				
							 (OS_OPT      )OS_OPT_TASK_STK_CHK|OS_OPT_TASK_STK_CLR, 
							 (OS_ERR 	* )&err);				
							 
	//创建温度读取任务
	OSTaskCreate((OS_TCB 	* )&DS18B20TaskTCB,		
							 (CPU_CHAR	* )"ds18b20 task", 		
							 (OS_TASK_PTR )ds18b20_task, 			
							 (void		* )0,					
							 (OS_PRIO	  )DS18B20_TASK_PRIO,     	
							 (CPU_STK   * )&DS18B20_TASK_STK[0],	
							 (CPU_STK_SIZE)DS18B20_STK_SIZE/10,	
							 (CPU_STK_SIZE)DS18B20_STK_SIZE,		
							 (OS_MSG_QTY  )0,					
							 (OS_TICK	  )0,					
							 (void   	* )0,				
							 (OS_OPT      )OS_OPT_TASK_STK_CHK|OS_OPT_TASK_STK_CLR, 
							 (OS_ERR 	* )&err);				
							 
	OS_TaskSuspend((OS_TCB*)&StartTaskTCB,&err);		//挂起开始任务			 
	OS_CRITICAL_EXIT();	//退出临界区
}

/*
************************************************************************************************************************
*                                函数实体 --- 任务是一个独立的函数,函数主体无限循环且不能返回。
************************************************************************************************************************
*/

//led0任务函数
void led0_task(void *p_arg)
{
	OS_ERR err;
	p_arg = p_arg;
	while(1)
	{
		LED0=0;
		OSTimeDlyHMSM(0,0,0,200,OS_OPT_TIME_HMSM_STRICT,&err); //延时200ms
		LED0=1;
		OSTimeDlyHMSM(0,0,0,500,OS_OPT_TIME_HMSM_STRICT,&err); //延时500ms
	}
}

//led1任务函数
void led1_task(void *p_arg)
{
	OS_ERR err;
	p_arg = p_arg;
	while(1)
	{
		LED1=~LED1;
		OSTimeDlyHMSM(0,0,0,500,OS_OPT_TIME_HMSM_STRICT,&err); //延时500ms
	}
}

//浮点测试任务
void float_task(void *p_arg)
{
	CPU_SR_ALLOC();
	static float float_num=0.01;
	while(1)
	{
		float_num+=0.01f;
		OS_CRITICAL_ENTER();	//进入临界区
		printf("float_num的值为: %.4f\r\n",float_num);
		OS_CRITICAL_EXIT();		//退出临界区
		delay_ms(500);			//延时500ms
	}
}

//DS18B20任务函数
void ds18b20_task(void *p_arg)
{
	u16 Temp = 0;
	OS_ERR err;
	CPU_SR_ALLOC();// 进入临界区代码须调用该函数来声明一个变量。
	p_arg = p_arg;
	
	DS18B20_UserConfig();
	
	while(1)
	{
		OSTimeDlyHMSM(0,0,0,500,OS_OPT_TIME_HMSM_STRICT,&err); //延时500ms
				
		OS_CRITICAL_ENTER();	//进入临界区
		DS18B20_Read_Temperature(rom1,&Temp);

		printf("T1- %d.%d%d   ,",Temp/100,((Temp%100)/10),(Temp%100%10));
		
		DS18B20_Read_Temperature(rom2,&Temp);
		printf("T2- %d.%d%d   ,",Temp/100,((Temp%100)/10),(Temp%100%10));
		OS_CRITICAL_EXIT();	//退出临界区
		
	}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/387318.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

第10集《佛说四十二章经》

请大家打开讲议第十一面,第十九章、假真并观。 前面一章念等本空,说明大乘佛法的修学,身口意应安住在非空非有的中道实相。本章对中道实相的修学,再做明确的说明。修中道实相观要有空观与假观的观照,从空观中远离有相…

VueCLI核心知识综合案例TodoList

目录 1 拿到一个功能模块首先需要拆分组件: 2 使用组件实现静态页面的效果 3 分析数据保存在哪个组件 4 实现添加数据 5 实现复选框勾选 6 实现数据的删除 7 实现底部组件中数据的统计 8 实现勾选全部的小复选框来实现大复选框的勾选 9 实现勾选大复选框来…

​StableSwarmUI#超越文本的prompt

今天看到一个新的webui方案,是Stability-AI开源的: StableSwarmUI 是一个模块化的稳定扩散web用户界面,着重于使强大的工具易于访问、高性能和可扩展性。 由于项目还在开发中,我们可以先了解下,翻看了它的特点&#xf…

幻兽帕鲁游戏联机的时候,显示“网络连接超时”怎么解决?

如果你在游戏联机的时候,显示“网络连接超时”,可以检查下: 1、前提是你已经按照教程部署成功 2、检查防火墙有没有忘记设置,协议是UDP(只有TCP不行,一定要有UDP),端口是否填了8211&…

K210开发环境搭建(VS Code)

一、新建一个文件夹,就叫K210 二、再K210文件夹里面再新建一个文件夹,就叫CMake 三、找到官方提供的资料包里的cmake安装包, 或者直接去cmake官方下载网址进行下载 CMake官方下载网址:https://cmake.org/download/ 四、双击安装…

每日一题 (不用加减乘除做加法,找到数组中消失的数字)

不用加减乘除做加法_牛客题霸_牛客网 (nowcoder.com) 可以使用位运算符实现两个整数的加法: 在二进制加法中,我们通常使用“逐位相加”的方法来模拟常规加法的过程。当两个数字进行加法运算时,从最低位(通常是右侧)开…

开源≠不赚钱,开源软件盈利的7大模式。

开源不是目的,目的是圈用户,留住用户,盈利自然不成问题。 开源系统可以通过多种方式赚钱,以下是其中几种常见的方式: 提供付费支持: 开源系统可以提供付费的技术支持服务,包括安装、配置、维…

PyTorch深度学习快速入门教程 - 【小土堆学习笔记】

小土堆Pytorch视频教程链接 声明: 博主本人技术力不高,这篇博客可能会因为个人水平问题出现一些错误,但作为小白,还是希望能写下一些碰到的坑,尽力帮到其他小白 1 环境配置 1.1 pycharm pycharm建议使用2020的&…

ArcgisForJS基础

文章目录 0.引言1.第一个ArcgisForJS应用程序1.1.安装部署ArcgisForJS1.2.实现ArcgisForJS应用程序 2.开发与调试工具2.1.集成开发环境2.2.调试工具2.3.Firebug 0.引言 ArcGIS API for JavaScript是一款由Esri公司开发的用于创建WebGIS应用的JavaScript库。它允许开发者通过调…

【王道数据结构】【chapter5树与二叉树】【P158t9】

假设二叉树采用二叉链存储结构存储&#xff0c;设计一个算法&#xff0c;求先序遍历序列中第k个结点的值 #include <iostream> #include <stack> typedef struct treenode{char data;struct treenode *left;struct treenode *right; }treenode,*ptreenode;ptreenod…

支付交易——清结算

摘要 老王有个账本&#xff0c;店里进了哪些货、进的谁家货、花了多少钱&#xff0c;老王都会—一记下来;卖了哪些货、卖给了谁、卖了多少钱&#xff0c;也都会记下来。为什么要有个账本&#xff0c;看看老王是怎么进货和卖货的就知道了。老王店里虽然商品种类很多&#xff0c…

【数据结构】图

文章目录 图1.图的两种存储结构2.图的两种遍历方式3.最小生成树的两种算法&#xff08;无向连通图一定有最小生成树&#xff09;4.单源最短路径的两种算法5.多源最短路径 图 1.图的两种存储结构 1. 图这种数据结构相信大家都不陌生&#xff0c;实际上图就是另一种多叉树&…

刘谦竟然不是第一个吃螃蟹的!——历年春晚数学魔术精选

早点关注我&#xff0c;精彩不错过&#xff01; 在今年2024的央视春晚&#xff0c;刘谦用一个手法数学魔术的流程&#xff0c;配合上小尼的完美衬托&#xff0c;时隔5年&#xff0c;再一次为全国观众见证奇迹。 如此江湖地位的加持&#xff0c;使得他表演什么甚至失误都已经不再…

MySQL 基础知识(五)之数据增删改

目录 1 插入数据 2 删除数据 3 更改数据 创建 goods 表 drop table if exists goods; create table goods ( id int(10) primary key auto_increment, name varchar(14) unique, stockdate date )charsetutf8; 1 插入数据 当要插入的数据为日期/时间类型时&#xff0c;如果…

Python数学建模之回归分析

1.基本概念及应用场景 回归分析是一种预测性的建模技术&#xff0c;数学建模中常用回归分析技术寻找存在相关关系的变量间的数学表达式&#xff0c;并进行统计推断。例如&#xff0c;司机的鲁莽驾驶与交通事故的数量之间的关系就可以用回归分析研究。回归分析根据变量的…

2048游戏C++板来啦!

个人主页&#xff1a;PingdiGuo_guo 收录专栏&#xff1a;C干货专栏 大家好呀&#xff0c;我是PingdiGuo_guo&#xff0c;今天我们来学习如何用C编写一个2048小游戏。 文章目录 1.2048的规则 2.步骤实现 2.1: 初始化游戏界面 2.1.1知识点 2.1.2: 创建游戏界面 2.2: 随机…

ng : 无法加载文件 C:\Program Files\nodejs\node_global\ng.ps1, 因为在此系统上禁止运行脚本

ng : 无法加载文件 C:\Program Files\nodejs\node_global\ng.ps1&#xff0c;因为在此系统上禁止运行脚本 今天在VSCode中运行ng serve --port 8081运行基于Angular的项目时&#xff0c;报错了&#xff0c;错误如下图所示&#xff1a; 解决方法&#xff1a; 按照下图的5步即…

【AI视野·今日NLP 自然语言处理论文速览 第七十八期】Wed, 17 Jan 2024

AI视野今日CS.NLP 自然语言处理论文速览 Wed, 17 Jan 2024 (showing first 100 of 163 entries) Totally 100 papers &#x1f449;上期速览✈更多精彩请移步主页 Daily Computation and Language Papers Deductive Closure Training of Language Models for Coherence, Accur…

一探Lepton Search究竟

2024年1月25日&#xff0c;阿里巴巴原技术副总裁在 Twitter 上称用不到 500 行 Python 代码实现了 AI 对话搜索引擎&#xff0c;并在27日附上了开源地址&#xff1a;https://github.com/leptonai/search_with_lepton&#xff0c;截止春节期间已经5.8K的Star。 Twitter截图 Comm…

单测的思路

文章目录 单测的定义方法的单测几种生成工具的对比生成步骤 接口的单测场景的单测总结参考 单测的定义 单元测试&#xff08;Unit Testing&#xff09;是一种软件开发中的测试方法&#xff0c;它的主要目的是确保软件中的最小可测试单元&#xff08;通常是函数、方法或类&…