stm32操作系统ucosiii笔记02

摘要:
3、 OS_TCB分为两个链接列表,自由列表和使用列表//任务控制块结构的主要成员OS _ STK*OSTCBStrPtr;//当前任务堆栈顶部指针structos_tcb*OSTCBNext;//任务块控制的双链接列表指针结构_ tcb*OSTCBPrev;//任务块控制的双链接列表指针OS _ EVENT*OSTCBEventPtr;//事件控制块void*OSTCBMsg//消息指针INT16UOSTCBDly//任务延迟INT8UOSTCBstat//任务状态字INT8UOSTCBprio//任务优先级INT8UOST CBX//用于加速进入就绪状态的进程INT8UOSTCBBit//用于加快进入就绪状态的进程任务就绪表1。每个任务的就绪标志都放置在就绪表中。就绪表中有两个变量,OSRdyGrp和OSRdyTb1[]。

临界段 Critical Sections :
  1、为了实现资源共享,一个操作系统必须提供临界段操作的功能

  2、uc/os-iii 为了处理林阶段代码需要关中断,处理完毕后需要开中断-——避免其他任务或中断服务进入临界段代码

  3、uc/os-iii 定义两个宏(macros)开关中断————OS_ENTER_CRITICAL()

                           OS_EXIT_CRITICAL()——————>>>OS_CPU.H

任务(task)  :通常是一个无限循环

void mytask(void * pdara)
{
      do init
      while(1)
      {
          do something;
          waiting;
          do something;

    }      
}    

保留了优先级为:0,1,2,3,4

        OS_LOWEST_PRI0-3、OS_LOWEST_PRI0-2、OS_LOWEST_PRI0-1、OS_LOWEST_PRI0

优先级号越低,任务的优先级越高

uC/OS中的中断处理

  1、中断服务子程序要用汇编语言编写

  2、用户中断子程序框架:

      a、保存全部CPU寄存器

      b、调用OSIntEnter 或 OSIntNesting直接加1

      c、执行用户代码做中断服务

      d、调用OSIntExit();

      e、恢复所有CPU寄存器

      f、执行中断返回指令

// OSIntEnter
void OSIntEnter (void)
{
       OS_ENTER_CRITICAL();
       OSIntNesting++;
       OS_EXIT_CRITICAL();
}

中断与时钟节拍

  1、当发生中断时,首先应保护现场,将CPU寄存器入栈,在处理中断函数,然后恢复现场,将CPU寄存器出栈,最后执行中断返回。

  2、uC/OS提供了OSIntEnter() 和 OSIntExit()----------->>>告诉内核进入了中断状态

  3、时钟节拍是一种特殊的中断,操作系统的心脏。对任务列表进行扫描,判断是否有延时任务应该处于准备就绪状态,最后进行上下文切换。

时钟节拍

  1、uC/OS需要用户提供周期信号源,用于实现时间延时和确认超时。节拍率在10-100hz。

                                 节拍率越高,系统的额外负荷就越重

  2、时钟节拍的实际频率取决于用户应用程序的精度。时钟节拍源可以是硬件定时器,也可以是50/60Hz交流电源信号

  3、用户必须在多任务系统启动以后再启动时钟节拍器,在调用OSStart()之后。

//OSTickISR
void OSTickISR(void)
{
    保存处理器寄存器的值;
    调用OSIntEnter()   或将OSIntNesting加1
    调用OSTimeTick();
    调用OSInitExit();
    恢复处理寄存器的值;
    执行中断返回指令;
}

uC/OS初始化

  1、首先调用OSInit();

  2、空闲任务idle task,总是处于就绪状态,  优先级总是设成最低——> OS_LOWEST_PRI0

  3、初始化了4个空数据结构缓冲区。

uC/OS-II的启动

    多任务启动是用户通过调用OSStart()实现的。

    

OSInit();/* 初始化 uC/OS-III */

......

调用 OSTaskCreate() 或 OSTaskCreateExt();

......
OSStart();/* 开始任务调度!永不返回 */
//OSStart
if ( OSRuning == FALSE )
{
      Y =     
      X =
      OSPrioHghRdy = 
      OSPrioCur = 
      OSPrioHghRdy = 

      OSTCBCur = 
      OSStartHighRdy =
}

        

任务控制块 (TCB)

  1、任务控制块 OS_TCB 是一数据结构,保存该任务的相关参数——任务堆栈指针,状态,优先级,任务表位置,任务链表指针等。

  2、一旦任务建立,OS_TCBs 将被赋值。

  3、OS_TCB 分两条链表,空闲链表和使用链表

// 任务控制块结构的主要成员

