UCOSIII任务创建

摘要:
UCOSIII任务创建:首先要确保UCOSIII移植成功;一般以下几个步骤就行了:第一步:写好任务所需的优先级、堆栈、控制块等;然后顺便声明下任务函数;第二步:开始创建函数源码:1#include"led.h"2#include"delay.h"3#include"sys.h"4#include"usart.h"5#include"includes.h"67//关于优先级的说明:8//系统保留有5

UCOSIII任务创建:

首先要确保UCOSIII移植成功;

一般以下几个步骤就行了:

第一步:写好任务所需的 优先级、堆栈、控制块等;

然后顺便声明下任务函数;

UCOSIII任务创建第1张

第二步:开始创建函数

UCOSIII任务创建第2张

源码:

1 #include "led.h"
2 #include "delay.h"
3 #include "sys.h"
4 #include "usart.h"
5 #include "includes.h"
6 
7 //关于优先级的说明:
8 //系统保留有5个任务,这五个任务占了5个优先级,用户不得使用这5个优先级
9 //优先级0:中断服务管理任务:OS_IntQTask();
10 //优先级1:时钟节拍任务:OS_TickTask();
11 //优先级2:定时任务:OS_TmrTask();
12 //优先级OS_CFG_PRIO_MAX-2(倒数第二个优先级):统计任务:OS_StatTask();
13 //优先级OS_CFG_PRIO_MAX-1(倒数第一个优先级):空闲任务:OS_IdleTask();
14 
15 #define START_TASK_PRIO         3                   //任务优先级;
16 #define START_STK_SIZE          128                 //任务堆栈大小,实际大小是:128*4字节
17 CPU_STK START_TASK_STK[START_STK_SIZE];             //任务堆栈;
18 OS_TCB StartTaskTCB;                                //任务控制块;
19 //声明任务函数(一般将一个任务写成一个函数):
20 void start_task(void *p_arg);                       //注:“p_arg”这个参数基本用不上,但必须得写上
21 
22 #define LED0_TASK_PRIO          4                   //任务优先级;
23 #define LED0_STK_SIZE           128                 //任务堆栈大小,实际大小是:128*4字节
24 CPU_STK LED0_TASK_STK[LED0_STK_SIZE];               //任务堆栈;
25 OS_TCB Led0TaskTCB;                                 //任务控制块;
26 //声明任务函数(一般将一个任务写成一个函数):
27 void Led0_task(void *p_arg);                        //注:“p_arg”这个参数基本用不上,但必须得写上
28 
29 #define LED1_TASK_PRIO          5                   //任务优先级;
30 #define LED1_STK_SIZE           128                 //任务堆栈大小,实际大小是:128*4字节
31 CPU_STK LED1_TASK_STK[LED1_STK_SIZE];               //任务堆栈;
32 OS_TCB Led1TaskTCB;                                 //任务控制块;
33 //声明任务函数(一般将一个任务写成一个函数):
34 void Led1_task(void *p_arg);                        //注:“p_arg”这个参数基本用不上,但必须得写上
35 
36 #define Printf_TASK_PRIO         6                  //任务优先级;
37 #define Printf_STK_SIZE          128                //任务堆栈大小,实际大小是:128*4字节
38 CPU_STK Printf_TASK_STK[Printf_STK_SIZE];           //任务堆栈;
39 OS_TCB PrintfTaskTCB;                               //任务控制块;
40 //声明任务函数(一般将一个任务写成一个函数):
41 void Printf_task(void *p_arg);                      //注:“p_arg”这个参数基本用不上,但必须得写上
42 
43 intmain()
44 {
45     OS_ERR err;                         //系统使用,任务错误标示保存在此变量中
46     CPU_SR_ALLOC();                     //临界区函数使用;
47     
48     //外设初始化:
49 delay_init();
50     NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);     //中断分组
51     uart_init(115200);
52 LED_Init();
53     
54     //UCOS初始化:
55     OSInit(&err);
56     OS_CRITICAL_ENTER();            //进入临界区;
57     //任务创建函数:
58 OSTaskCreate(
59                     (OS_TCB *)    &StartTaskTCB,        //任务控制块
60                     (CPU_CHAR*)   "start_task",         //任务名称
61                     (OS_TASK_PTR) start_task,           //任务函数
62                     (void *)       0,                   //此参数暂时不用
63                     (OS_PRIO)      START_TASK_PRIO,     //任务优先级
64                     (CPU_STK *)    &START_TASK_STK[0],  //任务堆栈基地址
65                     (CPU_STK_SIZE) START_STK_SIZE/10,   //堆栈栈深
66                     (CPU_STK_SIZE) START_STK_SIZE,      //堆栈大小
67                     (OS_MSG_QTY)   0,
68                     (OS_TICK)      0,
69                     (void *)       0,
70                     (OS_OPT)       OS_OPT_TASK_STK_CHK|OS_OPT_TASK_STK_CLR,//选项,选择任务创建后进行的操作
71                     (OS_ERR *)     &err                 //错误标示
72 );
73     OS_CRITICAL_EXIT();                                 //退出临界区;
74                     
75     OSStart(&err);                                      //系统开始运行
76 }
77 
78 //任务函数;注:一般将其它任务的创建放到一个专门创建任务的函数中;
79 void start_task(void *p_arg)
80 {
81 OS_ERR err;
82 CPU_SR_ALLOC();
83     p_arg = p_arg;      //故意使用一下这个参数,否则编译器会警告说此参数没有使用
84 
85 CPU_Init();
86 #if OS_CFG_STAT_TASK_EN > 0u
87    OSStatTaskCPUUsageInit(&err);      //统计任务
88 #endif
89     
90 #ifdef CPU_CFG_INT_DIS_MEAS_EN        //如果使能了测量中断关闭时间
91 CPU_IntDisMeasMaxCurReset();
92 #endif
93     
94 #if    OS_CFG_SCHED_ROUND_ROBIN_EN     //当使用时间片轮转的时候
95     
96     //使能时间片轮转调度功能,时间片长度为:1*5=5ms
97     OSSchedRoundRobinCfg(DEF_ENABLED,1,&err);
98 #endif
99     
100     OS_CRITICAL_ENTER();            //进入临界区
101     //创建LED0任务:
102     OSTaskCreate(   (OS_TCB *)      &Led0TaskTCB,
103                     (CPU_CHAR *)    "led0 task",
104 (OS_TASK_PTR)   Led0_task,
105                     (void *)        0,
106 (OS_PRIO)       LED0_TASK_PRIO,
107                     (CPU_STK *)     &LED0_TASK_STK[0],
108                     (CPU_STK_SIZE)  LED0_STK_SIZE/10,
109 (CPU_STK_SIZE)  LED0_STK_SIZE,
110                     (OS_MSG_QTY)    0,
111                     (OS_TICK)       0,
112                     (void *)        0,
113                     (OS_OPT)        OS_OPT_TASK_STK_CHK|OS_OPT_TASK_STK_CLR,
114                     (OS_ERR *)      &err
115 );
116                  
117     //创建LED1任务:
118     OSTaskCreate(   (OS_TCB *)      &Led1TaskTCB,
119                     (CPU_CHAR *)    "led1 task",
120 (OS_TASK_PTR)   Led1_task,
121                     (void *)        0,
122 (OS_PRIO)       LED1_TASK_PRIO,
123                     (CPU_STK *)     &LED1_TASK_STK[0],
124                     (CPU_STK_SIZE)  LED1_STK_SIZE/10,
125 (CPU_STK_SIZE)  LED1_STK_SIZE,
126                     (OS_MSG_QTY)    0,
127                     (OS_TICK)       0,
128                     (void *)        0,
129                     (OS_OPT)        OS_OPT_TASK_STK_CHK|OS_OPT_TASK_STK_CLR,
130                     (OS_ERR *)      &err
131 );
132              
133     //创建Printf任务:
134     OSTaskCreate(   (OS_TCB *)         &PrintfTaskTCB,
135                     (CPU_CHAR *)       "Printf test task",
136 (OS_TASK_PTR)      Printf_task,
137                     (void *)           0,
138 (OS_PRIO)          Printf_TASK_PRIO,
139                     (CPU_STK *)        &Printf_TASK_STK[0],
140                     (CPU_STK_SIZE)     Printf_STK_SIZE/10,
141 (CPU_STK_SIZE)     Printf_STK_SIZE,
142                     (OS_MSG_QTY)       0,
143                     (OS_TICK)          0,
144                     (void *)           0,
145                     (OS_OPT)           OS_OPT_TASK_STK_CHK|OS_OPT_TASK_STK_CLR,
146                     (OS_ERR*)          &err
147 );
148     
149     //OS_TaskSuspend((OS_TCB*)&StartTaskTCB,&err);        //挂起"start_task"任务
150     OS_CRITICAL_EXIT();    //退出临界区
151     OSTaskDel((OS_TCB *)0,&err);//删除任务自身;(第一个参数填写0,就是删除任务自身,要是填写别的任务的控制块,那就是删除别的任务)
152 }
153 
154 //*******************************************************************************
155 
156 //具体3个任务
157 
158 //*******************************************************************************
159 
160 //"Led0_task"任务:
161 void Led0_task(void *p_arg)
162 {
163 OS_ERR err;
164     p_arg = p_arg;          //故意使用一下这个参数,否则编译器会警告说此参数没有使用
165     while(1)
166 {
167         LED0=~LED0;
168         OSTimeDlyHMSM(0,0,0,300,OS_OPT_TIME_HMSM_STRICT,&err);
169 }
170 }
171 
172 //"Led1_task"任务:
173 void Led1_task(void *p_arg)
174 {
175 OS_ERR err;
176     p_arg = p_arg;          //故意使用一下这个参数,否则编译器会警告说此参数没有使用
177     while(1)
178 {
179         LED1=~LED1;
180         OSTimeDlyHMSM(0,0,0,300,OS_OPT_TIME_HMSM_STRICT,&err);
181 }
182 }
183 
184 //"Printf_task"任务:
185 void Printf_task(void *p_arg)
186 {
187 OS_ERR err;
188 CPU_SR_ALLOC();
189     p_arg = p_arg;          //故意使用一下这个参数,否则编译器会警告说此参数没有使用
190     while(1)
191 {
192         OS_CRITICAL_ENTER();    //进入临界区
193         printf("Hello World!
");
194         OS_CRITICAL_EXIT();        //退出临界区
195         delay_ms(300);
196         OSTimeDlyHMSM(0,0,0,300,OS_OPT_TIME_HMSM_STRICT,&err);
197 }
198 }

免责声明:文章转载自《UCOSIII任务创建》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇cJSON库源码分析解决腾讯云服务器 LNMP 环境无法发送邮件问题下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

unity行为树简介

目前在Unity3D游戏中一般复杂的AI都可以看到行为树的身影,简单的AI使用状态机来实现就可以了,所以这里我也是简单的学习下,为以后用到做准备。 行为树的概念出现已经很多年了,总的来说,就是使用各种经典的控制节点+行为节点进行组合,从而实现复杂的AI。 Behavior Designer插件里,主要有四种概念节点,都称之为Task。包括: (1)Comp...

FPU:fldpi,fmul等指令说明

协处理器共有68条不同的指令,汇编程序在遇到协处理器指令助记符时,都会将其转换成机器语言的ESC指令,ESC指令代表了协处理器的操作码。 协处理器指令在执行过程中,需要访问内存单元时,CPU会为其形成内存地址。协处理器在指令执行期间内利用数据总线来传递数据。80287协处理器利用I/O地址00FAH~00FFH来实现其与CPU之间的数据交换,而80387~...

c语言运算符

1.运算符概述 运算符是一种编译器执行特定的数学或逻辑操作的符号。C语言提供了以下类型的运算符: 算术运算符 关系运算符 逻辑运算符 位运算符 赋值运算符 条件运算符 其他运算符 2.算术运算符 算术运算符分为单目运算符和双目运算符,单目运算符表示只需要一个操作数,双目运算符需要两个操作数。 2.1 双目算术运算符 1)+ :加法,把两个操作数相加...

