ucosIII 中断、临界区与时间管理
2015-12-18 12:29
344 查看
本文内容简介 讲述了进入和退出中断的方法 临界区的介绍以及延时函数,取消延时函数和获取系统时间 |
ucosIII中断 |
void USART1_IRQHandler(void) { OSIntEnter(); //中断服务程序 OSIntExit(); }
进入中断 |
void OSIntEnter (void) { if (OSRunning != OS_STATE_OS_RUNNING) {//用于确定系统是否正常运行 return } if (OSIntNestingCtr >= (OS_NESTING_CTR)250u) { return; } OSIntNestingCtr++;//中断嵌套的层数 }
OSIntNestingCtr来记录中断嵌套次数,UCOSIII最多支持250级的中断嵌套。退出中断服务函数时要调用函数OSIntExit()。
退出中断 |
1.系统是否运行。不符合则退出
2.关闭全局中断
3.中断嵌套次数和任务切换次数记录
4.进行中断级任务切换
void OSIntExit (void) { CPU_SR_ALLOC();//宏定义的CPU_SR if (OSRunning != OS_STATE_OS_RUNNING) { /* Has the OS started? */ return; /* No */ } /*关闭全局中断,包括关闭滴答定时器中断*/ CPU_INT_DIS(); if (OSIntNestingCtr == (OS_NESTING_CTR)0) { /* Prevent OSIntNestingCtr from wrapping */ CPU_INT_EN(); return; } OSIntNestingCtr--;//中断嵌套次数 if (OSIntNestingCtr > (OS_NESTING_CTR)0) { /* ISRs still nested? */ CPU_INT_EN(); /* Yes */ return; } /*OSSchedLockNestingCtr 调度器是否加锁的标志*/ if (OSSchedLockNestingCtr > (OS_NESTING_CTR)0) { /* Scheduler still locked? */ CPU_INT_EN(); /* Yes */ return; } /*获得最高优先级的任务*/ OSPrioHighRdy = OS_PrioGetHighest(); /* Find highest priority */ OSTCBHighRdyPtr = OSRdyList[OSPrioHighRdy].HeadPtr; /* Get highest priority task ready-to-run */ if (OSTCBHighRdyPtr == OSTCBCurPtr) { /* Current task still the highest priority? */ CPU_INT_EN(); /* Yes */ return; } #if OS_CFG_TASK_PROFILE_EN > 0u OSTCBHighRdyPtr->CtxSwCtr++; /* Inc. # of context switches for this new task */ #endif OSTaskCtxSwCtr++; //任务切换的次数 /* Keep track of the total number of ctx switches */ #if defined(OS_CFG_TLS_TBL_SIZE) && (OS_CFG_TLS_TBL_SIZE > 0u) OS_TLS_TaskSw(); #endif /*中断级任务调度*/ OSIntCtxSw(); /* Perform interrupt level ctx switch */ CPU_INT_EN(); }
临界区 |
宏OS_CFG_ISR_POST_DEFERRED_EN:
0:UCOSIII使用关中断的方式来保护临界段代码
1:采用给调度器上锁的方式来保护临界段代码。
UCOSIII定义了一个进入临界段代码的宏:OS_CRITICAL_ENTER(),定义了两个退出临界段代码的宏:OS_CRITICAL_EXIT和OS_CRITICAL_EXIT_NO_SCHED()。
时间管理 |
任务延时 |
延时函数有两种,OSTimeDly()—指定节拍数
和OSTimeDlyHMSM()—参数直观。
OSTimeDly()函数有三种工作模式:相对模式、周期模式和绝对模式。
OSTimeDlyHMSM()函数仅在相对模式下工作。
取消任务延时 |
获取和设置系统时间 |
OSTimeSet()允许用户改变当前时钟节拍计数器的值,慎用!!!!!
OSTimeGet()用来获取动迁时钟节拍计数器的值。
相关文章推荐
- IOS UI篇—UILabel的文字顶部对齐
- boost源码剖析之:多重回调机制signal(上)
- 在Windows中隐藏用户的方法
- 团队博客 Week14
- HDOJ 4706 Children's Day
- 存储过程的常见结构
- mac中的echo颜色输出
- Leetcode: The Skyline Problem
- libevent安装
- 我学ASP.Net---新手(分页显示)
- boost源码剖析之:泛型函数指针类boost::function(rev#3)
- Oracle经常使用函数
- boost源码剖析之:Tuple Types(rev#2)
- android之getDimension、getDimensionPixelSize、getDimensionPixelOffset区别
- handler 使用
- 搜索引擎与浏览器的上层结构
- POJ 3984 迷宫问题 --- BFS
- Android笔记(2)---帧布局实现霓虹灯效果
- Javascript Charts
- bzoj4012: [HNOI2015]开店