找回密码
 注册

QQ登录

只需一步,快速开始

搜索

STM32之uCOS-II基础、移植、创建任务 stm32工程模板源码

[复制链接]
路漫漫 发表于 2020-6-28 17:44:28 | 显示全部楼层 |阅读模式

word格式文档、stm32工程模板源码下载

stm32 ucos新建工程模板.zip (581.42 KB, 售价: 2 E币)

uCOS-II源码.zip (94.6 KB)

STM32之uCOS-II基础、移植、创建任务.docx (1000.62 KB, 售价: 2 E币)

5.1 uCOS-II操作系统

5.1.1 什么是操作系统

              《1》管理软件硬件的程序集合。

              《2》软硬件的沟通桥梁。

238.001.jpg

举个栗子:当你要播放音乐时,假设是电脑,装的是Window操作系统,步骤如下:

  • 打开酷狗音乐软件
  • 找需要播放的歌曲
  • 点击播放

这时,你就能听到优美动听的歌曲了。但底层操作是如何操作的呢?是谁操作呢?

是操作系统帮你完成了这一切工作。当你点击播放,操作系统工作流程如下:

  • 当你点击播放按钮,操作系统读取你需要播放歌曲的源文件(mp3文件)
  • 操作系统调用音乐解析驱动,解析你的mp3文件,转成播放器(喇叭)认识的二进制文件。
  • 操作系统把解析好音乐的二进制文件,发送给播放器(硬件设备),若此时音乐播放器,一切都准备就绪了,就可以播放音乐了。

总结,对硬件的操作,由操作系统来完成,操作系统直接与硬件交互。用户如果想控制底层硬件,必须经过操作系统进行间接控制,操作系统提供系统调用给用户,用户就可以与硬件交互了。系统调用是封装了操作各部分硬件的API。


5.1.2 为什么要使用操作系统

              《1》屏蔽硬件。使应用程序不依赖硬件,提高了程序的可移植性。

              《2》多任务。因为消费者想同时聊QQ、聊、看电视剧等。早期单核CPU想完成这些功能,就需要使用操作系统,实现不同任务之间高速的切换。

238.002.jpg


5.1.3 操作系统分类

              《1》分时操作系统:以时间片为基本调度原则。给每个任务分配一段固定的CPU时间,时间到就切换下一个任务,时间不到不切换任务。如:Windows—95/98,Linux内核2.6以前。

              《2》实时操作系统:以优先级为基本调度原则。不是给每个任务分配一段固定的CPU时间,而是根据优先级分配CPU执行时间,谁优先级高,先执行谁,分配的CPU时间就多,如uCOS-II。

              《3》半实时操作系统:部分使用分时操作系统、部分使用实时操作系统。如Windows----7/8/10,Linux内核2.6以后。



5.1.3 为何学uCOS-II

《1》代码量少,容易上手。

《2》多任务,实现复杂功能

《3》提高内外功(内功:阅读代码能力 外功:编程能力)

《4》为学习其他操作系统打下基础


5.1.4 其他补充

学操作系统的难点

《1》逻辑理解、代码运行流程

《2》术语的理解、领悟

uCOS-II理解

u---微型

C---控制器

              OS—操作系统

UCOS-II代码来源

《1》官网

《2》示例代码


5.2 UCOS操作系统

5.2.1 操作系统的调度原则

《1》分时操作系统调度原则:

以时间片为基本调度原则,为每个任务分配固定的CPU执行时间,时间到,切换下一个任务,时间不到,不切换任务。

《2》实时操作系统调度原则

以优先级为基本调度原则,不是固定为每个任务分配CPU执行时间,而是根据优先级高低分配CPU时间,优先级低的分配CPU执行时间就短,优先级高的分配的CPU时间就长。



5.2.2 操作系统程序结构

《1》裸机代码

整个工程只有一个main函数,在main函数执行中只有一个真正意义上的死循环,其他死循环都是有退出条件或永远不会执行了的死循环。

《2》操作系统代码

