打印
[STM32]

立创商城STM32F系列——操作系统支持宏定义及相关函数

[复制链接]
669|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
小乐Tzz|  楼主 | 2018-8-24 10:08 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
操作系统支持宏定义及相关函数
/**********************************************************/
当需要 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 的支持,也只需要对以上代码进行简单修改即可实现。
支持 OS需要用到的三个宏定义(以 UCOSII为例)即:
#define delay_osrunning    OSRunning      //OS是否运行标记,0,不运行;1,在运行
#define delay_ostickspersec  OS_TICKS_PER_SEC  //OS 时钟节拍,即每秒调度次数
#define delay_osintnesting    OSIntNesting      //中断嵌套级别,即中断嵌套次数
宏定义:delay_osrunning,用于标记OS是否正在运行,当OS 已经开始运行时,该宏定义值为 1,当OS 还未运行时,该宏定义值为0。
宏定义:delay_ ostickspersec,用于表示OS的时钟节拍,即OS 每秒钟任务调度次数。
宏定义:delay_  osintnesting,用于表示 OS 中断嵌套级别,即中断嵌套次数,每进入一个中断,该值加1,每退出一个中断,该值减1。
支持 OS需要用到的 4个函数,即:
函数:delay_osschedlock,用于 delay_us 延时,作用是禁止 OS 进行调度,以防打断 us 级延时,导致延时时间不准。
函数: delay_osschedunlock,同样用于 delay_us延时,作用是在延时结束后恢复OS 的调度,继续正常的OS 任务调度。
函数:delay_ostimedly,则是调用 OS 自带的延时函数,实现延时。该函数的参数为时钟节拍数。
函数:SysTick_Handler,则是 systick的中断服务函数,该函数为OS 提供时钟节拍,同时可以引起任务调度。
以上就是 delay_ms和 delay_us支持操作系统时,需要实现的3个宏定义和 4个函数。
/**********************************************************/


【立创商城】STM32F103CBT6 托盘  https://item.szlcsc.com/8796.html

相关帖子

发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

70

主题

70

帖子

0

粉丝