OS_STK        *OSTCBStrPtr;            //当前任务栈顶指针    
struct  os_tcb    *OSTCBNext;          //任务块控制的双重链表指针
struct  os_tcb    *OSTCBPrev;          //任务块控制的双重链表指针
OS_EVENT        *OSTCBEventPtr;    //事件控制块的指针
void                  *OSTCBMsg;           //消息指针
INT16U             OSTCBDly;              //任务延时
INT8U               OSTCBStat;              //任务状态字
INT8U               OSTCBPrio;              //任务优先级
INT8U               OSTCBX;              //用于加速进入就绪状态的过程
INT8U               OSTCBY;              //用于加速进入就绪状态的过程
INT8U               OSTCBBitX;              //用于加速进入就绪状态的过程
INT8U               OSTCBBitY;              //用于加速进入就绪状态的过程
                

任务就绪表 (Ready List)

   1、每个任务的就绪标志都放入就绪表中,就绪表中有两个变量OSRdyGrp 和 OSRdyTb1[]。

   2、OSRdyGrp 中任务按优先级分组,8个任务为一组。OSRdyGrp 每一位表示每一组中是否有进入就绪状态

     就绪表中 OSRdyTb1[] 相应元素的相应位也置位。

stm32操作系统ucosiii笔记02第1张

 任务创建

  1、让 uC/OS-II 管理用户的任务,,用户必须要先建立任务

  2、用户可以通过传递任务地址和其他参数到以下两个函数之一来创建任务:

                        OSTaskCreate( )  、OSTaskCreateExt( )

  3、任务不能由中断服务程序(ISR)来建立。

任务调度

  1、uC/OS-III是抢占式实时多任务内核,优先级最高的任务一旦准备就绪,则拥有CPU的所有权开始投入运行。

  2、任务调度的工作就是:查找准备就绪的最高优先级的任务并进行上下文切换。

  3、uC/OS-III 任务调度所花费的时间为常数,与应用程序中建立的任务数无关

    4、uC/OS-III 总是运行进入就绪状态任务中优先级最高的哪一个,确定那个任务优先级最高,

              下面该那个任务运行了的工作是由调度器(Scheduler)完成的。

  5、任务级的调度是由函数OSSched( )完成的。中断级的调度是由另一个函数OSIntExt( )完成的

根据就绪表确定最高优先级

  1、OSRdyGrp 值确定高3位,假设OSRdyGrp = 0x08,对应OSRdyTb1[3],高优先级为2;

  2、OSRdyTb1[3]值确定低3位,假设OSRdyTb1[3]=0x3a,最高优先级的任务为25

stm32操作系统ucosiii笔记02第2张

 是任务脱离就绪态

 

免责声明:文章转载自《stm32操作系统ucosiii笔记02》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇SDRAM基础知识js 正则匹配标签,过滤标签不保留内容和过滤标签保留内容,过滤标签的的属性下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

深入探究Lua的GC算法(下)-《Lua设计与实现》

紧接着上一篇文章zblade:深入探究Lua的GC算法(上)-《Lua设计与实现》 这篇文章让我们收尾GC的具体后续操作。转载请标明出处:http://www.cnblogs.com/zblade/ 3、GC的扫描阶段 GCSpropagate 只要处于这个阶段,就会分2种情况执行,一个是propagatemark,一个是atomic,让我们分别看...

Log4j 日志

日志是应用软件中不可缺少的部分,Apache的开源项目Log4j是一个功能强大的日志组件,提供方便的日志记录。Log4j是Apache基金会的一个项 目,Log4j是一个基于Java的日志组件,Log4j是Java的几个日志框架中的一种。日志记录器(Logger)是日志处理的核 心组件。log4j具有6种一般的日志级别(Level)。 日志记录器(Logg...

C#综合揭秘——细说多线程(上)

引言   本文主要从线程的基础用法,CLR线程池当中工作者线程与I/O线程的开发,并行操作PLINQ等多个方面介绍多线程的开发。   其中委托的BeginInvoke方法以及回调函数最为常用。   而 I/O线程可能容易遭到大家的忽略,其实在开发多线程系统,更应该多留意I/O线程的操作。特别是在ASP.NET开发当中,可能更多人只会留意在客户端使用Ajax...

收录 Uboot 详解

--------------------------------------------------------------------------------------------------------  我们知道,bootloader是系统上电后最初加载运行的代码。它提供了处理器上电复位后最开始需要执行的初始化代码。     在PC机上引导程序一般...

重学STM32---(八)----SDIO

1.  SDIO(SD/SDIO MMC卡主机模块)在AHB外设总线和多媒体卡(MMC)、SD存储卡、SDIO卡和CE-ATA设备间提供了操作接口。(SDIO没有SPI兼容的通信模式 ) 1.1.什么是MMC卡 MMC:MMC就是MultiMediaCard的缩写,即多媒体卡。它是一种非易失性存储器件,体积小巧(24mm*32mm*1.4mm),容量大,耗...

STM32——timer

原文地址: http://blog.sina.com.cn/s/blog_49cb42490100s6ud.html   1.     STM32的Timer简介 STM32中一共有11个定时器,其中2个高级控制定时器,4个普通定时器和2个基本定时器,以及2个看门狗定时器和1个系统嘀嗒定时器。其中系统嘀嗒定时器是前文中所描述的SysTick,看门狗定时器以...