UCOS-II 系统的原理和任务-学习日(1)

2023-05-16

写在前头

本人嵌入式小辣鸡,本着好记性不如烂笔头的懒惰想法,在网上码起字来。说的容易,还是光看,然后想一想舒服,不过这样也是容易忘得很快。写下自己的想法,和感受更有助于巩固,和以后的复习。所以决定动起手指。敲出来。如笔记中有理解错误,逻辑混乱不流畅的地方,欢迎大牛指正讨论,私信交流。不接受批评!

学习参考资料
《正点原子STM32F428UCOS开发手册》-原子哥
《嵌入式实时操作系统UCOS-II原理及应用》-任哲

关于UCOS-II

1.ucos-ii是一个可剥夺型内核的实时操作系统,以stm32来说,使用系统滴答定时器,定时产生一个时钟节拍,来推动任务的调度,管理,切换等。

关于系统大概的运行原理

2.当产生一个时钟节拍时,如果有比当前运行任务优先级更高的任务就绪,那么优先级(“优先级”为0时优先级最高)高的任务抢占CPU,CPU保存现场环境,放入该任务堆栈中。再将优先级高的任务的堆栈中的现场环境取出来,写入CPU寄存器中。(CPU中的寄存器暂时还没有仔细去研究)。当这个任务执行进入延时,或是要等待某个时间或者信号量。那么它将放弃CPU的使用权,系统会从任务就绪表中,把优先级最高的且就绪状态的任务赋予CPU的使用权。至此来推动整个系统,调度所有的任务。

不发生中断时UCOS系统时间与任务的切换UCOS系统原理
①.假设当前运行的任务是低优先级的任务,CPU程序寄存器中存在的一些寄存器都是低优先级的任务

②当程序运行到检测到高优先级的任务进入就绪状态的时候,此时CPU发送一些命令,把CPU当前的一些程序寄存器的内容复制到低优先级任务的堆栈中。也就是1过程。

③.此时通过刚刚的就绪表的机制,可以从程序中得到最高优先级的任务,也就是2过程=

④.最后的过程3就是把刚刚的高优先级任务的堆栈指针复制到CPU的程序寄存器当中,实现任务的切换。Alt

当有中断时,UCOS系统的执行原理

当程序正在执行一个中断服务函数时,发生一个系统滴答中断,因为系统滴答定时器的优先级高,所以会中断这个中断服务函数执行任务切换。而有些时候,中断时不能延时的。例如接收数据时,会发生接收错误。造成严重的后果。

在这里插入图片描述
这时,就有下图中的操作,可以避免。

PendSV异常(我称它为中断)编程为最低的优先级中断。如果某个中断正在执行,而系统滴答抢占了它,那么这个中断将悬起一个PendSV中断,来缓期执行任务切换。
在这里插入图片描述

UCOS的任务切换时间可以在os_cfg.h中去设置OS_TICKS_PER_SEC宏UCOS任务数等配置也可以在该文件中去寻找。

UCOS-II主要提供服务

内存管理
多任务管理
外围资源管理

关于Make 与编译

书中有讲这一块,所以我也记录下我的理解
由于我平时都用keil这样的集成开发环境,之前也有学习过一段时间的linux,但是对编译,makefile这些理解的还是不是很好。
编辑makefile 来将源文件和包含的头文件编译成需要的.obj文件,然后再将这些.obj文件链接成,想要生成的程序。关于makefile好像每一种编译器都有自己的makefile规则和命令,因为以前学习GCC编译器和现在书上看到的BCC编译器写的makefile好像不太一样。我也没有去深究。
所以还是集成开发环境好,工具还是怎么方便怎么来。需要学习的原理的时候再去理解,实际的应用中用自己写的Makefile去编译文件怕是石乐志哦。

UCOS的任务

任务三要素(我理解的)

任务控制块