LinuxC下获取UDP包中的路由目的IP地址和头标识目的地址

在接受到UDP包后,有时候我们需要根据所接收到得UDP包,获取它的路由目的IP地址和头标识目的地址。 (一)主要的步骤: 在setsockopt中设置IP_PKTINFO,然后通过recvmsg来获取struct in_pktinfo(struct in_pktinfo是struct msghdr中msg_control的成员).in_pktinfo 结构...

iOS 编译过程原理(2)

一、前言 《iOS编译过程的原理和应用》文章介绍了 iOS 编译相关基础知识和简单应用,但也很有多问题都没有解释清楚: Clang 和 LLVM 究竟是什么 源文件到机器码的细节 Linker 做了哪些工作 编译顺序如何确定 头文件是什么?XCode 是如何找到头文件的? Clang Module 签名是什么?为什么要签名 为了搞清楚这些问题,我们来挖...

(案例5)软中断导致 CPU 使用率过高

前言 软中断基本原理,可参考这篇博客:https://www.cnblogs.com/uestc2007/p/14684499.html 中断 一种异步的事件处理机制,用来提供系统的并发处理能力 当中断事件发生,会触发执行中断处理程序 中断处理程序分为上半部和下半部 上半部:硬中断,快速处理中断 下半部:软中断,用来异步处理上半部未完成的工作  软...