Описание библиотеки микросхемы 5023ВС016 процессора "Спутник"
mem_test_old.c
См. документацию.
1 
29 //tests of internal memory
30 
31 #include "common.h"
32 #include "chip_5023BC.h"
33 #include "debug_uart.h"
34 
35 #define RAM_SIZE (128*1024) //256K, EDAC is ON
36 
37 #define RAM_START 0x20000000
38 #define RAM_END (0x20000000+RAM_SIZE - 1)
39 
40 #ifdef RAM
41  #define START_ADR (RAM_START + PROGRAM_SIZE) //Увеличиваем на размер исполняемой программы, с небольшим запасом
42 #else
43  #ifdef EXT
44  #define START_ADR RAM_START
45  #else
46  #error program load configuration is undefined
47  #endif
48 #endif //RAM
49 
50 #define END_ADR RAM_END
51 
52 #define M32
53 
54 #ifdef M32
55  #define INC 4
56  #define TYPE unsigned int
57  #define PATTERN_F 0xFFFFFFFF
58  #define PATTERN_0 0x00000000
59  #define BIT_COUNT 32
60 #else
61  #ifdef M16
62  #define INC 2
63  #define TYPE unsigned short
64  #define PATTERN_F 0xFFFF
65  #define PATTERN_0 0x0000
66  #define BIT_COUNT 16
67  #else
68  #ifdef M8
69  #define INC 1
70  #define TYPE unsigned char
71  #define PATTERN_F 0xFF
72  #define PATTERN_0 0x00
73  #define BIT_COUNT 8
74  #else
75  #error memory read mode is undefined
76  #endif //M8
77  #endif //M16
78 
79 #endif //M32
80 
81 
82 unsigned char ErrorsDetected;
83 
84 void ReportError(unsigned int code, unsigned int adr, unsigned int val1, unsigned int val2)
85 {
86  PRINT(" ");
87  PRINT_INT(code);
88  PRINT(" ");
89  PRINT_INT_HEX(adr);
90  PRINT(" ");
91  PRINT_INT_HEX(val1);
92  PRINT(" ");
93  PRINT_INT_HEX(val2);
94  PRINT("\n");
95 
96  ErrorsDetected++;
97 }
98 
99 void ClearAll()
100 {
101  for(unsigned int adr=START_ADR; adr<=END_ADR; adr+=INC)
102  (*(TYPE*)adr) = PATTERN_0;
103 }
104 
105 volatile unsigned int w_adr; //write address
106 volatile unsigned int r_adr; //read address
107 
108 #define TEMP (START_ADR + RAM_SIZE/32 - 1) //END_ADR
109 
111 {
112  ClearAll();
113 
114  for(w_adr=START_ADR; w_adr<=TEMP; w_adr+=INC)
115  {
116  (*(TYPE*)w_adr) = PATTERN_F;
117  for(int r_adr=START_ADR; r_adr<=TEMP; r_adr+=INC)
118  if(r_adr != w_adr)
119  {
120  if(*(TYPE*)r_adr != PATTERN_0)
121  ReportError(0, r_adr, w_adr, *(TYPE*)r_adr);
122  if(*(TYPE*)w_adr != PATTERN_F)
123  ReportError(1, r_adr, w_adr, *(TYPE*)w_adr);
124 
125  }
126  ClearAll();
127  }
128 }
129 
130 
132 {
133  for(unsigned int adr=START_ADR; adr<=END_ADR; adr+=INC)
134  (*(TYPE*)adr) = PATTERN_0;
135  for(unsigned int adr=START_ADR; adr<=END_ADR; adr+=INC)
136  {
137  if ( *(TYPE*)adr != PATTERN_0)
138  ReportError(2, adr, PATTERN_0, *(TYPE*)adr);
139  (*(TYPE*)adr) = PATTERN_F;
140  }
141  for(unsigned int adr=START_ADR; adr<=END_ADR; adr+=INC)
142  {
143  if ( *(TYPE*)adr != PATTERN_F)
144  ReportError(3, adr, PATTERN_F, *(TYPE*)adr);
145  (*(TYPE*)adr) = PATTERN_0;
146  }
147  for(unsigned int adr=END_ADR-3; adr>=START_ADR; adr-=INC)
148  {
149  if ( *(TYPE*)adr != PATTERN_0)
150  ReportError(4, adr, PATTERN_0, *(TYPE*)adr);
151  (*(TYPE*)adr) = PATTERN_F;
152  }
153  for(unsigned int adr=END_ADR-3; adr>=START_ADR; adr-=INC)
154  {
155  if ( *(TYPE*)adr != PATTERN_F)
156  ReportError(5, adr, PATTERN_F, *(TYPE*)adr);
157  (*(TYPE*)adr) = PATTERN_0;
158  }
159  for(unsigned int adr=END_ADR-3; adr>=START_ADR; adr-=INC)
160  if ( *(TYPE*)adr != PATTERN_0)
161  ReportError(6, adr, PATTERN_0, *(TYPE*)adr);
162 }
163 
165 {
166  volatile TYPE value;
167 
168  //running 1
169  value = 1;
170  for(int pos = 0; pos < BIT_COUNT; pos++)
171  {
172  for(unsigned int adr=START_ADR; adr<=END_ADR; adr+=INC)
173  *(TYPE*)adr = value;
174 
175  for(unsigned int adr=START_ADR; adr<=END_ADR; adr+=INC)
176  if (*(TYPE*)adr != value)
177  ReportError(7, adr, value, *(TYPE*)adr);
178 
179  value <<= 1;
180  }
181 
182  //running 0
183  value = 1;
184  for(int pos = 0; pos < BIT_COUNT; pos++)
185  {
186  for(unsigned int adr=START_ADR; adr<=END_ADR; adr+=INC)
187  *(TYPE*)adr = ~value;
188 
189  for(unsigned int adr=START_ADR; adr<=END_ADR; adr+=INC)
190  if ((*(TYPE*)adr) != ((~value) & PATTERN_F))
191  ReportError(8, adr, ((~value) & PATTERN_F), *(TYPE*)adr);
192  value <<= 1;
193  }
194 }
195 
197 {
198  for(unsigned int adr=START_ADR; adr<=END_ADR; adr+=INC)
199  *(TYPE*)adr = (TYPE)adr;
200 
201  for(unsigned int adr=START_ADR; adr<=END_ADR; adr+=INC)
202  if ( *(TYPE*)adr != (TYPE)adr )
203  ReportError(9, adr, (TYPE)adr, *(TYPE*)adr);
204 
205  for(unsigned int adr=START_ADR; adr<=END_ADR; adr+=INC)
206  *(TYPE*)adr = (TYPE)~adr;
207 
208  for(unsigned int adr=START_ADR; adr<=END_ADR; adr+=INC)
209  if ( *(TYPE*)adr != (TYPE)~adr )
210  ReportError(10, adr, (TYPE)~adr, *(TYPE*)adr);
211 }
212 
213 
215 {
216  #define TEST_CONST1 0xAAAAAAAA
217  #define TEST_CONST2 0x55555555
218  #define MEMORY_EXPOSURE_TIME 1000000
219 
220  unsigned char mem_test_state = 0;
221  unsigned int test_const;
222 
223  if (mem_test_state++)
224  test_const = TEST_CONST1;
225  else
226  test_const = TEST_CONST2;
227  mem_test_state %=2;
228 
229  unsigned short cerr;
230  unsigned short ferr;
231  unsigned int errors_count = 0;
232 
233  EDAC_DISABLE;
234  EDAC_ENABLE;
235 
236  //unsigned char counter = 0;
237  for (unsigned int adr = START_ADR; adr < END_ADR; adr+=4)
238  {
239  *(unsigned int*)adr = test_const;
240  }
241 
242  //pause
243  for(unsigned int i=0; i<MEMORY_EXPOSURE_TIME; i++);
244 
245  //искусственное добавление ошибки
246  //*(unsigned char*)0x20003214 = 0xFF;
247  //*(unsigned char*)0x20001520 = 0xEE;
248  //*(unsigned char*)0x20007F51 = 0xDD;
249 
250  //for (unsigned int adr = START_ADR; adr < END_ADR; adr+=4)
251  //if (adr % 120 == 0)
252  // *(unsigned int*)adr = ~test_const;
253 
254  //counter = 0;
255  for (unsigned int adr = START_ADR; adr < END_ADR; adr+=4)
256  {
257  if (*(unsigned int*)adr != test_const)
258  {
259  ReportError(11, adr, test_const, *(unsigned int*)adr);
260 
261  unsigned int val = *(unsigned int*)adr;
262  for (unsigned char pos = 0; pos<32; pos++)
263  if ( ((val >> pos) & 1) != ((test_const >> pos) & 1) )
264  {
265  errors_count++;
266  }
267 
268  }
269 
270  }
271  if (errors_count > 0)
272  {
273  //for(int i=0; i<errors_count; i++);
274  }
275 
276  for (unsigned int adr = START_ADR; adr < END_ADR; adr+=4)
277  {
278  *(unsigned int*)adr = 0;
279  }
280 
281  //if (errors_count > 0)
282  // Send_Test_Report(CODE_MEMORY_TEST, 0x81, errors_count);
283  //else
284  // Send_Test_Report(CODE_MEMORY_TEST, 0x00, 0x00000000);
285 
286  cerr = ((CMN_REG_t*)CMN_REG)->EDAC_INT_MEM_CERR_CNT;
287  ferr = ((CMN_REG_t*)CMN_REG)->EDAC_INT_MEM_FERR_CNT;
288  if (cerr || ferr)
289  {
290  PRINT(" CERR = 0x");
291  PRINT_INT_HEX(cerr);
292  PRINT(" FERR = 0x");
293  PRINT_INT_HEX(ferr);
294  PRINT("\n");
295  }
296 
297 }
298 
299 
300 volatile unsigned int iterations;
301 
303 {
304  iterations = 1;
305 
306  Test_result++;
307  PRINT(" Memory test - start\n");
308 #if (TEMP < END_ADR)
309  PRINT(" (Reduced version)\n");
310 #endif
311  ErrorsDetected = 0;
312 
313  while (iterations)
314  {
315  PRINT(" chess test\n");
316  Chess_Test();
317 
318  PRINT(" counter test\n");
319  Counter_Test();
320 
321  PRINT(" running 0 and running 1 test\n");
322  Run01_Test();
323 
324  PRINT(" march test\n");
325  Marsch_Test();
326 
327  PRINT(" galloping test\n");
328  Galloping_Test();
329 
330  if (ErrorsDetected)
331  {
332  break;
333  }
334 
335  iterations--;
336  }
337 
338  if (!ErrorsDetected)
339  {
340  PRINT(" Test result - OK\n");
341  Test_result--;
342  }
343  else
344  {
345  PRINT(" Errors total count = ");
346  PRINT_INT(ErrorsDetected);
347  PRINT("\n Test result - FAILED\n");
348  }
349 }
void ReportError(unsigned int code, unsigned int adr, unsigned int val1, unsigned int val2)
Definition: mem_test_old.c:84
Этот файл содержит структуры, макросы и функции необходимые для взаимодействия с отладочным выводом...
#define BIT_COUNT
Definition: mem_test_old.c:59
#define PRINT(...)
Макросы для использования отладочного выхода
Definition: debug_uart.h:48
void Marsch_Test()
Definition: mem_test_old.c:131
#define PATTERN_F
Definition: mem_test_old.c:57
volatile unsigned int w_adr
Definition: mem_test_old.c:105
#define PATTERN_0
Definition: mem_test_old.c:58
#define INC
Definition: mem_test_old.c:55
#define MEMORY_EXPOSURE_TIME
unsigned char ErrorsDetected
Definition: mem_test_old.c:82
volatile unsigned int r_adr
Definition: mem_test_old.c:106
void Run01_Test()
Definition: mem_test_old.c:164
#define TYPE
Definition: mem_test_old.c:56
void Galloping_Test()
Definition: mem_test_old.c:110
uint32_t val
Definition: mem_test.c:35
void Memory_Test()
Definition: mem_test_old.c:302
#define TEMP
Definition: mem_test_old.c:108
#define TEST_CONST2
#define CMN_REG
Указатель на структуру CMN_REG.
void Counter_Test()
Definition: mem_test_old.c:196
void ClearAll()
Definition: mem_test_old.c:99
void Chess_Test()
Definition: mem_test_old.c:214
#define END_ADR
Definition: mem_test_old.c:50
#define TEST_CONST1
volatile unsigned int iterations
Definition: mem_test_old.c:300