整个工程只有一个main函数,在mian函数中,至少创建一个任务,每个任务都有一个死循环。操作系统要切换任务需要高优先级任务释放CPU使用权。


5.2.3操作系统的任务结构

《1》任务的构成:任务控制块,任务函数、任务优先级、任务栈。

《2》 任务控制块:任务先内存空间申请的一块内存空间,用于执行任务使用的,任务控制块包含、任务函数、任务优先级、任务栈。

《3》任务函数:任务的执行入口,任务的具体功能在这里实现。

《4》任务优先级:任务的能执行的唯一标识。用来规定任务的执行先后顺序。

《5》任务栈:保存任务在切换过程中的现场信息。任务在切换前,把当前执行任务的现在信息保存在栈中,该过程称为压栈,当执行完其他任务完后,又切换回来,读取栈里面保存的现场信息,继续执行任务,该过程称为弹栈。

238.003.jpg

简单理解:在栈中进入一个元素,称为压栈或入栈,出来一个元素称为弹栈或出栈。

5.2.4 操作系统的任务切换

在哪些情况下,会进行任务切换?

  • 心跳节拍到达的时候会进行切换。心跳节拍来源于系统滴答时间,所以用Tick表示心跳节拍。
  • 调用任务调度函数。用操作系统内核进行调用。

5.2.5 操作系统的任务中断

与裸机编程中断基本一致,但需要注意两点

  • 在操作系统的中断服务函数的第一句代码,调用一个函数,目的是告诉操作系统当前进入中断功能。
  • 在操作系统的中断服务函数的最后一句代码,调用一个函数,目的是告诉操作系统当前退出了中断功能。

裸机中断与ucos中断的深入理解

  • 裸机中断,中断后会返回原点,原点就是主栈。从中断栈切换回到主栈。
  • ucos中断,中断后不一定返回原点,因为返回前有任务调度,如果中断完后,有任务优先级高过当前任务,当前任务就失去了CPU的使用权。

5.2.6 操作系统的任务状态

《1》停止/休眠态:任务创建之前和删除之后的状态。

《2》就绪态:任务具有了可执行条件。

《3》运行态:任务得到了CPU的使用权。

《4》等待/挂起态:任务被挂起或等待某件事情发生。

《5》中断态:正在执行的任务,被中断了。

任务状态转换关系如下图:

238.004.jpg

5.3 创建UCOS工程模板

5.3.1 获取UCOS源码

238.005.jpg

官网太卡了,所以给你准备UCOS例程,如下。

238.006.jpg

5.3.2 UCOS过程文件分析

238.007.jpg

238.008.jpg

238.009.jpg

5.3.3 新建UCOS工程

238.010.jpg

238.011.jpg

238.012.jpg 238.013.jpg

238.014.jpg

238.015.jpg

238.016.jpg


5.3.4 创建一个任务

238.017.jpg

238.018.jpg

238.019.jpg

5.3.5 补充、小结

移植Ucos-II总结:

配置基本流程:

《1》找到Ucos-II源码(来源:官网、例程、别人的代码、自己的代码)

《2》添加到过程文件中,添加对应头文件

《3》编写系统滴答定时器,开启中断模式

《4》编写滴答中断服务函数

《5》编写主函数

主函数编写流程:

  • 系统滴答初始化
  • 串口初始化(用于调试)
  • 操作系统初始化
  • 创建任务
  • 启动操作系统
  • 实现任务函数

关于延时OSTimeDly(100);?

一次系统滴答为5ms,所以写100,就是500ms。


关于任务函数OSTaskCreate(Task0,NULL,&stack0[TASK0_STK_SIZE-1],TASK0_PRI);?

  • 第一个参数为一个函数的名字(实现任务的函数的名字)
  • 传给实现任务函数的参数(形参)
  • 任务栈栈顶(高地址、数组最后一个元素)
  • 优先级(0-61中间的选一个,63留给了空闲任务、62留给了统计任务)


您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|手机版|小黑屋|ELEOK |网站地图

GMT+8, 2024-4-25 14:34

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表