datasheet

STM32学习笔记一一UCOSII(1)

2019-01-09来源: 互联网 关键字:STM32  UCOSII(1)

1.简介

UCOSII 是一个可以基于 ROM 运行的、可裁减的、抢占式、实时多任务内核,具有高度可移植性,特别适合于微处理器和控制器,是和很多商业操作系统性能相当的实时操作系统(RTOS)。


1.1 UCOSII 体系结构图



UCOSII 的移植,我们只需要修改: os_cpu.h、 os_cpu_a.asm 和 os_cpu.c等三个文件。


os_cpu.h: 进行数据类型的定义,以及处理器相关代码和几个函数原型;


os_cpu_a.asm:是移植过程中需要汇编完成的一些函数,主要就是任务切换函数;


os_cpu.c:定义一些用户 HOOK 函数。


定时器的作用:为 UCOSII 提供系统时钟节拍,实现任务切换和任务延时等功能。这 

个时钟节拍由 OS_TICKS_PER_SEC(在 os_cfg.h 中定义)设置,一般我们设置UCOSII 的系统时钟节拍为 1ms~100ms,具体根据你所用处理器和使用需要来设置。本章,利用 STM32的 SYSTICK 定时器来提供 UCOSII 时钟节拍。


1.2 任务

任务:其实就是一个死循环函数,该函数实现一定的功能,一个工程可以有很多这样的任务(最多 255 个), UCOSII 对这些任务进行调度管理, 让这些任务可以并发工作(注意不是同时工作,并发只是各任务轮流占用 CPU,而不是同时占用,任何时候还是只有 1个任务能够占用 CPU), 这就是 UCOSII 最基本的功能。


Ucos 任务的一般格式为:


void MyTask (void *pdata)

{

任务准备工作…

While(1)//死循环

{ 任务 MyTask 实体代码;

OSTimeDlyHMSM(x,x,x,x);//调用任务延时函数,释放 cpu 控制权,

}

 }


1.3 任务优先级

ucos 中,每个任务都有唯一的一个优先级。优先级是任务的唯一标识。在 UCOSII中,使用 CPU 的时候,优先级高(数值小)的任务比优先级低的任务具有优先使用权,即任务就绪表中总是优先级最高的任务获得 CPU 使用权,只有高优先级的任务让出 CPU 使用权(比如延时)时,低优先级的任务才能获得 CPU 使用权。 UCOSII 不支持多个任务优先级相同,也就是每个任务的优先级必须不一样。


1.4 任务堆栈

存储器中的连续存储空间。为了满足任务切换和响应中断时保存 CPU 寄存器中的内容以及任务调用其他函数时的需要,每个任务都有自己的堆栈。在创建任务的时候,任务堆栈是任务创建的一个重要入口参数。


1.5 任务控制块 OS_TCB

用来记录任务堆栈指针,任务当前状态以及任务优先级等任务属性。UCOSII 的任何任务都是通过任务控制块(TCB)的东西来控制的,一旦任务创建了,任务控制块 OS_TCB 就会被赋值。每个任务管理块有 3 个最重要的参数:


1.任务函数指针;


2.任务堆栈指针;


3.任务优先级;


任务控制块就是任务在系统里面的身份证。


1.6 任务就绪表

用来记录系统中所有处于就绪状态的任务。它是一个位图,系统中每个任务都在这个图中占据一个进制位,该位置的状态(1 或者 0)就表示任务是否处于就绪状态。


1.7 任务调度

一是在任务就绪表中查找优先级最高的就绪任务,二是实现任务的切换。比如说,当一个任务释放 cpu 控制权后,进行一次任务调度,这个时候任务调度器首先要去任务就绪表查询优先级最高的就绪任务,查到之后,进行一次任务切换,转而去执行下一个任务。


1.8 状态切换

UCOSII 的每个任务都是一个死循环。每个任务都处在以下 5 种状态之一的状态下,这 5种状态是:睡眠状态、 就绪状态、 运行状态、 等待状态(等待某一事件发生)和中断服务状态。


