ucosii 心跳用单片机定时器优先级高优先级还是低优先级好

2013年4月 硬件/嵌入开发大版内专家分月排行榜第二2007年9月 硬件/嵌入开发大版内专家分月排行榜第二
2013年5月 硬件/嵌入开发大版内专家分月排行榜第三2012年9月 硬件/嵌入开发大版内专家分月排行榜第三2007年11月 硬件/嵌入开发大版内专家分月排行榜第三
本帖子已过去太久远了,不再提供回复功能。您现在的位置:
ucos ii的任务在何时切换
ucos ii的任务在何时切换
来源: 作者: 发表时间: 09:02 
ucos ii的任务在何时切换 标签: ucosii cotex-m3 stm32学习 初学操作系统 it
刚才在做实验的时候,发现:当有一个任务没有进入延时的时候,这个任务就会一直执行不会挂起。就算有高优先级的任务已经准备好了,得等低优先级的任务执行完,或处于就绪态的时候,才能响应高优先级的的任务。所以任务里必须要有ucos ii系统里的延时函数,否则,没有延时函数的某优先级的任务会一直执行。
有人会想到,不用ucos ii系统里的延时函数可不可以?例如用:
while(x--);
这种延时的方法。
这个,虽然有延时的效果,但系统默认为语句的执行而已,并不能使该任务在进入延时的时间里释放CPU的控制权。
大家都知道,进入延时的时候,该任务并没有对任何的外设进行控制,所以延时对于CPU来说是浪费资源,但在延时的时候能让CPU去执行其它的任务或做其它的操作,那就能达到高效利用CPU的资源。当该任务的延时时间到的时候,该任务就会处于就绪态,这样就由任务的高低决定是否马上返回到该任务来。
所以,想执行多个任务的时候,就必须利用系统里的延时函数,否则多个任务就变得无意义了。
但有一种情况比较特殊,当在一个任务里创建另一个任务时(不管被创建的任务的优先级怎样),系统会将当前任务挂起,执行被创建的任务,当被创建的任务因为被阻塞或延时被挂起时,才会跳回当前的任务继续执行。所以当一个任务处于就绪态时,执行它的情况,目前本人碰到两种情况:
1、它并不在正在执行的低优先级的任务里创建,所以只有当它是处于就绪态的最高优先级的任务时,低优先级的任务被挂起后,才被执行。
2、任务A被任务B创建时,系统会马上挂起任务B,转而去执行任务A,只有当任务A被阻塞或延时被挂起时,系统将会执行处于就绪列表里的最高优先级的任务。
如果当前任务利用OSMutexPend(mutex,0,&err)函数申请互斥信号量时,如果该互斥信号量被占用;那么系统将会把当前任务挂起,然后执行最高优先级的任务。
注意:当高优先级的任务挂起的时间不够时,处于就绪态的低优先级的任务将得不到CPU的使用权,可能被创建后,就一直在就绪列表时,但不能被执行。
> ucos ii的任务在何时切换
"ucos ii的任务在何时切换"的相关文章
Copyright (C)
www.embed.cc 嵌入式开发知识网
开发知识-大学生(电子信息),,第一门户!优先级反转
在电子工程世界为您找到如下关于“优先级反转”的新闻
优先级反转资料下载
嵌入式实时系统中的优先级反转问题嵌入式实时系统中的优先级反转问题
摘要:嵌入式实时系统中由于多任务共享资源,通常会出现一些奇怪的现象。本文就什么是优先级反转及其产生原因进行分析,并提出2个行之有效的解决方案。
  关键词:嵌入式实时系统 多任务 信号量 优先级反转
1 问题的提出
  目前,市场上占有率比较高的商业RTOS有VxWorks/PSOS...
