UCOS学习笔记(1)—任务创建,挂起,恢复以及删除

UCOS任务创建

USOS任务创建函数:OSTaskCreate

函数参数原型:

void  OSTaskCreate (OS_TCB        *p_tcb,//任务控制块
                    CPU_CHAR      *p_name,//任务名称
                    OS_TASK_PTR    p_task,//任务函数指向
                    void          *p_arg,//数据区(传参)
                    OS_PRIO        prio,//任务优先级
                    CPU_STK       *p_stk_base,//堆栈基地址
                    CPU_STK_SIZE   stk_limit,//栈深
                    CPU_STK_SIZE   stk_size,//栈大小
                    OS_MSG_QTY     q_size,//消息队列长度
                    OS_TICK        time_quanta,//时间片轮状长度
                    void          *p_ext,//用户存储区
                    OS_OPT         opt,//权限,一般为CHK和CLK
                    OS_ERR        *p_err)//错误码

创建任务代码示例:

//优先级
#define START_TASK_PRIO		3
//任务堆栈大小
#define START_STK_SIZE 		128
//任务控制块
OS_TCB StartTaskTCB;
//任务堆栈
CPU_STK START_TASK_STK[START_STK_SIZE];
//任务函数
void start_task(void *p_arg);

int main(void)
{ 
 
	OS_ERR err;
	CPU_SR_ALLOC();
	
	delay_init(168);  //delay函数初始化
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//中断优先级分组
	uart_init(115200);   //串口初始化
	LED_Init();         //LED初始化
	LCD_Init();			//LCD初始化
		//创建任务
	OSTaskCreate((OS_TCB 	* )&StartTaskTCB,		//任务控制块
				 (CPU_CHAR	* )"start task", 		//名字
                 (OS_TASK_PTR )start_task, 			//任务函数
                 (void		* )0,					//传参
                 (OS_PRIO	  )START_TASK_PRIO,     //优先级
                 (CPU_STK   * )&START_TASK_STK[0],	//堆栈基地址
                 (CPU_STK_SIZE)START_STK_SIZE/10,	//堆栈深度
                 (CPU_STK_SIZE)START_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_CRITICAL_EXIT();	//退出临界区	 
	OSStart(&err);      //启动UCOSIII
}
//任务开始
void start_task(void *p_arg)
{
	u8 i,task1_num=0;
	OS_ERR err;
	p_arg = p_arg;
	 
	POINT_COLOR = RED;
	LCD_ShowString(30,130,110,16,16,"Task Run:000");
	POINT_COLOR = BLUE;
	while(1)
	{
		task1_num++;
		LCD_ShowxNum(110,130,task1_num,3,16,0x80);	
		LED0 = ~LED0;
		OSTimeDlyHMSM(0,0,1,0,OS_OPT_TIME_HMSM_STRICT,&err); //延时1m
		
	}
}

UCOS任务删除函OSTaskDel

函数参数原型:

void  OSTaskDel (OS_TCB  *p_tcb,//控制块
                 OS_ERR  *p_err)//错误码

删除任务示例:

OS_ERR err;
OSTaskDel((OS_TCB*)0,&err);	//0表示删除自身

UCOS任务挂起函数OSTaskSuspend

函数参数原型

void   OSTaskSuspend (OS_TCB  *p_tcb,//控制块
                      OS_ERR  *p_err)//错误码

和删除函数一样简单,直接传控制块

挂起任务示例:

OS_ERR err;
OSTaskSuspend((OS_TCB*)0,&err);	//0表示挂起自身

注意:任务挂起不是删除,它之前定义的变量的值不会被销毁,比如我定义了一个计数的任务,当它自加到11的时候被挂起了,,但是当我恢复它的时候,它以就是从11开始自加。

UCOS任务恢复函数OSTaskResume

函数参数原型

void  OSTaskResume (OS_TCB  *p_tcb,//控制块
                    OS_ERR  *p_err)

同上面的函数一样使用。

实验报告三:(1)设计 Task0、Task1 两个任务任务 Task0 不断地挂起自己,再被任务 Task1 解挂,两个任务不断地切换执行,并输出两个任务在各个时刻的状态。Task0 的主要功能是显示 Task1 的状态,Task1 的主要功能是显示 Task0 的状态。整个应用的运行流程如图 1 所示,其描述如下:在 main 函数创建起始任务 TaskStart,其优先级为 0。TaskStart 任务主要完成创建 2 个应用任务 Task0、Task1,并挂起自己(不再被其它任务唤醒)。之后整个系统的运行流程如下:t1 时刻,Task0 开始执行,它运行到 t2 时刻挂起自己;t2 时刻,系统调度处于就绪状态的优先级最高任务 Task1 执行,它在 t3 时刻唤醒 Task0,后者由于优先级较高而抢占 CPU;Task0 执行到 t4 时刻又挂起自己,内核调度 Task1执行;Task1 运行至 t5 时刻再度唤醒 Task0; 注意:图中的栅格并不代表严格的时间刻度,而仅仅表现各任务启动和执行的相对先后关系。 (2)设计 MyTask、YouTask、KeyTask 三个任务:MyTask 任务输出 M;YouTask 任务输出 Y,并输出 MyTask 任务的状态;KeyTask 任务从键盘接收字符 Y 或 N,当接收 Y 时挂起 MyTask 任务,当接收 N 时恢复 MyTask 任务。 (3)设计 KeyTask 任务,当从键盘输入+号时动态创建任务,最多可以创建 10 个任务,这 10个任务都执行一个函数 MyTask,要求优先级是(PRIO_BASE+0,1,2,3,4,5,6,7,8,9),还要向不同的任务传递不同的参数(0,1,2,3,4,5,6,7,8,9)给 MyTask 函数,优先级为(PRIO_BASE+0,1,2,3,4,5,6,7,8,9)的任务分别输出数字(0,1,2,3,4,5,6,7,8,9)。当从键盘输入-号时动态的删除创建的一个任务,最多可删除 10 个任务。提示:多个任务可以执行一个函数。运行结果如下图所示。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值