文章目录
序言
本篇文章主要是介绍一下在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的内部函数。