From c78c0da3b7b762e6009e36b2ade434855dd26e6d Mon Sep 17 00:00:00 2001 From: wjw Date: Mon, 21 Jul 2025 16:17:35 +0800 Subject: [PATCH] =?UTF-8?q?=E5=8A=9F=E8=83=BD=E5=AE=8C=E5=96=84=EF=BC=8C?= =?UTF-8?q?=E6=AD=A3=E5=BC=8F=E7=89=88=E6=9C=AC1.0=20=20=E6=97=A0ota?= =?UTF-8?q?=E5=8A=9F=E8=83=BD=EF=BC=8C=E7=BB=88=E7=AB=AF=E5=8F=82=E6=95=B0?= =?UTF-8?q?=E8=AF=BB=E5=8F=96=E9=97=AE=E9=A2=98=E5=BE=85=E4=BF=AE=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- custom/attr_broadcast/src/attr_broadcast.c | 4 +- custom/control_out/inc/control_out.h | 2 +- custom/control_out/src/control_out.c | 2 + custom/custom_main/src/custom_main.c | 2 +- custom/jt808/inc/jt808_electronic_fence.h | 8 + custom/jt808/inc/jt808_set_TermParam.h | 4 + custom/jt808/src/jt808_electronic_fence.c | 23 +++ custom/jt808/src/jt808_msg_parse.c | 24 ++- custom/jt808/src/jt808_set_TermParam.c | 176 ++++++++++----------- custom/local_tts/src/local_tts.c | 2 +- custom/radar/src/radar.c | 17 +- 11 files changed, 156 insertions(+), 108 deletions(-) diff --git a/custom/attr_broadcast/src/attr_broadcast.c b/custom/attr_broadcast/src/attr_broadcast.c index 53dd557..e1110e8 100644 --- a/custom/attr_broadcast/src/attr_broadcast.c +++ b/custom/attr_broadcast/src/attr_broadcast.c @@ -747,7 +747,7 @@ static void attr_broadcast_task(void* arg) { // 查找最近景点 AttractionNode* nearest = find_nearest_attraction(current_pos); - DEBUG("location ok\r\n"); + //DEBUG("location ok\r\n"); if (nearest != NULL) { // 计算距离 double distance = location_service_calculate_distance( @@ -824,7 +824,7 @@ void attr_broadcast_init(void) { // 初始化状态 memset(&broadcast_state, 0, sizeof(broadcast_state)); - broadcast_state.distance_threshold = 50.0; // 默认阈值50米 + broadcast_state.distance_threshold = 20.0; // 默认阈值50米 osThreadAttr_t attr_broadcast_task_attr = {0}; attr_broadcast_task_attr.name = "attr_broadcast_task"; diff --git a/custom/control_out/inc/control_out.h b/custom/control_out/inc/control_out.h index 74dc236..4d7fa92 100644 --- a/custom/control_out/inc/control_out.h +++ b/custom/control_out/inc/control_out.h @@ -130,7 +130,7 @@ typedef struct{ uint8_t IO_TX_brake :1; // 1:正常 0:刹车 uint8_t A_brake :1; // 1:自动刹车,0:手动刹车 uint8_t A_Speed_Cut :1; // 1:自动减速,0:手动减速 - uint8_t P_Radar_EN :1; // 2:雷达暂时关闭,1:雷达使能,0:雷达禁止 + uint8_t P_Radar_EN :2; // 2:雷达暂时关闭,1:雷达使能,0:雷达禁止 }; uint8_t IO_STA; }; diff --git a/custom/control_out/src/control_out.c b/custom/control_out/src/control_out.c index 172f469..0c529b1 100644 --- a/custom/control_out/src/control_out.c +++ b/custom/control_out/src/control_out.c @@ -273,6 +273,8 @@ void control_out_task(void *argument){ DEBUG("\n\nMAG_MODE\r\n\n"); // local_tts_set(5, 7, CM_LOCAL_TTS_DIGIT_AUTO); local_tts_text_play("管理员模式",0,1); + DEBUG("MAGmMODE=%d, PLTMODE=%d\r\n\n",sys_sta.MAG_MODE,sys_sta.PLT_MODE); + }else{ // 退出管理员模式 DEBUG("\n\nPLT_MODE\r\n\n"); // local_tts_set(10, 7, CM_LOCAL_TTS_DIGIT_AUTO); diff --git a/custom/custom_main/src/custom_main.c b/custom/custom_main/src/custom_main.c index 8d27106..b2e9d95 100644 --- a/custom/custom_main/src/custom_main.c +++ b/custom/custom_main/src/custom_main.c @@ -155,7 +155,7 @@ void my_appimg_enter(char *param){ } local_tts_init(); local_tts_mute(0);// 取消静音 - local_tts_volume(50); // 设置音量为55 + local_tts_volume(100); // 设置音量为55 // local_tts_set(7, 7, CM_LOCAL_TTS_DIGIT_AUTO); local_tts_text_play("已开机",0,0); diff --git a/custom/jt808/inc/jt808_electronic_fence.h b/custom/jt808/inc/jt808_electronic_fence.h index e94945a..8585025 100644 --- a/custom/jt808/inc/jt808_electronic_fence.h +++ b/custom/jt808/inc/jt808_electronic_fence.h @@ -34,6 +34,14 @@ int jt808_save_Fence_area(void); // 加载围栏区域 int jt808_load_Fence_area(void); +/** + * @brief 检查电子围栏是否为空 + * @retval 1: 围栏为空(没有任何围栏区域) + * 0: 围栏非空 + */ +int jt808_is_fence_empty(void); + + // 遍历围栏区域,判断指定坐标是否在围栏内 // 返回区域ID // 0 未在围栏内 // Area_att == 0x0001 景区围栏,Area_att == 0x0002 禁停区围栏 uint32_t jt808_Polygon_fence_check(uint16_t Area_att, uint32_t lat, uint32_t lng); diff --git a/custom/jt808/inc/jt808_set_TermParam.h b/custom/jt808/inc/jt808_set_TermParam.h index fc2f3b5..a7365d7 100644 --- a/custom/jt808/inc/jt808_set_TermParam.h +++ b/custom/jt808/inc/jt808_set_TermParam.h @@ -101,6 +101,7 @@ typedef struct {// 终端参数项 fence_Polygon_area_t *fence_polygon_area; // 围栏多边形区域 Data_SeriaNet_t big_data_up_SeriaNet; // 数据上行透传 }Term_Param_item_t; + #pragma pack() extern Term_Param_item_t jt808_term_param_item; @@ -141,4 +142,7 @@ void jt808_Autoreport_param_stop(void); // 初始化终端参数 void jt808_set_term_param_init(void); + + + #endif // JT808_SET_TERM_PARAM_H_ \ No newline at end of file diff --git a/custom/jt808/src/jt808_electronic_fence.c b/custom/jt808/src/jt808_electronic_fence.c index e345709..85e1510 100644 --- a/custom/jt808/src/jt808_electronic_fence.c +++ b/custom/jt808/src/jt808_electronic_fence.c @@ -379,3 +379,26 @@ ERR_Loal: JT808_DEBUG("load fence area failed\r\n"); return -3; } + + + +/** + * @brief 检查电子围栏是否为空 + * @retval 1: 围栏为空(没有任何围栏区域) + * 0: 围栏非空 + */ +int jt808_is_fence_empty(void) +{ + int isEmpty = 1; // 默认假设为空 + + osMutexAcquire(Polygon_fence_mutex, osWaitForever); + + // 检查链表头指针是否为NULL + if(jt808_term_param_item.fence_polygon_area != NULL) { + isEmpty = 0; // 链表非空 + } + + osMutexRelease(Polygon_fence_mutex); + + return isEmpty; +} \ No newline at end of file diff --git a/custom/jt808/src/jt808_msg_parse.c b/custom/jt808/src/jt808_msg_parse.c index de35e3f..4b6e7e8 100644 --- a/custom/jt808/src/jt808_msg_parse.c +++ b/custom/jt808/src/jt808_msg_parse.c @@ -245,16 +245,34 @@ static int jt808_BodyParse(void *Prsmsg_body, PrsResult_t *Result){ case ID_Delete_Polygon_area:{// 删除多边形区域 int ret = 0; uint8_t Area_ID_Num = ((uint8_t *)Prsmsg_body)[0]; // 区域ID个数 - Prsmsg_body = (void *)((uint8_t *)Prsmsg_body + 1); // 跳过1字节 + //Prsmsg_body = (void *)((uint8_t *)Prsmsg_body + 1); // 跳过1字节 + uint8_t *p_id = (uint8_t *)Prsmsg_body + 1; // 指向第一个ID Result->Rsp_result = Msg_ok; + + + JT808_DEBUG("Area_ID_Num=%d\r\n",Area_ID_Num); + + // 区域数为0:删除所有区域 + if (Area_ID_Num == 0) { + if (jt808_remove_fence_Polygon_area(0) != 0) { + Result->Rsp_result = Msg_err; + } + } + else { for(int i = 0; i < Area_ID_Num; i++){ - ret = jt808_remove_fence_Polygon_area(((uint8_t *)Prsmsg_body)[i]<<24 | ((uint8_t *)Prsmsg_body)[i+1]<<16 | ((uint8_t *)Prsmsg_body)[i+2]<<8 | ((uint8_t *)Prsmsg_body)[i+3]); + + uint32_t area_id = (p_id[0] << 24) | (p_id[1] << 16) | (p_id[2] << 8) | p_id[3]; + + ret = jt808_remove_fence_Polygon_area(area_id); if(ret != 0){ Result->Rsp_result = Msg_err; break; } + p_id += 4; + } - + + } Result->Rsp_flow_num = Result->msg_head.msg_flow_num; Result->Rsp_msg_id = Result->msg_head.msg_id; jt808_pkg_send(ID_Term_GenResp, 0);// 发送终端通用应答 diff --git a/custom/jt808/src/jt808_set_TermParam.c b/custom/jt808/src/jt808_set_TermParam.c index 3f24257..5f3e9a5 100644 --- a/custom/jt808/src/jt808_set_TermParam.c +++ b/custom/jt808/src/jt808_set_TermParam.c @@ -17,77 +17,36 @@ #define LOCAL_FENCE_COUNT (sizeof(local_fences) / sizeof(LocalFenceConfig_t)) +#define __DMB() __asm__ volatile("dmb sy" ::: "memory") // GCC Term_Param_item_t jt808_term_param_item; // 终端参数项 osMutexId_t term_param_mutex = NULL; // 终端参数项互斥锁 osMutexId_t Polygon_fence_mutex = NULL; // 多边形围栏互斥锁 -static const LocalFenceConfig_t local_fences[] = { - { // 第一个围栏 (8边形禁停区) - .area_id = 1, - .area_att = 0x0001, // 禁停区围栏 - .points_num = 8, - .points = (AreaPoint_t[]){ // 使用复合字面量 - {.lat = 31338039, .lng = 121342339}, // 31.338039, 121.342339 - {.lat = 31345049, .lng = 121357544}, // 31.345049, 121.357544 - {.lat = 31342006, .lng = 121359044}, // 31.342006, 121.359044 - {.lat = 31351253, .lng = 121378608}, // 31.351253, 121.378608 - {.lat = 31347419, .lng = 121389395}, // 31.347419, 121.389395 - {.lat = 31339808, .lng = 121373808}, // 31.339808, 121.373808 - {.lat = 31333732, .lng = 121354182}, // 31.333732, 121.354182 - {.lat = 31333178, .lng = 121345380} // 31.333178, 121.345380 - } - }, - { // 第二个围栏 (4边形景区) - .area_id = 2, - .area_att = 0x0002, // 景区围栏 - .points_num = 4, - .points = (AreaPoint_t[]){ - {.lat = 31344904, .lng = 121366191}, // 31.344904, 121.366191 - {.lat = 31345361, .lng = 121367180}, // 31.345361, 121.367180 - {.lat = 31344801, .lng = 121367561}, // 31.344801, 121.367561 - {.lat = 31344336, .lng = 121366509} // 31.344336, 121.366509 - } - }, - { // 第三个围栏 (4边形禁停区) - .area_id = 3, - .area_att = 0x0002, // 禁停区围栏 - .points_num = 4, - .points = (AreaPoint_t[]){ - {.lat = 31339885, .lng = 121358303}, // 31.339885, 121.358303 - {.lat = 31340580, .lng = 121359765}, // 31.340580, 121.359765 - {.lat = 31340179, .lng = 121359985}, // 31.340179, 121.359985 - {.lat = 31339484, .lng = 121358856} // 31.339484, 121.358856 - } - } -}; - - -void load_local_fence_data(void) { - JT808_DEBUG("Loading local fence data...\n"); - - // 清除所有现有围栏 - jt808_remove_fence_Polygon_area(0); - - // 加载预置围栏 - for (int i = 0; i < LOCAL_FENCE_COUNT; i++) { - const LocalFenceConfig_t *config = &local_fences[i]; - - // 跳过无效配置 - if (config->points_num < 3) continue; - - jt808_add_tail_fence_Polygon_area( - config->area_id, - config->area_att, - config->points_num, - config->points - ); - - - } - +// 安全获取RadarEN值 +uint8_t jt808_get_radar_en(void) { + // 内存屏障确保读取最新值 + __DMB(); + uint8_t value = jt808_term_param_item.set_term_param.RadarEN; + __DMB(); + return value; } +// 安全设置RadarEN值 +void jt808_set_radar_en(uint8_t value) { + // 验证值范围 + if (value > 2) { + JT808_DEBUG("Invalid RadarEN value: %d", value); + return; + } + + // 内存屏障 + __DMB(); + jt808_term_param_item.set_term_param.RadarEN = value; + __DMB(); + + JT808_DEBUG("Set RadarEN to %d", value); +} // 控制车辆状态 void jt808_Set_CarStatus(uint8_t status){ @@ -320,21 +279,31 @@ int jt808_setTermParam(set_TermParamID_t param_id, void *param, uint8_t param_le break; } case ID_RadarEN:{// TODO: 雷达使能位 - uint8_t radar_en = param_val32 & 0xFF; - JT808_DEBUG("RadarEN=%d", radar_en); + // JT808_DEBUG("RadarEN=%d", radar_en); - // 更新运行时状态(包括值2) - osMutexAcquire(radar_mutex, osWaitForever); - sys_sta.P_Radar_EN = radar_en; - osMutexRelease(radar_mutex); - - // 只保存0或1到持久化参数 - if(radar_en != 2) { - jt808_term_param_item.set_term_param.RadarEN = radar_en; - } else { - // 值2不保存,但可以记录日志 - JT808_DEBUG("Skip saving temporary RadarEN=2 state"); - } + jt808_term_param_item.set_term_param.RadarEN = param_val32 & 0xFF; + + if(2 == jt808_term_param_item.set_term_param.RadarEN) + { + + JT808_DEBUG("radar ok\r\n"); + sys_sta.P_Radar_EN=2; + } + else if(1 == jt808_term_param_item.set_term_param.RadarEN) + { + + sys_sta.P_Radar_EN=1; + } + else if(0 == jt808_term_param_item.set_term_param.RadarEN) + { + + JT808_DEBUG("radar ok\r\n"); + sys_sta.P_Radar_EN=0; + } + + + + break; } default:{ @@ -507,14 +476,20 @@ void jt808_LocReport_param_update(void){ // 更新当前所在位置区域ID uint32_t lat = nmea_ndeg2degree(gps_data_msg.info.lat) * 1e6; uint32_t lng = nmea_ndeg2degree(gps_data_msg.info.lon) * 1e6; + uint8_t flag = 0; //0:围栏非空 1:空围栏 + // lat = 44939236; // lng = 121369446; // lat = 34939236; // lng = 121369446; + flag=jt808_is_fence_empty(); + + JT808_DEBUG("list not null\r\n"); + Rsp_Bigscenic_Fence_Polygon_area_ID = Swap32(jt808_Polygon_fence_check(0x0001, lat, lng)); Rsp_Bigban_Fence_Polygon_area_ID = Swap32(jt808_Polygon_fence_check(0x0002, lat, lng)); - - if((1 == sys_sta.O_door_lock) || (0 == sys_sta.MAG_MODE )){ // 系统运行中 + + if((1 == sys_sta.O_door_lock) && (1 == sys_sta.PLT_MODE ) && (1 == sys_sta.MAG_MODE)){ // 系统运行中 Rsp_locked_condition = 0; // 复位锁车状态 if(Rsp_Bigscenic_Fence_Polygon_area_ID == 0){ // 在景区围栏 @@ -528,16 +503,18 @@ void jt808_LocReport_param_update(void){ } if(Rsp_Bigban_Fence_Polygon_area_ID != 0){ delay_off_count++; - if(delay_off_count >= jt808_term_param_item.set_term_param.Ban_Fence_Polygon_Delay_OFF){ // 30S + if((delay_off_count >= jt808_term_param_item.set_term_param.Ban_Fence_Polygon_Delay_OFF) && (0 == flag)){ // 30S delay_off_count = 0; - // sys_sta.O_door_lock = 0; // 锁车 - // Rsp_locked_condition = 1; // 锁车状态 - // local_tts_text_play("已锁车,请联系管理员解除禁止入内限制!",0,0); + sys_sta.O_door_lock = 0; // 锁车 + Rsp_locked_condition = 1; // 锁车状态 + local_tts_text_play("已锁车,请联系管理员解除禁止入内限制!",0,0); + jt808_pkg_send(ID_LocReport,10000/5); // 发送位置信息上报包 } ban_Fence_Polygon_count++; - if(ban_Fence_Polygon_count >= 10){ // 7S + if((ban_Fence_Polygon_count >= 10) && (0 == flag)){ // 7S ban_Fence_Polygon_count = 0; - // local_tts_text_play("您已进入禁区,请尽快离开!",0,0); + local_tts_text_play("您已进入禁区,请尽快离开!",0,0); + jt808_pkg_send(ID_LocReport,10000/5); // 发送位置信息上报包 } }else{ delay_off_count = 0; @@ -548,6 +525,12 @@ void jt808_LocReport_param_update(void){ ban_Fence_Polygon_count = 0; delay_off_count = 0; } + + + + + JT808_DEBUG("list null\r\n"); + } osMutexRelease(term_param_mutex); } @@ -612,7 +595,7 @@ void Autoreport_param_Task(void *arg){ jt808_LocReport_param_update(); // 更新位置信息参数 // jt808_term_param_item.big_loc_report.basic_info.alarm_flag.gnss_fault = 0 == gps_data_msg.info.sig ? 1 : 0; // 0:无故障,1:有故障 - if(0 == (count_Sec % jt808_term_param_item.set_term_param.HeartBeatInterval)){ + if((0 == (count_Sec % jt808_term_param_item.set_term_param.HeartBeatInterval))){ if((gps_data_msg.info.fix == 1)||(gps_data_msg.info.sig == 0)){ // 不可用// 未定位时发送心跳包 jt808_pkg_send(ID_Term_HB,0); // 发送心跳包 // 不接收应答 // jt808_pkg_send(ID_LocReport,0); @@ -620,7 +603,10 @@ void Autoreport_param_Task(void *arg){ JT808_DEBUG("Bat_Percent:%d,Bat_Voltage:%d,Bat_STA:%X\r\n",BAT_Message.Bat_Percent,BAT_Message.Bat_Voltage,BAT_Message.Bat_STA); }else{ jt808_pkg_send(ID_LocReport,10000/5); // 发送位置信息上报包 + JT808_DEBUG("auto report\r\n"); + } + } count_Sec++; osDelay(1000/5); // 1S @@ -670,7 +656,7 @@ void jt808_set_term_param_init(void){ // memcpy(jt808_term_param_item.big_term_attr_resp.term_ICCID+4, jt808_term_param_item.phone_BCDnum, 6); // 终端手机号码 但是你照这个来云端收到的iccid全是,因为BCDnum参数本身没有初始化 char str_hw_ver[] = "1.0.0"; // 硬件版本 - char str_fw_ver[] = "1.0.1"; // 固件版本 原本为1.0.0 + char str_fw_ver[] = "1.0.4"; // 固件版本 原本为1.0.0 jt808_term_param_item.big_term_attr_resp.hw_ver_len = strlen(str_hw_ver); // 硬件版本长度 jt808_term_param_item.big_term_attr_resp.fw_ver_len = strlen(str_fw_ver); // 固件版本长度 memcpy(jt808_term_param_item.big_term_attr_resp.str_hw_ver, str_hw_ver, strlen(str_hw_ver)); // 硬件版本 @@ -696,7 +682,7 @@ void jt808_set_term_param_init(void){ }else{ jt808_term_param_item.set_term_param.HeartBeatInterval = 30; // 心跳包间隔(秒) #if 1 - char ServerAddr[] ="47.99.118.34"; // 测试服务器地址 + char ServerAddr[] ="106.15.224.140"; // 三一服务器地址 uint32_t ServerPort = 5000; // 服务器端口 #else char ServerAddr[] ="106.14.30.23"; // 生产服务器地址 @@ -715,12 +701,12 @@ void jt808_set_term_param_init(void){ jt808_term_param_item.set_term_param.RadarEN =1; // 雷达使能位, 0 代表关闭, 1 代表开启 jt808_term_param_item.set_term_param.ManagerACC =100; // 管理员模式油门0~100% - jt808_term_param_item.set_term_param.TouristACC =50; // 游客模式油门0~100% - jt808_term_param_item.set_term_param.SpeedCutACC =20; // 自动减速油门0~100% - jt808_term_param_item.set_term_param.BrakeLimit =1200; //前进刹车距离 + jt808_term_param_item.set_term_param.TouristACC =45; // 游客模式油门0~100% + jt808_term_param_item.set_term_param.SpeedCutACC =1; // 自动减速油门0~100% + jt808_term_param_item.set_term_param.BrakeLimit =2000; //前进刹车距离 jt808_term_param_item.set_term_param.SpeedCutLimit =2000; // 前进自动减速刹车距离 - jt808_term_param_item.set_term_param.BrakeLimit_B =1200; // 后退刹车距离 - jt808_term_param_item.set_term_param.SpeedCutLimit_B =2000; // 后退自动减速刹车距离 + jt808_term_param_item.set_term_param.BrakeLimit_B =1000; // 后退刹车距离 + jt808_term_param_item.set_term_param.SpeedCutLimit_B =1600; // 后退自动减速刹车距离 jt808_term_param_item.set_term_param.Ban_Fence_Polygon_Delay_OFF =30; // 禁止围栏延时锁车时间 jt808_save_TermParam(); // 保存终端参数 } @@ -854,3 +840,5 @@ void jt808_set_term_param_free(void){ } PrsResult.term_param_item = NULL; } + + diff --git a/custom/local_tts/src/local_tts.c b/custom/local_tts/src/local_tts.c index 81bbb1a..b603a8a 100644 --- a/custom/local_tts/src/local_tts.c +++ b/custom/local_tts/src/local_tts.c @@ -475,7 +475,7 @@ void local_tts_init(void){ osThreadAttr_t local_tts_play_thread_attr = { .name = "local_tts_play_thread", .stack_size = 4096*4, - .priority = osPriorityNormal + .priority = osPriorityAboveNormal }; osThreadNew((osThreadFunc_t)local_tts_play_task, NULL, &local_tts_play_thread_attr); osThreadNew((osThreadFunc_t)__local_tts_play_task, NULL, &local_tts_play_thread_attr); diff --git a/custom/radar/src/radar.c b/custom/radar/src/radar.c index daa4b34..b75bff9 100644 --- a/custom/radar/src/radar.c +++ b/custom/radar/src/radar.c @@ -133,7 +133,7 @@ static void RADAR_TaskHandle(void *param){ uint16_t time_count =0; while(1){ - +// sys_sta.P_Radar_EN=jt808_term_param_item.set_term_param.RadarEN; if(0==sys_sta.P_Radar_EN) { @@ -167,10 +167,12 @@ static void RADAR_TaskHandle(void *param){ // DEBUG("SendCMD:ID=%#02x", (0 == sys_sta.IO_RX_back)?RADAR_ID_Back:RADAR_ID_Front); radar_Sendcmd((0 == sys_sta.IO_RX_back)?RADAR_ID_Back:RADAR_ID_Front, RADAR_MODE_Real); - + DEBUG("radar 1\r\n"); // 任务结束 }else{ sys_sta.A_Speed_Cut =0; // 清空自动减速状态 sys_sta.A_brake =0; // 清空自动刹车状态 + DEBUG("radar 1\r\n"); // 任务结束 + } @@ -180,21 +182,24 @@ static void RADAR_TaskHandle(void *param){ else if (2==sys_sta.P_Radar_EN) { + time_count++; sys_sta.A_Speed_Cut =0; // 清空自动减速状态 sys_sta.A_brake =0; // 清空自动刹车状态 - if(time_count>=1000) + if(time_count>=100) { sys_sta.P_Radar_EN=1; time_count=0; - + + } - + + DEBUG("radar 2\r\n"); // 任务结束 } - DEBUG("radar done\r\n"); // 任务结束 + osMutexRelease(radar_mutex); osDelay(140/5); // 140ms