任务接口
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)