реклама на сайте
подробности

 
 
> Портирование проекта AVR -> ARM, зависания
athlon64
сообщение Jul 18 2010, 14:34
Сообщение #1


Частый гость
**

Группа: Свой
Сообщений: 156
Регистрация: 10-03-10
Из: Уфа
Пользователь №: 55 882



Портирую проект с 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; // !! Вот тут происходит зависание
}


--------------------
Руслан
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 21st July 2025 - 10:25
Рейтинг@Mail.ru


Страница сгенерированна за 0.01338 секунд с 7
ELECTRONIX ©2004-2016