8.0-uC/OS-III单任务应用
1.单任务应用
app.c文件:
(1).APP_CFG.H 是用于配置的头文件。例如, APP_CFG.H 中包含的#define常量确定了任务优先级,堆栈大小,以及其他特性。
BSP.H 是 BSP 的头文件,包含了 #define 及函数原型如BSP_Init(),,SP_LED_On(), OS_TS_GET()等。
OS.H是uC/OS-III的主要头文件,包含了以下头文件:
OS_CFG.H
CPU.H
CPU_CFG.H
CPU_CORE.H
OS_TYPE.H
OS_CPU.H
(2).定义任务控制块( OS_TCB)
(3).)每个任务需要创建自己的堆栈。堆栈的数据类型必须是CPU_STK。堆栈可以被静态地分配或者通过malloc()动态地分配。没有必要释放堆栈空间,因为任务将不会被删除,堆栈将一直被使用。
(4).一个函数原型。
2.main函数:
(1). main()开始时调用一个 BSP函数用于关闭所有中断。在大部分处理器中, 中断在启动时是关闭的。 无论如何, 在启动时关闭所有的外设中断是更安全的。
( 2).调用 OSInit(),用于初始化 uC/OS-III。 OSInit()初始化内部变量和数据结构,同时产生 2个到 5个内部任务。最低程度,uC/OS-III须创建空闲任务 OS_IdleTask( ),当没有其他任务运行时就运行空闲任务。 uC/OS-III也创建时基任务。
根据配置文件中所配置的, uC/OS-III 会创建统计任务OS_StatTask()、定时器任务 OS_TmrTask()、中断队列处理任务OS_IntQTask()。
大多数的 uC/OS-III函数会通过一个指向 OS_ERR变量的指针返回一个错误代号。如果 OSInit()初始化函数运行成功,错误代号被设为 OS_ERR_NONE。如果在初始化不成功, uC/OS-III会根据执行的结果返回对应的错误代号。 参照OS.H中的错误代号。 特别的, 所有的错误代号都是以OS_ERR_作为前缀的。
OSInit()必须在uC/OS-III的其它函数之前调用.
(3) .通过调用 OSTaskCreate()创建任务。 OSTaskCreate()需要13个参数。 第一个参数是任务堆栈的地址。 {该任务堆栈的开始地址}
(4)OSTaskCreate( ) 允许给每个任务分配名字。 OS_TCB中存储了指向任务名的指针。因而任务名长度无限制,必须以空字符结尾。
(5) .第3个参数是指向任务代码的指针。典型的uC/OS-III任务是无限循环执行的如下:
(6). OSTaskCreate()的第四个参数是一个实参, 第一次被调用时OSTaskCreate()接收这个变量,传递给所创建的任务 MyTask()中的”p_arg”。
任务的参数可以是任意的指针。例如,用户可以传送数据结构等给任务。 {参数类型是void*}.
( 7) OSTaskCreate()的第五个参数是任务的优先级。优先级确立了任务间的重要性关系。参数值越小优先级越高。可以设置优先级数值为 1到OS_CFG_PRIO_MAX-2。要避免使用优先级#0和优先级OS_CFG_PRIO_MAX-1。因为这些是为 uC/OS-III 保留的。OS_CFG_PRIO_MAX是编译时配置的,在OS_CFG.H中定义。
( 8).是任务堆栈的基地址。基地址通常是分配给该任务的堆栈的最低内存位置。
( 9). 第七个参数是地址“ 水印”, 当堆栈生长到指定位置时就不再允许其生长。 在例子中, 当堆栈空间只剩下10%的时候将会限制堆栈的生长。
( 10). OSTaskCreate()的第八个参数定义了任务的堆栈大小(以CPU_STK为数据类型而不是字节)。例如,如果要分配 1KB大小的堆栈空间,因为CPU_STK是32位的,所以这个参数是256.
( 11).接下来的三个参数将被跳过因为这三个参数跟当前的话题无关,直接设置为 0。再下面一个参数是 OSTaskCreate()的可选项。例如, 在运行时堆栈会被检测 ( 假定统计任务在OS_CFG.H中使能),任务创建时堆栈会被初始化。
( 12) .OSTaskCreate()的最后一个参数是一个指针,将接收根据函数执行结果所返回的错误代号。如果OSTaskCreate()函数执行成功,错误代号将会是OS_ERR_NONE,否则会返回其它的错误代号(参见OS.H中错误代号的定义)。
( 13).调用 uC/OS-III过程在 main()函数中的最后一个步骤是调用OSStart(),开始多任务处理。特别的,在OSStart()调用之前uC/OS-III会选择最高优先级任务。最高优先级的任务通常是OS_IntQTask() ( 假定在 OS_CFG.H中定义了 OS_CFG_ISR_POST_DEFERRED_EN)。在种情况下, OS_IntQTask()将会执行一些它自身的初始化操作, 然后uC/OS-III将会切换到下一个最高优先级的任务。
3.函数AppTaskStart():
(1).参数“ p_arg” 是OSTaskCreate()传递给任务AppTaskStart()的参数。
(2). BSP_Init()用于初始化目标板的硬件。目标板可能会有一些GPIO,继电器,传感器等需要被设置。这个函数是在BSP.C中定义的.
(3).CPU_Init()初始化uC/CPU的服务。 uC/CPU用于测量中断响应时间, 读取时间戳, 提供仿真的计数清零指令等( 假定用户所使用的处理器没有那种汇编指令).
( 4). BSP_Cfg_Tick()设置 uC/OS-III的时基中断。为此,这个函数需要初始化一个硬件定时器用于中断 CPU,其频率为OS_CFG_TICK_RATE_HZ(在OS_CFG_APP.H中定义)。
( 5) .BSP_LED_Off()用于关闭LED, 参数为0表示关闭全部的LED。这是个用户函数,可删除。
( 6).所有的uC/OS-III任务需要被设置为无限循环。
(7). BSP_LED_Toggle()用于打开 LED,同样的,参数为 0表示打开全部LED。 改参数为1表示标号为#1的LED被打开。
( 8).最后,每个任务可以调用 uC/OS-III中的函数,可以让任务待一个事件( 信号量, 或来自于中断的消息, 或来自于其它任务的消息。)而被挂起。
8.0-uC/OS-III单任务应用的更多相关文章
- uc/os iii移植到STM32F4---IAR开发环境
也许是先入为主的原因,时钟用不惯Keil环境,大多数的教程都是拿keil写的,尝试将官方的uc/os iii 移植到IAR环境. 1.首先尝试从官网上下载的官方移植的代码,编译通过,但是执行会报堆栈溢 ...
- uC/OS - III 移植 IAR平台
关于移植uC/OS-III 网上已经有很多教程了此处只是做个记录 首先下载源码然后解压得到下面的文件: 然后在模版工程里新建各种文件夹: 最后全部都添加进工程: OK了,编译一下,惊呆了,竟然 0错误 ...
- uC/OS II原理分析及源码阅读(一)
uC/OS II(Micro Control Operation System Two)是一个可以基于ROM运行的.可裁减的.抢占式.实时多任务内核,具有高度可移植性,特别适合于微处理器和控制器,是和 ...
- uc/os任务创建
问题描述: uc/os中任务创建 问题解决: 创建一个任务,任务从无到有.任务创建函数分两种, 一种是基本的创建函数OSTaskCreate, 另一种是扩展的任务创建函数OSTaskCrea ...
- uC/OS 的任务调度解析 (转)
uC/OS 的任务调度解析 1.任务调度器启动之后(初始化,主要是TCB的初始化),就可以创建任务,开始任务调度了,实际上第一个任务准确的说不是进行任务切换,而是进行启动当前最高优先级任务.uC/OS ...
- 【原创】uC/OS 中LES BX,DWORD PTR DS:_OSTCBCur的作用及原理
LES BX, DWORD PTR DS:_OSTCBCur ;OSTCBCur->OSTCBStkPtr = SS:SP!!! ], SS ;将当前SS(栈的基地址)寄存器值存放至当前任务控制 ...
- 【原创】uC/OS II 任务切换原理
今天学习了uC/OS II的任务切换,知道要实现任务的切换,要将原先任务的寄存器压入任务堆栈,再将新任务中任务堆栈的寄存器内容弹出到CPU的寄存器,其中的CS.IP寄存器没有出栈和入栈指令,所以只能引 ...
- 基于μC/OS—III的CC1120驱动程序设计
基于μC/OS—III的CC1120驱动程序设计 时间:2014-01-21 来源:电子设计工程 作者:张绍游,张贻雄,石江宏 关键字:CC1120 嵌入式操作系统 STM32F103ZE ...
- 【小梅哥SOPC学习笔记】NIOS II处理器运行UC/OS II
SOPC开发流程之NIOS II 处理器运行 UC/OS II 这里以在芯航线FPGA学习套件的核心板上搭建 NIOS II 软核并运行 UCOS II操作系统为例介绍SOPC的开发流程. 第一步:建 ...
- uc/os 任务删除
问题描述: uc/os 任务删除 问题解决: uc/os任务删除流程图 具体代码 注: 如上是关中断,以及取消优先级对应的就绪标志 关中断代码为: 取消就绪标志,实际上是将就绪表中指定 ...
随机推荐
- python : 将txt文件中的数据读为numpy数组或列表
很多时候,我们将数据存在txt或者csv格式的文件里,最后再用python读取出来,存到数组或者列表里,再做相应计算.本文首先介绍写入txt的方法,再根据不同的需求(存为数组还是list),介绍从tx ...
- 从浏览器中输入URL到页面加载的发生了什么-转载
转:https://www.cnblogs.com/confach/p/10050013.html 背景 “从浏览器中输入URL到页面加载的发生了什么“,这是一道经典的面试题,涉及到的知识面非常多,但 ...
- 为什么我们做分布式使用Redis?
绝大部分写业务的程序员,在实际开发中使用 Redis 的时候,只会 Set Value 和 Get Value 两个操作,对 Redis 整体缺乏一个认知.这里对 Redis 常见问题做一个总结,解决 ...
- [Unity3D] 03 - Component of UI
还需进一步整理! ing... 博客参考 Unity 相关博客:Unity游戏开发爱好者 Unity 3D 连接Mysql数据库 Unity uGUI 登录界面 Unity uGUI 登录及注册功能 ...
- 《objective-c基础教程》学习笔记(四)—— OC面向对象编程初探
在上篇博文中,我们编写了一个可以输出不同几何类型的小程序.通过C语言的struct结构体,给大家感受了下,对象的大概样子. 如果用Obejctive-C的面向对象的特征来实现.那么,drawShape ...
- Win 10来袭,人工智能女将打头阵
7月1日,微软小冰身"考官",其姐姐微软小娜(Cortana)解锁"科技动态"功能,为即将来临的Win 10打头阵. 中国IT产业界从来没有见过这样的阵势,难于 ...
- Win10系统安装过程小记
1.网上下载ghost系统http://win10.jysmac.cn/win1064.html 2.使用系统自带的激活工具激活 3.到windows官网下载更新工具更新系统,重新安装https:// ...
- 【netcore入门】在Windows IIS上部署.NET Core 2.1项目
部署之前先检查下面2个先决条件是否满足 1.安装了 IIS 模块 win7 在 控制面板→程序和功能→打开或关闭Windows功能→勾选Internet 信息服务(Internet Informati ...
- vue编程式路由实现新窗口打开
一. 标签实现新窗口打开: 官方文档中说 v-link 指令被 组件指令替代,且 不支持 target=”_blank” 属性,如果需要打开一个新窗口必须要用标签,但事实上vue2版本的 是支持 ta ...
- SQL Server 2012 R2升级到SQL Server 2016无法正常启动数据库服务解决方案
原定周末把公司的TFS升级到2018,由于TFS 2018需要SQL Server至少是2016以上版本,所以还需要将原来的SQL Server 2012 R2一并升级.今天早上负责的同事告诉我升级失 ...