#include "system.h" #include "bsp_time.h" #include "nrf_delay.h" //系统函数 void FPS_process(void) { #if DEBUG_FPS static uint32_t tem1 = 0; static uint32_t tem2 = 0; static uint32_t fps_max=0; static uint32_t cnt_max=0; uint32_t fps; tem2 = NRF_RTC0->COUNTER; if(tem2=1000){ tim = TIME_GetTicks(); SEGGER_RTT_printf(0,"fps=%dms,cnt=%d\n",fps_max,cnt_max); fps_max = 0; } tem1 = NRF_RTC0->COUNTER; #endif } //休眠时间 ms uint32_t systermSleepTime = 1000; //休眠之前事件管理 #define sleep_cb_max 200 static uint8_t sleep_num = 0; static Sleep_cb sleep_cb[sleep_cb_max]={0}; int Sleep_Regist(Sleep_cb cb) { for(int i=0;icb==cb) return -1; target = target->next ; } for(int i=0;i=process_max) return -1; mProcess[process_dex].cb = cb; mProcess[process_dex].next = head_handle; mProcess[process_dex].Peroid = peroid; mProcess[process_dex].tim = TIME_GetTicks(); #if ProcessTime_EN sprintf(mProcess[process_dex].name_t,"%s",name); #endif head_handle = &mProcess[process_dex]; process_dex++; // SEGGER_RTT_printf(0,"process num(%d)\n",process_dex); return 0; } void Process_Stop(PROCESS_cb cb) { PROCESS_t** curr; for(curr=&head_handle;*curr;){ PROCESS_t* entry = *curr; if(entry->cb==cb){ *curr = entry->next; }else{ curr = &entry->next; } } } void Process_SetHoldOn(PROCESS_cb cb,uint8_t holdon) { PROCESS_t* target = head_handle; while(target){ //检查是否已经存在 if(target->cb==cb){ //存在 if(target->holdon!=holdon) target->holdon = holdon; return; } target = target->next ; } } void Process_UpdatePeroid(PROCESS_cb cb,uint16_t Peroid) { PROCESS_t* target = head_handle; while(target){ //检查是否已经存在 if(target->cb==cb){ //存在 target->Peroid = Peroid; target->tim = TIME_GetTicks(); return; } target = target->next ; } } uint16_t Process_GetPeroid(PROCESS_cb cb) { PROCESS_t* target = head_handle; while(target){ //检查是否已经存在 if(target->cb==cb){ //存在 return target->Peroid; } target = target->next ; } return 0; } void Process_SetError(PROCESS_cb cb,uint8_t error) { PROCESS_t* target = head_handle; while(target){ //检查是否已经存在 if(target->cb==cb){ //存在 target->error = error; } target = target->next ; } } int Process_App(void) { PROCESS_t* target; int ret = 0; for(target=head_handle;target;target=target->next){ if(target->cb) { #if ProcessTime_EN target->cnt1_rtc = NRF_RTC0->COUNTER; #endif if(0 == target-> Peroid)target->cb(); else if(TIME_GetTicks()-target->tim >= target-> Peroid ){ target->tim = TIME_GetTicks(); target->cb(); } #if ProcessTime_EN target->cnt2_rtc = NRF_RTC0->COUNTER; #endif } if(target->holdon) ret = 1; //不能进入低功耗 } #if ProcessTime_EN char Display[100]={0}; static uint32_t tim =0; if(TIME_GetTicks()-tim>=DisInterval){ tim = TIME_GetTicks(); for(target=head_handle;target;target=target->next){ if(target->cb && target->cnt2_rtc >= (target->cnt1_rtc +2)) { sprintf(Display,"%s, time:%02f us\n",target->name_t,(target->cnt2_rtc-target->cnt1_rtc)/32.768 * 1000); SEGGER_RTT_printf(0,"%s",Display); memset(Display,0,sizeof(Display)); } } } #endif return ret; } //大循环 void USR_Process(void) { //app进程调度 // static uint32_t time_t =0; if(Process_App()==0){ //进入低功耗模式 // SEGGER_RTT_printf(0,"Sleep(%d)...\n",TIME_GetTicks()-time_t); Sleep_Event(); // nrf_delay_ms(systermSleepTime); //模拟低功耗 systermSleepTime = rtc_sleep(); if(systermSleepTime==0){ systermSleepTime = 13; nrf_delay_ms(systermSleepTime); } //time_t = TIME_GetTicks(); Wakeup_Event(); //SEGGER_RTT_printf(0,"Wakeup(%d)...\n",systermSleepTime); } FPS_process(); }