uCOS_II系统实操_外部中断
2016-12-28 18:11
183 查看
因工作需要接触到uCOS_II系统,原本跑裸机的项目源码移植到系统上一编译到处都是error,网上也不好找uCOS的实例代码,还到处都要付费下载文档才能查看,无奈之下只能自己捣鼓捣鼓。
下面直接进入主题,以下配置方式为库函数版本。
配置中断初始化时,需要注意的是,在uCOS系统上的中断机制跟裸机上不一样
其中几个关键的中断函数(定义在Bsp_int.c)
void BSP_IntVectSet(CPU_DATA int_id, CPU_FNCT_VOID isr);//设置中断向量及处理中断服务函数,产生中断时将跳至中断服务函数的地址
void BSP_IntEn (CPU_DATA int_id) //使能指定中断
void BSP_IntDis (CPU_DATA int_id) //禁用指定中断(视程序需要)
void BSP_IntDisAll (void) //禁用所有中断(视程序需要)
写优先级分配应该不难,基本都大同小异,不一样的是中断通道的定义名,裸机的定义跟uCOS的定义不一样,这个查一下系统文件就能找到了。
在Bsp_int.c中,还有一个函数可用来设置中断优先级,有兴趣的读者可以试试
void BSP_IntPrioSet (CPU_DATA int_id, CPU_INT08U prio) //设置中断优先级
中断服务函数名需与外部中断初始化中的BSP_IntVectSet()第二个参数一致
这里还需讲明一点,函数中用到了OSIntEnter() 与 OSIntExit(),这里大概讲一下作用
在uC/OS-II中,通常在进入中断时需要使用OSIntEnter() ;退出中断前使用OSIntExit();
在中断服务函数中使用这对函数,在中断结束后可进行任务调度,使得系统更加“实时”
若中断函数的运行不做信号量处理,对任务没有触发作用的,可以忽视不用
这样就完成了外部中断的配置,把EXTIX_INIT()放入系统初始化函数中,运行时待指定的IO有高低电平触发时,将触发对应的中断操作
以上解说部分如有异议的地方欢迎在讨论区一起探讨,一起学习,共同进步。
下面直接进入主题,以下配置方式为库函数版本。
1、外部中断初始化函数
// EXTI initialize void EXTIX_INIT(void) { EXTI_InitTypeDef EXTI_InitStructure; //定义外部中断结构体 RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE); //使能外部中断时钟 GPIO_EXTILineConfig(GPIO_PortSourceGPIOA,GPIO_PinSource1); //将GPIOA.1与中断线1映射起来 EXTI_InitStructure.EXTI_Line = EXTI_Line1; //设置中断线 EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; //中断触发模式 EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling; //下降沿触发 EXTI_InitStructure.EXTI_LineCmd = ENABLE; //使能外部中断线 EXTI_Init(&EXTI_InitStructure); //外部中断初始化 BSP_IntVectSet(BSP_INT_ID_EXTI1,EXTI1_IRQHandler); //设置中断号跟对应的中断服务函数 BSP_IntEn(BSP_INT_ID_EXTI1); //使能指定中断 }
配置中断初始化时,需要注意的是,在uCOS系统上的中断机制跟裸机上不一样
其中几个关键的中断函数(定义在Bsp_int.c)
void BSP_IntVectSet(CPU_DATA int_id, CPU_FNCT_VOID isr);//设置中断向量及处理中断服务函数,产生中断时将跳至中断服务函数的地址
void BSP_IntEn (CPU_DATA int_id) //使能指定中断
void BSP_IntDis (CPU_DATA int_id) //禁用指定中断(视程序需要)
void BSP_IntDisAll (void) //禁用所有中断(视程序需要)
2、中断优先级配置
void NVICSTR_INIT(void) { NVIC_InitTypeDef NVIC_InitStructure; //定义优先级结构体 NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1); //设置NVIC中断分组 NVIC_InitStructure.NVIC_IRQChannel = EXTI1_IRQChannel; //使能只能外部中断通道 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1; //抢占优先级1 NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; //子优先级0 NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //使能外部中断通道 NVIC_Init(&NVIC_InitStructure); //中断优先级分组初始化 }
写优先级分配应该不难,基本都大同小异,不一样的是中断通道的定义名,裸机的定义跟uCOS的定义不一样,这个查一下系统文件就能找到了。
在Bsp_int.c中,还有一个函数可用来设置中断优先级,有兴趣的读者可以试试
void BSP_IntPrioSet (CPU_DATA int_id, CPU_INT08U prio) //设置中断优先级
3、中断服务函数
这里的中断服务函数名可以自己定义,不过也不能太随便,至少要能看出来是哪个中断的对接函数//EXTI1 interrupt handle void EXTI1_IRQHandler() { OSIntEnter(); ACounter1 = 30; //中断操作 EXTI_ClearITPendingBit(EXTI_Line1); //清除中断标志位 OSIntExit(); }
中断服务函数名需与外部中断初始化中的BSP_IntVectSet()第二个参数一致
这里还需讲明一点,函数中用到了OSIntEnter() 与 OSIntExit(),这里大概讲一下作用
在uC/OS-II中,通常在进入中断时需要使用OSIntEnter() ;退出中断前使用OSIntExit();
在中断服务函数中使用这对函数,在中断结束后可进行任务调度,使得系统更加“实时”
若中断函数的运行不做信号量处理,对任务没有触发作用的,可以忽视不用
这样就完成了外部中断的配置,把EXTIX_INIT()放入系统初始化函数中,运行时待指定的IO有高低电平触发时,将触发对应的中断操作
以上解说部分如有异议的地方欢迎在讨论区一起探讨,一起学习,共同进步。
相关文章推荐
- 基于UC/COSII系统的STM32F103系列单片机外部中断按键的一种使用方法
- ucos在s3c2410上运行过程整体剖析-从main函数到UCOS初始化完毕 分类: μc /os ii 系统有关知识 2012-03-13 21:37 1740人阅读 评论(0) 收藏
- LWIP-1.3.0在S3C2440平台UCOS-II-2.8.6系统上的移植过程DEBUG
- UCOS-II 中断与时钟问题总结(以UCOS2.25自带的X86例子)
- windows系统下调试uCOS-II
- STM8的中断系统以及外部中断详解
- 利用系统外部中断做PS键盘信号接收
- ucos-ii开关中断
- uCOS-II的中断-ARM7实现中断嵌套的方法探究
- STM32移植uCOS-II系统(1)
- ucos OS_ENTER_CRITICAL 分类: μc /os ii 系统有关知识 2011-09-08 11:31 5068人阅读 评论(2) 收藏
- ucos在s3c2410上运行过程整体剖析之基础知识-与UCOS运行有关的ARM9芯片知识--续 分类: μc /os ii 系统有关知识 2012-03-13 21:30 641人阅读 评论(0) 收藏
- ucos在s3c2410上运行过程整体剖析-从加电到执行main函数 分类: μc /os ii 系统有关知识 2012-03-13 21:27 2409人阅读 评论(1) 收藏
- 关于uCOS-II进出临界区时使用开关中断方式的疑问
- ucos在s3c2410上运行过程整体剖析---两种任务切换的实现方法 分类: μc /os ii 系统有关知识 2012-03-13 21:41 1102人阅读 评论(0) 收藏
- LWIP-1.3.0在S3C2440平台UCOS-II-2.8.6系统上的移植过程DEBUG
- Cortex-M3的PendSV中断以及uCOS系统一点思考
- ucos在s3c2410上运行过程整体剖析--创建任务到多任务调度及运行 分类: μc /os ii 系统有关知识 2012-03-13 21:38 1565人阅读 评论(1) 收藏
- uCOS-II 系统开发笔记
- STM32移植uCOS-II系统(2)