Портирую проект с AVR ATmega256 (IGCC) на ARM AT91SAM (IAR 5.4). Исходник под AVR писался не мной. Работу с периферией перенести успешно удалось (spi, twi, uart).
Устройство последовательно вызывает несколько функций, порядок которых определяется отдельно при конфигурировании устройства. Функции простые, реализующие логику, арифметику, счётчики и т.п.
Процессор берёт входные данные для каждой функции из массива inputs, складывает результаты в массив outputs. inputs и outputs - массивы char'ов, в которых могут лежать битовые значения (в char'е) и целочисленные значения (2 байта). Количество дискретных и целочисленных входов у всех функций различное.
При портировании я сменил типы unsigned int на unsigned short int т.к. у AVR int 16битный, у ARM - 16битный short int. Большинство функций исполняется верно, но на паре функций процессор жёстко зависает (останавливается вся периферия, таймеры и т.п.). Выяснил что виснет при обращении к массиву целочисленных выходов функции. Причём если изменить порядок вызова функций, та функция, которая вызывала зависание, может отработать нормально.
Понимаю, что дать конкретные советы по моей проблеме сложно, может быть сможете дать конкретные направления, способы отладки. Возможно я забыл про какие то отличия между AVR и ARM, наверняка многие при портировании сталкивались с такими подводными камнями. Буду благодарен за любую помощь. К сожалению, отладчика под рукой нет.
Т.к. виснет при работе с массивами inputs и outputs, приведу фрагменты работы с этими массивами:
Код
unsigned char *__discret_input, *__discret_output;
unsigned short int *__analog_input, *__analog_output;
В цикле исполнения цепочки функций:
Код
cntInputs = 0;
idx = pins[(CodeFunc<<2) + 0];
__discret_input = (unsigned char *)(inputs + 0);
idx = pins[(CodeFunc<<2) + 1];
__analog_input = (unsigned short int *)(inputs + cntInputs);
__discret_output = (unsigned char *)(outputs + cntOutputs);
cntOutputs += pins[(CodeFunc<<2) + 2];
__analog_output = (unsigned short int *)(outputs + cntOutputs);
cntOutputs += pins[(CodeFunc<<2) + 3]<<1;
Определение структур в заголовочном файле функции:
Код
typedef struct{
u_char Input;
u_char Reverse;
} func032_discret_input_type;
typedef struct{
u_int MaxValue;
u_int MinValue;
u_int DefValue;
} func032_analog_input_type;
typedef struct{
u_char Overflow;
} func032_discret_output_type;
typedef struct{
u_int Output;
u_int Sost;
} func032_analog_output_type;
И сама функция (упрощённо):
Код
void func032_exec()
{
func032_discret_input_type *discret_input;
func032_analog_input_type *analog_input;
func032_discret_output_type *discret_output;
func032_analog_output_type *analog_output;
discret_input = (func032_discret_input_type *)__discret_input;
analog_input = (func032_analog_input_type *)__analog_input;
discret_output = (func032_discret_output_type *)__discret_output;
analog_output = (func032_analog_output_type *)__analog_output;
analog_output->Output = analog_input->DefValue; // !! Вот тут происходит зависание
}