睡眠状态:任务在没有被配备任务控制块或被剥夺了任务控制块时的状态。


就绪状态:系统为任务配备了任务控制块且在任务就绪表中进行了就绪登记,任务已经准备好了,但由于该任务的优先级比正在运行的任务的优先级低, 还暂时不能运行,这时任务的状态叫做就绪状态。


运行状态:该任务获得 CPU 使用权,并正在运行中,此时的任务状态叫做运行状态。


等待状态:正在运行的任务,需要等待一段时间或需要等待一个事件发生再运行时,该任务就会把 CPU 的使用权让给别的任务而使任务进入等待状态。


中断服务状态:一个正在运行的任务一旦响应中断申请就会中止运行而去执行中断服务程序,这时任务的状态叫做中断服务状态。


5种状态之间的转换如下图:



2.UCOS相关函数

2.1 建立任务函数

如果想让 UCOSII 管理用户的任务,必须先建立任务。 UCOSII 提供了 2 个建立任务的函数: OSTaskCreat 和 OSTaskCreatExt,一般用 OSTaskCreat 函数来创建任务。


该函数原型为:


OSTaskCreate(void(*task)(void*pd),void*pdata,OS_STK*ptos,INTU prio);


task:是指向任务代码的指针;


pdata:是任务开始执行时,传递给任务的参数的指针;


ptos:是分配给任务的堆栈的栈顶指针;


prio :是分配给任务的优先级。


每个任务都有自己的堆栈,堆栈必须申明为 OS_STK 类型,并且由连续的内存空间组 

成。可以静态分配堆栈空间,也可以动态分配堆栈空间。


2.2 任务删除函数

任务删除,其实就是把任务置于睡眠状态。 UCOSII提供的任务删除函数原型为:


INT8U OSTaskDel(INT8U prio);


参数 prio :要删除的任务的优先级,可见该函数是通过任务优先级来实现任务删除的。


特别注意:任务不能随便删除,必须在确保被删除任务的资源被释放的前提下才能删除!


2.3 请求任务删除函数

前面提到,必须确保被删除任务的资源被释放的前提下才能将其删除,所以通过向被删除任务发送删除请求,来实现任务释放自身占用资源后再删除。


UCOSII 提供的请求删除任务函数原型为:


INT8U OSTaskDelReq(INT8U prio);


通过优先级来确定被请求删除任务。


2.4 任务挂起函数

任务挂起和任务删除有点类似,但是又有区别,任务挂起只是将被挂起任务的就绪标志删除,并做任务挂起记录,并没有将任务控制块任务控制块链表里面删除, 也不需要释 

放其资源, 而任务删除则必须先释放被删除任务的资源,并将被删除任务的任务控制块也给删了。被挂起的任务,在恢复(解挂)后可以继续运行。


UCOSII 提供的任务挂起函数原型为:


INT8U OSTaskSuspend(INT8U prio);


2.5 任务恢复函数

有任务挂起函数,就有任务恢复函数,通过该函数将被挂起的任务恢复,让调度器能 

够重新调度该函数。


UCOSII 提供的任务恢复函数原型为:


INT8U OSTaskResume(INT8U prio);


3.移植 UCOSII

3.1 移植UCOUS

3.2 编写任务函数并设置其堆栈大小和优先级等参数

编写任务函数,以便 UCOSII 调用。


设置函数堆栈大小,这个需要根据函数的需求来设置,如果任务函数的局部变量多,嵌套层数多,那么相应的堆栈就得大一些,如果堆栈设置小了,很可能出现的结果就是 CPU进入 HardFault,遇到这种情况,就必须把堆栈设置大一点了。另外,有些地方还需要注意堆栈字节对齐的问题,如果任务运行出现莫名其妙的错误(比如用到 sprintf 出错),请考虑是不是字节对齐的问题。


设置任务优先级, 这个需要根据任务的重要性和实时性设置,高优先级的任务有优先使用 CPU 的权利。


3.3 初始化 UCOSII,并在 UCOSII 中创建任务

调用 OSInit,初始化 UCOSII,通过调用 OSTaskCreate 函数创建我们的任务。


