嵌入式实时操作系统ucosii原理及应用(任哲)-- --阅读笔记2

2023-05-16

本文是《嵌入式实时操作系统ucosii原理及应用(任哲)》一书第三章的阅读笔记,知识点多为摘录,若希望深入了解,请购买该书认真研读。由于一些知识比较零散,记起来不大方便,又习惯画图辅助记忆,刚好想起一款比较好用的思维导图,就顺手拿来用一用了(绝非打广告),导图中包含部分备注。

脑图链接及密码:http://naotu.baidu.com/file/c550d674fa54bd29588c31c5bd682f4f?token=8e71f5732699f4b6 密码: v6um

可以看出:A)任务必须先从睡眠状态进入就绪状态,才能在合适的时机被运行;B)只能从运行状态进入中断服务状态;C)只能从运行状态进入等待状态。

前面一章我们已经讲过:大多数任务(尤其是用户任务)是一个无限循环结构,在这个循环中,系统响应中断请求,进入中断服务函数进行其他操作。但是,有时任务中的一些操作是不允许被中断打断的,为此,我们可以在任务函数程序代码中添加关中断函数和开中断函数,则在这两个函数之间的代码,执行过程不会被打断,该段代码称为临界段。ucosii中用两个宏:OS_ENTER_CRITICAL( )、OS_EXIT_CRATICAL( )分别实现关中断和开中段。从程序设计角度看,一个ucosii任务的代码就是一个C语言函数,为了可以传递各种不同类型的数据甚至是函数,ucosii把任务参数定义成了一个void类型的指针。

用户应用程序的一般结构:

在ucosii中,main函数与任务函数的地位是平等的,虽然任务是在main函数中初始化的,但是任务和main的运行与中断是由操作系统调度的,也就是说,作为程序运行的入口函数,main函数必须完成操作系统的初始化、任务的创建、操作系统的启动,最后把系统的调度权交回给操作系统。

void MyTask1(void *pdata)

{
for( ; ; )
{
//这上面的代码执行时可以被打断
OS_ENTER_CRITICAL( );
//临界段
//这中间执行的代码不可以被打断
OS_ENTER_CRITICAL( );
}
}
void MyTask2(void *pdata)
{
for( ; ; )
{
//这上面的代码执行时可以被打断
OS_ENTER_CRITICAL( );
//临界段
//这中间执行的代码不可以被打断
OS_ENTER_CRITICAL( );
}
}
void main(void)
{
OS_Init( );

OSTaskCreate(MyTask1,...);
OSTaskCreate(MyTask2,...);

OS_Start( );
}

操作系统运行时,一定有某段时间处于空闲状态,但是CPU是不可以停下来的,除非断电。为此,ucosii定义了两个系统任务:空闲任务和统计任务。空闲任务是用户应用程序必须使用的,统计任务是用户程序可选择使用的。

//操作系统定义的空闲任务

void OS_TaskIdle(void *pdata)
{
#if(OS_CRITICAL_METHOD == 3)
OS_CPU_SR cpu_sr;
#endif

//部分C编译器会对定义了却没有使用的变量报错
pdata = pdata;

for( ; ; )
{
OS_ENTER_CRITICAL( );
OSIdleCtr++; //记录空闲任务运行次数
OS_EXIT_CRITICAL( );

//一般还会加上下面这个函数,用户可以在该函数中写用户希望执行的代码
//一般函数内写的是让CPU进入低功耗模式的指令
//该函数总是处于就绪状态的
OSTaskIdleHook( );
}
}

至于统计任务,该任务每秒计算一次CPU在单位时间内被使用的时间,并把计算结果以百分比的形式存放在变量OSCPUsage中,从而使得应用程序可以了解CPU的利用率。