6、优先级反转.rar...
7、线程优先级反转之优先级继承算法.rar...
使用信号量模拟ucos中优先级反转的问题...
使用互斥信号量解决ucosii中的优先级反转...
实时控制系统中优先级反转问题的解决方法...
的可调度性,减少了内核存储开销;在共享资源访问控制方面,以优先级天花板协议为依据,使用互斥事件解决优先级反转和死锁问题的发生。 为了保障系统的强实时性能,本文还对内核的时钟管理、内存管理等方面进行了设计。最后,通过实时性能测试,结果表明该实时内核有很好的强实时特性。...
1.1 每次处理一个字符
1.2 字符和字符值之间的转换
1.3 测试一个对象是否是类字符串
1.4 字符串对齐
1.5 去除字符串两端的空格
1.6 合并字符串
1.7 将字符串逐字符或逐词反转
1.8 检查字符串中是否包含某字符集合中的字符
1.9 简化字符串的translate方法的使用
1.10 过滤字符串中不属于指定集合的字符
1.11 检查一个字符串是文本还是二进制...
ucosDEMO程序,可以模拟实现任务管理,优先级反转,内存管理,消息队列,时钟中断等...
嵌入式VxWorks开发所需典型例程源代码,包括消息队列,信号量,时钟,优先级反转,中断等常见处理....
优先级反转相关帖子
显示完毕后才可以显示新信息,从而可以避免这个现象。不过,采用这种方法是以牺牲系统的实时性为代价的。如果显示原有信息需要耗费大量时间,系统只好等待。从结果上看,等于延长了中断响应时间,这对于未显示信息是报警信息的情况,无疑是致命的。发生这种情况,在μC/OS-II中称为优先级反转,就是高优先级任务必须等待低优先级任务的完成。在上述情况下,在两个任务之间发生优先级反转是无法避免的。所以在使用ucos...
知识产权案件14317件,其中专利案件占比12.3%。与2015年相比,2016年专利案件审结数量增长率达70.5%。
  在盈沃资本创始合伙人王欢看来,虽然较前几年有较大进步,但目前仍只有部分创业者特别重视专利申请,其他的CEO也有这个意识,但是由于要做的事情太多了,所以申请专利的优先级还不高,“投资时,我们也会提醒一些涉及核心专利的创业者去申请注册专利。”
  知识产权服务创业公司涌现...