3.4 启动 UCOSII

调用 OSStart,启动 UCOSII。


4.软件配置

4.1 UCOSII源码说明


UCOSII-CORE:是UCOSII 的核心源码,不需要做任何变动。


UCOSII-PORT :移植 UCOSII 要修改的 3 个代码,这个在移植的时候完成。


UCOSII-CONFIG : UCOSII 的配置部分,主要由用户根据自己的需要对 UCOSII进行裁剪或其他设置。


4.2 UCOSII简易测试

#include "led.h"

#include "delay.h"

#include "sys.h"

#include "includes.h"    


/////////////////////////UCOSII任务设置///////////////////////////////////

//START 任务

//设置任务优先级

#define START_TASK_PRIO                 10 //开始任务的优先级设置为最低

//设置任务堆栈大小

#define START_STK_SIZE                  64

//任务堆栈  

OS_STK START_TASK_STK[START_STK_SIZE];

//任务函数

void start_task(void *pdata);   


//LED0任务

//设置任务优先级

#define LED0_TASK_PRIO                  7 

//设置任务堆栈大小

#define LED0_STK_SIZE                   64

//任务堆栈  

OS_STK LED0_TASK_STK[LED0_STK_SIZE];

//任务函数

void led0_task(void *pdata);



//LED1任务

//设置任务优先级

#define LED1_TASK_PRIO                  6 

//设置任务堆栈大小

#define LED1_STK_SIZE                   64

//任务堆栈

OS_STK LED1_TASK_STK[LED1_STK_SIZE];

//任务函数

void led1_task(void *pdata);



 int main(void)

 {  

    delay_init();            //延时函数初始化  

    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);// 设置中断优先级分组2

    LED_Init();         //初始化与LED连接的硬件接口

    OSInit();   

    OSTaskCreate(start_task,(void *)0,(OS_STK *)&START_TASK_STK[START_STK_SIZE-1],START_TASK_PRIO );//创建起始任务

    OSStart();  

 }



//开始任务

vo

[1] [2]

关键字:STM32  UCOSII(1)

编辑:什么鱼 引用地址:http://www.eeworld.com.cn/mcu/2019/ic-news010942851.html
本网站转载的所有的文章、图片、音频视频文件等资料的版权归版权所有人所有,本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如果本网所选内容的文章作者及编辑认为其作品不宜公开自由传播,或不应无偿使用,请及时通过电子邮件或电话通知我们,以迅速采取适当措施,避免给双方造成不必要的经济损失。

上一篇:STM32学习笔记一一SysTick
下一篇:最后一页

关注eeworld公众号 快捷获取更多信息
关注eeworld公众号
快捷获取更多信息
关注eeworld服务号 享受更多官方福利
关注eeworld服务号
享受更多官方福利

推荐阅读

STM32程序移植技巧总结

1. 工程更换不同的STM32芯片eg:stm32f103rct6 ---->stm32f103c8t6:1.1. 修改芯片点击魔术棒,在出来的菜单栏里,Device 选项重新选择芯片1.2. 修改启动文件此处举例是 RCT6 修改为 C8T6,因为 flash 容量大小不一样,所以需要对应修改启动文件,如果是 flash 大小相同,此步骤不需要。此处由:startup_stm32f10x_hd.s修改为startup_stm32f10x_md.s1.3. 修改全局宏定义同样先点击魔术棒,在菜单栏选择 C/C++。进而修改全局宏定义。此处:STM32F10X_HD–>STM32F10X_MD1.4. 重新添加FLASH
发表于 2019-01-09
STM32程序移植技巧总结

STM32学习笔记一一FLASH 模拟 EEPROM

