一、关于OSAL系统
由于使用freeRTOS操作系统导致的观念不同,对OSAL有一定的误解。RTOS是基于任务调度机制的多任务操作系统,任务优先级高的任务会剥夺任务优先级低的CPU使用权。
而OSAL是基于事件轮询机制,通过不断的轮询事件是否发生,发生则执行相应的处理事件处理程序。
所以一般事件会对应一个处理函数。
任务开启流程:
osal_init_system(); //初始化操作系统
> osalInitTasks(); //初始化任务,分配任务taskID
> SampleApp_Init( taskID ); //初始化APP相应任务
osal_start_system(); //执行操作系统
> osal_run_system(); //轮询事件
任务切换过程:
void osal_run_system( void )
{
uint8 idx = 0;
osalTimeUpdate();
Hal_ProcessPoll();
do {
if (tasksEvents[idx]) //是否有事件发生
{
break;
}
} while (++idx < tasksCnt);
if (idx < tasksCnt)
{
uint16 events;
halIntState_t intState;
HAL_ENTER_CRITICAL_SECTION(intState);
events = tasksEvents[idx]; //tasksEvents存放任务事件列表
tasksEvents[idx] = 0; //清除此任务的事件
HAL_EXIT_CRITICAL_SECTION(intState);
activeTaskID = idx;
events = (tasksArr[idx])( idx, events ); //tasksArr存放了事件对应的处理函数
activeTaskID = TASK_NO_TASK;
HAL_ENTER_CRITICAL_SECTION(intState);
tasksEvents[idx] |= events; // Add back unprocessed events to the current task.
HAL_EXIT_CRITICAL_SECTION(intState);
}
#if defined( POWER_SAVING )
else // Complete pass through all task events with no activity?
{
osal_pwrmgr_powerconserve(); // Put the processor/system into sleep
}
#endif
/* Yield in case cooperative scheduling is being used. */
#if defined (configUSE_PREEMPTION) && (configUSE_PREEMPTION == 0)
{
osal_task_yield();
}
#endif
}
二、关于硬件驱动
TI的库支持了LED,KEY,LCD。但是自己的硬件的话可能会发生引脚冲突,比如TI定义的LED引脚在自己的硬件上连接了KEY。默认这些功能是开启的,可以在hal_board_cfg.h中失能。然后根据需要重新使能,修改。
硬件初始化流程:
InitBoard( OB_COLD ); //失能中断,检测RESER引脚
HalDriverInit(); //硬件IO初始化
InitBoard( OB_READY ); //初始化板级任务,可能涉及到任务ID,应放到osal_init_system()后执行