(7/10)pmTask; /*电源管理任务*/(未完成)

目录


一、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

 


总结:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值