版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
任务6-1信号量模拟优先级翻转Task6-1Semaphoresimulationpriorityreversal《物联网操作系统技术与应用》制作人张亚军
任务描述
在LiteOS中创建三个任务,分别是高优先级任务,中优先级任务,低优先级任务,再创建一个二值信号量,用于模拟产生优先级翻转。低优先级任务在获取信号量执行的时候,被中优先级任务打断,中优先级任务执行时间较长,因为低优先级任务还未释放信号量,那么高优先级任务就无法获得信号量而进入阻塞态,此时就发生了优先级翻转。
任务实现
1.打开第2章中移植好LiteOS的裸机工程TEST,修改main.c文件,添加头文件。任务6-1信号量模拟优先级翻转
26
/*USERCODEBEGINIncludes*/27
/*LiteOS头文件*/28#include"los_sys.h"29#include"los_task.ph"30#include"los_sem.h"31
/*USERCODEENDIncludes*/2.定义任务ID变量、二值信号量的ID变量。任务6-1信号量模拟优先级翻转
60
/*USERCODEBEGIN0*/61
/*定义任务ID*/62UINT32HighPriority_Task_Handle;63UINT32MidPriority_Task_Handle;64UINT32LowPriority_Task_Handle;65
/*定义二值信号量的ID*/66UINT32BinarySem_Handle;3.创建和管理任务HighPriority_Task、MidPriority_Task和LowPriority_Task。1)定义任务实现函数HighPriority_Task()、MidPriority_Task()和LowPriority_Task()。67/*************************************************************68*@函数名
:HighPriority_Task69*@功能说明:HighPriority_Task任务实现70*@参数
:NULL71*@返回值
:NULL72************************************************************/73
static
voidHighPriority_Task(void)74
{75
//定义一个返回类型变量,初始化为LOS_OK76UINT32uwRet=LOS_OK;
77
/*任务都是一个无限循环,不能返回*/任务6-1信号量模拟优先级翻转
78
while(1)79
{80
//获取二值信号量,没获取到则一直等待81uwRet=LOS_SemPend(BinarySem_Handle,LOS_WAIT_FOREVER);
82
if
(uwRet==LOS_OK)83printf("高优先级任务HighPriority_Task运行\n");84HAL_GPIO_TogglePin(GPIOD,GPIO_PIN_5);85LOS_SemPost(BinarySem_Handle);
86LOS_TaskDelay(
1000
);
/*延时1000ticks*/
87
}88
}89/*************************************************************90*@函数名
:MidPriority_Task91*@功能说明:MidPriority_Task任务实现92*@参数
:NULL93*@返回值
:NULL94***********************************************************/95
static
voidMidPriority_Task(void)96
{
97
/*任务都是一个无限循环,不能返回*/98
while(1)99
{100printf("中优先级任务MidPriority_Task运行\n");101LOS_TaskDelay(
1000
);
/*延时1000ticks*/
102
}103}104105/************************************************************106*@函数名
:LowPriority_Task107*@功能说明:LowPriority_Task任务实现108*@参数
:NULL109*@返回值
:NULL110**********************************************************/111static
voidLowPriority_Task(void)112{113
//定义一个返回类型变量,初始化为LOS_OK114UINT32uwRet=LOS_OK;
115
static
uint32_ti;
116
/*任务都是一个无限循环,不能返回*/117
while(1)118
{119
//获取二值信号量BinarySem_Handle,没获取到则一直等待
120uwRet=LOS_SemPend(BinarySem_Handle,LOS_WAIT_FOREVER);
121
if
(uwRet==LOS_OK)122printf("低优先级任务LowPriority_Task运行\n");
123HAL_GPIO_TogglePin(GPIOD,GPIO_PIN_4);
124
for(i=0;i<2000000;i++)//模拟低优先级任务占用信号量125
{126
//继续执行这个任务,不产生任务切换,延时为0个tick127LOS_TaskYield();128
}129printf("低优先级任务LowPriority_Task释放信号量!\r\n");130LOS_SemPost(BinarySem_Handle);
131LOS_TaskDelay(
1000
);
/*延时1000ticks*/
132
}133}2)定义任务创建函数Creat_HighPriority_Task()、Creat_MidPriority_Task()和Creat_LowPriority_Task()。任务6-1信号量模拟优先级翻转
134/************************************************************135*@函数名
:Creat_HighPriority_Task136*@功能说明:
创建HighPriority_Task任务137*@参数
:
138*@返回值
:
无139***********************************************************/140staticUINT32Creat_HighPriority_Task()141{142
//定义一个返回类型变量,初始化为LOS_OK143UINT32uwRet=LOS_OK;
144
//定义一个用于创建任务的参数结构体145TSK_INIT_PARAM_Stask_init_param;
146task_init_param.usTaskPrio=
3;
/*任务优先级,数值越小,优先级越高*/147task_init_param.pcName=
"HighPriority_Task";/*任务名*/148task_init_param.pfnTaskEntry=
(TSK_ENTRY_FUNC)HighPriority_Task;/*任务函数入口*/149task_init_param.uwStackSize=
1024;
/*堆栈大小*/150uwRet=LOS_TaskCreate(&HighPriority_Task_Handle,
&task_init_param);/*创建任务*/151
returnuwRet;152}153/*************************************************************154*@函数名
:Creat_MidPriority_Task155*@功能说明:
创建MidPriority_Task任务156*@参数
:
157*@返回值
:
无158***********************************************************/159staticUINT32Creat_MidPriority_Task()160{161
//定义一个返回类型变量,初始化为LOS_OK162UINT32uwRet=LOS_OK;
163TSK_INIT_PARAM_Stask_init_param;164task_init_param.usTaskPrio=
4;
/*任务优先级,数值越小,优先级越高*/165task_init_param.pcName=
"MidPriority_Task";
/*任务名*/166task_init_param.pfnTaskEntry=
(TSK_ENTRY_FUNC)MidPriority_Task;/*任务函数入口*/167task_init_param.uwStackSize=
1024;
/*堆栈大小*/168uwRet=LOS_TaskCreate(&MidPriority_Task_Handle,
&task_init_param);/*创建任务*/169
returnuwRet;170}172/**************************************************************173*@函数名
:Creat_MidPriority_Task174*@功能说明:
创建MidPriority_Task任务175*@参数
:
176*@返回值
:
无177************************************************************/178staticUINT32Creat_LowPriority_Task()179{180
//定义一个返回类型变量,初始化为LOS_OK181UINT32uwRet=LOS_OK;
182TSK_INIT_PARAM_Stask_init_param;183task_init_param.usTaskPrio=
5;
/*任务优先级,数值越小,优先级越高*/184task_init_param.pcName=
"LowPriority_Task";
/*任务名*/185task_init_param.pfnTaskEntry=
(TSK_ENTRY_FUNC)LowPriority_Task;/*任务函数入口*/186task_init_param.uwStackSize=
1024;
/*堆栈大小*/
187uwRet=LOS_TaskCreate(&LowPriority_Task_Handle,
&task_init_param);/*创建任务*/188
returnuwRet;189}3)定义任务管理函数AppTaskCreate()。任务6-1信号量模拟优先级翻转
190/***********************************************************191*@函数名
:AppTaskCreate192*@功能说明:
任务创建,为了方便管理,所有的任务创建函数都可以放在这个函数里面193*@参数
:
无
194*@返回值
:
无195***********************************************************/196staticUINT32AppTaskCreate(void)197{198
/*定义一个返回类型变量,初始化为LOS_OK*/199UINT32uwRet=LOS_OK;
200
/*创建一个二值信号量*/201uwRet=LOS_BinarySemCreate(1,&BinarySem_Handle);202
if
(uwRet!=LOS_OK)203
{204printf("BinarySem创建失败!失败代码0x%X\n",uwRet);205
}
206uwRet=Creat_HighPriority_Task();207
if
(uwRet!=LOS_OK)208
{209printf("HighPriority_Task任务创建失败!失败代码0x%X\n",uwRet);210
returnuwRet;211
}
212uwRet=Creat_MidPriority_Task();213
if
(uwRet!=LOS_OK)214
{215printf("MidPriority_Task任务创建失败!失败代码0x%X\n",uwRet);216
returnuwRet;217
}
218uwRet=Creat_LowPriority_Task();219
if
(uwRet!=LOS_OK)220
{221printf("LowPriority_Task任务创建失败!失败代码0x%X\n",uwRet);222
returnuwRet;223
}
224
returnLOS_OK;225}226/*USERCODEEND0*/4.在主函数中修改代码。任务6-1信号量模拟优先级翻转
232intmain(void)233{234
/*USERCODEBEGIN1*/235UINT32uwRet=LOS_OK;
//定义一个返回类型变量,初始化为LOS_OK236
/*USERCODEEND1*/237
/*MCUConfiguration---------------------------------------*/238
/*Resetofallperipherals,InitializestheFlashinterfaceandtheSystick.*/239HAL_Init();240
/*Configurethesystemclock*/241SystemClock_Config();242
/*Initializeallconfiguredperipherals*/243MX_GPIO_Init();244MX_USART1_UART_Init();245MX_USART2_UART_Init();246MX_USART3_UART_Init();247
/*LiteOS内核初始化*/248uwRet=LOS_KernelInit();249
if
(uwRet
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 天津师范大学考勤制度
- 单位不实行考勤制度
- 家长学校家长考勤制度
- 质量改进永无止境-黄金集团质量工程师的长期规划
- 新闻编辑记者工作手册:新闻采编与报道技巧
- 学校交通安全管理制度
- 波形钢腹板梁桥课程设计
- eda课程设计制作
- 国内外分行长职位的职业发展研究
- 吃空饷考勤制度
- 2026北京市公安局监所管理总队招聘勤务辅警300人笔试参考题库及答案解析
- 2026年张家界航空工业职业技术学院单招职业技能考试备考题库含详细答案解析
- 2026年智能手环技术分析报告
- 民航地面服务操作规范与流程手册(标准版)
- 2026年春季苏教版(2024)三年级下册数学教学计划附教学进度表
- 2026年及未来5年中国接触器市场供需格局及未来发展趋势报告
- 2025-2026学年人教版(新教材)小学数学一年级下册教学计划(附进度表)
- 车辆特情处置课件
- 2026年湖南有色金属职业技术学院单招职业适应性考试题库附答案详解
- 村干部廉洁自律课件
- 《道路工程地质》课程标准
评论
0/150
提交评论