OSTaskCreate((void()(void))start_task,
//任务函数
(void*)0,
//传递给任务函数的参数
(OS_STK*)&START_TASK_STK[START_STK_SIZE-1],
//任务堆栈的栈顶
(INT8U)START_TASK_PRIO,
//任务的优先级

主要包含了任务的栈顶地址
如果处理器的堆栈是高地址向下生长的那么栈顶地址是(OS_STK*)&START_TASK_STK[START_STK_SIZE-1],
如果堆栈是低地址向上生长的那么栈顶的地址是
(OS_STK*)&START_TASK_STK[0],
而STM32

ARM微处理器支持这四种类型的堆栈工作方式,即:
ARM-Thumb过程调用标准和ARM、Thumb C/C++ 编译器总是使用Full descending 类型堆栈。
◎ Full descending 满递减堆栈 堆栈首部是高地址,堆栈向低地址增长。栈指针总是指向堆栈最后一个元素(最后一个元素是最后压入的数据)。

◎ Full ascending 满递增堆栈
堆栈首部是低地址,堆栈向高地址增长。栈指针总是指向堆栈最后一个元素(最后一个元素是最后压入的数据)。

◎ Empty descending 空递减堆栈
堆栈首部是低地址,堆栈向高地址增长。栈指针总是指向下一个将要放入数据的空位置。

◎ Empty ascending 空递增堆栈
堆栈首部是高地址,堆栈向低地址增长。栈指针总是指向下一个将要放入数据的空位置。

任务的优先级(任务的优先级是唯一的),

任务的堆栈大小

任务堆栈

用于相应中断和任务切换时,保存CPU寄存器的内容及任务调用其他函数时,使用。

任务代码

没啥好说的

任务

UCOS的任务有64个任务。任务分两种,一种系统任务,一种用户任务。
系统任务有两个一个是空闲任务,一个是系统统计任务。

空闲任务什么都不做,只在里面对一个数值进行++,我们写代码的时候可以根据系统空闲是的时候来决定让CPU来做什么,来改写UCOS的这个空闲任务

系统统计任务,在里面统计了CPU的使用率

**任务有就绪状态等待状态运行状态睡眠状态中断服务状态这几个状态
就绪状态,就是在任务就绪表里面登记好,随时准备抢占CPU使用权的任务
等待状态,就是在等待某一信号量或邮箱消息或消息队列的任务
运行状态,就是正在使用CPU的任务
睡眠状态,就是被系统删除了任务控制块的任务
中断服务状态,就是正在执行的任务,相应了中断,去执行中断服务,自己暂时挂起的任务。
在这里插入图片描述

用户的任务都是无返回值,void形参的函数,需要形参的函数,用一个void指针在创建任务的时候传入。

好了巩固一下敲了一个多小时。对自己的记录,也希望可以帮到有缘人。

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

UCOS-II 系统的原理和任务-学习日(1) 的相关文章

  • 关于立创EDA使用的几点心得

    对于立创EDA 与AD仅为小白 xff0c 仅布过简单的双层板 xff0c 以下仅记录自己的几点心得 1 如果想要在立创商城 xff0c 嘉立创实现打板贴片一体化 xff0c 采用的普遍的两种方法 xff1a 立创EDA xff0c 有在线
  • 《当下即是生活》季羡林——读书笔记

    目录 书籍简介 经典摘录 三思而行 满招损 xff0c 谦受益 牵就与适应 睁一只眼 闭一只眼 论压力 论恐惧 难得糊涂 春色满寰中 槐花 书籍简介 作者季羡林 本书精选季羡林关于人生活法的散文 xff0c 阐述一个人怎样活在当下 xff0
  • Python装饰器

    Python的装饰器 decorator 可以说是Python的一个神器 xff0c 它可以在不改变一个函数代码和调用方式的情况下给函数添加新的功能 Python的装饰器同时也是Python学习从入门到精通过程中必需要熟练掌握的知识 小编我
  • Python学习笔记--带参数的装饰器

    带参数的装饰器 装饰器的副作用柯里化functools带参数的装饰器多参数小结 装饰器的副作用 def fn 39 39 39 this is fn 39 39 39 help fn 结果 xff1a Help on function fn
  • 六、51单片机之定时器/计数器_理论

    1 什么是定时器 计数器 定时器就是单片机设定一个时间间隔 xff0c 时间间隔到后通知单片机 例如设置100ms的定时器 xff0c 100ms后定时器通知单片机时间到了 1 定时器是单片机的一种内部外设 以前的单片机只有CPU 也就是只
  • 八、51单片机之蜂鸣器

    1 蜂鸣器的原理 蜂鸣器分为有源蜂鸣器和无源蜂鸣器 这里的 源 不是指电源 xff0c 而是指震荡源 1 1 无源蜂鸣器 1 早期蜂鸣器都是无源的 2 内部没有震荡电路 xff0c 无源蜂鸣器比有源蜂鸣器更便宜 3 无源蜂鸣器内部没有震荡源
  • CSS3实现loading效果

    前言 晚上躺床上刷视频的时候看到有个前端大佬写了一个loading xff0c 这是效果 xff1a loading 感觉也挺有意思哈 xff0c 要不自己也写一个 xff0c 学习 43 复习 两不误 但是又因为太晚了 xff0c 不想起
  • C#应用程序界面开发基础——窗体控制(2)——MDI窗体

    MDI窗体 单文档界面 xff08 SDI xff09 多文档界面 xff08 MDI xff09 MDI窗体的概念 MDI窗体 xff08 Multiple Document Interface xff0c 多文档界面 xff09 用于同
  • windows 10 + GTX1650 环境下基于TensorFlow的深度学习环境配置

    因论文需要 xff0c 简单的记录一个深度学习环境的配置过程 说明 xff1a 与广为应用的基于Anaconda的深度学习环境配置方法不同的是 xff0c 本文直接基于Python基础环境 43 Pycharm进行环境的配置 xff0c 不
  • TX2硬盘扩展

    TX2硬盘扩展 硬件平台 xff1a NVIDIA TX2 Samsung SSD 860EVO 系统平台 xff1a Ubuntu 18 04 LTS 安装 将硬盘连接至侧边SATA接口 扩展home 1 查看硬盘所有分区 sudo fd
  • Android手机4G网络设置ipv6

    我的卡是联通的 xff0c 所以下面截图也是联通的 xff0c 移动和电信的卡类似 xff1b 1 进入目录 xff1a 设置 移动网络 接入点名称 xff08 APN xff09 xff1b 2 点击默认的连接项 xff0c 进入详情页
  • 简单TCP编程

    1 TCP服务端 span class token macro property span class token directive hash span span class token directive keyword include
  • Redis的基本使用

    Redis简介 什么是Redis Redis是一款开源的内存数据库 xff0c 也称为键值存储 database 缓存 database 和消息队列 database 系统 它提供了丰富的数据结构和高效的操作方式 xff0c 并且支持多种编
  • Ubuntu16.04通过VNC远程桌面并开机自启动

    前置条件 xff0c 远程客户端已经安装VNC Viewer x11vnc安装 在Ubuntu 16 04中安装x11vnc xff0c 可以按照以下步骤操作 xff1a span class token comment 输入以下命令以更新
  • SpringBoot数据库读写分离

    导入maven坐标 span class token tag span class token tag span class token punctuation lt span dependency span span class toke
  • 滑模控制

    滑动模态的定义 人为设定一经过平衡点的相轨迹 xff0c 通过适当设计 xff0c 系统状态点沿着此相轨迹渐近稳定到平衡点 xff0c 或形象地称为滑向平衡点的一种运动 xff0c 滑动模态的 滑动 二字即来源于此 滑模控制的优点 xff1
  • FPGA基础之VGA(一)满屏红色

    一 项目分析 用VGA显示全屏的红色 xff0c VGA xff08 Video Graphics Array xff0c 视频图形阵列 xff09 是一种电脑显示标准 开发板采用至芯科技zx 1学习板 xff0c VGA视频显示接口是25
  • docker基础学习入门(六)------ DockerFile解析

    DockerFile是什么 Dockerfile是用来构建Docker镜像的构建文件 xff0c 是由一系列命令和参数构成的脚本 构建三步骤 xff1a 编写Dockerfile文件docker builddocker run 构建的文件什
  • C#应用程序界面开发基础——窗体控制(5)——分组类控件

    分组类控件 分组类控件有容器 xff08 Panel xff09 控件 分组框 xff08 GroupBox xff09 控件 选项卡 xff08 TabControl xff09 控件等 容器控件 容器控件是由System Windows
  • openmv4修改好的原理图和pcb文件

    openmv4修改好的原理图和pcb文件以及试验过的了 xff0c 生产过pcb文件 download csdn net download weixin 42741023 11953091

随机推荐