当不同任务同时需要运行时,系统利用优先级判断哪个先执行,由于大多数情况下任务数少于64个,用户可以通过修改OS_CFG.h文件的OS_LOWEST_PRIO来确定最低优先级(优先级为:0~OS_LOWEST_PRIO)。OS_LOWEST_PRIO赋给空闲任务,如果用户使用了统计任务,系统还会把(OS_LOWEST_PRIO-1)赋给统计任务,用户可以使用的优先级范围为:0~OS_LOWEST_PRIO-2,在创建任务时,用户必须指定任务的优先级(指定OSTaskCreate( )第四个参数)。

任务堆栈:任务的运行环境,在程序设计上体现为一数组,出栈入栈遵循LIFO后进先出的原则。任务堆栈的定义:宏定义设置堆栈存储单位(可理解为数据类型)type、宏定义设置堆栈大小size、用type定义大小为size的数组用作任务堆栈。

任务的定义:使用系统函数OSTaskCreate(指向任务代码的指针,传递给任务的参数,任务堆栈的栈顶指针,任务优先级),需要提醒的是,处理器不同,栈的生长方向不同,stm32f103的栈生长方向是从高地址到低地址,所以栈顶指针是堆栈数组的最后一个成员的地址。

int 16位;unsigned int 位数与操作系统相关。

任务堆栈的初始化:由于任务的运行前,CPU的各个寄存器需要预置一些原始数据,包括指向任务的指针、程序状态字PSW等,因为它们因任务不同而有差异,所以存储在任务堆栈中,创建任务时将这些值放入堆栈中称为堆栈的初始化。堆栈的初始化由OSTaskCreat( )函数调用OSTaskStkInit( )实现,用户除了在移植操作系统时修改它,基本不会接触到这个函数。

附上一篇的脑图链接及密码:http://naotu.baidu.com/file/8910fc6778b390b730a755e610790477?token=86bdf5ad5bee75c3 密码: SC2h


本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

嵌入式实时操作系统ucosii原理及应用(任哲)-- --阅读笔记2 的相关文章

