任务接口

BabyOS是基于while(1)大循环的代码。编写应用程序创建任务有如下几种方式:

  • 固定时间间隔的任务 BOS_PERIODIC_TASK(pf, ms)

#define BOS_PERIODIC_TASK(pf, ms)                         \
    {                                                     \
        static uint32_t tick##pf = 0;                     \
        if (bHalGetSysTick() - tick##pf > (MS2TICKS(ms))) \
        {                                                 \
            tick##pf = bHalGetSysTick();                  \
            pf();                                         \
        }                                                 \
    }

基于tick时间,比较tick值,满足时间条件后调用函数。

  • 创建定时器任务

    bTimerId_t bTimerCreate(bTimerFunc_t , bTimerType_t , void *, bTimerAttr_t *);

    通过接口创建循环执行或者单次执行的定时任务。

    定时器回调函数:typedef void (*bTimerFunc_t)(void *arg);

    定时器类型:

    typedef enum
    {
        B_TIMER_ONCE     = 0,  ///< One-shot timer.
        B_TIMER_PERIODIC = 1   ///< Repeating timer.
    } bTimerType_t;
    
  • 结合Protothreads

    创建任务接口:

    bTaskId_t bTaskCreate(const char *name, bTaskFunc_t func, void *argument, bTaskAttr_t *attr);

    任务的执行函数模板:

    PT_THREAD(test_task)(struct pt *pt, void *arg)
    {
        PT_BEGIN(pt);
        while (1)
        {
            //.....
        }
        PT_END(pt);
    }
    

可用接口:


/// 创建任务
/// \param[in]     name          任务名
/// \param[in]     func          任务执行函数 \ref bTaskFunc_t
/// \param[in]     argument      自定义参数
/// \param[in]     attr          通过B_TASK_CREATE_ATTR创建,再传入
/// \return 任务ID
bTaskId_t bTaskCreate(const char *name, bTaskFunc_t func, void *argument, bTaskAttr_t *attr);

/// 销毁任务
void bTaskRemove(bTaskId_t id);

/// 暂停任务
void bTaskSuspend(bTaskId_t id);

/// 恢复任务
void bTaskResume(bTaskId_t id);

/// 获取id对应的任务名。id为NULL表示获取当前任务
const char *bTaskGetName(bTaskId_t id);

/// 获取当前运行任务的id
bTaskId_t bTaskGetId(void);

/// task中延时函数, 这里只是为了保证接口的名字与其他接口一致。
#define bTaskDelayMs(pt, ms) B_TASK_DELAY_XMS(pt, ms)