Прежде всего, вы должны понять, что программирование микроконтроллера очень отличается от программирования P C. Микроконтроллеры ограничены практически всеми возможными способами, поэтому для их программирования требуется больше навыков и осторожности, особенно для устаревших 8-битных устройств. (Почему я рекомендую новичкам держаться подальше от 8-битных, это одни из самых сложных процессоров для правильного программирования в C.)
Вы должны отметить, что использовать типы с плавающей запятой - очень плохая идея. на 8-ми битных микроконтроллерах. У них нет FPU, поэтому вы заставляете компилятор подключать относительно огромную программную библиотеку с плавающей запятой, которая займет много памяти и времени выполнения.
Прочтите это, в частности
Когда использовать с плавающей запятой
Если ваш MCU имеет FPU, и вам действительно нужно выполнять сложные математические вычисления, тогда вы должны использовать плавающую точку . В противном случае вы не должны.
Обычно, если вы действительно нуждаетесь в математике с плавающей запятой, то вы выбрали неправильный MCU для задачи. Вы должны были выбрать Cortex M4 или больше со встроенным FPU.
Чтобы оптимизировать сам тип с плавающей запятой в зависимости от цели, один простой способ - это сделать что-то вроде:
typedef float float_t;
А затем изменить этот тип в соответствии с целью с помощью #ifdef
переключателей компилятора.
Что касается самой структуры, не имеет особого смысла иметь на ней переменные размеры, поскольку вы никогда не сможете позволить себе это с точки зрения памяти. Вместо этого вам следует статически выделить максимальный размер, чтобы охватить наихудший сценарий.
Что-то вроде
typedef struct {
float mat[MAX_X][MAX_Y];
uint8_t nRows;
uint8_t nCols;
} Matrix ;
Где nRows / nCols обозначают, какая часть матрицы фактически используется.
(Обратите внимание, что использование int
во встроенной системе почти всегда неверно. Вместо этого используйте типы stdint.h
, чтобы избежать подписанных типов и оптимизировать размер. 8-битные микроконтроллеры не любят 16-битные арифметики c и ненавидите 32-битную арифметику c, поэтому по возможности придерживайтесь uint8_t
.)
Также возьмите за привычку использовать const корректность , то есть:
float_t determinantDouble (const Matrix* mat);