| #include <cstddef> | 
 | #include <cstdint> | 
 |  | 
 | // Writes incrementing integers to an array, reads them back and returns the | 
 | // the accumulated sum. | 
 | template <typename T, int N> | 
 | int WriteReadAccumulateArray(volatile T* data) { | 
 |   for (int i = 0; i < N; i++) { | 
 |     data[i] = static_cast<T>(i); | 
 |   } | 
 |   int acc = 0; | 
 |   for (int i = 0; i < N; i++) { | 
 |     acc += data[i]; | 
 |   } | 
 |   return acc; | 
 | } | 
 |  | 
 | volatile int8_t* extmem = reinterpret_cast<volatile int8_t*>(0x20000000L); | 
 |  | 
 | int main() { | 
 |   for (size_t i = 0; i < sizeof(int32_t); i++) { | 
 |     if (WriteReadAccumulateArray<int32_t, 4>( | 
 |             reinterpret_cast<volatile int32_t*>(extmem+i)) != 6) { | 
 |       return -1; | 
 |     } | 
 |   } | 
 |  | 
 |   for (size_t i = 0; i < sizeof(int16_t); i++) { | 
 |     if (WriteReadAccumulateArray<int16_t, 4>( | 
 |             reinterpret_cast<volatile int16_t*>(extmem+i)) != 6) { | 
 |       return -1; | 
 |     } | 
 |   } | 
 |  | 
 |   for (size_t i = 0; i < sizeof(int8_t); i++) { | 
 |     if (WriteReadAccumulateArray<int8_t, 4>( | 
 |             reinterpret_cast<volatile int8_t*>(extmem+i)) != 6) { | 
 |       return -1; | 
 |     } | 
 |   } | 
 |  | 
 |   volatile int32_t* extmem_boundary = reinterpret_cast<volatile int32_t*>(0x20000ffe); | 
 |   *extmem_boundary = 0xdeadbeef; | 
 |  | 
 |   if (*extmem_boundary != static_cast<int32_t>(0xdeadbeef)) { | 
 |     return -1; | 
 |   } | 
 |   return 0; | 
 | } |