Код кажется правильным
Вы имеете в виду, что string[0] == '\0'
?
Может быть (total >> 24 & 0xFF) == 0
всегда (или в большинстве случаев).
РЕДАКТИРОВАТЬ:
Функция должна быть
void UART_1_PutString(const volatile unsigned char buff[]);
Она не должна называться строкой, потому что это не текст, это просто буфер (он выглядит как минимум).
unsigned
потому что "строка" происходит от некоторой битовой обработки без знака после некоторых математических операций, что может привести к недопустимому знаковому значению (вряд ли произойдет сбой, но правило должно быть: char
для текста, unsigned char
для неизвестных данных (все остальное)).
volatile
, потому что если нет, вы отбрасываете спецификатор volatile
.Компилятор с достаточно высокими флагами (в GCC: -Wall -Wextra -Werror
выделит почти все как ошибки) предупредит вас об этом.Компилятор может подумать, что содержимое функции можно упростить, даже не зная, что вы будете вызывать ее с данными volatile
, и, следовательно, оптимизировать то, что не следует оптимизировать.
Вы также можете добавитьrestrict
ключевое слово (C11), если никакая другая функция не получит доступ к этому буферу одновременно, так что вы поможете компилятору создать лучший код:
void UART_1_PutString(const volatile unsigned char buff[restrict]);
EDIT2:
Вы должны указать размер буфера, если он будет вызываться только с этим буфером, или также передать размер буфера функции, если нет:
void UART_1_PutString(const volatile unsigned char buff[restrict 6]);
(6, вероятно, должнозаменить на какой-нибудь макрос) или
void UART_1_PutString(size_t size, const volatile unsigned char buff[restrict size]);