淘宝店铺:http://eboard.taobao.com 技术论坛:www.openedv.com 《手把手教你学STM32-UCOS》 主讲人 :正点原子团队 硬件平台:正点原子STM32开发板 版权所有:广州市星翼电子科技有限公司 淘宝店铺:http://eboard.taobao.com 技术论坛:www.openedv.com 开源电子网 公众平台:“正点原子” 官方网站:www.alientek.com 联系电话:13922348612 ddddd ALIENTEK 淘宝店铺:http://eboard.taobao.com 技术论坛:www.openedv.com
淘宝店铺:http://eboard.taobao.com 技术论坛:www.openedv.com 《手把手教你学STM32-UCOS》 UCOSIII中断和时间管理 适用平台 STM32F1xx 开发板 (正点原子) STM32F4xx 开发板 (正点原子) 淘宝店铺:http://eboard.taobao.com 技术论坛:www.openedv.com
淘宝店铺:http://eboard.taobao.com 技术论坛:www.openedv.com 目录 UCOSIII中断 1 UCOSIII临界段代码保护 2 UCOSIII时间管理 3 淘宝店铺:http://eboard.taobao.com 技术论坛:www.openedv.com
UCOSIII中断和时间管理 参考资料: 战舰/精英/Mini STM32/STM32F4开发板 《STM32F4 UCOS开发手册》-第八章 UCOSIII中断和时间管理 《STM32F1 UCOS开发手册》-第八章 UCOSIII中断和时间管理 www.themegallery.com
淘宝店铺:http://eboard.taobao.com 技术论坛:www.openedv.com 1、UCOSIII中断管理 1.1、UCOSIII中断: 中断:应内部或外部异步事件的请求中止当前任务,而去处理异步事件所要求的任务的过程叫做中断。 我们学习的重点就是---如何在UCOSIII下编写中断服务函数! void USART1_IRQHandler(void) { OSIntEnter(); //中断服务程序 OSIntExit(); } 淘宝店铺:http://eboard.taobao.com 技术论坛:www.openedv.com
淘宝店铺:http://eboard.taobao.com 技术论坛:www.openedv.com 1、UCOSIII中断管理 1.2、进入和退出中断服务函数: 进入中断服务函数以后使用函数OSIntEnter() void OSIntEnter (void) { if (OSRunning != OS_STATE_OS_RUNNING) { return } if (OSIntNestingCtr >= (OS_NESTING_CTR)250u) { return; OSIntNestingCtr++; OSIntNestingCtr来记录中断嵌套次数,UCOSIII最多支持250级的中断嵌套。退出中断服务函数时要调用函数OSIntExit()。 淘宝店铺:http://eboard.taobao.com 技术论坛:www.openedv.com
淘宝店铺:http://eboard.taobao.com 技术论坛:www.openedv.com 2、UCOSIII临界段代码保护 临界段代码也叫做临界区,是指那些必须完整连续运行,不可被打断的代码段。当访问这些临界段代码的时候需要对这些临界段代码进行保护。 当宏OS_CFG_ISR_POST_DEFERRED_EN为0时,UCOSIII使用关中断的方式来保护临界段代码,当设置为1的时候就会采用给调度器上锁的方式来保护临界段代码。 UCOSIII定义了一个进入临界段代码的宏:OS_CRITICAL_ENTER(),定义了两个退出临界段代码的宏:OS_CRITICAL_EXIT和OS_CRITICAL_EXIT_NO_SCHED()。 淘宝店铺:http://eboard.taobao.com 技术论坛:www.openedv.com
淘宝店铺:http://eboard.taobao.com 技术论坛:www.openedv.com 3、UCOSIII时间管理 3.1、任务延时: UCOSIII中的任务是一个无限循环并且还是一个抢占式内核,为了使高优先级的任务不至于独占CPU,可以给其他优先级较低任务获取CPU使用权的机会,UCOSIII中除空闲任务外的所有任务必须在合适的位置调用系统提供的延时函数,让当前的任务暂停运行一段时间并进行一个任务切换。 延时函数有两种,OSTimeDly()和OSTimeDlyHMSM()。 OSTimeDly()函数有三种工作模式:相对模式、周期模式和绝对模式。 OSTimeDlyHMSM()函数仅在相对模式下工作。 淘宝店铺:http://eboard.taobao.com 技术论坛:www.openedv.com
淘宝店铺:http://eboard.taobao.com 技术论坛:www.openedv.com 3、UCOSIII时间管理 3.2、取消任务的延时: 延时任务任务可通过在其他任务中调用函数OSTimeDlyResume()取消延时而进入就绪状态,此函数最后会引发一次任务调度。 3.3、获取和设置系统时间: UCOSIII定义了一个CPU_INT32U类型的全局变量OSTickCtr来记录系统时钟节拍数,在调用OSInit()时被初始化为0,以后每发生1个时钟节拍,OSTickCtr加1。 OSTimeSet()允许用户改变当前时钟节拍计数器的值,慎用!!!!! OSTimeGet()用来获取动迁时钟节拍计数器的值。 淘宝店铺:http://eboard.taobao.com 技术论坛:www.openedv.com
淘宝店铺:http://eboard.taobao.com 技术论坛:www.openedv.com 谢谢您对“正点原子”团队的支持 硬件平台:正点原子STM32开发板 版权所有:广州市星翼电子科技有限公司 淘宝店铺:http://eboard.taobao.com 技术论坛:www.openedv.com 淘宝店铺:http://eboard.taobao.com 技术论坛:www.openedv.com