随机推荐

  • Leetcode 212. Word Search II (tries树 + DFS)

    题目 xff1a Given a 2D board and a list of words from the dictionary find all words in the board Each word must be construc
  • LINUX 安装 AODV协议

    介绍 xff1a AODV协议是无线自组网中主动路由协议的一种 xff0c 也是非常经典的一个协议 xff0c 但是 xff0c 在linux实际环境中却很难找到协议的实现 xff08 十几年前有一个 aodv uu 现在的内核已经不能用了
  • Leetcode 210. Course Schedule II (利用拓扑排序)

    一 题目 There are a total of n courses you have to take labeled from 0 to n 1 Some courses may have prerequisites for examp
  • 2018年,Java程序员转型大数据开发,是不是一个好选择?

    近日网上有一篇关于Java程序员职场生存现状的文章 2017年 Java 程序员 xff0c 风光背后的危机 xff0c 在Java程序员圈子里引起了广泛关注和热议 2017年 xff0c Java 程序员面临更加激烈的竞争 不得不承认 x
  • Leetcode 105 106 重构二叉树

    Leetcode上105 xff0c 106题很相似 xff0c 都是重构二叉树的题 题目 xff1a 105 Given preorder and inorder traversal of a tree construct the bin
  • LeetCode 查并集系列 朋友圈 冗余链接等

    网上有作者已经总结的很好 xff0c 这里转载一下 xff1a https www jianshu com p b81f6db6beaf 什么是并查集 一种数据结构 xff0c 用来描述集合 查 xff08 find xff09 xff1a
  • 记 7.24 阿里巴巴机试题

    题一 题目 xff1a 吃烧饼大赛 有n个盘子 xff0c 每个盘子内有s i 个烧饼 每次选取一个 x xff08 1 x n xff09 xff0c 可以吃到1 xff5e x 号盘子里的一个烧饼 若这1 xff5e x个盘子中有空盘时
  • C++ 智能指针学习

    网上找了一篇很棒的文章 转载自 xff1a https www jianshu com p bf8de014e5c2 C Java python和go等语言中都有垃圾自动回收机制 xff0c 在对象失去引用的时候自动回收 xff0c 而且基
  • 记面试遇到的一个智力题:追击问题

    一个带环的单链表 xff0c 一个快指针 xff08 每次走三步 xff09 xff0c 一个慢指针 xff08 每次走一步 xff09 xff0c 请问这两个指针可能无法相遇吗 xff1f 解 xff1a 假设慢指针入环时 xff0c 快
  • 面试经典题 手撸LRU

    1 C与C 43 43 混搭写法 struct LRUCacheNode int key int value LRUCacheNode prev LRUCacheNode next LRUCacheNode key 0 value 0 pr
  • 腾讯8.23号笔试 刷木板题 DP

    作者 xff1a 夜 xffe3 太美 链接 xff1a https www nowcoder com discuss 486642 type 61 2 来源 xff1a 牛客网 题意 有n xff08 n在5000内 xff09 块木板
  • 京东2018笔试题 神奇数

    题目 东东在一本古籍上看到有一种神奇数 如果能够将一个数的数字分成两组 其中一组数字的和等于另一组数字的和 我们就将这个数称为神奇数 例如242就是一个神奇数 我们能够将这个数的数字分成两组 分别是 2 2 以及 4 而且这两组数的和都是4
  • 绑定mac地址与网卡驱动wlan

    按照之前博客https blog csdn net Lin QC article details 90717218的配置 xff0c 我们可以在树莓派上实现双网卡 xff0c 但是再多次试验中发现 xff0c 每次重启后 xff0c 网卡的
  • 在树莓派上ROS MAVROS的安装使用

    首先 xff0c 我购买的是树莓派3B 43 xff0c 比较新款 xff0c 所以装不了太老的树莓派系统 xff0c 安装的是树莓派官方提供的Raspbian Stretch系统 树莓派系统安装过程较为简单 xff0c 且官网教程详细 x
  • APP引导页UI设计素材模板|轻松留下完美的第一印象

    App首次引导页是当你第一次打开一款应用的时候你看到的引导页 xff0c 它们在你未使用产品之前提前告知产品的主要功能与特点 先来看看 像素精简版引导UI工具包 好的实际案例 xff0c 让初学者更友好 xff01 美丽的用户界面 xff0
  • px4 offboard外部控制仿真

    官网中http dev px4 io en ros mavros offboard html xff0c 只给示例代码 xff0c 却不告诉怎么用 xff0c 实在有点坑 xff0c 还好参照网上的一些博客 xff0c 找到了使用方法 首先
  • POST和GET方法的区别与联系

    错误的一个理论就是 xff0c get是从服务器拿数据 xff0c 而post是给服务器传数据 两者其实都是从服务器端拿数据 xff0c 只是一些细节不同罢了 历史 get和post是HTTP与服务器交互的方式 xff0c 说到方式 xff
  • Dronekit 搭配使用Ardupilot 和 PX4

    Dronekit是一个与无人机飞控搭配使用 xff0c 方便开发者使用代码控制无人机 个人认为它会比搭建ros来控制无人机更容易上手一些 对于Dronekit xff0c PX4被支持的较少 xff0c 不可以进行模式切换 xff0c 而对
  • 堆栈存放什么

    此乃转载别人发表 xff0c 作为知识点保存积累 一 xff1a 概念 1 栈 xff1a 当程序进入一个方法时 xff0c 会为这个方法单独分配一块私属存储空间 xff0c 用于存储这个方法内部的局部变量 xff0c 当这个方法结束时 x
  • 嵌入式实时操作系统ucosii原理及应用(任哲)-- --阅读笔记2

    本文是 嵌入式实时操作系统ucosii原理及应用 xff08 任哲 xff09 一书第三章的阅读笔记 xff0c 知识点多为摘录 xff0c 若希望深入了解 xff0c 请购买该书认真研读 由于一些知识比较零散 xff0c 记起来不大方便