UCOS的任务创建和删除

news2025/1/12 3:58:55

一、任务创建和删除的API函数

1、任务创建和删除本质就是调用uC/OS的函数

API函数

描述

OSTaskCreate()

创建任务

OSTaskDel()

删除任务

注意:

1,使用OSTaskCreate() 创建任务,任务的任务控制块以及任务栈空间所需的内存,需要由用户手动分配并提供。当任务被创建好后,就会立马处于就绪态 。

2,使用OSTaskDel() 删除任务。当不再需要某一任务时,可以使用此函数来删除任务。删除任务并不会删除任务的代码或释放任务栈,仅代表该任务的代码和任务栈都不再由µC/OS-III 内核管理 。

2、任务创建函数

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,                                                             /* 任务选项共有5 */ 
  OS_ERR*   p_err                                                         /* 指向接收错误代码变量指针 */ 

);

3、任务控制块结构体成员介绍 

注意:每个任务都有属于自己的任务控制块,类似于身份证

任务栈栈顶,在任务切换时与任务的上下文保存、任务恢复息息相关

 二、任务创建函数的参数介绍

1、opt

OS_OPT                         opt,                                    /* 任务选项共有5 */ 

Opt(任务选项)

描述

OS_OPT_TASK_NONE

没有选项

OS_OPT_TASK_STK_CHK

是否允许对任务进行堆栈检查

OS_OPT_TASK_STK_CLR

是否需要清除任务堆栈

OS_OPT_TASK_SAVE_FP

是否保存浮点寄存器

OS_OPT_TASK_NO_TLS

不需要对正在创建的任务提供 TLS(线程本地存储)支持

 2、p_err

 OS_ERR*                       p_err                            /* 指向接收错误代码变量指针 */

p_err(错误代码)

描述

OS_ERR_NONE

任务创建成功

OS_ERR_ILLEGAL_CREATE_RUN_TIME

定义了 OS_SAFETY_CRITICAL_IEC61508,且
OSStart( )之后非法地创建内核对象

OS_ERR_PRIO_INVALID

非法的任务优先级数值

OS_ERR_STAT_STK_SIZE_INVALID

任务栈在初始化期间溢出

OS_ERR_STK_INVALID

指向任务栈起始地址的指针为空

OS_ERR_STK_SIZE_INVALID

任务栈小于配置项 OS_CFG_STK_SIZE_MIN

OS_ERR_STK_LIMIT_INVALID

任务栈警戒线大小,大于或等于任务栈大小

OS_ERR_TASK_CREATE_ISR

在中断中非法地创建任务

OS_ERR_TASK_INVALID

指向任务函数的指针为空

OS_ERR_TCB_INVALID

指向任务控制块的指针为空

 注意如果p_ tcb代入的参数为NULL,则代表删除任务自身(当前正在运行的任务)

三、UCOS的任务创建流程

1、创建任务的流程如下

创建成功的任务会立刻进入就绪态,由任务调度器调度运行。

注意:

(1)、 在调用任何关于UCOSIII函数之前必须先初始化UCOSIII,仅初始化一次即可。调用函数:OSInit( )

(2)、任务在创建之后是不会直接运行的,需开启任务调度器,任务才能得以运行。调用函数: OSStart( )

四、任务创建和删除

1、寄存器xPSR被初始为0x01000000,其中bit24被置1,表示使用Thumb指令

 2、寄存器PC被初始化为任务函数指针vTask_A,这样当某次任务切换后,任务A获得CPU控制权,任务函数vTask_A被出栈到PC寄存器,之后会执行任务A的代码

 3LR寄存器初始化为函数指针OS_TaskReturn ,这是由移植层提供的一个出错处理函数。

 4、子函数的调用通过寄存器R0~R3传递参数,创建任务时,我们传入的参数被保存到R0中,用来向任务函数传递参数

 

 堆栈大小的设置:

必须考虑任务调用的所有函数的嵌套、任务调用的所有函数要分配的局部变量以及所有嵌套中断服务例程的堆栈要求。此外,如果处理器具有 FPU,堆栈必须能够存储所有 CPU 寄存器,包括浮点单元 (FPU) 寄存器

CPU_Init( )的作用:

(a) 初始化CPU时间戳

(b) 初始化CPU中断禁用的时间测量

(c) 初始化CPU主机名

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

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

相关文章

基于SpringBoot的流浪动物管理系

基于SpringBoot的流浪动物管理系的设计与实现,前后端分离 开发语言:Java数据库:MySQL技术:SpringBootMyBatisVue工具:IDEA/Ecilpse、Navicat、Maven 系统展示 首页 后台登陆界面 管理员界面 摘要 基于Spring Boot的…

常见的几种排序方式

常见的几种排序方式 1. 排序的概念2. 常见排序算法的实现2.1 插入排序2.1.1基本思想2.1.2 直接插入排序2.1.3 希尔排序( 缩小增量排序 ) 2.2 选择排序2.2.1基本思想2.2.2 直接选择排序:2.2.3 堆排序 2.3 交换排序2.3.1冒泡排序2.3.2 快速排序 2.4 归并排序2.4.1 基本思想2.4.2 …

力扣-383.赎金信