1. 简述STM32 本身没有自带 EEPROM,但是 STM32 具有在应用编程(IAP:In Application Programming)功能,可以把它的 FLASH 当成 EEPROM 来使用。不同型号的 STM32,其 FLASH 容量也有所不同,最小的只有 16K 字节,最大的则达到了1024K 字节。MiniSTM32 开发板选择的 STM32F103RCT6 的 FLASH 容量为 256K 字节,属于大容量产品,闪存模块组织如下图:1.1 主存储器:该部分用来存放代码和数据常数(如 const 类型的数据)。对于大容量产品,其被划分为 256 页,每页 2K 字节。**注意:**小容量和中容量产品则每页
发表于 2019-01-09
STM32学习笔记一一FLASH 模拟 EEPROM

STM32学习笔记一一HEX文件和BIN文件格式

1. 引言今天看串口的 IAP ,平时我们通过 JTAG 等工具下载的都是 HEX 文件,都没有思考一下 HEX 的文件组成。而串口 IAP 下载的是 BIN 文件,刚好在这里区分学习一下。我们平时烧写 HEX 文件是不需要设置地址信息的,因为已经包含在文件里面,而使用 BIN 烧写,需要在程序中指定地址。2. 简述Intel hex 文件是记录文本行的 ASCII 文本文件,在 Intel HEX 文件中,每一行是一个 HEX 记录,由十六进制数组成的机器码或者数据常量。Intel HEX 文件经常被用于将程序或数据传输存储到 ROM、EPROM,大多数编程器和模拟器使用Intel HEX文件。2.1 HEX文件HEX 文件是包括
发表于 2019-01-09
STM32学习笔记一一HEX文件和BIN文件格式

STM32学习笔记一一串口 IAP

(Bootloader 程序)必须通过其它手段,如 JTAG 或 ISP 烧入;第二部分代码(APP 程序)可以使用第一部分代码 IAP 功能烧入,也可以和第一部分代码一起烧入,以后需要程序更新时再通过第一部分 IAP代码更新。他们存放在 STM32 FLASH 的不同地址范围,一般从最低地址区开始存放 Bootloader,紧跟其后的就是 APP 程序。2 .STM32程序流程2.1 STM32 正常的程序运行流程下图为 STM32 正常的程序运行流程:STM32 的内部闪存(FLASH)地址起始于 0x08000000,一般情况下,程序文件就从此地址开始写入。此外STM32是基于Cortex-M3内核的微控制器,其内部通过一张
发表于 2019-01-09
STM32学习笔记一一串口 IAP

STM32学习笔记一一待机唤醒

1. 简述1.1 低功耗模式:在系统或电源复位以后,微控制器处于运行状态。当CPU不需继续运行时,可以利用多种低功耗模式来节省功耗,例如:等待某个外部事件时,常见的按键唤醒。用户需要根据最低电源消耗、最快速启动时间和可用的唤醒源等条件,选定一个最佳的低功耗模式。1.2 STM32F10X系列的低功耗模式STM32F10xxx有三种低功耗模式:–模式– –特点—睡眠模式 Cortex-M3内核停止,所有外设包括Cortex-M3核心的外设,如NVIC、系统时钟(SysTick)等仍在运行停止模式 所有的时钟都已停止待机模式 1.8V电源关闭在这三种低功耗模式中,最低功耗的是待机模式,在此模式下,最低只需 2uA 左右的电流。停机模式
发表于 2019-01-09
STM32学习笔记一一待机唤醒

STM32学习笔记一一红外遥控

}2.2 中断捕获u8 RmtSta=0;u16 Dval;u32 RmtRec=0;u8 RmtCnt=0;void TIM5_IRQHandler(void){ if(TIM_GetITStatus(TIM5,TIM_IT_Update)!= RESET) { if(RmtSta&0x80)//数据接收到标志位 { RmtSta &= ~0x10;//取消上升沿捕获标记 if((RmtSta&0x0F)==0x00) RmtSta |= 1<<6; if((RmtSta&0x0F)<14) RmtSta++; else { RmtSt
发表于 2019-01-09
STM32学习笔记一一红外遥控

小广播

何立民专栏

单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号 电信业务审批[2006]字第258号函 京公海网安备110108001534 Copyright © 2005-2018 EEWORLD.com.cn, Inc. All rights reserved
pt type="text/javascript" src="//v3.jiathis.com/code/jia.js?uid=2113614" charset="utf-8">