一.OSAL任务初始化
void osal_init_system(void)
{
OSAL_DISABLE_INTERRUPTS( );//关闭系统中断
osal_init_timer( ); //初始化定时器相关结构体
osal_init_task( ); //初始化任务相关结构体
}
1、关闭系统定时器中断函数OSAL_DISABLE_INTERRUPTS( )本质上是一个宏定义
#define OSAL_DISABLE_INTERRUPTS() { //这里写自己所使用MCU的定时器中断的失能 }
2、定时器初始化
(1) 定时器结构体及相关参数如下:
#define OSAL_U8 unsigned char
#define OSAL_U16 unsigned short
#define OSAL_U32 unsigned long
typedef struct
{
OSAL_U32 timeOut; //超时时间
OSAL_U32 runTime; //运行时间以递减的形式运行
OSAL_EVENT eventId; //事件ID
OSAL_U8 taskId; //任务ID
OSAL_U8 runState; //运行状态
}OSAL_TIMERREC;
(2) 定时器初始化
#define OSAL_MAX_TIMER_CNT 20 //定时器个数
void osal_init_timer( void )
{
OSAL_U8 i;
for(i = 0;i < OSAL_MAX_TIMER_CNT; i++)
{
osal_delete_timer(i);
}
OSAL_HAL_INIT_TIMER( );
}
(3) 定时器删除
#define OSAL_FAIL 0
#define OSAL_SUCCESS 1
#define OSAL_NOFIND_TASKID 0xff //未找到任务ID
#define OSAL_NOFIND_TIMERID 0xff //未找到定时器ID
#define OSAL_TIMER_SPACE_FULL 0xff //定时器空间满
#define OSAL_NULL_EVENTS 0
static OSAL_U8 osal_delete_timer( OSAL_U8 timer_id )
{
OSAL_U8 state = OSAL_FAIL;
if( timer_id < OSAL_MAX_TIMER_CNT )
{
osalTimer[timer_id].timeOut = 0;
osalTimer[timer_id].runTime = 0;
osalTimer[timer_id].eventId = OSAL_NULL_EVENTS;
osalTimer[timer_id].taskId = OSAL_NOFIND_TASKID;
osalTimer[timer_id].runState = OSAL_TIMER_RUNSTATE_NULL;
state = OSAL_SUCCESS;
}
return state;
}
3、任务初始化
(1) 任务结构体
#define OSAL_EVENT OSAL_U8 //任务事件变量
typedef OSAL_EVENT (*osal_pTaskEventHandlerFn)( OSAL_EVENT event );
typedef struct
{
osal_pTaskEventHandlerFn pTaskFn; //任务处理函数指针
OSAL_EVENT taskEvent; //任务事件
}OSAL_TASK_HANDLER; //任务结构体
(2) 任务初始化函数
#define OSAL_MAX_TASK_CNT 2 //根据自己的需要定义任务数
#define OSAL_NULL 0
static void osal_init_task(void)
{
OSAL_U8 i = 0;
for( i = 0; i < OSAL_MAX_TASK_CNT; i++)
{
taskHandler[i].pTaskFn = OSAL_NULL;
taskHandler[i].taskEvent = 0;
}
}
二.任务的添加
typedef void (*osal_pTaskInitFn)( OSAL_U8 taskId ); //任务初始化(在osal_add_task中被调用)
typedef OSAL_EVENT (*osal_pTaskEventHandlerFn)( OSAL_EVENT event );
OSAL_U8 osal_add_task(osal_pTaskInitFn pTaskInitFn, osal_pTaskEventHandlerFn pTaskFn, OSAL_U8 taskId)
{
OSAL_U8 state = OSAL_FAIL;
if( taskId < OSAL_MAX_TASK_CNT )
{
if( taskHandler[taskId].pTaskFn == OSAL_NULL )
{
taskHandler[taskId].pTaskFn = pTaskFn;
pTaskInitFn( taskId ); //调用任务初始化函数
state = OSAL_SUCCESS;
}
}
return state;
}
三.OSAL任务启动
系统一直在这里轮询,等到任务所属的任务事件变量为非零值,就去调用相应任务处理函数
#define OSAL_ENTER_CRITICAL_SECTION(x) { //关闭定时器中断 }
#define OSAL_EXIT_CRITICAL_SECTION(x) { //恢复定时器中断 }
void osal_run_system(void)
{
OSAL_U8 idx = 0;
OSAL_EVENT events;
OSAL_INT_STARTE_T intState;
OSAL_ENABLE_INTERRUPTS( );//开始系统中断
while(1)
{
idx = 0;
OSAL_WDT_CLEAR( ); //喂狗
do{
if(taskHandler[idx].taskEvent) //有事件
{
break;
}
}while( ++idx < OSAL_MAX_TASK_CNT );//扫描事件
if( idx < OSAL_MAX_TASK_CNT ) //有事件要处理
{
OSAL_ENTER_CRITICAL_SECTION(intState); // 进入临界区保护
events = taskHandler[idx].taskEvent; // 读取该任务的事件(事件可能不止1个)
taskHandler[idx].taskEvent = 0; // 清除事件记录,在执行任务处理函数期间有可置上新事件
OSAL_EXIT_CRITICAL_SECTION(intState); // 退出临界区保护
events = ( taskHandler[idx].pTaskFn )( events );// 任务处理函数
OSAL_ENTER_CRITICAL_SECTION(intState);
taskHandler[idx].taskEvent |= events;
OSAL_EXIT_CRITICAL_SECTION(intState);
}else //否则进入睡眠模式
{
OSAL_SLEEP_MODE( ); //空的宏定义,可以根据自己实际用到的MCU来处理
}
}
}