diff --git a/py/builtin.c b/py/builtin.c
index 58a86ac9b5c308a6948e31a9019ae14af40617fc..250a3558e8e9318dbfbbba73753721732b9f4b0c 100644
--- a/py/builtin.c
+++ b/py/builtin.c
@@ -128,7 +128,7 @@ MP_DEFINE_CONST_FUN_OBJ_1(mp_builtin_any_obj, mp_builtin_any);
 
 STATIC mp_obj_t mp_builtin_bin(mp_obj_t o_in) {
     mp_obj_t args[] = { MP_OBJ_NEW_QSTR(MP_QSTR__brace_open__colon__hash_b_brace_close_), o_in };
-    return mp_obj_str_format(sizeof(args) / sizeof(args[0]), args);
+    return mp_obj_str_format(ARRAY_SIZE(args), args);
 }
 
 MP_DEFINE_CONST_FUN_OBJ_1(mp_builtin_bin_obj, mp_builtin_bin);
diff --git a/py/builtintables.c b/py/builtintables.c
index e6461ad80b48575fa145bf69ab6ed2728a207e3c..ab60183c6675ad2d06ffe2ae56554aa151b0e8b4 100644
--- a/py/builtintables.c
+++ b/py/builtintables.c
@@ -118,8 +118,8 @@ const mp_obj_dict_t mp_builtin_object_dict_obj = {
     .map = {
         .all_keys_are_qstrs = 1,
         .table_is_fixed_array = 1,
-        .used = sizeof(mp_builtin_object_table) / sizeof(mp_map_elem_t),
-        .alloc = sizeof(mp_builtin_object_table) / sizeof(mp_map_elem_t),
+        .used = ARRAY_SIZE(mp_builtin_object_table),
+        .alloc = ARRAY_SIZE(mp_builtin_object_table),
         .table = (mp_map_elem_t*)mp_builtin_object_table,
     },
 };
@@ -158,8 +158,8 @@ const mp_obj_dict_t mp_builtin_module_dict_obj = {
     .map = {
         .all_keys_are_qstrs = 1,
         .table_is_fixed_array = 1,
-        .used = sizeof(mp_builtin_module_table) / sizeof(mp_map_elem_t),
-        .alloc = sizeof(mp_builtin_module_table) / sizeof(mp_map_elem_t),
+        .used = ARRAY_SIZE(mp_builtin_module_table),
+        .alloc = ARRAY_SIZE(mp_builtin_module_table),
         .table = (mp_map_elem_t*)mp_builtin_module_table,
     },
 };
