На 8051 вам следует избегать использования указателей, насколько это возможно.Вместо этого, как правило, лучше - если вы можете себе это позволить - иметь несколько глобальных структур, которые будут управляться различными функциями.Наличие функций для «загрузки thing
с адреса» и «сохранения thing
для адреса» вместе с различными функциями, которые манипулируют thing
, может быть гораздо более эффективным, чем попытка иметь функции, которые могут работать с объектами этого типа »на месте.Я бы также предложил использовать функцию "ldivmod", которая делит 32-битное значение в ldiv_acc на 8-битный аргумент, оставляя частное в ldiv_acc и возвращая остаток, а также функцию "lmul", которая умножает 32-битовое значение в ldiv_acc 8-битным значением.Прошло много времени с тех пор, как я запрограммировал 8051, поэтому я не уверен, какая помощь нужна компиляторам для генерации хорошего кода, но деление и умножение 32x32 будет дорогостоящим по сравнению с использованием комбинации умножений и делений 8x8.
На 8051 код вроде:
uint32_t time;
uint32_t sec,min,hr;
sec = time % 60;
time /= 60;
min = time % 60;
time /= 60;
hr = time % 24;
time /= 24;
, вероятно, будет большим и медленным.Использование что-то вроде:
ldiv_acc.l = time;
sec = ldivmod(60);
min = ldivmod(60);
hr = ldivmod(24);
может быть намного более компактным и, если вы умным, быстрее.Если скорость действительно важна, вы можете использовать функции для выполнения divmod6, divmod10, divmod24 и divmod60, используя тот факт, что divmod60 (h + 256 * l) равен h * 4 + divmod60 (h * 16 + l),Второе добавление может дать значение больше 256, но если это произойдет, применение того же метода даст операнд ниже 256. Деление unsigned char
на другое unsigned char
происходит быстрее, чем деление, включающее unsigned int
.