UCOSIII中的中断和时间管理

序言

本篇文章主要是介绍一下在UCOSIII中是如何使用的中断的,以及UCOSIII中的时间管理

在STM32中使用外部中断

我们先来复习一下在STM32中如何使用外部中断

中断配置

STM32中的中断配置主要分为四个步骤:配置引脚、开启外设所在总线时钟、配置每个引脚对应的外部中断线、配置中断线、配置NVIC

//外部中断初始化函数
void EXTIX_Init(void)
{
	//定义用来配置外部中断线的结构体
	EXTI_InitTypeDef EXTI_InitStructure;
	NVIC_InitTypeDef NVIC_InitStructure;
    
    //配置引脚
    key_init();
	
	//外部中断,需要使能AFIO时钟
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);
	
  //GPIOA.15配置	  
  GPIO_EXTILineConfig(GPIO_PortSourceGPIOA,GPIO_PinSource15);
	
	//中断线以及中断初始化配置
  EXTI_InitStructure.EXTI_Line=EXTI_Line15;
  EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;	
  EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;
  EXTI_InitStructure.EXTI_LineCmd = ENABLE;
  EXTI_Init(&EXTI_InitStructure);
	
	//配置NVIC
  NVIC_InitStructure.NVIC_IRQChannel = EXTI15_10_IRQn;			//使能按键所在的外部中断通道
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x02;	//抢占优先级2, 
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x00;					//子优先级1
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;								//使能外部中断通道
  NVIC_Init(&NVIC_InitStructure);
}

编写中断函数

void EXTI15_10_IRQHandler(void)
{
  delay_ms(20);    //消抖			 
  if(KEY1==0)	{
		LED1=~LED1;
   }
	EXTI_ClearITPendingBit(EXTI_Line15);  //清除LINE15线路挂起位
	EXTI_ClearITPendingBit(EXTI_Line13); 
}

在UCOSIII中使用中断

唯一不同的地方在于中断的函数编写,我们将中断函数写成如下形式

void EXTI15_10_IRQHandler(void)
{
	OSIntEnter();
	/**裸机时候的中断服务函数**/
	OSIntExit();
}

时间管理

UCOSIII是抢占式内核,为了防止高优先级的任务一直占用CPU,我们必须给除了空闲任务以外的每一个任务加一个延时函数。下面就来介绍几个延时函数。

OSTimeDly()函数

当我们需要对一个任务进行延时操作的时候就可以使用这个函数,函数原型如下所示:

void OSTimeDly(OS_TICK dly, OS_OPT opt, OS_ERR  *p_err)
  • dly:指定延时的时间长度,这里单位为时间节拍数
  • opt:指定延时的选项
  • p_err:指向调用该函数后返回的错误码

OSTimeDlyHMSM()函数

我们也可以调用OSTimeDlyHMSM函数来更加直观地对任务进行延时,原型如下:

void OSTimeDlyHMSM(CPU_INT16U hours,//需要延时的小时数
                   CPU_INT16U minutes,//需要延时的分钟数
                   CPU_INT16U seconds,//需要延时的秒数
                   CPU_INT32U milli,//需要延时的毫秒数
                   OS_OPT     opt,//选项
                   OS_ERR    *p_err)

OSTimeDlyResume()函数

一个任务可以通过调用这个函数来解救那些因为调用了OSTimeDly()或者OSTimeDlyHMSM()函数而进入等待状态的任务,函数原型如下:

void OSTimeDlyResume(OS_TCB *p_tcb, OS_ERR *p_err)
  • p_tcb:需要恢复的任务的任务控制块
  • p_err:指向调用这个函数后返回的错误码

OSTimeTick()

当时基础中断发生时,时基中断服务函数ISR必须调用这个函数。UCOSIII用这个函数更新时基计数值。OSTimeTick()是UCOSIII的内部函数。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值