FreeRTOS和UCOS操作系统使用笔记

news2024/11/22 21:16:45

FreeRTOS使用示例

UCOS使用示例

信号量使用

信号量访问共享资源区/
OS_SEMMY_SEM; //定义一个信号量,用于访问共享资源

OSSemCreate ((OS_SEM* )&MY_SEM, //创建信号量,指向信号量
			 (CPU_CHAR* )"MY_SEM", //信号量名字
			 (OS_SEM_CTR )1,       //信号量值为1,可以理解开始有个任务就可以请求到信号量
			 (OS_ERR* )&err);//错误码
 
void task1_task(void *p_arg)
{
	OS_ERR err;
	u8 task1_str[]="First task Running!";
	//请求信号量,参数2:0为死等;参数3:表示信号量无效任务挂起等待信号量;参数4:时间戳
	OSSemPend(&MY_SEM,0,OS_OPT_PEND_BLOCKING,0,&err);
	memcpy(share_resource,task1_str,sizeof(task1_str));//向共享资源区拷贝数据
	delay_ms(200);
	printf("%s\r\n",share_resource);       //串口输出共享资源区数据
	OSSemPost(&MY_SEM,OS_OPT_POST_1,&err); //发送信号量
}
void task2_task(void *p_arg)
{
	OS_ERR err;
	u8 task2_str[]="Second task Running!";
	OSSemPend(&MY_SEM,0,OS_OPT_PEND_BLOCKING,0,&err);  //请求信号量(3)
	memcpy(share_resource,task2_str,sizeof(task2_str));//向共享资源区拷贝数据
	delay_ms(200);
	printf("%s\r\n",share_resource);        //串口输出共享资源区数据
	//OS_OPT_POST_1表示向信号量优先级高的任务发送信号量
	OSSemPost(&MY_SEM,OS_OPT_POST_1,&err);//发送信号量 
}
/信号量用于任务同步实验
OS_SEM SYNC_SEM; //定义一个信号量,用于任务同步
OSSemCreate ((OS_SEM* )&SYNC_SEM,//创建信号量,指向信号量
			 (CPU_CHAR* )"SYNC_SEM",//信号量名字
			 (OS_SEM_CTR )0,        //信号量值为0
			 (OS_ERR* )&err);       //错误码

void task1_task(void *p_arg)
{
	OS_ERR err;
	if(KEY_Scan(0)==WKUP_PRES){
		OSSemPost(&SYNC_SEM,OS_OPT_POST_1,&err);//发送信号量
		LCD_ShowxNum(150,111,SYNC_SEM.Ctr,3,16,0); //显示信号量值 
	}
}

void task2_task(void *p_arg)
{
	OS_ERR err;
    //OS_OPT_PEND_BLOCKING:表示信号量无效任务挂起等待信号量
	//如是OS_OPT_POST_ALL 向等待该信号量的所有任务发送信号量。
	OSSemPend(&SYNC_SEM,0,OS_OPT_PEND_BLOCKING,0,&err); //请求信号量
	LCD_ShowxNum(150,111,SYNC_SEM.Ctr,3,16,0); //显示信号量值
	OSTimeDlyHMSM(0,0,1,0,OS_OPT_TIME_PERIODIC,&err);//延时1s
}

 内建信号量

//内建信号量///
void task1_task(void *p_arg)
{
	OS_ERR err;
	if(KEY_Scan(0) == WKUP_PRES){
		//OS_OPT_POST_NONE:不指定特定的选项
		OSTaskSemPost(&Task2_TaskTCB,OS_OPT_POST_NONE,&err);//使用系统内建信号量向任务task2发送信号量
		LCD_ShowxNum(150,111,Task2_TaskTCB.SemCtr,3,16,0); //显示信号量值
	}
}

void task2_task(void *p_arg)
{
	OS_ERR err; 
	//参数1:超时时间,0为一直等待信号量;2:信号量被占用则挂起等待;3:时间戳
	OSTaskSemPend(0,OS_OPT_PEND_BLOCKING, 0,&err);//请求任务内建的信号量
	LCD_ShowxNum(150,111,Task2_TaskTCB.SemCtr,3,16,0);//显示任务内建信号量值
}

消息传递

消息队列相关函数

消息队列//
#define KEYMSG_Q_NUM 1 //按键消息队列的数量
#define DATAMSG_Q_NUM 4 //发送数据的消息队列的数量
OS_Q KEY_Msg; //定义一个消息队列,用于按键消息传递,模拟消息邮箱
OS_Q DATA_Msg; //定义一个消息队列,用于发送数据

