Imported Upstream version 2.9.0
[debian/cc1111] / support / regression / tests / critical.c
1 /* Keyword "critical" tests.
2  */
3 #include <testfwk.h>
4
5 #if defined(SDCC_mcs51)
6 #include <8052.h>
7
8 typedef union
9 {
10   unsigned int a;
11   struct
12   {
13     unsigned char b;
14     unsigned char c;
15   };
16 } big;
17
18 //must be at least 2 bytes big and volatile
19 volatile big global_var = { 0 };
20 int y;
21
22 unsigned int get_global (void) critical
23 {
24   return global_var.a;
25 }
26 #endif
27
28 void
29 testCritical(void)
30 {
31 #if defined(SDCC_mcs51)
32   big x;
33   unsigned char i;
34
35   //enable the interrupt and set it
36   ET2 = 1;
37   EA = 1;
38   TF2 = 1;
39
40   critical x.a = global_var.a;
41   ASSERT(x.b == x.c);
42
43   x.a = get_global();
44   ASSERT(x.b == x.c);
45
46   for (i=10; i!=0; i--)
47   {
48     critical x.a = global_var.a;
49     ASSERT(x.b == x.c);
50
51     x.a = get_global();
52     ASSERT(x.b == x.c);
53   }
54   //check the interrupt has run at all
55   ASSERT(x.a != 0);
56
57   critical y = 0;
58   //check the interrupts are still enabled
59   ASSERT(EA);
60 #else
61   ASSERT(1);
62 #endif
63 }
64
65 #if defined(SDCC_mcs51)
66 void T2_isr (void) interrupt 5 using 2
67 {
68   //do not clear flag ET2 so it keeps interrupting !
69   global_var.b++;
70   if (global_var.b == 0)
71     global_var.b++;
72   global_var.c = global_var.b;
73 }
74 #endif