嵌入式系统学习——STM32之UCOS-III中断和时间管理及软件定时器

时间:2023-02-08 22:35:04

UCOSIII中断:

      中断:应内部或外部异步事件的请求中止当前任务,而去处理异步事件所要求的任务的过程叫做中断。
void USART1_IRQHandler(void)
{
OSIntEnter();
//中断服务程序
OSIntExit();
}

进入和退出中断服务函数:
进入中断服务函数以后使用函数OSIntEnter()
void  OSIntEnter (void)
{
if (OSRunning != OS_STATE_OS_RUNNING) {
return
}
if (OSIntNestingCtr >= (OS_NESTING_CTR)250u) {
return;
}
OSIntNestingCtr++;
}
   OSIntNestingCtr来记录中断嵌套次数,UCOSIII最多支持250级的中断嵌套。退出中断服务函数时要调用函数OSIntExit()。

临界段代码保护

      临界段代码也叫做临界区,是指那些必须完整连续运行,不可被打断的代码段。当访问这些临界段代码的时候需要对这些临界段代码进行保护。
   当宏OS_CFG_ISR_POST_DEFERRED_EN为0时,UCOSIII使用关中断的方式来保护临界段代码,当设置为1的时候就会采用给调度器上锁的方式来保护临界段代码。
     UCOSIII定义了一个进入临界段代码的宏:OS_CRITICAL_ENTER(),定义了两个退出临界段代码的宏:OS_CRITICAL_EXITOS_CRITICAL_EXIT_NO_SCHED()

时间管理

任务延时:
     UCOSIII中的任务是一个无限循环并且还是一个抢占式内核,为了使高优先级的任务不至于独占CPU,可以给其他优先级较低任务获取CPU使用权的机会,UCOSIII中除空闲任务外的所有任务必须在合适的位置调用系统提供的延时函数,让当前的任务暂停运行一段时间并进行一个任务切换。
   延时函数有两种,OSTimeDly()OSTimeDlyHMSM()
   OSTimeDly()函数有三种工作模式:相对模式、周期模式和绝对模式
   OSTimeDlyHMSM()函数仅在相对模式下工作。

取消任务的延时:      延时任务任务可通过在其他任务中调用函数OSTimeDlyResume()取消延时而进入就绪状态,此函数最后会引发一次任务调度。

获取和设置系统时间:
     UCOSIII定义了一个CPU_INT32U类型的全局变量OSTickCtr来记录系统时钟节拍数,在调用OSInit()时被初始化为0,以后每发生1个时钟节拍,OSTickCtr加1。
  OSTimeSet()允许用户改变当前时钟节拍计数器的值,慎用!!!!!
  OSTimeGet()用来获取动迁时钟节拍计数器的值。


软件定时器简介:

      定时器本质是递减计数器,当计数器减到零时可以触发某种动作的执行,这个动作通过回调函数来实现。当定时器计时完成时,定义的回调函数就会被立即调用,应用程序可以有任意数量的定时器,UCOSIII中定时器的时间分辨率由一个宏OS_CFG_TMR_TASK_RATE_HZ,单位为HZ,默认为100Hz。
      注意!一定要避免在回调函数中使用阻塞调用或者可以阻塞或删除定时器任务的函数。
    回调函数就是一个通过函数指针调用的函数。如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用来调用其所指向的函数时,我们就说这是回调函数。回调函数不是由该函数的实现方法直接调用,而是在特定的事件或条件发生时由另外的一方调用的,用于对该事件或条件进行响应。

软件定时器API函数:
嵌入式系统学习——STM32之UCOS-III中断和时间管理及软件定时器

创建定时器:
创建软件定时器使用函数OSTmrCreate():
OSTmrCreate (OS_TMR               *p_tmr,
CPU_CHAR *p_name,
OS_TICK dly,
OS_TICK period,
OS_OPT opt,
OS_TMR_CALLBACK_PTR p_callback,
void *p_callback_arg,
OS_ERR *p_err)

单次定时器:

      单次定时器从初始值(也就是OSTmrCreate()函数中的参数dly)开始倒计数,直到为0调用回调并停止。单次定时器的定时器只执行一次。

周期模式(无初始延迟):
     创建定时器的时候我们可以设定为周期模式,当倒计时完成后,定时器调用回调函数,并重置计数器重新开始计时,一直循环性下去。如果在调用函数OSTmrCreate()创建周期定时器时让参数dly为0,那么定时器每个周期就是period。

周期模式(有初始延迟):
     周期定时器也可以设定为带初始延迟时间的运行模式,使用函数OSTmrCreate() 参数dly来确定第一个周期,以后的每个周期开始时将计数器值重置为period。


参考:开源电子网   STM32中文参考手册