5.2.1 - Updated I2C files

Dependents:   mbed-TFT-example-NCS36510 mbed-Accelerometer-example-NCS36510 mbed-Accelerometer-example-NCS36510

Committer:
group-onsemi
Date:
Wed Jan 25 20:34:15 2017 +0000
Revision:
0:098463de4c5d
Initial commit

Who changed what in which revision?

UserRevisionLine numberNew contents of line
group-onsemi 0:098463de4c5d 1 /*
group-onsemi 0:098463de4c5d 2 * Copyright (c) 2013-2016, ARM Limited, All Rights Reserved
group-onsemi 0:098463de4c5d 3 * SPDX-License-Identifier: Apache-2.0
group-onsemi 0:098463de4c5d 4 *
group-onsemi 0:098463de4c5d 5 * Licensed under the Apache License, Version 2.0 (the "License"); you may
group-onsemi 0:098463de4c5d 6 * not use this file except in compliance with the License.
group-onsemi 0:098463de4c5d 7 * You may obtain a copy of the License at
group-onsemi 0:098463de4c5d 8 *
group-onsemi 0:098463de4c5d 9 * http://www.apache.org/licenses/LICENSE-2.0
group-onsemi 0:098463de4c5d 10 *
group-onsemi 0:098463de4c5d 11 * Unless required by applicable law or agreed to in writing, software
group-onsemi 0:098463de4c5d 12 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
group-onsemi 0:098463de4c5d 13 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
group-onsemi 0:098463de4c5d 14 * See the License for the specific language governing permissions and
group-onsemi 0:098463de4c5d 15 * limitations under the License.
group-onsemi 0:098463de4c5d 16 */
group-onsemi 0:098463de4c5d 17
group-onsemi 0:098463de4c5d 18 #include "mbed.h"
group-onsemi 0:098463de4c5d 19 #include "greentea-client/test_env.h"
group-onsemi 0:098463de4c5d 20 #include "unity/unity.h"
group-onsemi 0:098463de4c5d 21 #include "utest/utest.h"
group-onsemi 0:098463de4c5d 22 #include "mbed_mem_trace.h"
group-onsemi 0:098463de4c5d 23 #include <stdlib.h>
group-onsemi 0:098463de4c5d 24 #include <stdio.h>
group-onsemi 0:098463de4c5d 25 #include <stdarg.h>
group-onsemi 0:098463de4c5d 26
group-onsemi 0:098463de4c5d 27 #ifndef MBED_MEM_TRACING_ENABLED
group-onsemi 0:098463de4c5d 28 #error [NOT_SUPPORTED] test not supported
group-onsemi 0:098463de4c5d 29 #endif
group-onsemi 0:098463de4c5d 30
group-onsemi 0:098463de4c5d 31 using namespace utest::v1;
group-onsemi 0:098463de4c5d 32
group-onsemi 0:098463de4c5d 33 /******************************************************************************/
group-onsemi 0:098463de4c5d 34 /* Helper functions and data structures */
group-onsemi 0:098463de4c5d 35 /******************************************************************************/
group-onsemi 0:098463de4c5d 36
group-onsemi 0:098463de4c5d 37 // This structure keeps data about the various memory allocation operations,
group-onsemi 0:098463de4c5d 38 // as traced by 'test_trace_cb' below.
group-onsemi 0:098463de4c5d 39 #define TEST_MAX_MEMORY_OPS 10
group-onsemi 0:098463de4c5d 40 // Trace results for all possible operations
group-onsemi 0:098463de4c5d 41 typedef struct {
group-onsemi 0:098463de4c5d 42 uint8_t op;
group-onsemi 0:098463de4c5d 43 void *res;
group-onsemi 0:098463de4c5d 44 union {
group-onsemi 0:098463de4c5d 45 struct {
group-onsemi 0:098463de4c5d 46 size_t arg_size;
group-onsemi 0:098463de4c5d 47 } malloc_info;
group-onsemi 0:098463de4c5d 48 struct {
group-onsemi 0:098463de4c5d 49 void *arg_ptr;
group-onsemi 0:098463de4c5d 50 size_t arg_size;
group-onsemi 0:098463de4c5d 51 } realloc_info;
group-onsemi 0:098463de4c5d 52 struct {
group-onsemi 0:098463de4c5d 53 size_t arg_nmemb;
group-onsemi 0:098463de4c5d 54 size_t arg_size;
group-onsemi 0:098463de4c5d 55 } calloc_info;
group-onsemi 0:098463de4c5d 56 struct {
group-onsemi 0:098463de4c5d 57 void *arg_ptr;
group-onsemi 0:098463de4c5d 58 } free_info;
group-onsemi 0:098463de4c5d 59 };
group-onsemi 0:098463de4c5d 60 } mem_trace_data_t;
group-onsemi 0:098463de4c5d 61 // Memory operation statistics
group-onsemi 0:098463de4c5d 62 typedef struct {
group-onsemi 0:098463de4c5d 63 mem_trace_data_t op_data[TEST_MAX_MEMORY_OPS];
group-onsemi 0:098463de4c5d 64 uint32_t total_ops;
group-onsemi 0:098463de4c5d 65 bool invalid_op, overflow;
group-onsemi 0:098463de4c5d 66 } stats_t;
group-onsemi 0:098463de4c5d 67 static stats_t stats;
group-onsemi 0:098463de4c5d 68
group-onsemi 0:098463de4c5d 69 // Clear all the memory statistics
group-onsemi 0:098463de4c5d 70 static void test_clear_stats() {
group-onsemi 0:098463de4c5d 71 memset(&stats, 0, sizeof(stats));
group-onsemi 0:098463de4c5d 72 }
group-onsemi 0:098463de4c5d 73
group-onsemi 0:098463de4c5d 74 // Memory tracer callback that records each operation in "stats" (above)
group-onsemi 0:098463de4c5d 75 extern "C" void test_trace_cb(uint8_t op, void *res, void *caller, ...) {
group-onsemi 0:098463de4c5d 76 va_list va;
group-onsemi 0:098463de4c5d 77 mem_trace_data_t *pmem = stats.op_data + stats.total_ops;
group-onsemi 0:098463de4c5d 78
group-onsemi 0:098463de4c5d 79 if (stats.total_ops >= TEST_MAX_MEMORY_OPS) {
group-onsemi 0:098463de4c5d 80 stats.overflow = true;
group-onsemi 0:098463de4c5d 81 return;
group-onsemi 0:098463de4c5d 82 }
group-onsemi 0:098463de4c5d 83 va_start(va, caller);
group-onsemi 0:098463de4c5d 84 pmem->op = op;
group-onsemi 0:098463de4c5d 85 pmem->res = res;
group-onsemi 0:098463de4c5d 86 switch(op) {
group-onsemi 0:098463de4c5d 87 case MBED_MEM_TRACE_MALLOC:
group-onsemi 0:098463de4c5d 88 pmem->malloc_info.arg_size = va_arg(va, size_t);
group-onsemi 0:098463de4c5d 89 break;
group-onsemi 0:098463de4c5d 90
group-onsemi 0:098463de4c5d 91 case MBED_MEM_TRACE_REALLOC:
group-onsemi 0:098463de4c5d 92 pmem->realloc_info.arg_ptr = va_arg(va, void *);
group-onsemi 0:098463de4c5d 93 pmem->realloc_info.arg_size = va_arg(va, size_t);
group-onsemi 0:098463de4c5d 94 break;
group-onsemi 0:098463de4c5d 95
group-onsemi 0:098463de4c5d 96 case MBED_MEM_TRACE_CALLOC:
group-onsemi 0:098463de4c5d 97 pmem->calloc_info.arg_nmemb = va_arg(va, size_t);
group-onsemi 0:098463de4c5d 98 pmem->calloc_info.arg_size = va_arg(va, size_t);
group-onsemi 0:098463de4c5d 99 break;
group-onsemi 0:098463de4c5d 100
group-onsemi 0:098463de4c5d 101 case MBED_MEM_TRACE_FREE:
group-onsemi 0:098463de4c5d 102 pmem->free_info.arg_ptr = va_arg(va, void *);
group-onsemi 0:098463de4c5d 103 break;
group-onsemi 0:098463de4c5d 104
group-onsemi 0:098463de4c5d 105 default:
group-onsemi 0:098463de4c5d 106 stats.invalid_op = true;
group-onsemi 0:098463de4c5d 107 }
group-onsemi 0:098463de4c5d 108 stats.total_ops ++;
group-onsemi 0:098463de4c5d 109 va_end(va);
group-onsemi 0:098463de4c5d 110 }
group-onsemi 0:098463de4c5d 111
group-onsemi 0:098463de4c5d 112 // Generic sanity checks for the tracer
group-onsemi 0:098463de4c5d 113 static void check_sanity(uint32_t expected_ops) {
group-onsemi 0:098463de4c5d 114 TEST_ASSERT_FALSE(stats.overflow);
group-onsemi 0:098463de4c5d 115 TEST_ASSERT_FALSE(stats.invalid_op);
group-onsemi 0:098463de4c5d 116 TEST_ASSERT_EQUAL_UINT32(stats.total_ops, expected_ops);
group-onsemi 0:098463de4c5d 117 }
group-onsemi 0:098463de4c5d 118
group-onsemi 0:098463de4c5d 119 // Check a "malloc" operation
group-onsemi 0:098463de4c5d 120 static void check_malloc_op(const mem_trace_data_t *p, void *expected_res, size_t expected_arg_size) {
group-onsemi 0:098463de4c5d 121 TEST_ASSERT_EQUAL_UINT8(p->op, MBED_MEM_TRACE_MALLOC);
group-onsemi 0:098463de4c5d 122 TEST_ASSERT_EQUAL_PTR(p->res, expected_res);
group-onsemi 0:098463de4c5d 123 TEST_ASSERT_EQUAL_UINT32(p->malloc_info.arg_size, expected_arg_size);
group-onsemi 0:098463de4c5d 124 }
group-onsemi 0:098463de4c5d 125
group-onsemi 0:098463de4c5d 126 // Check a "free" operation
group-onsemi 0:098463de4c5d 127 static void check_free_op(const mem_trace_data_t *p, void *expected_arg_ptr) {
group-onsemi 0:098463de4c5d 128 TEST_ASSERT_EQUAL_UINT8(p->op, MBED_MEM_TRACE_FREE);
group-onsemi 0:098463de4c5d 129 TEST_ASSERT_EQUAL_PTR(p->free_info.arg_ptr, expected_arg_ptr);
group-onsemi 0:098463de4c5d 130 }
group-onsemi 0:098463de4c5d 131
group-onsemi 0:098463de4c5d 132 // Check a "realloc" operation
group-onsemi 0:098463de4c5d 133 static void check_realloc_op(const mem_trace_data_t *p, void *expected_res, void *expected_arg_ptr, size_t expected_arg_size) {
group-onsemi 0:098463de4c5d 134 TEST_ASSERT_EQUAL_UINT8(p->op, MBED_MEM_TRACE_REALLOC);
group-onsemi 0:098463de4c5d 135 TEST_ASSERT_EQUAL_PTR(p->res, expected_res);
group-onsemi 0:098463de4c5d 136 TEST_ASSERT_EQUAL_UINT32(p->realloc_info.arg_ptr, expected_arg_ptr);
group-onsemi 0:098463de4c5d 137 TEST_ASSERT_EQUAL_UINT32(p->realloc_info.arg_size, expected_arg_size);
group-onsemi 0:098463de4c5d 138 }
group-onsemi 0:098463de4c5d 139
group-onsemi 0:098463de4c5d 140 // Check a "calloc" operation
group-onsemi 0:098463de4c5d 141 static void check_calloc_op(const mem_trace_data_t *p, void *expected_res, size_t expected_arg_nmemb, size_t expected_arg_size) {
group-onsemi 0:098463de4c5d 142 TEST_ASSERT_EQUAL_UINT8(p->op, MBED_MEM_TRACE_CALLOC);
group-onsemi 0:098463de4c5d 143 TEST_ASSERT_EQUAL_PTR(p->res, expected_res);
group-onsemi 0:098463de4c5d 144 TEST_ASSERT_EQUAL_UINT32(p->calloc_info.arg_nmemb, expected_arg_nmemb);
group-onsemi 0:098463de4c5d 145 TEST_ASSERT_EQUAL_UINT32(p->calloc_info.arg_size, expected_arg_size);
group-onsemi 0:098463de4c5d 146 }
group-onsemi 0:098463de4c5d 147
group-onsemi 0:098463de4c5d 148 /******************************************************************************/
group-onsemi 0:098463de4c5d 149 /* Tests */
group-onsemi 0:098463de4c5d 150 /******************************************************************************/
group-onsemi 0:098463de4c5d 151
group-onsemi 0:098463de4c5d 152 // Allocate a single buffer, then free it. Check that tracing matches the operations.
group-onsemi 0:098463de4c5d 153 static void test_case_single_malloc_free() {
group-onsemi 0:098463de4c5d 154 const size_t block_size = 126;
group-onsemi 0:098463de4c5d 155 const mem_trace_data_t *pmem = stats.op_data;
group-onsemi 0:098463de4c5d 156
group-onsemi 0:098463de4c5d 157 test_clear_stats();
group-onsemi 0:098463de4c5d 158 mbed_mem_trace_set_callback(test_trace_cb);
group-onsemi 0:098463de4c5d 159 // Allocate a single memory block
group-onsemi 0:098463de4c5d 160 void *p = malloc(block_size);
group-onsemi 0:098463de4c5d 161 TEST_ASSERT_NOT_EQUAL(p, NULL);
group-onsemi 0:098463de4c5d 162 // Free the memory block
group-onsemi 0:098463de4c5d 163 free(p);
group-onsemi 0:098463de4c5d 164 // Stop tracing
group-onsemi 0:098463de4c5d 165 mbed_mem_trace_set_callback(NULL);
group-onsemi 0:098463de4c5d 166 // Check tracer result
group-onsemi 0:098463de4c5d 167 check_sanity(2);
group-onsemi 0:098463de4c5d 168 check_malloc_op(pmem ++, p, block_size);
group-onsemi 0:098463de4c5d 169 check_free_op(pmem, p);
group-onsemi 0:098463de4c5d 170 }
group-onsemi 0:098463de4c5d 171
group-onsemi 0:098463de4c5d 172 // Test all memory operations (malloc, realloc, free, calloc)
group-onsemi 0:098463de4c5d 173 static void test_case_all_memory_ops() {
group-onsemi 0:098463de4c5d 174 const size_t malloc_size = 40, realloc_size = 80, nmemb = 25, size = 10;
group-onsemi 0:098463de4c5d 175 const mem_trace_data_t *pmem = stats.op_data;
group-onsemi 0:098463de4c5d 176
group-onsemi 0:098463de4c5d 177 test_clear_stats();
group-onsemi 0:098463de4c5d 178 mbed_mem_trace_set_callback(test_trace_cb);
group-onsemi 0:098463de4c5d 179 // Allocate a single memory block, the realloc it
group-onsemi 0:098463de4c5d 180 void *p_malloc = malloc(malloc_size);
group-onsemi 0:098463de4c5d 181 TEST_ASSERT_NOT_EQUAL(p_malloc, NULL);
group-onsemi 0:098463de4c5d 182 void *p_realloc = realloc(p_malloc, realloc_size);
group-onsemi 0:098463de4c5d 183 TEST_ASSERT_NOT_EQUAL(p_realloc, NULL);
group-onsemi 0:098463de4c5d 184 // Use calloc() now
group-onsemi 0:098463de4c5d 185 void *p_calloc = calloc(nmemb, size);
group-onsemi 0:098463de4c5d 186 //TEST_ASSERT_NOT_EQUAL(p_calloc, NULL);
group-onsemi 0:098463de4c5d 187 // Free the realloc() pointer first, then the calloc() one
group-onsemi 0:098463de4c5d 188 free(p_realloc);
group-onsemi 0:098463de4c5d 189 free(p_calloc);
group-onsemi 0:098463de4c5d 190 // Stop tracing
group-onsemi 0:098463de4c5d 191 mbed_mem_trace_set_callback(NULL);
group-onsemi 0:098463de4c5d 192 // Check tracer result
group-onsemi 0:098463de4c5d 193 check_sanity(6);
group-onsemi 0:098463de4c5d 194 check_malloc_op(pmem ++, p_malloc, malloc_size);
group-onsemi 0:098463de4c5d 195 check_realloc_op(pmem ++, p_realloc, p_malloc, realloc_size);
group-onsemi 0:098463de4c5d 196 // calloc() calls malloc() internally
group-onsemi 0:098463de4c5d 197 check_malloc_op(pmem ++, p_calloc, nmemb * size);
group-onsemi 0:098463de4c5d 198 check_calloc_op(pmem ++, p_calloc, nmemb, size);
group-onsemi 0:098463de4c5d 199 check_free_op(pmem ++, p_realloc);
group-onsemi 0:098463de4c5d 200 check_free_op(pmem, p_calloc);
group-onsemi 0:098463de4c5d 201 }
group-onsemi 0:098463de4c5d 202
group-onsemi 0:098463de4c5d 203 // Test that tracing is off when using a NULL callback
group-onsemi 0:098463de4c5d 204 static void test_case_trace_off() {
group-onsemi 0:098463de4c5d 205 const size_t malloc_size = 10;
group-onsemi 0:098463de4c5d 206
group-onsemi 0:098463de4c5d 207 test_clear_stats();
group-onsemi 0:098463de4c5d 208 // We don't want any tracing
group-onsemi 0:098463de4c5d 209 mbed_mem_trace_set_callback(NULL);
group-onsemi 0:098463de4c5d 210 // Allocate a buffer and free it
group-onsemi 0:098463de4c5d 211 void *p_malloc = malloc(malloc_size);
group-onsemi 0:098463de4c5d 212 TEST_ASSERT_NOT_EQUAL(p_malloc, NULL);
group-onsemi 0:098463de4c5d 213 free(p_malloc);
group-onsemi 0:098463de4c5d 214 // Check that we didn't trace anything
group-onsemi 0:098463de4c5d 215 check_sanity(0);
group-onsemi 0:098463de4c5d 216 }
group-onsemi 0:098463de4c5d 217
group-onsemi 0:098463de4c5d 218 // Test partial tracing (start tracing, stop tracing, restart later)
group-onsemi 0:098463de4c5d 219 static void test_case_partial_trace() {
group-onsemi 0:098463de4c5d 220 const size_t malloc_size_1 = 20, malloc_size_2 = 30;
group-onsemi 0:098463de4c5d 221 const mem_trace_data_t *pmem = stats.op_data;
group-onsemi 0:098463de4c5d 222
group-onsemi 0:098463de4c5d 223 test_clear_stats();
group-onsemi 0:098463de4c5d 224 // Start tracing
group-onsemi 0:098463de4c5d 225 mbed_mem_trace_set_callback(test_trace_cb);
group-onsemi 0:098463de4c5d 226 // Allocate a buffer
group-onsemi 0:098463de4c5d 227 void *p_malloc_1 = malloc(malloc_size_1);
group-onsemi 0:098463de4c5d 228 TEST_ASSERT_NOT_EQUAL(p_malloc_1, NULL);
group-onsemi 0:098463de4c5d 229 // Disable tracing before freeing the first buffer
group-onsemi 0:098463de4c5d 230 mbed_mem_trace_set_callback(NULL);
group-onsemi 0:098463de4c5d 231 free(p_malloc_1);
group-onsemi 0:098463de4c5d 232 // Allocate another buffer (still not traced)
group-onsemi 0:098463de4c5d 233 void *p_malloc_2 = malloc(malloc_size_2);
group-onsemi 0:098463de4c5d 234 TEST_ASSERT_NOT_EQUAL(p_malloc_2, NULL);
group-onsemi 0:098463de4c5d 235 // Re-enable tracing
group-onsemi 0:098463de4c5d 236 mbed_mem_trace_set_callback(test_trace_cb);
group-onsemi 0:098463de4c5d 237 // And free the second buffer (this operation should be tracer)
group-onsemi 0:098463de4c5d 238 free(p_malloc_2);
group-onsemi 0:098463de4c5d 239 // Stop tracing
group-onsemi 0:098463de4c5d 240 mbed_mem_trace_set_callback(NULL);
group-onsemi 0:098463de4c5d 241 // Check tracer result
group-onsemi 0:098463de4c5d 242 check_sanity(2);
group-onsemi 0:098463de4c5d 243 check_malloc_op(pmem ++, p_malloc_1, malloc_size_1);
group-onsemi 0:098463de4c5d 244 check_free_op(pmem, p_malloc_2);
group-onsemi 0:098463de4c5d 245 }
group-onsemi 0:098463de4c5d 246
group-onsemi 0:098463de4c5d 247 // Test new/delete tracing
group-onsemi 0:098463de4c5d 248 static void test_case_new_delete() {
group-onsemi 0:098463de4c5d 249 const mem_trace_data_t *pmem = stats.op_data;
group-onsemi 0:098463de4c5d 250
group-onsemi 0:098463de4c5d 251 test_clear_stats();
group-onsemi 0:098463de4c5d 252 // Start tracing
group-onsemi 0:098463de4c5d 253 mbed_mem_trace_set_callback(test_trace_cb);
group-onsemi 0:098463de4c5d 254 // Test new, new[], delete and delete[]
group-onsemi 0:098463de4c5d 255 int *p_int = new int;
group-onsemi 0:098463de4c5d 256 int *p_int_array = new int[10];
group-onsemi 0:098463de4c5d 257 delete p_int;
group-onsemi 0:098463de4c5d 258 delete[] p_int_array;
group-onsemi 0:098463de4c5d 259 // Stop tracing
group-onsemi 0:098463de4c5d 260 mbed_mem_trace_set_callback(NULL);
group-onsemi 0:098463de4c5d 261 // Check tracer result
group-onsemi 0:098463de4c5d 262 check_sanity(4);
group-onsemi 0:098463de4c5d 263 check_malloc_op(pmem ++, p_int, sizeof(int));
group-onsemi 0:098463de4c5d 264 check_malloc_op(pmem ++, p_int_array, 10 * sizeof(int));
group-onsemi 0:098463de4c5d 265 check_free_op(pmem ++, p_int);
group-onsemi 0:098463de4c5d 266 check_free_op(pmem ++, p_int_array);
group-onsemi 0:098463de4c5d 267 }
group-onsemi 0:098463de4c5d 268
group-onsemi 0:098463de4c5d 269 static Case cases[] = {
group-onsemi 0:098463de4c5d 270 Case("single malloc/free", test_case_single_malloc_free),
group-onsemi 0:098463de4c5d 271 Case("all memory operations", test_case_all_memory_ops),
group-onsemi 0:098463de4c5d 272 Case("trace off", test_case_trace_off),
group-onsemi 0:098463de4c5d 273 Case("partial trace", test_case_partial_trace),
group-onsemi 0:098463de4c5d 274 Case("test new/delete", test_case_new_delete)
group-onsemi 0:098463de4c5d 275 };
group-onsemi 0:098463de4c5d 276
group-onsemi 0:098463de4c5d 277 static status_t greentea_test_setup(const size_t number_of_cases) {
group-onsemi 0:098463de4c5d 278 GREENTEA_SETUP(20, "default_auto");
group-onsemi 0:098463de4c5d 279 return greentea_test_setup_handler(number_of_cases);
group-onsemi 0:098463de4c5d 280 }
group-onsemi 0:098463de4c5d 281
group-onsemi 0:098463de4c5d 282 static Specification specification(greentea_test_setup, cases, greentea_test_teardown_handler);
group-onsemi 0:098463de4c5d 283
group-onsemi 0:098463de4c5d 284 int main() {
group-onsemi 0:098463de4c5d 285 // Disable stdout buffering to prevent any unwanted allocations
group-onsemi 0:098463de4c5d 286 setvbuf(stdout, NULL, _IONBF, 0);
group-onsemi 0:098463de4c5d 287 Harness::run(specification);
group-onsemi 0:098463de4c5d 288 }
group-onsemi 0:098463de4c5d 289