diff --git a/py/compile.c b/py/compile.c
index ee735a872f4457cb18a898bec8929f99949513b9..532e29a23399d3ef0b8f181848a7cc2d4d3419d2 100644
--- a/py/compile.c
+++ b/py/compile.c
@@ -86,8 +86,8 @@ STATIC const mp_map_elem_t mp_constants_table[] = {
 STATIC const mp_map_t mp_constants_map = {
     .all_keys_are_qstrs = 1,
     .table_is_fixed_array = 1,
-    .used = sizeof(mp_constants_table) / sizeof(mp_map_elem_t),
-    .alloc = sizeof(mp_constants_table) / sizeof(mp_map_elem_t),
+    .used = ARRAY_SIZE(mp_constants_table),
+    .alloc = ARRAY_SIZE(mp_constants_table),
     .table = (mp_map_elem_t*)mp_constants_table,
 };
 
diff --git a/py/emitinlinethumb.c b/py/emitinlinethumb.c
index 1ed5526631386de4e726f1453dc9de9215e62247..8b0e6af5e599affb0a8e01359d2ed6ca0517e023 100644
--- a/py/emitinlinethumb.c
+++ b/py/emitinlinethumb.c
@@ -141,7 +141,7 @@ STATIC uint get_arg_reg(emit_inline_asm_t *emit, const char *op, mp_parse_node_t
     if (MP_PARSE_NODE_IS_ID(pn)) {
         qstr reg_qstr = MP_PARSE_NODE_LEAF_ARG(pn);
         const char *reg_str = qstr_str(reg_qstr);
-        for (uint i = 0; i < sizeof(reg_name_table) / sizeof(reg_name_table[0]); i++) {
+        for (uint i = 0; i < ARRAY_SIZE(reg_name_table); i++) {
             const reg_name_t *r = &reg_name_table[i];
             if (reg_str[0] == r->name[0] && reg_str[1] == r->name[1] && reg_str[2] == r->name[2] && (reg_str[2] == '\0' || reg_str[3] == '\0')) {
                 if (r->reg > max_reg) {
@@ -260,7 +260,7 @@ STATIC void emit_inline_thumb_op(emit_inline_asm_t *emit, qstr op, int n_args, m
             asm_thumb_b_n(emit->as, label_num);
         } else if (op_str[0] == 'b' && op_len == 3) {
             uint cc = -1;
-            for (uint i = 0; i < (sizeof cc_name_table) / (sizeof cc_name_table[0]); i++) {
+            for (uint i = 0; i < ARRAY_SIZE(cc_name_table); i++) {
                 if (op_str[1] == cc_name_table[i].name[0] && op_str[2] == cc_name_table[i].name[1]) {
                     cc = cc_name_table[i].cc;
                 }
diff --git a/py/misc.h b/py/misc.h
index 002a97ffec3fba8c4f46ce4e593fb1b1b8efbc1a..bf31f75354e95c198c0ce999756e9b59b9d81d1f 100644
--- a/py/misc.h
+++ b/py/misc.h
@@ -52,6 +52,11 @@ int m_get_total_bytes_allocated(void);
 int m_get_current_bytes_allocated(void);
 int m_get_peak_bytes_allocated(void);
 
+/** array helpers ***********************************************/
+
+// get the number of elements in a fixed-size array
+#define ARRAY_SIZE(a) (sizeof(a) / sizeof((a)[0]))
+
 /** unichar / UTF-8 *********************************************/
 
 typedef int unichar; // TODO
diff --git a/py/modarray.c b/py/modarray.c
index d8ff7158ff2ad97c2d958ec5270fa67388eeeb2c..ff668f5b8769b44a24ff8673d3a0ec33b2fdce30 100644
--- a/py/modarray.c
+++ b/py/modarray.c
@@ -14,8 +14,8 @@ STATIC const mp_obj_dict_t mp_module_array_globals = {
     .map = {
         .all_keys_are_qstrs = 1,
         .table_is_fixed_array = 1,
-        .used = sizeof(mp_module_array_globals_table) / sizeof(mp_map_elem_t),
-        .alloc = sizeof(mp_module_array_globals_table) / sizeof(mp_map_elem_t),
+        .used = ARRAY_SIZE(mp_module_array_globals_table),
+        .alloc = ARRAY_SIZE(mp_module_array_globals_table),
         .table = (mp_map_elem_t*)mp_module_array_globals_table,
     },
 };
diff --git a/py/modcmath.c b/py/modcmath.c
index 3f561e7f309605b6713e228d380f9b30256e6133..80dc0c886009d2476ab9eb51163cec41a72b0495 100644
--- a/py/modcmath.c
+++ b/py/modcmath.c
@@ -116,8 +116,8 @@ STATIC const mp_obj_dict_t mp_module_cmath_globals = {
     .map = {
         .all_keys_are_qstrs = 1,
         .table_is_fixed_array = 1,
-        .used = sizeof(mp_module_cmath_globals_table) / sizeof(mp_map_elem_t),
-        .alloc = sizeof(mp_module_cmath_globals_table) / sizeof(mp_map_elem_t),
+        .used = ARRAY_SIZE(mp_module_cmath_globals_table),
+        .alloc = ARRAY_SIZE(mp_module_cmath_globals_table),
         .table = (mp_map_elem_t*)mp_module_cmath_globals_table,
     },
 };
diff --git a/py/modcollections.c b/py/modcollections.c
index 5278a526fbd29afbc810f52fc03bf9e1901a8d23..12d8f486c6726e3a1a148eb1fafc181ba61c5fbe 100644
--- a/py/modcollections.c
+++ b/py/modcollections.c
@@ -16,8 +16,8 @@ STATIC const mp_obj_dict_t mp_module_collections_globals = {
     .map = {
         .all_keys_are_qstrs = 1,
         .table_is_fixed_array = 1,
-        .used = sizeof(mp_module_collections_globals_table) / sizeof(mp_map_elem_t),
-        .alloc = sizeof(mp_module_collections_globals_table) / sizeof(mp_map_elem_t),
+        .used = ARRAY_SIZE(mp_module_collections_globals_table),
+        .alloc = ARRAY_SIZE(mp_module_collections_globals_table),
         .table = (mp_map_elem_t*)mp_module_collections_globals_table,
     },
 };
diff --git a/py/modio.c b/py/modio.c
index ac5c7df9de9c73e9035f2728612c998a1689a3fd..d07dc6a9827b5e7132f251b824f4c3265d42e104 100644
--- a/py/modio.c
+++ b/py/modio.c
@@ -18,8 +18,8 @@ STATIC const mp_obj_dict_t mp_module_io_globals = {
     .map = {
         .all_keys_are_qstrs = 1,
         .table_is_fixed_array = 1,
-        .used = sizeof(mp_module_io_globals_table) / sizeof(mp_map_elem_t),
-        .alloc = sizeof(mp_module_io_globals_table) / sizeof(mp_map_elem_t),
+        .used = ARRAY_SIZE(mp_module_io_globals_table),
+        .alloc = ARRAY_SIZE(mp_module_io_globals_table),
         .table = (mp_map_elem_t*)mp_module_io_globals_table,
     },
 };
diff --git a/py/modmath.c b/py/modmath.c
index 09bb4ce3aac343d63f13119250a344457fc7dc02..2c5b0e6faf3e4a2fd71ee5e8ae96c13b66579a23 100644
--- a/py/modmath.c
+++ b/py/modmath.c
@@ -145,8 +145,8 @@ STATIC const mp_obj_dict_t mp_module_math_globals = {
     .map = {
         .all_keys_are_qstrs = 1,
         .table_is_fixed_array = 1,
-        .used = sizeof(mp_module_math_globals_table) / sizeof(mp_map_elem_t),
-        .alloc = sizeof(mp_module_math_globals_table) / sizeof(mp_map_elem_t),
+        .used = ARRAY_SIZE(mp_module_math_globals_table),
+        .alloc = ARRAY_SIZE(mp_module_math_globals_table),
         .table = (mp_map_elem_t*)mp_module_math_globals_table,
     },
 };
diff --git a/py/modmicropython.c b/py/modmicropython.c
index ed245969cff27ec3dd4a50657548421845af7f40..b8ddbfe2a1e89efa56d1bb124e27125329266785 100644
--- a/py/modmicropython.c
+++ b/py/modmicropython.c
@@ -39,8 +39,8 @@ STATIC const mp_obj_dict_t mp_module_micropython_globals = {
     .map = {
         .all_keys_are_qstrs = 1,
         .table_is_fixed_array = 1,
-        .used = sizeof(mp_module_micropython_globals_table) / sizeof(mp_map_elem_t),
-        .alloc = sizeof(mp_module_micropython_globals_table) / sizeof(mp_map_elem_t),
+        .used = ARRAY_SIZE(mp_module_micropython_globals_table),
+        .alloc = ARRAY_SIZE(mp_module_micropython_globals_table),
         .table = (mp_map_elem_t*)mp_module_micropython_globals_table,
     },
 };
diff --git a/py/modstruct.c b/py/modstruct.c
index 81afd94d169234238dd72d1fbf215c169baa54f2..2a3c3c0ad67a663b237a3492f87a2c94744b5673 100644
--- a/py/modstruct.c
+++ b/py/modstruct.c
@@ -98,8 +98,8 @@ STATIC const mp_obj_dict_t mp_module_struct_globals = {
     .map = {
         .all_keys_are_qstrs = 1,
         .table_is_fixed_array = 1,
-        .used = sizeof(mp_module_struct_globals_table) / sizeof(mp_map_elem_t),
-        .alloc = sizeof(mp_module_struct_globals_table) / sizeof(mp_map_elem_t),
+        .used = ARRAY_SIZE(mp_module_struct_globals_table),
+        .alloc = ARRAY_SIZE(mp_module_struct_globals_table),
         .table = (mp_map_elem_t*)mp_module_struct_globals_table,
     },
 };
diff --git a/py/modsys.c b/py/modsys.c
index 41ade1f2755b3a310d6a2c297db094d4a37c0f83..ab067e06623853554037e64227ea17f87856f39d 100644
--- a/py/modsys.c
+++ b/py/modsys.c
@@ -49,8 +49,8 @@ STATIC const mp_obj_dict_t mp_module_sys_globals = {
     .map = {
         .all_keys_are_qstrs = 1,
         .table_is_fixed_array = 1,
-        .used = sizeof(mp_module_sys_globals_table) / sizeof(mp_map_elem_t),
-        .alloc = sizeof(mp_module_sys_globals_table) / sizeof(mp_map_elem_t),
+        .used = ARRAY_SIZE(mp_module_sys_globals_table),
+        .alloc = ARRAY_SIZE(mp_module_sys_globals_table),
         .table = (mp_map_elem_t*)mp_module_sys_globals_table,
     },
 };
diff --git a/stmhal/dac.c b/stmhal/dac.c
index 92edb24d76fe83f6ddaab9b69d2e4edb50963368..b9f825c05e74ff4bcf4ad4d22e8b4fb4d5a817f2 100644
--- a/stmhal/dac.c
+++ b/stmhal/dac.c
@@ -167,7 +167,7 @@ STATIC const mp_arg_parse_t pyb_dac_write_timed_accepted_args[] = {
     { MP_QSTR_freq, MP_ARG_PARSE_REQUIRED | MP_ARG_PARSE_INT, {.u_int = 0} },
     { MP_QSTR_mode, MP_ARG_PARSE_KW_ONLY | MP_ARG_PARSE_INT, {.u_int = DMA_NORMAL} },
 };
-#define PYB_DAC_WRITE_TIMED_NUM_ARGS (sizeof(pyb_dac_write_timed_accepted_args) / sizeof(pyb_dac_write_timed_accepted_args[0]))
+#define PYB_DAC_WRITE_TIMED_NUM_ARGS ARRAY_SIZE(pyb_dac_write_timed_accepted_args)
 
 mp_obj_t pyb_dac_write_timed(uint n_args, const mp_obj_t *args, mp_map_t *kw_args) {
     pyb_dac_obj_t *self = args[0];
diff --git a/stmhal/extint.c b/stmhal/extint.c
index ede4f39515c00db3046f0922c84af88fbc143a38..2c576648b48a867e500988ed32de82c74b7e064f 100644
--- a/stmhal/extint.c
+++ b/stmhal/extint.c
@@ -245,7 +245,7 @@ STATIC const mp_arg_parse_t pyb_extint_make_new_accepted_args[] = {
     { MP_QSTR_pull,     MP_ARG_PARSE_REQUIRED | MP_ARG_PARSE_INT, {.u_int = 0} },
     { MP_QSTR_callback, MP_ARG_PARSE_REQUIRED | MP_ARG_PARSE_OBJ, {.u_obj = MP_OBJ_NULL} },
 };
-#define PYB_EXTINT_MAKE_NEW_NUM_ARGS (sizeof(pyb_extint_make_new_accepted_args) / sizeof(pyb_extint_make_new_accepted_args[0]))
+#define PYB_EXTINT_MAKE_NEW_NUM_ARGS ARRAY_SIZE(pyb_extint_make_new_accepted_args)
 
 STATIC mp_obj_t extint_make_new(mp_obj_t type_in, uint n_args, uint n_kw, const mp_obj_t *args) {
     // type_in == extint_obj_type
diff --git a/stmhal/i2c.c b/stmhal/i2c.c
index b6e3d9beee0a4fec84c7051dd0b4a19b8661810a..4b44a1a313952cb15693e2d7a37eceb63e16fa31 100644
--- a/stmhal/i2c.c
+++ b/stmhal/i2c.c
@@ -157,7 +157,6 @@ STATIC const pyb_i2c_obj_t pyb_i2c_obj[] = {
 #endif
     {{&pyb_i2c_type}, &I2CHandle2}
 };
-#define PYB_NUM_I2C (sizeof(pyb_i2c_obj) / sizeof(pyb_i2c_obj[0]))
 
 STATIC void pyb_i2c_print(void (*print)(void *env, const char *fmt, ...), void *env, mp_obj_t self_in, mp_print_kind_t kind) {
     pyb_i2c_obj_t *self = self_in;
@@ -183,7 +182,7 @@ STATIC const mp_arg_parse_t pyb_i2c_init_accepted_args[] = {
     { MP_QSTR_baudrate, MP_ARG_PARSE_KW_ONLY | MP_ARG_PARSE_INT, {.u_int = 400000} },
     { MP_QSTR_gencall,  MP_ARG_PARSE_KW_ONLY | MP_ARG_PARSE_BOOL, {.u_bool = false} },
 };
-#define PYB_I2C_INIT_NUM_ARGS (sizeof(pyb_i2c_init_accepted_args) / sizeof(pyb_i2c_init_accepted_args[0]))
+#define PYB_I2C_INIT_NUM_ARGS ARRAY_SIZE(pyb_i2c_init_accepted_args)
 
 STATIC mp_obj_t pyb_i2c_init_helper(const pyb_i2c_obj_t *self, uint n_args, const mp_obj_t *args, mp_map_t *kw_args) {
     // parse args
@@ -222,7 +221,7 @@ STATIC mp_obj_t pyb_i2c_make_new(mp_obj_t type_in, uint n_args, uint n_kw, const
     machine_int_t i2c_id = mp_obj_get_int(args[0]) - 1;
 
     // check i2c number
-    if (!(0 <= i2c_id && i2c_id < PYB_NUM_I2C && pyb_i2c_obj[i2c_id].i2c != NULL)) {
+    if (!(0 <= i2c_id && i2c_id < ARRAY_SIZE(pyb_i2c_obj) && pyb_i2c_obj[i2c_id].i2c != NULL)) {
         nlr_raise(mp_obj_new_exception_msg_varg(&mp_type_ValueError, "I2C bus %d does not exist", i2c_id + 1));
     }
 
@@ -301,7 +300,7 @@ STATIC const mp_arg_parse_t pyb_i2c_send_accepted_args[] = {
     { MP_QSTR_addr,    MP_ARG_PARSE_INT, {.u_int = PYB_I2C_MASTER_ADDRESS} },
     { MP_QSTR_timeout, MP_ARG_PARSE_KW_ONLY | MP_ARG_PARSE_INT, {.u_int = 5000} },
 };
-#define PYB_I2C_SEND_NUM_ARGS (sizeof(pyb_i2c_send_accepted_args) / sizeof(pyb_i2c_send_accepted_args[0]))
+#define PYB_I2C_SEND_NUM_ARGS ARRAY_SIZE(pyb_i2c_send_accepted_args)
 
 STATIC mp_obj_t pyb_i2c_send(uint n_args, const mp_obj_t *args, mp_map_t *kw_args) {
     pyb_i2c_obj_t *self = args[0];
@@ -341,7 +340,7 @@ STATIC const mp_arg_parse_t pyb_i2c_recv_accepted_args[] = {
     { MP_QSTR_addr,    MP_ARG_PARSE_INT, {.u_int = PYB_I2C_MASTER_ADDRESS} },
     { MP_QSTR_timeout, MP_ARG_PARSE_KW_ONLY | MP_ARG_PARSE_INT, {.u_int = 5000} },
 };
-#define PYB_I2C_RECV_NUM_ARGS (sizeof(pyb_i2c_recv_accepted_args) / sizeof(pyb_i2c_recv_accepted_args[0]))
+#define PYB_I2C_RECV_NUM_ARGS ARRAY_SIZE(pyb_i2c_recv_accepted_args)
 
 STATIC mp_obj_t pyb_i2c_recv(uint n_args, const mp_obj_t *args, mp_map_t *kw_args) {
     pyb_i2c_obj_t *self = args[0];
@@ -386,7 +385,7 @@ STATIC const mp_arg_parse_t pyb_i2c_mem_read_accepted_args[] = {
     { MP_QSTR_memaddr, MP_ARG_PARSE_REQUIRED | MP_ARG_PARSE_INT, {.u_int = 0} },
     { MP_QSTR_timeout, MP_ARG_PARSE_KW_ONLY | MP_ARG_PARSE_INT, {.u_int = 5000} },
 };
-#define PYB_I2C_MEM_READ_NUM_ARGS (sizeof(pyb_i2c_mem_read_accepted_args) / sizeof(pyb_i2c_mem_read_accepted_args[0]))
+#define PYB_I2C_MEM_READ_NUM_ARGS ARRAY_SIZE(pyb_i2c_mem_read_accepted_args)
 
 STATIC mp_obj_t pyb_i2c_mem_read(uint n_args, const mp_obj_t *args, mp_map_t *kw_args) {
     pyb_i2c_obj_t *self = args[0];
diff --git a/stmhal/led.c b/stmhal/led.c
index d30c72157e2a3c867b4924e3f1f9064eb9320ffa..5a0dd7b9ac8ac91d20dca463c43296be9e572058 100644
--- a/stmhal/led.c
+++ b/stmhal/led.c
@@ -30,7 +30,7 @@ STATIC const pyb_led_obj_t pyb_led_obj[] = {
 #endif
 #endif
 };
-#define NUM_LEDS (sizeof(pyb_led_obj) / sizeof(pyb_led_obj[0]))
+#define NUM_LEDS ARRAY_SIZE(pyb_led_obj)
 
 void led_init(void) {
     /* GPIO structure */
diff --git a/stmhal/main.c b/stmhal/main.c
index 861e584d16d8a70ec1909f3aea2918943f1beb24..a25f3f69dec754528c95752016efae63665f7568 100644
--- a/stmhal/main.c
+++ b/stmhal/main.c
@@ -279,7 +279,7 @@ soft_reset:
             MP_OBJ_NEW_SMALL_INT(115200),
         };
         pyb_uart_global_debug = pyb_uart_type.make_new((mp_obj_t)&pyb_uart_type,
-                                                       sizeof(args) / sizeof(args[0]),
+                                                       ARRAY_SIZE(args),
                                                        0, args);
     }
 #else
diff --git a/stmhal/modos.c b/stmhal/modos.c
index f160627525941106eda6829ec62978d46c93bdd2..33b4ff73e05bbedfef6a603ecebd3109fc74da83 100644
--- a/stmhal/modos.c
+++ b/stmhal/modos.c
@@ -167,8 +167,8 @@ STATIC const mp_obj_dict_t os_module_globals = {
     .map = {
         .all_keys_are_qstrs = 1,
         .table_is_fixed_array = 1,
-        .used = sizeof(os_module_globals_table) / sizeof(mp_map_elem_t),
-        .alloc = sizeof(os_module_globals_table) / sizeof(mp_map_elem_t),
+        .used = ARRAY_SIZE(os_module_globals_table),
+        .alloc = ARRAY_SIZE(os_module_globals_table),
         .table = (mp_map_elem_t*)os_module_globals_table,
     },
 };
diff --git a/stmhal/modpyb.c b/stmhal/modpyb.c
index 7aec7125100afab44c3d9ce12042d095448ca347..a4e54fb87ca6c2bfadff951335847d497017c231 100644
--- a/stmhal/modpyb.c
+++ b/stmhal/modpyb.c
@@ -324,8 +324,8 @@ STATIC const mp_obj_dict_t pyb_module_globals = {
     .map = {
         .all_keys_are_qstrs = 1,
         .table_is_fixed_array = 1,
-        .used = sizeof(pyb_module_globals_table) / sizeof(mp_map_elem_t),
-        .alloc = sizeof(pyb_module_globals_table) / sizeof(mp_map_elem_t),
+        .used = ARRAY_SIZE(pyb_module_globals_table),
+        .alloc = ARRAY_SIZE(pyb_module_globals_table),
         .table = (mp_map_elem_t*)pyb_module_globals_table,
     },
 };
diff --git a/stmhal/modstm.c b/stmhal/modstm.c
index c923d13f3d5ded215869a1e1fe0fdb3c250079d2..078f590ece972e7f4c0bcef1f014a771325d8f4b 100644
--- a/stmhal/modstm.c
+++ b/stmhal/modstm.c
@@ -105,8 +105,8 @@ STATIC const mp_obj_dict_t stm_module_globals = {
     .map = {
         .all_keys_are_qstrs = 1,
         .table_is_fixed_array = 1,
-        .used = sizeof(stm_module_globals_table) / sizeof(mp_map_elem_t),
-        .alloc = sizeof(stm_module_globals_table) / sizeof(mp_map_elem_t),
+        .used = ARRAY_SIZE(stm_module_globals_table),
+        .alloc = ARRAY_SIZE(stm_module_globals_table),
         .table = (mp_map_elem_t*)stm_module_globals_table,
     },
 };
diff --git a/stmhal/modtime.c b/stmhal/modtime.c
index c20752e21d40fe028dfe8edd44d6fb7d4d468336..83be2deaa10ee562a797506ddf0ab628df5b2375 100644
--- a/stmhal/modtime.c
+++ b/stmhal/modtime.c
@@ -33,8 +33,8 @@ STATIC const mp_obj_dict_t time_module_globals = {
     .map = {
         .all_keys_are_qstrs = 1,
         .table_is_fixed_array = 1,
-        .used = sizeof(time_module_globals_table) / sizeof(mp_map_elem_t),
-        .alloc = sizeof(time_module_globals_table) / sizeof(mp_map_elem_t),
+        .used = ARRAY_SIZE(time_module_globals_table),
+        .alloc = ARRAY_SIZE(time_module_globals_table),
         .table = (mp_map_elem_t*)time_module_globals_table,
     },
 };
diff --git a/stmhal/spi.c b/stmhal/spi.c
index 99bc08c3b10971caf3b634fe3d5c913d6ea1215d..7e2e4ad4cfb89d6f13751eff4946bc5a3cdfc207 100644
--- a/stmhal/spi.c
+++ b/stmhal/spi.c
@@ -158,7 +158,7 @@ STATIC const pyb_spi_obj_t pyb_spi_obj[] = {
     {{&pyb_spi_type}, NULL},
 #endif
 };
-#define PYB_NUM_SPI (sizeof(pyb_spi_obj) / sizeof(pyb_spi_obj[0]))
+#define PYB_NUM_SPI ARRAY_SIZE(pyb_spi_obj)
 
 STATIC void pyb_spi_print(void (*print)(void *env, const char *fmt, ...), void *env, mp_obj_t self_in, mp_print_kind_t kind) {
     pyb_spi_obj_t *self = self_in;
@@ -206,7 +206,7 @@ STATIC const mp_arg_parse_t pyb_spi_init_accepted_args[] = {
     { MP_QSTR_ti,       MP_ARG_PARSE_KW_ONLY | MP_ARG_PARSE_BOOL, {.u_bool = false} },
     { MP_QSTR_crc,      MP_ARG_PARSE_KW_ONLY | MP_ARG_PARSE_OBJ,  {.u_obj = mp_const_none} },
 };
-#define PYB_SPI_INIT_NUM_ARGS (sizeof(pyb_spi_init_accepted_args) / sizeof(pyb_spi_init_accepted_args[0]))
+#define PYB_SPI_INIT_NUM_ARGS ARRAY_SIZE(pyb_spi_init_accepted_args)
 
 STATIC mp_obj_t pyb_spi_init_helper(const pyb_spi_obj_t *self, uint n_args, const mp_obj_t *args, mp_map_t *kw_args) {
     // parse args
@@ -299,7 +299,7 @@ STATIC const mp_arg_parse_t pyb_spi_send_accepted_args[] = {
     { MP_QSTR_send,    MP_ARG_PARSE_REQUIRED | MP_ARG_PARSE_OBJ, {.u_obj = MP_OBJ_NULL} },
     { MP_QSTR_timeout, MP_ARG_PARSE_KW_ONLY | MP_ARG_PARSE_INT, {.u_int = 5000} },
 };
-#define PYB_SPI_SEND_NUM_ARGS (sizeof(pyb_spi_send_accepted_args) / sizeof(pyb_spi_send_accepted_args[0]))
+#define PYB_SPI_SEND_NUM_ARGS ARRAY_SIZE(pyb_spi_send_accepted_args)
 
 STATIC mp_obj_t pyb_spi_send(uint n_args, const mp_obj_t *args, mp_map_t *kw_args) {
     // TODO assumes transmission size is 8-bits wide
@@ -331,7 +331,7 @@ STATIC const mp_arg_parse_t pyb_spi_recv_accepted_args[] = {
     { MP_QSTR_recv,    MP_ARG_PARSE_REQUIRED | MP_ARG_PARSE_OBJ, {.u_obj = MP_OBJ_NULL} },
     { MP_QSTR_timeout, MP_ARG_PARSE_KW_ONLY | MP_ARG_PARSE_INT, {.u_int = 5000} },
 };
-#define PYB_SPI_RECV_NUM_ARGS (sizeof(pyb_spi_recv_accepted_args) / sizeof(pyb_spi_recv_accepted_args[0]))
+#define PYB_SPI_RECV_NUM_ARGS ARRAY_SIZE(pyb_spi_recv_accepted_args)
 
 STATIC mp_obj_t pyb_spi_recv(uint n_args, const mp_obj_t *args, mp_map_t *kw_args) {
     // TODO assumes transmission size is 8-bits wide
@@ -368,7 +368,7 @@ STATIC const mp_arg_parse_t pyb_spi_send_recv_accepted_args[] = {
     { MP_QSTR_recv,    MP_ARG_PARSE_OBJ, {.u_obj = MP_OBJ_NULL} },
     { MP_QSTR_timeout, MP_ARG_PARSE_KW_ONLY | MP_ARG_PARSE_INT, {.u_int = 5000} },
 };
-#define PYB_SPI_SEND_RECV_NUM_ARGS (sizeof(pyb_spi_send_recv_accepted_args) / sizeof(pyb_spi_send_recv_accepted_args[0]))
+#define PYB_SPI_SEND_RECV_NUM_ARGS ARRAY_SIZE(pyb_spi_send_recv_accepted_args)
 
 STATIC mp_obj_t pyb_spi_send_recv(uint n_args, const mp_obj_t *args, mp_map_t *kw_args) {
     // TODO assumes transmission size is 8-bits wide
diff --git a/stmhal/timer.c b/stmhal/timer.c
index bd70eaa8700207f8e5904d16bbdc64091cb17585..8a0d3f5bb649db666e7a3d318db0e3de8f40168e 100644
--- a/stmhal/timer.c
+++ b/stmhal/timer.c
@@ -57,7 +57,7 @@ static uint32_t tim3_counter = 0;
 
 // Used to do callbacks to Python code on interrupt
 STATIC pyb_timer_obj_t *pyb_timer_obj_all[14];
-#define PYB_TIMER_OBJ_ALL_NUM (sizeof(pyb_timer_obj_all) / sizeof(pyb_timer_obj_all[0]))
+#define PYB_TIMER_OBJ_ALL_NUM ARRAY_SIZE(pyb_timer_obj_all)
 
 void timer_init0(void) {
     tim3_counter = 0;
@@ -180,7 +180,7 @@ STATIC const mp_arg_parse_t pyb_timer_init_accepted_args[] = {
     { MP_QSTR_mode,      MP_ARG_PARSE_KW_ONLY | MP_ARG_PARSE_INT, {.u_int = TIM_COUNTERMODE_UP} },
     { MP_QSTR_div,       MP_ARG_PARSE_KW_ONLY | MP_ARG_PARSE_INT, {.u_int = TIM_CLOCKDIVISION_DIV1} },
 };
-#define PYB_TIMER_INIT_NUM_ARGS (sizeof(pyb_timer_init_accepted_args) / sizeof(pyb_timer_init_accepted_args[0]))
+#define PYB_TIMER_INIT_NUM_ARGS ARRAY_SIZE(pyb_timer_init_accepted_args)
 
 STATIC mp_obj_t pyb_timer_init_helper(pyb_timer_obj_t *self, uint n_args, const mp_obj_t *args, mp_map_t *kw_args) {
     // parse args
diff --git a/stmhal/uart.c b/stmhal/uart.c
index 1b0d9e1b60cb52bb015988e8b149c53bc053daec..66997ce3e91f1dee488eb991290ff9bc78a12e4a 100644
--- a/stmhal/uart.c
+++ b/stmhal/uart.c
@@ -231,7 +231,7 @@ STATIC const mp_arg_parse_t pyb_uart_init_accepted_args[] = {
     { MP_QSTR_stop,     MP_ARG_PARSE_KW_ONLY | MP_ARG_PARSE_INT,  {.u_int = 1} },
     { MP_QSTR_parity,   MP_ARG_PARSE_KW_ONLY | MP_ARG_PARSE_OBJ,  {.u_obj = mp_const_none} },
 };
-#define PYB_UART_INIT_NUM_ARGS (sizeof(pyb_uart_init_accepted_args) / sizeof(pyb_uart_init_accepted_args[0]))
+#define PYB_UART_INIT_NUM_ARGS ARRAY_SIZE(pyb_uart_init_accepted_args)
 
 STATIC mp_obj_t pyb_uart_init_helper(pyb_uart_obj_t *self, uint n_args, const mp_obj_t *args, mp_map_t *kw_args) {
     // parse args
@@ -331,7 +331,7 @@ STATIC const mp_arg_parse_t pyb_uart_send_accepted_args[] = {
     { MP_QSTR_send,    MP_ARG_PARSE_REQUIRED | MP_ARG_PARSE_OBJ, {.u_obj = MP_OBJ_NULL} },
     { MP_QSTR_timeout, MP_ARG_PARSE_KW_ONLY | MP_ARG_PARSE_INT, {.u_int = 5000} },
 };
-#define PYB_UART_SEND_NUM_ARGS (sizeof(pyb_uart_send_accepted_args) / sizeof(pyb_uart_send_accepted_args[0]))
+#define PYB_UART_SEND_NUM_ARGS ARRAY_SIZE(pyb_uart_send_accepted_args)
 
 STATIC mp_obj_t pyb_uart_send(uint n_args, const mp_obj_t *args, mp_map_t *kw_args) {
     // TODO assumes transmission size is 8-bits wide
@@ -363,7 +363,7 @@ STATIC const mp_arg_parse_t pyb_uart_recv_accepted_args[] = {
     { MP_QSTR_recv,    MP_ARG_PARSE_REQUIRED | MP_ARG_PARSE_OBJ, {.u_obj = MP_OBJ_NULL} },
     { MP_QSTR_timeout, MP_ARG_PARSE_KW_ONLY | MP_ARG_PARSE_INT, {.u_int = 5000} },
 };
-#define PYB_UART_RECV_NUM_ARGS (sizeof(pyb_uart_recv_accepted_args) / sizeof(pyb_uart_recv_accepted_args[0]))
+#define PYB_UART_RECV_NUM_ARGS ARRAY_SIZE(pyb_uart_recv_accepted_args)
 
 STATIC mp_obj_t pyb_uart_recv(uint n_args, const mp_obj_t *args, mp_map_t *kw_args) {
     // TODO assumes transmission size is 8-bits wide
diff --git a/unix/modffi.c b/unix/modffi.c
index 56ea6ed307ceed830ddf993f87de2deea5bb3f51..be542625ede0488080257ef882465227c2aaa246 100644
--- a/unix/modffi.c
+++ b/unix/modffi.c
@@ -394,8 +394,8 @@ STATIC const mp_obj_dict_t mp_module_ffi_globals = {
     .map = {
         .all_keys_are_qstrs = 1,
         .table_is_fixed_array = 1,
-        .used = sizeof(mp_module_ffi_globals_table) / sizeof(mp_map_elem_t),
-        .alloc = sizeof(mp_module_ffi_globals_table) / sizeof(mp_map_elem_t),
+        .used = ARRAY_SIZE(mp_module_ffi_globals_table),
+        .alloc = ARRAY_SIZE(mp_module_ffi_globals_table),
         .table = (mp_map_elem_t*)mp_module_ffi_globals_table,
     },
 };
diff --git a/unix/modsocket.c b/unix/modsocket.c
index 4c76502da61adf53b80804f8011a6190807bb2f3..e52f5d92a997f4ccd61847fb90c54051de2973df 100644
--- a/unix/modsocket.c
+++ b/unix/modsocket.c
@@ -378,8 +378,8 @@ STATIC const mp_obj_dict_t mp_module_socket_globals = {
     .map = {
         .all_keys_are_qstrs = 1,
         .table_is_fixed_array = 1,
-        .used = sizeof(mp_module_socket_globals_table) / sizeof(mp_map_elem_t),
-        .alloc = sizeof(mp_module_socket_globals_table) / sizeof(mp_map_elem_t),
+        .used = ARRAY_SIZE(mp_module_socket_globals_table),
+        .alloc = ARRAY_SIZE(mp_module_socket_globals_table),
         .table = (mp_map_elem_t*)mp_module_socket_globals_table,
     },
 };
diff --git a/unix/modtime.c b/unix/modtime.c
index a0d7cd046235c7c6cefb0560f173f45a1d10680e..d8ca0e4ef53e3eab6179fbd1089a17f6b6f077c5 100644
--- a/unix/modtime.c
+++ b/unix/modtime.c
@@ -63,8 +63,8 @@ STATIC const mp_obj_dict_t mp_module_time_globals = {
     .map = {
         .all_keys_are_qstrs = 1,
         .table_is_fixed_array = 1,
-        .used = sizeof(mp_module_time_globals_table) / sizeof(mp_map_elem_t),
-        .alloc = sizeof(mp_module_time_globals_table) / sizeof(mp_map_elem_t),
+        .used = ARRAY_SIZE(mp_module_time_globals_table),
+        .alloc = ARRAY_SIZE(mp_module_time_globals_table),
         .table = (mp_map_elem_t*)mp_module_time_globals_table,
     },
 };