Просмотр исходного кода

f407 修改级联数据读取失败导致,从机数据读取越界

liyi 1 год назад
Родитель
Сommit
c786de1f72
2 измененных файлов с 79 добавлено и 12 удалено
  1. 72 10
      f407/applications/cascade.c
  2. 7 2
      f407/applications/cascade.h

+ 72 - 10
f407/applications/cascade.c

@@ -204,10 +204,12 @@ static void slave_func(uint16_t reg,void *r_w_data,uint32_t lenth)
 			
 			cmd = (cmd_data_t*)(r_w_data);
       if(cmd->cmd>=CASCADE_CMD_GET_INFO) {
-					slave_info.cmd = *cmd;
+					//slave_info.cmd = *cmd;
+					memcpy(&slave_info.cmd,r_w_data,sizeof(cmd_data_t));
+					sendlen = slave_info.cmd.c_m.sendlen_offset;
       }
 			//LOGD("____write_____ %d\n",lenth);
-      sendlen = 0;
+     // sendlen = 0;
       
 			switch(cmd->cmd)
 			{
@@ -256,7 +258,6 @@ static void slave_func(uint16_t reg,void *r_w_data,uint32_t lenth)
 				case CASCADE_CMD_GET_INFO:
 				{
 					LOGD("____read_____ readlen = %d,sendlen = %d power_ch_t size=%d\n",lenth,sendlen,sizeof(power_ch_t));
-					//my_memcpy_byte(r_w_data,(void*)&slave_info.info+sendlen,lenth*2);
 					uint8_t * base_addr = (uint8_t *)&all.pch[1];
 					my_memcpy_byte(r_w_data,base_addr+sendlen,lenth*2);
 					memswap(r_w_data,lenth*2);
@@ -265,10 +266,7 @@ static void slave_func(uint16_t reg,void *r_w_data,uint32_t lenth)
 					break;
 				case CASCADE_CMD_QUERY_CH:
 				{
-					//my_memcpy_byte(r_w_data,(void*)&slave_info.info+sendlen,lenth*2);
-					//power_all_t power = power_data_get();
 					uint8_t * base_addr = (uint8_t *)&all.pch[1];
-					//my_memcpy_byte(r_w_data,&power->pch[1]+sendlen,lenth*2);
 					my_memcpy_byte(r_w_data,base_addr+sendlen,lenth*2);
 					memswap(r_w_data,lenth*2);
 				}
@@ -284,7 +282,7 @@ static void slave_func(uint16_t reg,void *r_w_data,uint32_t lenth)
         case CASCADE_CMD_QUERY_TOTAL_PWR:break;
         case CASCADE_CMD_BREAKER_GET_INFO:break;
 			}
-			sendlen += lenth*2;
+			//sendlen += lenth*2;
 		}
 		break;
 		default:
@@ -409,8 +407,8 @@ static int _mb_read(cascade_handle_t *cas, int addr, data_t *d)
 
 static int mb_write_read(cascade_handle_t *cas, int addr, data_t *wd, data_t *rd)
 {
-    int r=0;
-    
+
+    int r =0;
     r = _mb_write(cas, addr,wd);
     if(r==0) {
         r = _mb_read(cas, addr,rd);
@@ -419,6 +417,70 @@ static int mb_write_read(cascade_handle_t *cas, int addr, data_t *wd, data_t *rd
 }
 
 
+static int mb_write_read_n(cascade_handle_t *cas, int addr, data_t *wd, data_t *rd)
+{
+	int i=0,r=0,finish=0,timeout=0;
+  int rl,xlen,rlen=0,oncelen=250;
+	uint16_t buff[MB_BUF_SIZE];
+	
+
+	
+	while(1) {
+		//set sendlen = rlen;
+		cas->cmd.c_m.sendlen_offset = rlen;
+		wd->dlen = sizeof(cmd_data_t);
+		wd->data = (uint8_t*)&(cas->cmd);
+		r = _mb_write(cas, addr,wd);
+		//set need transport len
+		if(rlen+oncelen>rd->dlen) {
+			xlen = rd->dlen-rlen;
+		}else{
+			xlen = oncelen;
+		}
+		
+		xlen += xlen%2;
+		lock_on(cas->lock);
+		while(1)
+		{
+			rl = mb_read(MB_ID_CASCADE, addr, CASCADE_REG_READ, buff, xlen/2,200);
+			if(rl<=0) {
+				if(addr >0 && addr < POWER_SLAVE_CH_MAX) {
+					cas->slaves[addr].err ++;
+					LOGE("___ _mb_read failed, %s, rlen: %d, retry: %d\n", "read error", rlen, cas->slaves[addr].err);
+					if(cas->slaves[addr].err > 5) {
+						slave_rm(addr);
+						lock_off(cas->lock);
+						goto fail;
+					}
+				}else {
+					lock_off(cas->lock);
+					goto fail;
+				}
+			}else {
+				cas->slaves[addr].err =0;
+				break;
+			}
+		}
+		lock_off(cas->lock);
+		if(rlen+rl*2>=rd->dlen) {
+			xlen = rd->dlen-rlen;
+			finish = 1;
+		}else {
+			xlen = rl*2;
+		}
+		memcpy((char*)rd->data+rlen, buff, xlen);
+		rlen += xlen;
+		if(finish) {
+			r = 0;
+			break;
+		}
+	}
+fail:
+	return r;	
+}
+
+
+
 static void* off_on_thread(void *arg)
 {
 	cascade_handle_t *cas=&slave_info;
@@ -498,7 +560,7 @@ static int master_cmd(cascade_handle_t *cas,uint8_t cur_dev_addr ,cmd_data_t *cm
 								//rdata.dlen = sizeof(slave_info_t) -sizeof(power_ch_t)*(POWER_SLAVE_CH_MAX - cas->info.channels);
                 rdata.dlen = sizeof(power_ch_t)*cas->chache->info.channels;
 								rdata.data = (uint8_t*)&(cas->chache->info.ch);
-								r = mb_write_read(cas, cur_dev_addr, &wdata, &rdata);
+								r = mb_write_read_n(cas, cur_dev_addr, &wdata, &rdata);
 								if(r==0) {
 
                 }else

+ 7 - 2
f407/applications/cascade.h

@@ -22,6 +22,10 @@ enum {
 
 
 
+typedef union{
+	uint8_t 			data[100];
+	int sendlen_offset;
+}cmd_da;
 
 
 
@@ -30,7 +34,8 @@ typedef struct {
     uint8_t         cmd;
     uint8_t         obj;
     uint8_t         chId;
-		uint8_t 			data[200];
+		//uint8_t 			data[200];
+		cmd_da					c_m;
 }cmd_data_t;
 
 typedef struct {
@@ -102,7 +107,7 @@ enum {
     CASCADE_CMD_BREAKER_SAVE_DELETE,
     CASCADE_CMD_OPEN_NF,
     CASCADE_CMD_CLOSE_NF,
-		CASCADE_CMD_SEND_OFFSET,
+
     CASCADE_CMD_MAX,
 };