- 5.1.1 操作系统支持宏定义及相关函数
- 当需要 delay_ms 和 delay_us 支持操作系统(OS)的时候,我们需要用到 3 个宏定义和 4
- 个函数,宏定义及函数代码如下:
- //本例程仅作 UCOSII 和 UCOSIII 的支持,其他 OS,请自行参考着移植
- //支持 UCOSII
- #ifdef OS_CRITICAL_METHOD
- //OS_CRITICAL_METHOD 定义了,说明要支持 UCOSII
- #define delay_osrunning
- OSRunning
- //OS 是否运行标记,0,不运行;1,在运行
- #define delay_ostickspersec OS_TICKS_PER_SEC //OS 时钟节拍,即每秒调度次数
- #define delay_osintnesting OSIntNesting
- //中断嵌套级别,即中断嵌套次数
- #endif
- //支持 UCOSIII
- #ifdef CPU_CFG_CRITICAL_METHOD
- //CPU_CFG_CRITICAL_METHOD 定义了,说明要支持 UCOSIII
- #define delay_osrunning
- OSRunning
- //OS 是否运行标记,0,不运行;1,在运行
- #define delay_ostickspersec OSCfg_TickRate_Hz
- //OS 时钟节拍,即每秒调度次数
- #define delay_osintnesting OSIntNestingCtr
- //中断嵌套级别,即中断嵌套次数
- #endif
- //us 级延时时,关闭任务调度(防止打断 us 级延迟)
- void delay_osschedlock(void)
- {
- #ifdef CPU_CFG_CRITICAL_METHOD //使用 UCOSIII
- OS_ERR err;
- OSSchedLock(&err);
- //UCOSIII 的方式,禁止调度,防止打断 us 延时
- #else
- //否则 UCOSII
- OSSchedLock();
- //UCOSII 的方式,禁止调度,防止打断 us 延时
- #endif
- }
- //us 级延时时,恢复任务调度
- void delay_osschedunlock(void)
- {
- #ifdef CPU_CFG_CRITICAL_METHOD //使用 UCOSIII
- OS_ERR err;
- OSSchedUnlock(&err);
- //UCOSIII 的方式,恢复调度
- #else
- //否则 UCOSII
- OSSchedUnlock();
- //UCOSII 的方式,恢复调度
- #endif
- }
- //调用 OS 自带的延时函数延时
- //ticks:延时的节拍数
- void delay_ostimedly(u32 ticks)
- {
- #ifdef CPU_CFG_CRITICAL_METHOD //使用 UCOSIII 时
- OS_ERR err;
- OSTimeDly(ticks,OS_OPT_TIME_PERIODIC,&err);//UCOSIII 延时采用周期模式
- #else
- OSTimeDly(ticks);
- //UCOSII 延时
- #endif
- }
- //systick 中断服务函数,使用 ucos 时用到
- void SysTick_Handler(void)
- {
- if(delay_osrunning==1)
- //OS 开始跑了,才执行正常的调度处理
- {
- OSIntEnter();
- //进入中断
- OSTimeTick();
- //调用 ucos 的时钟服务程序
- OSIntExit();
- //触发任务切换软中断
- }
- }
- 以上代码,仅支持 UCOSII 和 UCOSIII,不过,对于其他 OS 的支持,也只需要对以上代
- 码进行简单修改即可实现。
|