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

 
 
 
Reply to this topicStart new topic
> Портирование проекта 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
aaarrr
сообщение Jul 18 2010, 14:39
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Скорее всего, процессор вылетает в Data Abort при попытке чтения/записи 16 битного слова по нечетному адресу. Выходов есть два:
1. Объяснить компилятору, что адрес может быть нечетным (например, в Keil это будет __packed unsigned short)
2. Разрулить ситуацию вручную

Конечно, на Abort'ы желательно сделать честные обработчики с выводом диагностики.
Go to the top of the page
 
+Quote Post
athlon64
сообщение Jul 18 2010, 15:19
Сообщение #3


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

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



Цитата(aaarrr @ Jul 18 2010, 20:39) *
Скорее всего, процессор вылетает в Data Abort при попытке чтения/записи 16 битного слова по нечетному адресу.
Хм, действительно. Это объясняет почему при изменении порядка вызовов функций может перестать зависать smile.gif Спасибо за наводку

Цитата(aaarrr @ Jul 18 2010, 20:39) *
Конечно, на Abort'ы желательно сделать честные обработчики с выводом диагностики.
Ясно. Изучением системных прерываний займусь на неделе. Сейчас нужно устранить эти зависания, иначе тестеры не могут продолжить свою работу.

Цитата(aaarrr @ Jul 18 2010, 20:39) *
Выходов есть два:
1. Объяснить компилятору, что адрес может быть нечетным (например, в Keil это будет __packed unsigned short)
2. Разрулить ситуацию вручную

1. В IAR есть ключ __packed, по смыслу это оно smile.gif. Его нужно добавить при объявлении *__analog_input, *__analog_output и в объявлениях структур для short int элементов? Попробовать смогу только завтра
2. Как? в голову приходит только работать со всеми элементами как с char'ами и при записи short int разбивать на 2 байта. Так?


--------------------
Руслан
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Jul 18 2010, 15:27
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(athlon64 @ Jul 18 2010, 19:19) *
1. В IAR есть ключ __packed, по смыслу это оно smile.gif. Его нужно добавить при объявлении *__analog_input, *__analog_output и в объявлениях структур для short int элементов? Попробовать смогу только завтра

Оно. Да, добавить при объявлении.

Цитата(athlon64 @ Jul 18 2010, 19:19) *
2. Как? в голову приходит только работать со всеми элементами как с char'ами и при записи short int разбивать на 2 байта. Так?

Так. И при чтении аналогично.
В случае __packed компилятор сделает то же самое, только самостоятельно.
Go to the top of the page
 
+Quote Post
sergeeff
сообщение Jul 18 2010, 16:15
Сообщение #5


Профессионал
*****

Группа: Свой
Сообщений: 1 481
Регистрация: 10-04-05
Пользователь №: 4 007



Как-то не хорошо писать в массив случайную мешанину char'ов и short'ов. Как вы их распознавать то собираетесь?
Go to the top of the page
 
+Quote Post
athlon64
сообщение Jul 19 2010, 15:16
Сообщение #6


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

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



Цитата(aaarrr @ Jul 18 2010, 21:27) *
Оно. Да, добавить при объявлении.


Так. И при чтении аналогично.
В случае __packed компилятор сделает то же самое, только самостоятельно.

Спасибо в очередной раз за помощь, с __packed зависания прекратились. Тестируем дальше..

Цитата(sergeeff @ Jul 18 2010, 22:15) *
Как-то не хорошо писать в массив случайную мешанину char'ов и short'ов. Как вы их распознавать то собираетесь?
Наверное нехорошо, но переписывать сейчас не стану. А распознаются они довольно просто т.к. количество входов/выходов определённого типа у каждой функции заранее известно.


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

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

 


RSS Текстовая версия Сейчас: 18th July 2025 - 14:11
Рейтинг@Mail.ru


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