int POLLING_INTERVAL1 = BEEP_DELAY_TIME_MIN + (((BEEP_DELAY_TIME_MAX - BEEP_DELAY_TIME_MIN) * (100 - proximity)) / 100); if (!beepONLocate) { beepONLocate = true; beep(); if (tbeep == null) { TimerTask task = new TimerTask() { @Override public void run() { stopBeepingTimer(); beepONLocate = false; } }; tbeep = new Timer(); tbeep.schedule(task, POLLING_INTERVAL1, 10); } }
这段代码看起来像是Java代码,可以看到它是用来控制蜂鸣器的。变量POLLING_INTERVAL1是蜂鸣器发声的时间间隔,根据proximity的值进行计算。如果beepONLocate为false,就会将它设为true并且调用beep()方法,然后创建一个TimerTask并且用它来控制蜂鸣器的停止时间。最后用tbeep.schedule(task, POLLING_INTERVAL1, 10)来启动计时器。
优化代码void can_app_sig_rx_vehicle_speed_polling(void) { U16 speed = 0; U8 speed_ret = can_app_il_get_rx_ESP_v_Signal_1(&speed); U8 speed_valid=0; can_app_il_get_rx_ESP_QBit_v_Signal(&speed_valid); U8 speed_timeout = ((speed_ret&CAN_IL_TIMEOUT)!=CAN_IL_TIMEOUT)?FALSE:TRUE; static U8 speed_timeout_bk = 0; static BOOL speed_update_flag = FALSE; if(speed_timeout_bk != speed_timeout) { if(speed_timeout) { can_sig_vehicle_speed_valid = 1; can_app_output_vehicle_speed(); can_sig_vehicle_speed_valid = speed_valid; } else//when timeout change to normal,need send it. { speed_update_flag = TRUE; } speed_timeout_bk = speed_timeout; } if((can_sig_vehicle_speed != speed)||(can_sig_vehicle_speed_valid != speed_valid)||speed_update_flag) { can_sig_vehicle_speed = speed; can_sig_vehicle_speed_valid = speed_valid; speed_update_flag = FALSE; can_app_output_vehicle_speed(); } }
可以尝试使用以下优化方式:
减少函数调用次数。可以将
can_app_il_get_rx_ESP_v_Signal_1
和can_app_il_get_rx_ESP_QBit_v_Signal
的返回值存储在局部变量中,避免多次调用。避免过多的变量复制。可以直接将
speed_ret&CAN_IL_TIMEOUT
的结果赋值给speed_timeout
,避免中间变量的使用。尽可能减少全局变量的使用。可以将
can_sig_vehicle_speed
和can_sig_vehicle_speed_valid
作为参数传递给can_app_output_vehicle_speed
函数,避免全局变量的使用。将静态变量的初始化移动到函数外部,避免每次函数调用都进行初始化。
下面是优化后的代码示例:
void can_app_sig_rx_vehicle_speed_polling(U16 *vehicle_speed, U8 *vehicle_speed_valid) {
U16 speed = 0;
U8 speed_ret = 0;
U8 speed_valid = 0;
static U8 speed_timeout_bk = 0;
static BOOL speed_update_flag = FALSE;
static BOOL speed_timeout = FALSE;
speed_ret = can_app_il_get_rx_ESP_v_Signal_1(&speed);
can_app_il_get_rx_ESP_QBit_v_Signal(&speed_valid);
speed_timeout = (speed_ret & CAN_IL_TIMEOUT) ? TRUE : FALSE;
if (speed_timeout_bk != speed_timeout) {
if (speed_timeout) {
*vehicle_speed_valid = 1;
speed_update_flag = TRUE;
}
speed_timeout_bk = speed_timeout;
}
if (*vehicle_speed != speed || *vehicle_speed_valid != speed_valid || speed_update_flag) {
*vehicle_speed = speed;
*vehicle_speed_valid = speed_valid;
can_app_output_vehicle_speed(*vehicle_speed, *vehicle_speed_valid);
speed_update_flag = FALSE;
}
}
解释下面代码void AutoDevScan(void) { unsigned char Com_Scan[47]={0xFF,0xBF,0x81,0xF0}; char tmp; if(AutoScanTime==0) { if(AutoScan_AddrReSet()==0) return; else { AddrSetNum=255; AutoScanTime=0; } } if(Com_Scan_BitPos>=152 || !auto_scanning) { exit: Com_Scan_ChrPos=20; Com_Scan_BitPos=0; Com_Scan_Times=0; memset(Com_Scan_UniqueId+2,0,19); memset(Com_Scan_Mask+2,0,19); auto_scanning=false; Com_Scan_Start=true; Com_Scan_RtnEnd=false; XidFrame=false; if(Device[0].SlaveAddr!=0) { SlaveNum=0; SlaveRead=0; DataReadNum=0; DataReadTimeOutSum=0; Device[0].DataReading=true; tmrSecond=0; } String Run_Status="Device scan finished!"; frm_indicate->memo_status->Lines->Add(Run_Status); Uid_Sorted(); DeviceRefresh(); Sleep(100); frm_indicate->Visible =false; Polling_En=true; btnnum=401; return; }
这段代码实现了自动设备扫描功能。首先定义了一个长度为47的数组Com_Scan,存储了扫描命令的数据。然后判断自动扫描时间是否为0,如果是,调用AutoScan_AddrReSet()函数进行地址重置,否则将AddrSetNum设置为255,并将AutoScanTime设置为0。接着判断Com_Scan_BitPos是否大于等于152或者auto_scanning为false,如果是,则跳转到exit标签。如果不是,将Com_Scan_ChrPos设置为20,Com_Scan_BitPos设置为0,Com_Scan_Times设置为0,清空Com_Scan_UniqueId和Com_Scan_Mask数组,将auto_scanning设置为false,将Com_Scan_Start设置为true,将Com_Scan_RtnEnd设置为false,将XidFrame设置为false。如果Device[0].SlaveAddr不为0,将SlaveNum设置为0,SlaveRead设置为0,DataReadNum设置为0,DataReadTimeOutSum设置为0,将Device[0].DataReading设置为true,并将tmrSecond设置为0。然后更新扫描状态,并执行Uid_Sorted()和DeviceRefresh()函数。最后将frm_indicate设置为不可见,将Polling_En设置为true,将btnnum设置为401,并退出函数。
相关推荐

















