Разбирался с дизассемблированным текстом программы.
Есть работа с индикатором типа 1602.
Нашел функцию забивки строки пробелами, 3 параметра- указатель и два числа, одно код пробела, второй число 16.
Явно memset()
https://learn.microsoft.com/ru-ru/cpp/c-runtime-library/reference/memset-wmemset
void *memset(void *dest, int c, size_t count);
Подставил вызов библиотечной функции из IAR - не пошло.
Решил покопаться и нашел, что есть проблемы с memset
В IAR 8.0.4 и 9.1.5
http://www.iarsys.co.jp/download/LMS2/arm/8101/ewarm8101doc/common/doc/KnownProblems.html
https://updates.iar.com/filestore/standard/001/002/168/common/doc/KnownProblems.html
EW25524 / IDE-2671 When a breakpoint set at "memset();" triggered, the execution might halt at "__aeabi_memset(_D, _N, _C);" in DLib_Product_string.h.
Здесь пользователь IAR для RTOS/CC2640 пишет именно о такой проблеме:
https://e2e.ti.com/support/wireless-connectivity/bluetooth-group/bluetooth/f/bluetooth-forum/605999/rtos-cc2640-memset-issue-for-a-struct
-----
Стало понятно, что вызывается функция от разработчика архитектуры ARM c переставленными параметрами
Вот здесь в GCC, это указано
https://codebrowser.dev/glibc/glibc/sysdeps/arm/aeabi_memset.c.html
/* Set memory like memset, but different argument order and no return value required. */ void __aeabi_memset (void *dest, size_t n, int c) { memset (dest, c, n); } /* Versions of the above which may assume memory alignment. */ strong_alias (__aeabi_memset, __aeabi_memset4) strong_alias (__aeabi_memset, __aeabi_memset8)
Здесь
так
void __aeabi_memset(void *dest, char c, size_t n) { memset(dest, c, n); }
"Энтропия растет."
Я еще заметил, что IAR на высоких степенях оптимизации может нарушать порядок передачи параметров через регистры.
Например "видит", что указатель на строку передается несколько раз в разные функции, может загнать его в R4 и не передавать его каждый раз.