void start_task(void *p_arg)
{//......
	OSQCreate ( (OS_Q* )&KEY_Msg,//指向一个消息队列
				(CPU_CHAR* )"KEY Msg",//消息队列名称
				(OS_MSG_QTY )KEYMSG_Q_NUM, //消息队列长度,这里设置为 1
				(OS_ERR* )&err); //错误码
//创建消息队列 DATA_Msg
	OSQCreate ( (OS_Q* )&DATA_Msg, //指向一个消息队列
				(CPU_CHAR* )"DATA Msg",//消息队列的名称
				(OS_MSG_QTY )DATAMSG_Q_NUM,//消息队列的个数这里是4
				(OS_ERR* )&err);//错误码
}

void tmr1_callback(void *p_tmr,void *p_arg)
{//......
	sprintf((char*)pbuf,"ALIENTEK %d",msg_num);
	//发送消息
	OSQPost((OS_Q* )&DATA_Msg,//指向一个消息队列
			(void* )pbuf,     //指向要发送的内容void指针
			(OS_MSG_SIZE )10, //要发送的消息大小,单位字节
			(OS_OPT )OS_OPT_POST_FIFO,//发送消息操作类型,这里表示发送消息报错队列尾部
			(OS_ERR* )&err);  //错误码	
}

void main_task(void *p_arg)
{
	u8 key = KEY_Scan(0); //扫描按键

	//发送消息
	OSQPost((OS_Q* )&KEY_Msg,
			(void* )&key,
			(OS_MSG_SIZE )1,
			(OS_OPT )OS_OPT_POST_FIFO,
			(OS_ERR* &err);
    u8 msgq_remain_size = DATA_Msg.MsgQ.NbrEntriesSize-DATA_Msg.MsgQ.NbrEntries;//消息队列剩余大小
    sprintf((char*)p,"Total Size:%d",DATA_Msg.MsgQ.NbrEntriesSize);//显示 DATA_Msg 消息队列总的大小
}

void Keyprocess_task(void *p_arg)
{
	u8 num;
	u8 *key;
	OS_MSG_SIZE size;
	OS_ERR err;
	key=OSQPend((OS_Q* )&KEY_Msg, //指向一个消息队列,整个函数反回的是指针消息数据
				(OS_TICK )0,     //指定时间没有接收到数据任务就被唤醒,0一直等
				(OS_OPT )OS_OPT_PEND_BLOCKING,//一直等,直到接收到消息
				(OS_MSG_SIZE* )&size,//接收消息的字节长度
				(CPU_TS* )0,//指向一个时间戳
				(OS_ERR* )&err);//错误码
}
void msgdis_task(void *p_arg)
{
	u8 *p;
	OS_MSG_SIZE size;
	OS_ERR err; 
	p=OSQPend(  (OS_Q* )&DATA_Msg, 
				(OS_TICK )0,
				(OS_OPT )OS_OPT_PEND_BLOCKING,
				(OS_MSG_SIZE* )&size;
				(CPU_TS* )0,
				(OS_ERR* )&err);
    LCD_ShowString(5,270,100,16,16,p);
}

 任务内建消息队列

#define TASK_Q_NUM 4 //任务内建消息队列的长度

void tmr1_callback(void *p_tmr,void *p_arg)
{//......
	sprintf((char*)pbuf,"ALIENTEK %d",msg_num);
	OSTaskQPost((OS_TCB* )&Msgdis_TaskTCB, //向任务msgdis_task发送消息
				(void* )pbuf,      //指向要发送的内容void指针
				(OS_MSG_SIZE )10,  //指定要发送消息的大小
				(OS_OPT )OS_OPT_POST_FIFO,//发送消息报错在队列末尾
				(OS_ERR* )&err);//错误码
}

void msgdis_task(void *p_arg)
{//......
	u8 *p;
	OS_MSG_SIZE size;
	OS_ERR err; 
	p=OSTaskQPend((OS_TICK )0, //超时时间没有接收到数据任务就被唤醒
				(OS_OPT )OS_OPT_PEND_BLOCKING, //一直等待,直到接收到消息
				(OS_MSG_SIZE* )&size,  //消息的大小
				(CPU_TS* )0,  //时间戳
				(OS_ERR* )&err ); //错误码
	LCD_ShowString(40,270,100,16,16,p);//P为接收到的数据指针
}

事件标志组

事件标志组//
#define KEY0_FLAG 0x01
#define KEY1_FLAG 0x02
#define KEYFLAGS_VALUE 0X00
OS_FLAG_GRP EventFlags; //定义一个事件标志组

void start_task(void *p_arg)
{//......
	OSFlagCreate((OS_FLAG_GRP* )&EventFlags, //指向事件标志组
				(CPU_CHAR* )"Event Flags", //名字
				(OS_FLAGS )KEYFLAGS_VALUE, //事件标志组初始值
				(OS_ERR* )&err); //错误码
}

//向事件标志组 EventFlags 发送标志
void main_task(void *p_arg)
{//......
	//按下按键1发送
	flags_num=OSFlagPost((OS_FLAG_GRP*)&EventFlags,//指向事件标志组
					 (OS_FLAGS )KEY0_FLAG,//决定哪些位清零和置位
					 (OS_OPT )OS_OPT_POST_FLAG_SET,//对位进行置位操作,也可清零
					 (OS_ERR* )&err);//返回错误码
	//按下按键2发送
//向事件标志组 EventFlags 发送标志
	flags_num=OSFlagPost((OS_FLAG_GRP*)&EventFlags,
						(OS_FLAGS )KEY1_FLAG,
						(OS_OPT )OS_OPT_POST_FLAG_SET,
						(OS_ERR* )&err);				 
}
void flagsprocess_task(void *p_arg)
{//......
	OS_ERR err; 
	//等待事件标志组
	OSFlagPend((OS_FLAG_GRP* )&EventFlags, //指向事件标准组
				 (OS_FLAGS )KEY0_FLAG+KEY1_FLAG,//等待 bit0和bit1时,值就为 0X03。

				 (OS_TICK )0,//等待超时时间,为0则一直等待下去
				 (OS_OPT )OS_OPT_PEND_FLAG_SET_ALL+\//多种配置模式:当前配置为等待所有位
				  OS_OPT_PEND_FLAG_CONSUME,//保留事件标志的状态
				 (CPU_TS* )0,//时间戳
				 (OS_ERR* )&err);//返回错误码
    printf("事件标志组 EventFlags 的值:%d\r\n",EventFlags.Flags);
}

 

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【C++】多态(详解)

前言:今天学习的内容可能是近段时间最难的一个部分的内容了,C的多态,这部分内容博主认为难度比较大,各位一起慢慢啃下来。 💖 博主CSDN主页:卫卫卫的个人主页 💞 👉 专栏分类:高质量&#xff23…

绝地求生PUBG服务器延迟太高 购买领取响应时间长怎么解决

绝地求生PUBG是一款特别热门的射击类吃鸡游戏,游戏还有多张地图可供玩家选择,玩家们需要乘坐飞机空投跳伞至不同的各个角落,赤手空拳寻找武器,车辆以及物资,并在多种多样的地形中展开战斗。想要取得胜利,我…

微信小程序转发朋友圈详细教程

微信小程序转发朋友圈功能,官方说的很官方,容易踩坑 官方链接戳这里 想分享朋友圈必须要分享好友 onShareTimeline() { } 想要生效必须先定义 onShareAppMessage() { } /*** 用户点击右上角分享*/onShareAppMessage() { },onShareTimeline() { } 简单…

应对SQL注入攻击:保障网站安全的策略

在互联网的广阔天地中,网站安全始终是站长用户和企业开发者不可忽视的重要议题。其中,SQL注入攻击作为一种常见的网络攻击手段,严重威胁着网站的数据安全和业务稳定。什么是SQL注入攻击,我们该如何应对这种攻击呢?今天…

广州外贸建站模板

Yamal外贸独立站wordpress主题 绿色的亚马尔Yamal外贸独立站wordpress模板,适用于外贸公司建独立站的wordpress主题。 https://www.jianzhanpress.com/?p7066 赛斯科Sesko-W外贸建站WP主题 适合机械设备生产厂家出海做外贸官网的wordpress主题,红橙色…

互联网应用主流框架整合之SpringCloud微服务治理

微服务架构理念 关于微服务的概念、理念及设计相关内容,并没有特别严格的边界和定义,某种意义上说,适合的就是最好的,在之前的文章中有过详细的阐述,微服务[v1.0.0][Spring生态概述]、微服务[设计与运行]、微服务[v1.0.0][服务调用]、微服务[开发生命周期]、微服务[面临的…

Unity之创建与导出PDF

内容将会持续更新,有错误的地方欢迎指正,谢谢! Unity之创建与导出PDF TechX 坚持将创新的科技带给世界! 拥有更好的学习体验 —— 不断努力,不断进步,不断探索 TechX —— 心探索、心进取! 助力快速…

最靓丽的C++开源通知弹框SnoreToasts自动监听软件及网页通知

SnoreToasts,作为一款轻量级的C开源项目,为开发者提供了一个便捷的方式来在Windows操作系统上展示通知弹框(Toast Notifications)。 特点与优势 轻量级:SnoreToasts采用了简洁的代码设计,避免了不必要的依…

SQLServer:从数据类型 varchar 转换为 numeric 时出错。

1.工作要求 计算某两个经纬度距离 2.遇到问题 从数据类型 varchar 转换为 numeric 时出错。 3.解决问题 项目版本较老,使用SQLServer 2012 计算距离需执行视图,如下: SET QUOTED_IDENTIFIER ON SET ANSI_NULLS ON GO ALTER view vi_ord…

「前端」快速排序算法演示

快速排序算法演示。 布局描述 一个简单的HTML页面,用户可以在其中输入一系列用逗号分隔的数字。 一个CSS样式表,提供了一个美观大方的布局和样式。 一个JavaScript脚本,实现了快速排序算法,并在用户点击按钮时对输入的数字进行排序,并显示结果。 效果演示 核心代码 <…

PyPDF2拆分PDF文件的高级应用:指定拆分方式

本文目录 前言一、拆分方式选择1、代码讲解2、实现效果图3、完整代码前言 前两篇文章,分别讲解了将使用PyPDF2将PDF文档分割成为单个页面、在分割PDF文档时指定只分割出指定页面,如果你还没有看过,然后有需要的话,可以去看一下,我把文章链接贴到这里: PyPDF2拆分PDF文件…

苹果可能与谷歌大模型合作,马斯克xAI下个月推出Grok-2,比尔·盖茨:Scaling Law快要走到尽头

ChatGPT狂飙160天&#xff0c;世界已经不是之前的样子。 更多资源欢迎关注 1、苹果被曝 Gemini 模型今秋或融入苹果智能生态系统 苹果知名爆料人马克古尔曼&#xff08;Mark Gurman&#xff09;最新透露&#xff0c;苹果公司将于今年秋季宣布与Alphabet旗下的谷歌的大模型Gem…

计算机网络网络层复习题2

一. 单选题&#xff08;共22题&#xff0c;100分&#xff09; 1. (单选题)如果 IPv4 数据报太大&#xff0c;会在传输中被分片&#xff0c;对分片后的数据报进行重组的是&#xff08; &#xff09;。 A. 中间路由器B. 核心路由器C. 下一跳路由器D. 目的主机 我的答案: D:目的…

如何学好自动化测试

1. 什么是自动化测试 自动化测试是使用脚本和工具来执行测试任务&#xff0c;以替代手工测试过程。它可以提高效率、减少人工错误&#xff0c;并增加测试覆盖率。在软件开发过程中&#xff0c;自动化测试已经成为了不可或缺的一部分。 自动化测试主要有以下好处&#xff1a; …

《人人都是产品经理》:大产品

《人人都是产品经理》&#xff1a;大产品 产品之大时间之大空间之大&#xff1a;商业、产品、技术设计之大以写书为例 团队之大 回答一个问题 产品经理应该是管理者嘛&#xff1f;优点在于&#xff1a;缺点在于&#xff1a;总结&#xff1a; 如何让团队更加开心总结 产品之大 …

Android线性布局的概念与属性

线性布局(LinearLayout)是Android中最简单的布局方式&#xff0c;线性布局方式会使得所有在其内部的控件或子布局按一条水平或垂直的线排列。如图所示&#xff0c;图a是纵向线性布局示意图&#xff0c;图b是横向线性布局示意图。 a&#xff09;纵向线性布局示意图 …

JAVA每日作业day7.1-7.3小总结

ok了家人们前几天学了一些知识&#xff0c;接下来一起看看吧 一.API Java 的 API &#xff08; API: Application( 应用 ) Programming( 程序 ) Interface(接口 ) &#xff09; Java API 就是 JDK 中提供给我们使用的类&#xff0c;这些类将底层 的代码实现封装了起来&#x…

仓库货物管理系统

摘 要 随着信息技术的迅猛发展&#xff0c;大数据已经成为推动各行各业变革的重要力量。特别是在物流仓储领域&#xff0c;大数据技术的应用不仅能够显著提升仓库货物管理的效率&#xff0c;还能够优化库存管理、减少成本、提高客户满意度。因此&#xff0c;基于大数据的仓库货…

第二十一章 网络编程

​ 一、网络的相关概念 1. 网络通信 &#xff08;1&#xff09;网络通信&#xff1a;将 数据 通过网络从一台设备传输到另一台设备 &#xff08;2&#xff09;java.net 包下提供了一系列的类或接口&#xff0c;完成网络通信 2. 网络 概念&#xff1a;两台或多台设备通过一定…

git配置ssh-keygen -t rsa -c“xxxx@xxxx.com.cn出现Too many arguments.解决办法

git配置ssh-keygen -t rsa -c"xxxxxxxx.com.cn出现Too many arguments.解决办法 问题描述 配置Git公钥私钥时候输入命令ssh-keygen -t rsa -c"xxxxxxxx.com.cn出现Too many arguments. 解决办法&#xff1a; 提示输入的参数格式不正确&#xff0c;需要注意这几个地…