uc/OS-II操作系统:uc/OS中的任务_上(如不懂——>请收下我的膝盖)
uc/OS中任务的学习目录
注:本章未写完的在后面章节会继续书写
(1)任务的基本概念
(2)任务堆栈
(3)任务控制块及任务控制块链表
(4)任务就绪表及任务调度
(5)任务的创建
(6)任务的挂起和恢复
(7)其他任务管理函数
(8)uC/OS-II的初始化和任务的启动
涉及到的基本问题:
(1)任务的特性
(2)任务的划分目标
(3)任务的划分方法
(4)任务的可调度性分析
(5)任务的执行分类和优先级安排
(6)任务设计中的问题
(7)系统设计编码实现过程
(8)中断服务程序的设计
一、任务的基本概念
(1)复杂问题 “分而治之” 的问题解题思路。
(2)针对目标系统拆分后的 “小且易” 的问题的具体处理方法编码和数据结构 ---- 任务。
uC/OS-II的两种任务:
系统任务、用户任务。
任务的组成:
任务控制块 ---- uC/OS-II进行任务管理用的一个数据结构。
任务代码 ---- 描述任务算法的程序编码。
任务堆栈 ---- 任务的工作现场环境。
任务的组成如下图:
1、任务的五种状态
Sleep ---- 仅有编码未激活。
Ready ---- 已激活并“万事俱备,只欠调度”
Running ---- 正占用 CPU 运行自己。
Wait ---- 等待某事件发生。
ISR_Sta ---- Running状态的任务被中断后进入的状态。
2、用户任务代码的一般结构
void MyTask(void *pdata)
{ …… // 任务的初始化for ( ; ; ) //超循环构成任务体 {可被中断的用户代码片断;OS_ENTER_CRITICAL(); //进入临界区(关中断)不可被中断的用户代码片断;OS_EXIT_CRITICAL(); //退出临界区(开中断)可被中断的用户代码片断;}
}
3、用户应用程序的一般结构
注意:
(1)“用户任务” 代码形式上很像 C函数,但他不是函数!
(2)“任务” 不能被主函数 main( ) 或其他函数调用,只能被主函数或已激活任务创建。
(3)任务的运行由操作系统调度管理。
用户应用程序代码如下:
void MyTask1(void *pdata)
{ … … }
void MyTask2(void *pdata)
{ … … }
void main( )
{… …OSInit( );… …OSTaskCreate( MyTask1,… … );OSTaskCreate( MyTask2,… … );… …OSStart( );… …
}
4、应用程序的函数原型
OSInit( ) 函数原型: void OSInit( void )
OSStar( ) 函数原型: void OSStart( void )
OSTaskCreate( ) 函数原型:
INT8U OSTaskCreate(void (*task)(void *pd) , //指向任务的指针void *pdata , //传递给任务的参数OS_STK *ptos , //任务堆栈栈顶的指针INT8U prio //任务的优先级别)
(1)OSTaskCreate( ) 函数使用举例
》定义任务 task_A
void task_A(void* pdata)
{……; //任务初始化部分while (1){……; //任务功能代码}
}》在系统 “创建” 任务 task_A
void main(void)
{OSInit(); //系统初始化部分……OSTaskCreate( task_A, void * 0, &MystackTop,8);OSStart();
}
5、系统任务
统计任务(OSTaskStat( ))使用说明:1、功能完成用户任务 CPU 使用率的统计,结果以百分比的形式存放在变量 OSCPUsage中。2、该任务用户可选择使用。OS_CFG.H文件中的常数OS_TASK_STAT_EN 设置为1,使能该函数。 3、用户在OS_CFG.H中使能该任务后,系统自动创建该任务,但在用户使用统计数据前必须调用系统函数OSStatInit() 先进行初始化。4、该任务固定拥有次末任务优先级。
6、任务的优先权和优先级别
uC/OS-II 的每个任务都必须有唯一的优先级。
uC/OS-II 最多可以管理64个优先级别分配给64个任务。
uC/OS-II 中用一个8b的整型数来表示优先级别,数字越小,优先级越高,prio = 0 的任务优先级最高。
uC/OS-II 中使用任务的优先级(prio)作为任务句柄。
用户通过修改 OS_CFG.H 中的宏定义常数 OS_LOWEST_PRIO 的值,约定本用户系统的最大优先级数。
二、任务堆栈
堆栈 ---- LIFO访问原则组织的连续存储器。
任务堆栈在 uC/OS-II 中的应用:
(1)任务堆栈是任务的三大组成部分之一。
(2)保存 CPU 寄存器现场(R0~R12、LR、SPSR 等)。
(3)本Task 的私有数据。
1、任务堆栈的创建
举例:
#define MyTaskStkSize 64
OS_STK MyTaskStk[ MyTaskStkSize ] //在 OS_CPU.H中定义 OS_STK
… … // typedef INT32U OS_STK
INT8U OSTaskCreate(void (*task) (void *pd), //指向任务的指针void * pdata, //传递给任务的参数MyTaskStk[ MyTaskStkSize -1 ] //任务堆栈栈顶的指针INT8U prio //任务的优先级别)
2、任务堆栈的使用注意事项 __ 存在两种堆栈形式
(1)递减堆栈 ---- 进栈操作向小地址方向发展。
OSTaskCreate(… …&MyTaskStk[StkSize - 1],… …)
(2)递增堆栈 ---- 进栈操作向大地址方向发展。
OSTaskCreate(… …&MyTaskStk[ 0 ],… …)
备注:利用条件编译技术和 OS_CPU.H 中的宏定义常数OS_STK_GROWTH 编写易移植用户系统;“1” --- 递减堆栈 for ARM CPU。
三、任务控制块及任务控制块链表
1、任务控制块(TCB)---- 任务在系统中的身份证
(1)TCB ---- uC/OS-II 中用于记录任务信息(任务堆栈指针、任务当前状态、任务优先级别等)的数据结构。
(2)uC/OS-II 将系统中的所有 TCB 构成两个链表(OSTCBList、OSTCBFreeList)进行任务管理。
》空任务控制块链表 ---- 未被分配的 TCB 链 OSTCBFreeList。
》任务控制块链表 ---- 已分配的 TCB 链 OSTCBList。
2、任务控制块(TCB)的结构
任务控制块结构的主要成员:
typedef struct os_tcb {struct os_tcb *OSTCBNext; //指向下一个TCB的指针struct os_tcb *OSTCBPrev; //指向前一个TCB的指针OS_STK *OSTCBStkPtr; //指向任务堆栈栈顶的指针……INT16U OSTCBDly; //任务等待时间INT8U OSTCBStat; //任务的当前状态标志INT8U OSTCBPrio; //任务的优先级别 ……
} OS_TCB;
3、任务控制块链表
(1)当进行系统初始化时,初始化函数会按用户提供的任务数为系统创建具有相应数量的任务控制块并把它们链接为一个链表。
(2)由于这些任务控制块还没有对应的任务,故这个链表叫做空任务块链表。即相当于是一些空白的身份证。
uC/OS-II 中提供了系统函数 OSTaskDel( ),用于删除一个任务 ---- 实质就是将该任务的TCB从“任务控制块列表” 移到了“空任务控制块列表” 。
《任务控制块》就相当于是一个任务的身份证,没有任务控制块的任务是不能被系统承认和管理。
4、任务控制块链表其他相关系统管理变量
OSTCBPrioTbl[ ] :OS_TCB* 数据类型的数组,以 Prio 为下标存放已使能的 TCB 指针。用于加速 TCB 的访问。
OSTCBCur:全局系统变量,指向当前正在运行的任务的 TCB 。
相关代码如下:
OSTCBFreeList、OSTCBList
OSTCBTbl[ ] ---- OSInit()建立的任务控制块数组
OSTCBPrioTbl[ ] ---- 任务控制块优先级数组
OSTCBCur
四、本章《任务_上》已经完结,《任务_下》会在后面继续更新
uc/OS-II操作系统:uc/OS中的任务_上(如不懂——>请收下我的膝盖)相关推荐
- uc/OS-II操作系统:uc/OS中的任务_下(如不懂——>请收下我的膝盖)
注:本章接着上一章节书写 六.任务的挂起和恢复 (1)挂起一个任务,就是暂停这个任务的调度. (2)挂起任务的 TCB 还存在系统中,只是该任务的状态是 "挂起" ,对挂起态的任务 ...
- 【 uC/OS II 】uC/OS II 源代码阅读(os_task.c)任务管理
前言 这个任务管理源代码,是整个系统最核心的部分,也是最难的部分,多看几遍吧.其中的核心结构体是: typedef struct os_tcb {OS_STK *OSTCBStkPtr; /* Poi ...
- 【 uC/OS II 】uC/OS II 源代码阅读(os_mbox.c)消息邮箱
前言 关于消息邮箱,是一个消息邮箱里面,只能存储一条消息.核心结构体如下: #if (OS_EVENT_EN) && (OS_MAX_EVENTS > 0u) typedef s ...
- python批量修改文件名为excel中指定名称_在Python脚本的帮助下,使用excelsh中的名称映射重命名文件夹中的文件名...
在一个文件夹中有许多CSV文件我想重命名.有一个excel工作表,其中包含要重命名为文件夹的文件名.在 文件夹中的文件名为 测试数据?30四月.csv在 测试数据?20四月.csv在 测试数据18四月 ...
- 【学习编程】献给迷茫中的你,教你如何快速入门编程,如何从编程小百到 IT 巨佬?零基础自学请收下这份学习指南(经验分享)
导语 编程初学者可能都思考过这个问题: "我该怎么学编程?我要选择哪门编程语言比较适合我呢?......" 今天小编教大家认识编程语言,了解编程语言. 我们已经迈进了崭新的2023 ...
- 自定义UI控件:继承UIlabel,使label中的文字居上,居中,居下
一般来说,在ios里面label中的文字垂直方向上是默认居中的,如果想要设置居上或者居下,在xib文件里面不能设置,只能自定义一个UI控件. label文字的水平位置,可以在xib文件中直接设置. i ...
- JAVA中useDrlimiter方法_今天来讲讲分布式环境下,怎么达到对象共享,以及实现原子性(atomic),以Redis中的Redisson为例(实现分布式锁、分布式限流等)...
相信各位对redis肯定是不陌生的,一个高吞吐量的内存型结构存储数据库.可用用于很多业务场景,能够有效的解决很多复杂的并发问题,分布式问题. 下面粘一下中文官网介绍: 关于解决对象共享问题,很多方式, ...
- UART0串口编程(四):UART0串口编程之在UC/OS—II中遭遇的危机
UART0串口编程之在UC/OS-II中遭遇的危机 一.潜在的危机 1.在uc/os操作系统中设计串口编程时,由于ISR和多个任务并发执行,情况比较复杂.尤其是接收状态为被动状态时,只能靠串行口中断来 ...
- Lab 6:uC/OS II
为什么80%的码农都做不了架构师?>>> 目标: 移植uC/OS II到RPi上,实现两个任务的调度.这两个任务能轮流点亮LED,并通过串口发送消息表明自己正在运行 具体步骤: ...
最新文章
- ngx_pagespeed加速nginx
- 【正一专栏】新赛季欧冠小组赛猜想
- Android微信视频播放填坑指南
- 模板类出现外部符号无法解析错误
- 基于块的纹理合成 matlab程序,基于块的纹理合成方法和装置制造方法
- [译]Vue 2.0的变化(一)之基本API变化
- c语言入门经典(第5版)pdf
- python查看opencv版本
- 蘑菇租房java,租房经历总结-----我是如何2天找到合适租房的(房东直租)简单粗暴...
- 德国是2018世界杯夺冠最大热门? Python数据分析来揭开神秘面纱…
- Python MD5值破解
- 360顽固木马专杀工具 千万别用
- B. 在哈尔滨的寒风中
- mysql gh ost 对比_GitHub开源MySQL Online DDL工具gh-ost参数解析
- matlab显示图像全黑,请教!彩色图像显示出来怎么是全黑的?
- 0208中年发福,需要更加注意保持身材
- 【数据挖掘】关联规则的术语及定义
- 百度统计工具是什么?百度统计工具有什么用呢?
- 投弃式海洋仪器设备(XBT/XCTD)
- Shell编程-02-正则表达式