C2A_Core
majority_vote_for3.c
[詳解]
1 #pragma section REPRO
6 #include "majority_vote_for3.h"
7 #include <string.h> // for memcpy;
8 
10  void* array1_arg,
11  void* array2_arg,
12  void* array3_arg,
13  size_t type_len,
14  uint32_t length)
15 {
16  unsigned char* res = (unsigned char*)res_arg;
17  unsigned char* array1 = (unsigned char*)array1_arg;
18  unsigned char* array2 = (unsigned char*)array2_arg;
19  unsigned char* array3 = (unsigned char*)array3_arg;
20 
21  uint32_t i;
23 
24  for (i = 0; i < length; ++i)
25  {
26  int flag12 = memcmp(array1, array2, type_len);
27  int flag23 = memcmp(array2, array3, type_len);
28 
29  if (flag12 == 0 && flag23 == 0)
30  {
31  memcpy(res, array1, type_len);
32  }
33  else
34  {
35  int flag31 = memcmp(array3, array1, type_len);
36 
37  if (flag12 == 0 || flag23 == 0 || flag31 == 0)
38  {
40  if (flag12 != 0)
41  {
42  memcpy(res, array3, type_len);
43  }
44  else if (flag23 != 0)
45  {
46  memcpy(res, array1, type_len);
47  }
48  else
49  {
50  memcpy(res, array2, type_len);
51  }
52  }
53  else
54  {
55  return MAJORITY_VOTE_ERROR; // 全不一致は即return
56  }
57  }
58 
59  res += type_len;
60  array1 += type_len;
61  array2 += type_len;
62  array3 += type_len;
63  }
64 
65  return ret;
66 }
67 
69  void* array2_arg,
70  void* array3_arg,
71  size_t type_len,
72  uint32_t length)
73 {
74  unsigned char* array1 = (unsigned char*)array1_arg;
75  unsigned char* array2 = (unsigned char*)array2_arg;
76  unsigned char* array3 = (unsigned char*)array3_arg;
77 
78  uint32_t i;
80 
81  for (i = 0; i < length; ++i)
82  {
83  int flag12 = memcmp(array1, array2, type_len);
84  int flag23 = memcmp(array2, array3, type_len);
85 
86  if (!(flag12 == 0 && flag23 == 0))
87  {
88  int flag31 = memcmp(array3, array1, type_len);
89 
90  if (flag12 == 0 || flag23 == 0 || flag31 == 0)
91  {
93 
94  if (flag12 == 0)
95  {
96  memcpy(array3, array1, type_len);
97  }
98  else if (flag23 == 0)
99  {
100  memcpy(array1, array2, type_len);
101  }
102  else
103  {
104  memcpy(array2, array3, type_len);
105  }
106  }
107  else
108  {
109  return MAJORITY_VOTE_ERROR; // 全不一致は即return
110  }
111  }
112  }
113 
114  return ret;
115 }
116 
117 #pragma section
MAJORITY_VOTE_FOR3_STATUS majority_vote_for3_copy(void *res_arg, void *array1_arg, void *array2_arg, void *array3_arg, size_t type_len, uint32_t length)
3重冗長用汎用多数決関数 (コピー)
MAJORITY_VOTE_FOR3_STATUS majority_vote_for3_sync(void *array1_arg, void *array2_arg, void *array3_arg, size_t type_len, uint32_t length)
3重冗長用汎用多数決関数 (同期)
3重冗長用汎用多数決関数
MAJORITY_VOTE_FOR3_STATUS
@ MAJORITY_VOTE_MAJORITY
@ MAJORITY_VOTE_MATCH
@ MAJORITY_VOTE_ERROR