* .version: bumped version to 2.4.7
[fw/sdcc] / 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
21 unsigned int get_global (void) critical
22 {
23   return global_var.a;
24 }
25 #endif
26
27 void
28 testCritical(void)
29 {
30 #if defined(SDCC_mcs51)
31   big x;
32   unsigned char i;
33
34   //enable the interrupt and set it
35   ET2 = 1;
36   EA = 1;
37   TF2 = 1;
38
39   critical x.a = global_var.a;
40   ASSERT(x.b == x.c);
41
42   x.a = get_global();
43   ASSERT(x.b == x.c);
44
45   for (i=10; i!=0; i--)
46   {
47     critical x.a = global_var.a;
48     ASSERT(x.b == x.c);
49
50     x.a = get_global();
51     ASSERT(x.b == x.c);
52   }
53   //check the interrupt has run at all
54   ASSERT(x.a != 0);
55 #else
56   ASSERT(1);
57 #endif
58 }
59
60 #if defined(SDCC_mcs51)
61 void T2_isr (void) interrupt 5 using 2
62 {
63   //do not clear flag ET2 so it keeps interrupting !
64   global_var.b++;
65   if (global_var.b == 0)
66     global_var.b++;
67   global_var.c = global_var.b;
68 }
69 #endif