ucos-ii任务调度中几个关键点

1、OSTimtick():给每个用户控制块OS_TCB中的时间延时项OSTCBDly减1,当某个任务的延时项减到零后 任务就进入到了就绪状态。
SysTickHandler():定时器服务中断函数(硬件),该函数每进入一次 就会调用一次OSTimtick()
该中断多久进入一次?配置函数为  SysTick_Config(),一般为1毫秒


2、信号量:在ucos-II中,为了实现任务之间的同步,用到的同步机制有:信号量,邮箱和消息队列。其中这里我主要说下对信号量的使用经验。信号量在创建时,调用OSSemCreate(INT16U?cnt)函数。cnt为信号量的初始值。对cnt赋予不同的值,所起到的作用不同。如果Semp?=?OSSemCreate(0),?该信号量表示等待一个事件或者多个事件的发生。?例如:我们现在想实现这样一个功能:当有按键按下时,PWM蜂鸣器响起;无按键时,蜂鸣器不响。这是我们就可以分别建立两个任务,Task1和Task2,在Task1中处理按键的按下与否,一旦按下,则调用OSSemPost(Semp)发送这里信号量。在Task2中调用OSSemPend(Semp,0,&err)请求此信号量,如果信号量可用,则调用蜂鸣器程序蜂鸣,否则无限等待,任务自动进行切换。?
?????如果我们想对一个公共资源进行互斥访问,例如:如果我们想让两个任务Task1和Task2都可以调用Fun()函数,但不能同时调用,最好定义Semp?=?OSSemCreate(1),同理在各自的任务中都需要调用OSSemPend(Semp,0,&err)请求此信号量,如果可用,则调用Fun(),然后再调用OSSemPost(Semp)释放该信号量。这里就实现了一个资源的互斥访问。同理,如果一个任务要等待n个事件发生后才能执行,则应定义为Semp?=?OSSemCreate(n)。然后在这n个任务分别运行时调用OSSemPost(Semp),直到这n个事件均发生后,这个任务才能运行。


3、关键词 volatile:(英译 :易变的)
http://www.cnblogs.com/chio/archive/2007/11/24/970632.html


4、计算CUP使用率 (1 - OSIdleCtr/OSIdleCtrMax)
CPU Usage (%) = 100 * (1 - OSIdleCtr/OSIdleCtrMax)


分析这两个变量是怎么产生的 ,在什么地方产生的:
【OSIdleCtrMax:这个变量的产生是在OSStatInit()这个初始化函数中产生的,具体的含义就是统计在规定的时间内(一般是OSTimeDly(OS_TICKS_PER_SEC / 10u))空闲任务的计数值(OSIdleCtr的值)。这个值的意义就是现在任何用户的任务都没有运行,因此全部都是空闲的任务,也就是说此时CPU使用率为0,在这段时间内空闲任务最大计数值为OSIdleCtrMax】
【 OSIdleCtr的变动是在系统空闲任务OS_TaskIdle()中变化的,该任务优先级最低,并且该任务并没有while循环和系统延时!因此该任务运行一次即退出!运行一次的时间是一个时钟节拍(由OS_TICKS_PER_SEC决定),在统计任务OS_TaskStat()中,该任务统计在接下来的每个OSTimeDly(OS_TICKS_PER_SEC / 10u)的时间内空闲任务的累计值OSIdleCtr】
【结合上面这两个数据,没有用户任务运行时 OSIdleCtr最大为OSIdleCtrMax,当有用户任务存在时,OSIdleCtr自然会小于OSIdleCtrMax,由于时间间隔相等(必须相等),因此OSIdleCtr/OSIdleCtrMax即是空闲任务占用cpu的使用率,而1 - OSIdleCtr/OSIdleCtrMax即是用户cpu的使用率,换成%为单位即是100 * (1 - OSIdleCtr/OSIdleCtrMax)】【完】




  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值