目录
一、void pmTask(void *param) /* 电源管理任务*/
typedef enum
{
battery,
charging,
charged,
lowPower,
shutDown,
} PMStates;
void pmTask(void *param) /*电源管理任务 */
{
PMStates pmStateOld = battery;//定义了一个枚举变量PMStates 并将battery 赋值给它
u32 tickCount;
tickCount = getSysTickCnt();//这里是没有看懂的
batteryLowTimeStamp = tickCount;//记录一个时间
vTaskDelay(500);
while(1)
{
vTaskDelay(100);
tickCount = getSysTickCnt();
if (pmGetBatteryVoltage() > PM_BAT_LOW_VOLTAGE)
{
batteryLowTimeStamp = tickCount;
}
pmState = pmUpdateState();
if (pmState != pmStateOld)
{
switch (pmState) /*µçԴ״̬Çл»*/
{
case charged:
ledseqStop(CHG_LED, seq_charging);
ledseqRun(CHG_LED, seq_charged);
break;
case charging:
isLowpower = false;
ledseqStop(LOWBAT_LED, seq_lowbat);
if(getIsCalibrated())
ledseqRun(SYS_LED, seq_calibrated);
else
ledseqRun(SYS_LED, seq_alive);
ledseqStop(CHG_LED, seq_charged);
ledseqRun(CHG_LED, seq_charging);
break;
case lowPower:
isLowpower = true;
// ledseqStop(CHG_LED, seq_charging);
ledseqStop(SYS_LED, seq_alive);
ledseqStop(SYS_LED, seq_calibrated);
ledseqRun(LOWBAT_LED, seq_lowbat);
break;
case battery:
ledseqStop(CHG_LED, seq_charging);
ledseqRun(CHG_LED, seq_charged);
break;
default:
break;
}
pmStateOld = pmState;
}
}
}
二、vTaskDelay 与 vTaskDelayUntil
在一个任务函数中使用延时函数对这个任务延时,会进行任务切换,并且此任务就会进入阻塞态,直到延时完成,任务重新进入就绪态。(是不是延时的时间就是任务的阻塞时间,当其他任务运行这么多时间后,这个任务重新回归就绪态)(阻塞和挂起的区别https://blog.csdn.net/qq_43599835/article/details/90737963)
延时函数一般可以设置为相对模式、周期模式、和绝对模式。前者是相对模式,后者是绝对模式。
绝对模式一般使用于需要靠固定频率运行的函数。
#if ( INCLUDE_vTaskDelay == 1 )
void vTaskDelay( const TickType_t xTicksToDelay )//u32数据
{
BaseType_t xAlreadyYielded = pdFALSE;
/* 如果延时数据为0 那么直接启抵用portYIELD切换任务*/
if( xTicksToDelay > ( TickType_t ) 0U )
{
configASSERT( uxSchedulerSuspended == 0 );
vTaskSuspendAll();//挂起任务调度器
{
traceTASK_DELAY();
/*在调度器被挂起时从事件列表中删除的任务,在恢复调度器之前,不会被放置在就绪列表中或从阻塞列表中删除。此任务不能出现在事件列表中,因为它是当前正在执行的任务。 */
prvAddCurrentTaskToDelayedList( xTicksToDelay, pdFALSE );//将延时的任务添到延时列表中
}
xAlreadyYielded = xTaskResumeAll();//恢复任务调度器
}
else
{
mtCOVERAGE_TEST_MARKER();
}
/* 如果没有进行任务调度的话那么爱这里进行任务调度 */
if( xAlreadyYielded == pdFALSE )
{
portYIELD_WITHIN_API();//调用函数进行一次任务调度
}
else
{
mtCOVERAGE_TEST_MARKER();
}
}
#endif /* INCLUDE_vTaskDelay */
三、getSysTickCnt