您好、欢迎来到现金彩票网!
当前位置:秒速快3 > 输入优先级 >

STM32 uCOS_II 实践 之 外部中断事件 及 系统运行过程

发布时间:2019-05-18 13:38 来源:未知 编辑:admin

  大概可以分作4个步骤:1-配置相应管脚为浮空输入;2-配置相应管脚为外部中断口并设定其中断属性及参数;3-配置NVIC相关寄存器,设定中断优先级;4-编写中断服务函数。废话不说直接上代码:

  第二步:配置相应管脚为外部中断口并且设定其中断属性及参数,来自文件EXTIG.c

  第三步:配置NVIC相关寄存器,设定中断优先级,来自文件SysInit.c

  首先把上面所述步骤1,步骤2和步骤4的代码放到KEY.C文件内,然后把步骤3的代码加入SysInit.C文件内的 NVIC_Configuration()函数。步骤1,步骤2,和步骤3与没有操作系统的代码一致,都是最底层的东西。步骤4需要符合ucos的代码规范,也要用到ucos的系统函数,如下面代码:

  OSSemPost(Sem_Task_LED2);// 发送信号量,这个函数并不会引起系统调度,所以中断服务函数一定要简洁。

  如代码所示黄色高亮部分就是进入中断和出中断的ucos部分的代码,在出中断的时候会引起系统调度,然后最高优先级的任务会先执行,保证了系统的实时性。

  首先系统建立一个起始任务START,这个任务的优先级最低为10,他主要是做系统心跳的显示,另外把其他需要的任务初始化。在例程里有另外两个任务,分别是KEY1任务(优先级为9)和LED2任务(优先级为5)。先初始化KEY1任务,初始化函数结束后就跳到KEY1任务代码处执行,当遇到OSTimeDlyHMSM()函数时,会引发系统调度,此时就两个任务,所以肯定会回到起始任务START,然后初始化LED2任务,初始化函数结束后就跳到LED2任务代码处执行,在这个任务中有等待信号量的函数,所以系统会自己挂起任务,系统再进行调度的时候也会执行这个挂起任务里的代码。这时候如果按下按键,就会触发中断,在中断函数里会有信号量发出来,在结束中断的时候会有系统调度,此时系统会跳到请求信号量的断点处去执行代码,这一点体现了ucos的抢占性的特点,就是中断的优先级都是凌驾与非中断任务的,所以中断里发出的信号量一定是要先相应的。然后系统就会遵循优先级高低进行系统调度。

  这里创建信号量和设置等待信号量都是在任务LED2里,设置发送信号量在中断服务函数里。见代码:

  这里要说一下注意点,首先定义的信号量指针是一个全局变量,需要在相应的头文件里进行extern声明,在这里是把他放在task.c文件里的。另外创建信号量和设置等待信号量函数都放在具体的任务中,因为在逻辑上,创建信号量和等待信号量函数肯定要早与发送信号量函数执行,因此在设置等待信号量之前去创建信号量是完全合适的,并且把创建信号量函数放在具体任务的while(1)上面,在创建函数的时候信号量就已经被创建了,然后代码执行到等待信号量的时候任务就会被挂起,除非时间到或者有信号量来的话才会被执行。最后设置发送信号量,在这里发送信号量函数是放在中断服务程序里的,因为发送信号量函数的执行并不会引起系统调度,只有在中断服务函数执行完毕,出中断函数的执行才会引发系统调度,所以中断服务函数里的内容一定要精简,否则就会影响系统的实时性。

http://moserfarmshomes.com/shuruyouxianji/15.html
锟斤拷锟斤拷锟斤拷QQ微锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷微锟斤拷
  • 上一篇:没有了
  • 下一篇:没有了
关于我们|联系我们|版权声明|网站地图|
Copyright © 2002-2019 现金彩票 版权所有