Idea 使用一个hashmap 或者一个int数组存储第二次字符串中每一个字符及其出现的次数 遍历第一个字符串,讲出现的重复字符减1,若该字符次数已经为0,则返回false AC Code class Solution { public:bool canConstruct(string ransomNote, strin…

最短路径专题3 最短距离-多边权

题目: 样例: 输入 4 5 0 2 0 1 2 1 0 2 5 1 0 3 1 2 1 2 1 6 3 2 2 3 输出 3 5 思路: 根据题目意思,其实还是Dijkstra 的题目,不同的是,多了一个最少花费边权的这个点,多添加一个spend数组&am…

【Maven基础篇-黑马程序员】Maven项目管理从基础到高级,一次搞定!

文章目录 前言Maven简介Maven是什么Maven的作用 Maven的下载与安装Maven基础概念仓库坐标仓库配置全局setting与用户setting区别 第一个Maven程序(手工制作)第一个Maven程序(IDEA生成)使用模版(骨架)创建Ma…

(C++版)ROS2 bind函数解读

在ros2的发布者节点里面有这么一句话:估计没有学过C的人不太理解,这里我就发发好心帮忙解读一下timer_ this->create_wall_timer(500ms, std::bind(&MinimalPublisher::timer_callback, this)); timer_ this->create_wall_timer(500ms, std…

Java - 基本数据类型和封装类型

基本类型有默认值,而包装类型初始为null。然后再根据这两个特性进行分业务使用,在阿里巴巴的规范里所有的POJO类必须使用包装类型,而在本地变量推荐使用基本类型。 Java语言提供了八种基本类型。六种数字类型(四个整数型&#xff…

BP神经网络的MATLAB实现(含源代码)

BP(back propagation)神经网络是1986年由Rumelhart和McClelland为首的科学家提出的概念,是一种按照误差逆向传播算法训练的多层前馈神经网络,是应用最广泛的神经网络模型之一 具体数学推导以及原理在本文不做详细介绍,本文将使用MATLAB进行B…

ASUS (k013) ME176CX不进入系统恢复出厂设置的方法

k013 me176cx ASUS k013 ME176CX不进入系统恢复出厂设置的方法 当忘记系统密码或系统异常导致无法进入系统时,可以按以下步骤尝试不进入系统恢复出厂设置来解决。 注意:执行恢复出厂设置前,请先将资料备份至外接设备,否则资料都…

十四天学会C++之第三天(数组和字符串)

1. 数组的定义和初始化 数组是一种由相同数据类型的元素组成的集合,这些元素按照一定的顺序存储在连续的内存位置上。数组的大小在创建时是固定的,无法在运行时改变。 在C中,数组的定义和声明非常简单。定义一个数组: 数据类型…

基于被囊群优化的BP神经网络(分类应用) - 附代码

基于被囊群优化的BP神经网络(分类应用) - 附代码 文章目录 基于被囊群优化的BP神经网络(分类应用) - 附代码1.鸢尾花iris数据介绍2.数据集整理3.被囊群优化BP神经网络3.1 BP神经网络参数设置3.2 被囊群算法应用 4.测试结果&#x…

实验四 内核线程管理-实验部分

目录 一、知识点 1.进程 1.1.进程定义 1.2.内存中的进程 1.3.进程的组成 1.4.进程的特点 1.5.进程与程序的联系 1.6.进程与程序的区别 2.进程控制块 2.1.进程控制块的使用 2.2.进程控制信息 2.3.进程控制块的组织 3.线程 3.1.为什么引入线程? 3.2.线…

XXPermissions权限请求框架

官网 项目地址:Github博文地址:一句代码搞定权限请求,从未如此简单 框架亮点 一马当先:首款适配 Android 13 的权限请求框架简洁易用:采用链式调用的方式,使用只需一句代码体积感人:功能在同类…

智慧公厕整体解决方案,厕所革命实施方案的范本

随着城市化进程的不断加快,智慧城市应用正成为未来城市发展的重要方向。其中,智慧公厕作为城市基础设施的重要组成部分,其建设范本已经成为各建设中的智慧城市不可或缺的重要内容。那么,如何打造智慧公厕整体解决方案?…

C语言判断语句

判断结构要求程序员指定一个或多个要评估或测试的条件,以及条件为真时要执行的语句(必需的)和条件为假时要执行的语句(可选的)。 C 语言把任何非零和非空的值假定为 true,把零或 null 假定为 false。 下面…

【C++】设计模式之——建造者

建造者模式概念模拟实现建造者模式代码实现 建造者模式 首先先大体了解一下,建造者模式是什么意思,它是怎么实现的? 首先,建造者模式是一种创建型设计模式再一个它是使用多个简单的对象一步一步的搭建出一个复杂的对象它可以将一个…

【已解决】RuntimeError Java gateway process exited before sending its port number

RuntimeError: Java gateway process exited before sending its port number 问题 思路 🎯方法一 在代码前加入如下代码(如图): import os os.environ[‘JAVA_HOME’] “/usr/local/jdk1.8.0_221” # 记得把地址改成自己的 …

MQTT 服务器搭建(基于mosquitto)

1、前言 MQTT(Message Queuing Telemetry Transport,消息队列遥测传输协议),是一种基于发布/订阅(publish/subscribe)模式的"轻量级"通讯协议,该协议构建于TCP/IP协议上,…

【pwn入门】用gdb实现第1个pwn

声明 本文是B站你想有多PWN学习的笔记&#xff0c;包含一些视频外的扩展知识。 有问题的源码 #include <stdio.h> #include <stdlib.h> #include <unistd.h> char sh[]"/bin/sh"; int func(char *cmd){system(cmd);return 0; }int main(){char …

3.Tensors For Beginners- Forward and Backward Transformations

张量在不同坐标系之间来回移动的规则究竟如何。 之前说过&#xff0c;张量在坐标系变化下是不变的&#xff0c;故了解如何在坐标系之间来回移动对理解张量很重要。 Forward&#xff1a;旧基 到 新基 old basis&#xff1a;旧基 这是在二维坐标系下的两组基。 线性代数中的基…