=#999999]汤权 发表于
11:17[/color][/url][/size]
2.6版本之前是不支持抢占的,2.6之后的内核可以抢占,现在大部分使用的2.6之后的内核,但是有的时候可能 ...[/quote]
你不要骗我,2.5.4内核开始就已经有抢占了。
感觉你有些概念不清楚:
你的问题是想实现原子操作,但是你的疑虑是怕出现优先级反转。
一旦进入原子操作内部(代码...
6.触摸屏反转修改;
7.使用平台号和OEM信息进行版本控制;
当前版本号:EBootV1.0_OSV1.0.0
当前平台号:MST785
系统调用:
//获取Eboot和OS版本
::SystemParametersInfo( SPI_GETOEMINFO, nCount, pszBuffer, SPIF_SENDCHANGE );
//平台信息获取...
运行速率就是1Msps/64/3大约为5.2K。
& && &&&现在的问题是,adc采样和外环是都没问题的,内环我通过反转IO来观察,发现根本没有60K,波形紊乱,大约只有20多k,FPU我是
#include &driverlib/fpu.h&
ROM_FPUEnable...
“OSSemAccept失败”,从串口打印如下:
实验五、互斥锁
本节我们主要介绍的是uC/OS-II的互斥锁1、互斥锁互斥锁即互斥型信号量,是一种特殊的信号量,他除了具有普通信号量的机制外,还有一些其他的特性。互斥信号量可以在应用程序中解决优先级反转问题。当高优先级的任务需要使用某个共享资源,而该资源已被一个低优先级的任务占用时,就会发生优先级反转。为了解决优先级反转,内核可以...
; & & & 如图5-3所示,我们看到当线程的时间片到了之后,则被迫让出,让给另外一个同优先级的就绪状态的线程执行。 图5-3
6、优先级反转
本节主要讲述,操作系统中最常见的优先级反转的问题,由于多线程共享资源,具有最高优先级的线程被低优先级线程阻塞,反而使中优先级线程先于高优先级线程执行,导致系统故障。优先级反转的一个典型场景为:系统中存在优先级为A、B...
。MSP430的中断机制:MSP430的中断优先级按所在的向量的大小排列,中断向量地址越高优先级就越大,但是默认的MSP430是不能中断嵌套的,要想在执行某一中断时能够响应更高优先级的中断,需要在低优先级的中断程序中手动打开全局中断便能位,因为在进入中断服务子程序时全局中断便能位被清零,即禁止响应其它中断。msp430的指令中,_DINT()和_EINT()分别为关和开所有中断,也就是包括P1IE...
;return 0;
4。编码器的中断
& & 由于编码器是基于定时器的,所以编码器的中断实际上就是定时器的中断啦。也就是说定时器是每隔一定时间加一个数(或减一个数 ),当数到达预设值时就产生中断,而编码器是每一个有效脉冲就加一个数(或减一个数 ),当数到达预设值时就产生中断。若预设值为1000则编码器与定时器中断不同的是,当编码器反转时值到达999产生一次中断,而当编码器...
很大的提高linux的软实时性。下面简单的解释一下这3点的作用。 我们知道一旦一个线程关了抢占后,这个线程在执行期间内是不允许被其他线程抢占的,这样就会绑死一个cpu,即使有更高优先级的线程就绪,也只能等这个线程开抢占。Linux内核的协议栈中大量用到了spinlock ,会对任务延迟这个时间急剧的增大,从而造成实时性的降低,所以这一点是最重要的一点。 优先级反转对于实时性的损害非常之大,后面会...
优先级反转视频
你可能感兴趣的标签
热门资源推荐UCOS-II 如何 用定时器中断 实现多任务之间的调度?
UCOS-II 如何 用定时器中断 实现多任务之间的调度?
09-10-19 &
这关魔兽什么事......不懂
请登录后再发表评论!ucos2&&软件定时器介绍&(转载)
软件定时器
UCOSII从V2.83版本以后,加入了软件定时器,这使得UCOSII的功能更加完善,在其上的应用程序开发与移植也更加方便。在实时操作系统中一个好的软件定时器实现要求有较高的精度、较小的处理器开销,且占用较少的存储器资源。
通过前面的学习,我们知道UCOSII通过OSTimTick函数对时钟节拍进行加1操作,同时遍历任务控制块,以判断任务延时是否到时。软件定时器同样由OSTimTick提供时钟,但是软件定时器的时钟还受OS_TMR_CFG_TICKS_PER_SEC设置的控制,也就是在UCOSII的时钟节拍上面再做了一次“分频”,软件定时器的最快时钟节拍就等于UCOSII的系统时钟节拍。这也决定了软件定时器的精度。
软件定时器定义了一个单独的计数器OSTmrTime,用于软件定时器的计时,UCOSII并不在OSTimTick中进行软件定时器的到时判断与处理,而是创建了一个高于应用程序中所有其他任务优先级的定时器管理任务OSTmr_Task,在这个任务中进行定时器的到时判断和处理。时钟节拍函数通过信号量给这个高优先级任务发信号。这种方法缩短了中断服务程序的执行时间,但也使得定时器到时处理函数的响应受到中断退出时恢复现场和任务切换的影响。软件定时器功能实现代码存放在tmr.c文件中,移植时需只需在os_cfg.h文件中使能定时器和设定定时器的相关参数。
UCOSII中软件定时器的实现方法是,将定时器按定时时间分组,使得每次时钟节拍到来时只对部分定时器进行比较操作,缩短了每次处理的时间。但这就需要动态地维护一个定时器组。定时器组的维护只是在每次定时器到时时才发生,而且定时器从组中移除和再插入操作不需要排序。这是一种比较高效的算法,减少了维护所需的操作时间。
UCOSII软件定时器实现了3类链表的维护:
OS_TMR&&OSTmrTbl[OS_TMR_CFG_MAX];&
&//定时器控制块数组
OS_EXT OS_TMR *OSTmrFreeL&
&&&//空闲定时器控制块链表指针
OS_EXT OS_TMR_WHEEL
OSTmrWheelTbl[OS_TMR_CFG_WHEEL_SIZE];//定时器轮
其中OS_TMR为定时器控制块,定时器控制块是软件定时器管理的基本单元,包含软件定时器的名称、定时时间、在链表中的位置、使用状态、使用方式,以及到时回调函数及其参数等基本信息。
OSTmrTbl[OS_TMR_CFG_MAX];:以数组的形式静态分配定时器控制块所需的RAM空间,并存储所有已建立的定时器控制块,OS_TMR_CFG_MAX为最大软件定时器的个数。
OSTmrFreeLiSt:为空闲定时器控制块链表头指针。空闲态的定时器控制块(OS_TMR)中,OSTmrnext和OSTmrPrev两个指针分别指向空闲控制块的前一个和后一个,组织了空闲控制块双向链表。建立定时器时,从这个链表中搜索空闲定时器控制块。
OSTmrWheelTbl[OS_TMR_CFG_WHEEL_SIZE]:该数组的每个元素都是已开启定时器的一个分组,元素中记录了指向该分组中第一个定时器控制块的指针,以及定时器控制块的个数。运行态的定时器控制块(OS_TMR)中,OSTmrnext和OSTmrPrev两个指针同样也组织了所在分组中定时器控制块的双向链表。软件定时器管理所需的数据结构示意图如图60.1.5所示:
<img FILE="/upload//e3cc23c79b501_381.jpg" ALT="" src="/blog7style/images/common/sg_trans.gif" real_src ="/upload//e3cc23c79b501_381.jpg" LAZYLOADED="true" WIDTH="415" HEIGHT="356" STYLE="word-wrap: break-"
TITLE="ucos2&&软件定时器介绍&(转载)" />
软件定时器管理所需的数据结构示意图
OS_TMR_CFG_WHEEL_SIZE定义了OSTmrWheelTbl的大小,同时这个值也是定时器分组的依据。按照定时器到时值与OS_TMR_CFG_WHEEL_SIZE相除的余数进行分组:不同余数的定时器放在不同分组中;相同余数的定时器处在同一组中,由双向链表连接。这样,余数值为0~OS_TMR_CFG_WHEEL_SIZE-1的不同定时器控制块,正好分别对应了数组元素OSTmr-WheelTbl[0]~OSTmrWheelTbl[OS_TMR_CFGWHEEL_SIZE-1]的不同分组。每次时钟节拍到来时,时钟数OSTmrTime值加1,然后也进行求余操作,只有余数相同的那组定时器才有可能到时,所以只对该组定时器进行判断。这种方法比循环判断所有定时器更高效。随着时钟数的累加,处理的分组也由0~OS_TMR_CFG_WHE
EL_SIZE-1循环。这里,我们推荐OS_TMR_CFG_WHEEL_SIZE的取值为2的N次方,以便采用移位操作计算余数,缩短处理时间。
信号量唤醒定时器管理任务,计算出当前所要处理的分组后,程序遍历该分组中的所有控制块,将当前OSTmrTime值与定时器控制块中的到时值(OSTmrMatch)相比较。若相等(即到时),则调用该定时器到时回调函数;若不相等,则判断该组中下一个定时器控制块。如此操作,直到该分组链表的结尾。软件定时器管理任务的流程如图60.1.6所示。
<img FILE="/upload//1a274da6b6bbc195d061e7_633.jpg" ALT="" src="/blog7style/images/common/sg_trans.gif" real_src ="/upload//1a274da6b6bbc195d061e7_633.jpg" LAZYLOADED="true" WIDTH="385" HEIGHT="291" STYLE="word-wrap: break-"
TITLE="ucos2&&软件定时器介绍&(转载)" />
软件定时器管理任务流程
当运行完软件定时器的到时处理函数之后,需要进行该定时器控制块在链表中的移除和再插入操作。插入前需要重新计算定时器下次到时时所处的分组。计算公式如下:
定时器下次到时的OSTmrTime值(OSTmrMatch)=定时器定时值+当前OSTmrTime值
新分组=定时器下次到时的OSTmrTime值(OSTmrMatch)%OS_TMR_CFG_WHEEL_SIZE
接下来我们看看在UCOSII中,与软件定时器相关的几个函数。
1)&&创建软件定时器函数
创建软件定时器通过函数OSTmrCreate实现,该函数原型为:OS_TMR
*OSTmrCreate (INT32U dly, INT32U period, INT8U opt, OS_TMR_CALLBACK
callback,void&&*callback_arg,
INT8U *pname, INT8U *perr)。
dly,用于初始化定时时间,对单次定时(ONE-SHOT模式)的软件定时器来说,这就是该定时器的定时时间,而对于周期定时(PERIODIC模式)的软件定时器来说,这是该定时器第一次定时的时间,从第二次开始定时时间变为period。
period,在周期定时(PERIODIC模式),该值为软件定时器的周期溢出时间。
opt,用于设置软件定时器工作模式。可以设置的值为:OS_TMR_OPT_ONE_SHOT或OS_TMR_OPT_PERIODIC,如果设置为前者,说明是一个单次定时器;设置为后者则表示是周期定时器。
callback,为软件定时器的回调函数,当软件定时器的定时时间到达时,会调用该函数。
callback_arg,回调函数的参数。
pname,为软件定时器的名字。
perr,为错误信息。
软件定时器的回调函数有固定的格式,我们必须按照这个格式编写,软件定时器的回调函数格式为:void
(*OS_TMR_CALLBACK)(void *ptmr, void
*parg)。其中,函数名我们可以自己随意设置,而ptmr这个参数,软件定时器用来传递当前定时器的控制块指针,所以我们一般设置其类型为OS_TMR*类型,第二个参数(parg)为回调函数的参数,这个就可以根据自己需要设置了,你也可以不用,但是必须有这个参数。
2)&&开启软件定时器函数
任务可以通过调用函数OSTmrStart开启某个软件定时器,该函数的原型为:BOOLEAN&&OSTmrStart
(OS_TMR *ptmr, INT8U
*perr)。其中ptmr为要开启的软件定时器指针,perr为错误信息。
3)&&停止软件定时器函数
任务可以通过调用函数OSTmrStop停止某个软件定时器,该函数的原型为:BOOLEAN&&OSTmrStop
(OS_TMR *ptmr,INT8U opt,void *callback_arg,INT8U *perr)。
其中ptmr为要停止的软件定时器指针。
opt为停止选项,可以设置的值及其对应的意义为:
OS_TMR_OPT_NONE,直接停止,不做任何其他处理
OS_TMR_OPT_CALLBACK,停止,用初始化的参数执行一次回调函数
OS_TMR_OPT_CALLBACK_ARG,停止,用新的参数执行一次回调函数
&&&callback_arg,新的回调函数参数。
&&&perr,错误信息。
软件定时器我们就介绍到这。
60.2 硬件设计
本节实验功能简介:本章我们在UCOSII里面创建7个任务:开始任务、LED任务、触摸屏任务、队列消息显示任务、信号量集任务、按键扫描任务和主任务,开始任务用于创建邮箱、消息队列、信号量集以及其他任务,之后挂起;触摸屏任务用于在屏幕上画图,测试CPU使用率;队列消息显示任务请求消息队列,在得到消息后显示收到的消息数据;信号量集任务用于测试信号量集,采用OS_FLAG_WAIT_SET_ANY的方法,任何按键按下(包括TPAD),该任务都会控制蜂鸣器发出“滴”的一声;按键扫描任务用于按键扫描,优先级最高,将得到的键值通过消息邮箱发送出去;主任务创建3个软件定时器(定时器1,100ms溢出一次,显示CPU和内存使用率;定时2,200ms溢出一次,在固定区域不停的显示不同颜色;定时3,,100ms溢出一次,用于自动发送消息到消息队列),并通过查询消息邮箱获得键值,根据键值执行DS1控制、控制软件定时器3的开关、触摸区域清屏、触摸屏校和软件定时器2的开关控制等。
所要用到的硬件资源如下:
1)&&指示灯DS0
2)&&4个机械按键(KEY0/KEY1/KEY2/WK_UP)
3)&&TPAD触摸按键
4)&&蜂鸣器
5)&&TFTLCD模块
这些,我们在前面的学习中都已经介绍过了。
60.3 软件设计
本章,我们在第四十三章实验 (实验38
)的基础上修改,首先,是UCOSII代码的添加,具体方法同第五十九章一模一样,本章就不再详细介绍了。本章OS_TICKS_PER_SEC的设置还是为500,即UCOSII的时钟节拍为2ms。另外由于我们创建了7个任务,加上统计任务、空闲任务和软件定时器任务,总共10个任务,如果你还想添加其他任务,请把OS_MAX_TASKS的值适当改大。
另外,我们还需要在os_cfg.h里面修改软件定时器管理部分的宏定义,修改如下:
#define OS_TMR_EN&
&//使能软件定时器功能
OS_TMR_CFG_MAX&
//最大软件定时器个数
OS_TMR_CFG_NAME_EN&
&&&//使能软件定时器命名
OS_TMR_CFG_WHEEL_SIZE&
&&&//软件定时器**小
OS_TMR_CFG_TICKS_PER_SEC&
&//软件定时器的时钟节拍(10ms)
OS_TASK_TMR_PRIO&
&&&//软件定时器的优先级,设置为最高&
这样我们就使能UCOSII的软件定时器功能了,并且设置最大软件定时器个数为16,定时器**小为8,软件定时器时钟节拍为10ms(即定时器的最少溢出时间为10ms)。
最后,我们只需要修改test.c函数了,打开test.c,输入如下代码:
/////////////////////////UCOSII任务设置///////////////////////////////////
//START 任务
START_TASK_PRIO&
&//设置任务优先级
START_STK_SIZE&
& //设置任务堆栈大小
START_TASK_STK[START_STK_SIZE]; //任务堆栈&
void start_task(void
*pdata);& &&
&//任务函数
LED_TASK_PRIO&
&&&//设置任务优先级
LED_STK_SIZE& &&
//设置任务堆栈大小
LED_TASK_STK[LED_STK_SIZE];&
&//任务堆栈&
led_task(void *pdata);&
&&&//任务函数
//触摸屏任务
TOUCH_TASK_PRIO&
&&&//设置任务优先级
TOUCH_STK_SIZE&
//设置任务堆栈大小&
TOUCH_TASK_STK[TOUCH_STK_SIZE];//任务堆栈
touch_task(void *pdata);&
&& &//任务函数
//队列消息显示任务
QMSGSHOW_TASK_PRIO&
&&&//设置任务优先级
QMSGSHOW_STK_SIZE&
//设置任务堆栈大小&
QMSGSHOW_TASK_STK[QMSGSHOW_STK_SIZE]; //任务堆栈
qmsgshow_task(void *pdata);&
&& & //任务函数
MAIN_TASK_PRIO&
&&&//设置任务优先级
MAIN_STK_SIZE&
128&&//设置任务堆栈大小
MAIN_TASK_STK[MAIN_STK_SIZE];& &
//任务堆栈&
main_task(void *pdata);&
&& &//任务函数
//////////////////////////////////////////////////////////////////////////////
//信号量集任务
FLAGS_TASK_PRIO&
&&&//设置任务优先级
FLAGS_STK_SIZE&
64& & //设置任务堆栈大小
FLAGS_TASK_STK[FLAGS_STK_SIZE]; //任务堆栈
flags_task(void *pdata);&
&&&//任务函数
//按键扫描任务
KEY_TASK_PRIO&
&&&//设置任务优先级
KEY_STK_SIZE& &&
& //设置任务堆栈大小
KEY_TASK_STK[KEY_STK_SIZE];&
&//任务堆栈&
key_task(void *pdata);&
&& & //任务函数
OS_EVENT *
&//按键邮箱事件块&
OS_EVENT *
&&&//消息队列
OS_TMR& &*
&&&//软件定时器1
OS_TMR& &*
&&&//软件定时器2
OS_TMR& &*
&&&//软件定时器3
OS_FLAG_GRP *
flags_& &&
& //按键信号量集
MsgGrp[256];& &&
//消息队列存储地址,最大支持256个消息
//软件定时器1的回调函数&&
//每100ms执行一次,用于显示CPU使用率和内存使用率&
tmr1_callback(OS_TMR *ptmr,void *p_arg)
&static u16 cpuusage=0; static u8
tcnt=0;& &&
& POINT_COLOR=BLUE;
& if(tcnt==5)
LCD_ShowxNum(182,10,cpuusage/5,3,16,0);&
//显示CPU使用率&&
&&&cpuusage=0;
tcnt=0;& &&
& cpuusage+=OSCPUU tcnt++;&
&LCD_ShowxNum(182,30,mem_perused(SRAMIN),3,16,0);&
&//显示内存使用率&&
LCD_ShowxNum(182,50,((OS_Q*)(q_msg-&OSEventPtr))-&OSQEntries,3,16,0X80);
//显示队列当前的大小& &&
//软件定时器2的回调函数&
tmr2_callback(OS_TMR *ptmr,void *p_arg)
& static u8 sta=0;
& switch(sta)
&&&case 0:
LCD_Fill(121,221,lcddev.width-1,lcddev.height-1,RED);
&&&case 1:
LCD_Fill(121,221,lcddev.width-1,lcddev.height-1,GREEN);
&&&case 2:
LCD_Fill(121,221,lcddev.width-1,lcddev.height-1,BLUE);
&&&case 3:
LCD_Fill(121,221,lcddev.width-1,lcddev.height-1,MAGENTA);
&& & case 4:
LCD_Fill(121,221,lcddev.width-1,lcddev.height-1,GBLUE);
5<img src="/blog7style/images/common/sg_trans.gif" real_src ="/static/image/smiley/default/sweat.gif" SMILIEID="10" BORDER="0" ALT="" STYLE="word-wrap: break-"
TITLE="ucos2&&软件定时器介绍&(转载)" />CD_Fill(121,221,lcddev.width-1,lcddev.height-1,YELLOW);
&&&case 6:
LCD_Fill(121,221,lcddev.width-1,lcddev.height-1,BRRED);
& sta++; if(sta&6)sta=0;&
//软件定时器3的回调函数&
tmr3_callback(OS_TMR *ptmr,void *p_arg)
& static u8 msg_cnt=0;&
&//msg编号&
& p=mymalloc(SRAMIN,13);&
&//申请13个字节的内存
sprintf((char*)p,"ALIENTEK d",msg_cnt);
&&&msg_cnt++;
&&&err=OSQPost(q_msg,p);
//发送队列
&&&if(err!=OS_ERR_NONE)&
&&&//发送失败
&myfree(SRAMIN,p);&
&&&//释放内存
&OSTmrStop(tmr3,OS_TMR_OPT_NONE,0,&err);&
&&&//关闭软件定时器3
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。}

我要回帖

更多关于 定时器中断优先级 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信