功率电感生产厂家
联系我们
热门搜索
点击排行
推荐阅读
猜猜你喜欢的
技术知识 您所在的位置: 首页 > 技术知识

μC/OSII中软件定时器的优缺点与改进

来源:    作者:    发布时间:2015-01-05 10:48:28    浏览量:

μC/OSII具有小巧、性能稳定、开源等众多优点,并且μC/OSII大部分用ANSI C语言编写,系统的移植非常容易。在μC/OSII I2.81及以后的版本中[2],加入了对软件定时贴片电感器的支持,使得μC/OSII操作系统更加完善。

  μC/OSII是一种基于优先电感器生产厂家级的抢占式操作系统,实时性很强。而系统中软件定时器没有优先级,回调函数顺序执行,这样就降低了系统的实时性。因此,本文对软件定时器进行改进,定时器中加入优先级,回调函数按优先级执行,从而提高系统的实时性。

  1 对软件定时器的介绍

  μC/OSII系统中的时间管理功能包括任务延时与软件定时器,而软件定时器的主要作用是,对函数周期性或者一次性执行的定时,利用软件定时器控制块与“差模电感器定时器轮”管理软件定时器。定时器控制块的结构如同任务控制块,创建一个定时器时,从空闲定时器控制块链表中得到一个空闲控制块,并对其赋值。

  软件定时器也需要一个时钟节拍驱动,而这个驱动一般是硬件实现的,一般使用μC/OSII操作系统中任务延时的时钟节拍来驱动软件定时器。每个时钟节拍OSTmrCtr(全局变量,初始值为0)增1, 当OSTmrCtr的值等于为OS_TICKS_PER_SEC /OS_TMR_CFG_TICKS_PER_SEC(此两者的商决定软件定时器的频率)时,调用函数OSTmrSignal(),此函数发送信号量OSTmrSemSignal(初始值为0,决定软件定时器扫描任务OSTm电感电压r_Task的运行)。也就是说,对定时器的处理不在时钟节拍中断函数中进行,而是以发生信号量的方式激活任务OSTmr_Task(具有很高的优先级)。任务OSTmr_Task对定时器进行检测处理,包括定时器定时完成的判断、回调函数的执行。

  μC/OSII 2.86中与软件定时器相关的函数包括:

  ① 软件定时器内部静态函数。获取与释放定时器控制块函数OSTmr_Alloc()、OSTmr_Free();定时器插入相应“时间轮”组函数OSTmr_Link();从相应“时间轮”组中删除定时器函数OSTmr_Unlink();软件定时器任务初始化函数OSTmr_InitTask();定时器扫描任务OSTmr_Task;定时器上锁与解锁函数OSTmr_Lock()与OSTmr_Unlock()(在μC/OSII 2.91中,此两函数被任务调度锁定与解锁函数代替)。

  ② 定时器外部接口函数。定时器创建与删除函数OSTmrCreate()、OSTmrDel();定时器启动与停止函数OSTmrStart()、OSTmrStop();定时器剩余时间与当前状态查询函数OSTmrRemainGet()、OSTmrStateGet();软件定时器的初始化OSTmr_Init();发送信号量OSTmrSemSignal函数OSTmrSignal();定时器名称查询函数OSTmrNameGet()。

  由于软件定时器的回调函数的执行都是在任务OSTmr_Task中执行,如果多个定时器同时定时完成,则在定时器任务中执行多个定时器的回调函数,因此定时器任务的执行时间不确定。而且定时器回调函数是顺工字电感序执行的,如果某个定时器回调函数需要尽快执行以实现精确定时,就难以实现了。由于各个定时器没有优先级,因此了影响系统的实时性。

  2 对软件定时器的改进

  为提高软件定时器回调函数执行的实时性,给每个定时器赋予一个优先级。当定时完成时,并且定时器的回调函数不为空,则把定时器的优先级写于软件定时器就绪表中。任务OSTmr_Task对相应“时间轮”检查结束后,如果在扫描各个定时器前软件定时器就绪表为零而扫描之后不为零,则发送信号量激活回调函数任务OSTmr_TaskCallback。在此任务中,回调函数根据软件定时器就绪表中的优先级执行相应的回调函数,这样就提高了系统的实时性。

  2.1 对软件定时器相关数据结构改进

  ① 定义结构体OS_TMR_CALL,存储定时器的回调函数、函数的参数、定时器指针,形式如下:

  typedefstructos_tmr_call {

  OS_TMR_CALLBACKOSTmrCallback; /*回调函数*/

  void *OSTmrCallbackArg;/*回调函数指针*/

  OS_TMR *OSTmr; /*定时器指针*/

  } OS_TMR_CALL;

  在头文件ucos_ii.h中,定义OSTmrCallbackTbl[OS_TMR_CFG_MAX],OS_TMR_CFG_MAX表示系统中配置的软件定时器数量。

  ② 在软件定时器控制块中加入成员变量OSTmrPrio(定时器优先级),删去变量OSTmrCallback(回调函数)、OSTmrCallbackArg(回调函数参数),为了测试的方便,可暂不删除这两个变量。

  ③ 定义定时器就绪表:

  • 介质损耗/功率因数测试鲜为人知的事实Megger技术支持小组随着变电站电气设备故障率的不断上升,供电公司和重工业必须着手进行预防和预测性维护,确保电力系统的完整性和可靠性。电气绝缘问题是电气设备故障的一个常见原因,而介质损耗/功率损耗/

  • 两个BUCK电路制作的并联电路


    我为什么最后调试的结果是I1为正值,但是I2却为负值了? 是电流I1流向了I2吗? 该怎么解决呢?
    两个并联需要考虑均流的,你的电路里面貌似没有。。。。均流只是这个题目的一部

  • On Semi Q32M210 32位MCU血糖仪应用方案On Semi公司的Q32M210是精密的混合信号32位MCU, 集成了2个16位模数转换器、高精度电压参考、3个10位数模转换器和基于ARM Cortex-M3 32位内核以及高度可配置的模拟前端及

  •