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

 
 
2 страниц V  < 1 2  
Reply to this topicStart new topic
> ARM и AVR cравнение плотности кода
GetSmart
сообщение Feb 21 2008, 09:16
Сообщение #16


.
******

Группа: Участник
Сообщений: 4 005
Регистрация: 3-05-06
Из: Россия
Пользователь №: 16 753



Цитата(aaarrr)
Компилятор просто начнет "делать" из 32-х битного процессора восьмибитный, с соответствующим оверхедом.
Вообще, не должен, но делает. Т.к. в системе команд ARM команда LDRB автоматически расширяет число до 32 бит.


--------------------
Заблуждаться - Ваше законное право :-)
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Feb 21 2008, 09:22
Сообщение #17


Гуру
******

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



А если бы не расширяла - легче было бы? Сделайте ++ с переменной типа unsigned char, и в листинге получите примерно такую картину:
Код
add    r0, r0, #1
and    r0, r0, #0xff

И так во всем.
Go to the top of the page
 
+Quote Post
alexander55
сообщение Feb 21 2008, 09:59
Сообщение #18


Бывалый
*****

Группа: Свой
Сообщений: 1 584
Регистрация: 7-08-07
Пользователь №: 29 615



Цитата(aaarrr @ Feb 21 2008, 11:57) *
Компилятор просто начнет "делать" из 32-х битного процессора восьмибитный, с соответствующим оверхедом.

Для примера сложение двух 32-битных чисел на 8-битном uC.
Требуется:
- 4 сложения
- 6 сложений переносов
- SWAPы, т.к. регистров не хватает. biggrin.gif
Go to the top of the page
 
+Quote Post
Rst7
сообщение Feb 21 2008, 10:01
Сообщение #19


Йа моск ;)
******

Группа: Модераторы
Сообщений: 4 345
Регистрация: 7-07-05
Из: Kharkiv-city
Пользователь №: 6 610



Цитата
команда LDRB автоматически расширяет число до 32 бит.


Расширять то она расширяет. Только компилятор обязан при, например, выполнении char a=b+2 и b=254 обеспечить 0 в а, а не 256 (если тупо расширить), вот отсюда он и генерит сбросы старших битов. А если еще и signed char, то вообще мраки начинаются...


--------------------
"Практика выше (теоретического) познания, ибо она имеет не только достоинство всеобщности, но и непосредственной действительности." - В.И. Ленин
Go to the top of the page
 
+Quote Post
GetSmart
сообщение Feb 21 2008, 10:14
Сообщение #20


.
******

Группа: Участник
Сообщений: 4 005
Регистрация: 3-05-06
Из: Россия
Пользователь №: 16 753



Это я тоже заметил. Просто компиляторы пока недостаточно умные. Дело в том, какую логическую и арифметическую операцию не делай в 32-битном регистре со значимыми только 8-ми битами, результат будет правильный если отбросить старшие биты только под конец. А если учесть что STRB сама отбрасывает эти лишние биты, то я в недоумении.

Только при смешивании байта и большей байта переменной требуется сбросить лишние биты, ИМХО.

Деление только нельзя. Однако аппаратной команды деления в АРМе нет. И со сдвигами надо быть осторожным. А больше я никаких подводных камней не вижу.

Сообщение отредактировал GetSmart - Feb 21 2008, 10:23


--------------------
Заблуждаться - Ваше законное право :-)
Go to the top of the page
 
+Quote Post
KRS
сообщение Feb 21 2008, 10:19
Сообщение #21


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

Группа: Модераторы
Сообщений: 1 951
Регистрация: 27-08-04
Из: Санкт-Петербург
Пользователь №: 555



Цитата(Rst7 @ Feb 21 2008, 13:01) *
А если еще и signed char, то вообще мраки начинаются...

Да тоже самое что и unsigned char, просто сдвиг другой для unsigned используется пара LSL/LSR а для signed LSL/ASR.

Вообще что бы код хорошо работал и на ARM и на AVR, я все локальные переменные объявляю uint_fast8_t, и все операции с переменными которые в памяти делаю через временные локальные объявленные как uint_fast8_t. Тогда все нормально загрузка идет через LDRB, а промежуточные операции все 32 битные (на ARM)
Тут главное помнить что uint_fast8_t может быть больше 8 бит....
примерно так
Код
uint8_t var;
void f(uint_fast8_t arg)
{
  uint_fast8_t tmp;
  tmp = var;
  if ( tmp > arg) tmp = arg+5;
  else tmp*=2;
  var = tmp;
}


Сообщение отредактировал KRS - Feb 21 2008, 10:27
Go to the top of the page
 
+Quote Post
vesago
сообщение Feb 21 2008, 11:20
Сообщение #22


Тутэйшы
****

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



Цитата(zltigo @ Feb 21 2008, 09:25) *
smile.gif Ну если LPC,это поминаемый Вами LPC22xx c внешней шиной на которой висит RAM/ROM и все это по традиции на 2x слойной плате спроектированой без опыта шаманства со скростными девайсами на двуслойных платах, то это совершенно "нормально" smile.gif. Кроме того,какое отношение Ваша реплика имеет к заданному вопросу?


Да, собственно, никакого. Просто поделился впечатлением.
Go to the top of the page
 
+Quote Post
GetSmart
сообщение Feb 21 2008, 11:42
Сообщение #23


.
******

Группа: Участник
Сообщений: 4 005
Регистрация: 3-05-06
Из: Россия
Пользователь №: 16 753



Цитата(KRS @ Feb 21 2008, 15:19) *
Код
uint8_t var;
void f(uint_fast8_t arg)
{
....
}
Реальное шаманство. А всего-то надо было в первой строке исправить тип переменной с char на int.

Тестировал LPC2132 (без внешней шины) на предмет помехоустойчивости. С помощью искроподжигателя газа (применяющегося в котельных) так и не смог подвесить проц. Даже когда искра (мощная) происходила в 3 см от процессора. Плата простая двухсторонняя.

Сообщение отредактировал GetSmart - Feb 21 2008, 11:48


--------------------
Заблуждаться - Ваше законное право :-)
Go to the top of the page
 
+Quote Post
KRS
сообщение Feb 21 2008, 11:53
Сообщение #24


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

Группа: Модераторы
Сообщений: 1 951
Регистрация: 27-08-04
Из: Санкт-Петербург
Пользователь №: 555



Цитата(GetSmart @ Feb 21 2008, 14:42) *
Реальное шаманство. А всего-то надо было в первой строке исправить тип переменной с char на int.

Ага и получить код занимающий в 2 раза больше места и работающий в 2 раза медленнее на АВР
Go to the top of the page
 
+Quote Post
GetSmart
сообщение Feb 21 2008, 12:02
Сообщение #25


.
******

Группа: Участник
Сообщений: 4 005
Регистрация: 3-05-06
Из: Россия
Пользователь №: 16 753



Ну уже писали же, что нужно предопределять типы, удобные для процессора на котором компилится проект. Их исправить-то несколько секунд надо. И больше не шаманить.


--------------------
Заблуждаться - Ваше законное право :-)
Go to the top of the page
 
+Quote Post
vesago
сообщение Feb 21 2008, 12:12
Сообщение #26


Тутэйшы
****

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



Цитата(GetSmart @ Feb 21 2008, 13:42) *
Реальное шаманство. А всего-то надо было в первой строке исправить тип переменной с char на int.

Тестировал LPC2132 (без внешней шины) на предмет помехоустойчивости. С помощью искроподжигателя газа (применяющегося в котельных) так и не смог подвесить проц. Даже когда искра (мощная) происходила в 3 см от процессора. Плата простая двухсторонняя.


А у меня дивайс управляет электромагнитными защелками через реле. Если диод не поставить - гарантированно виснет. Причем внутренний вачдог бывает не помогает. Но это несомненно проблема конструкции.
Go to the top of the page
 
+Quote Post
KRS
сообщение Feb 21 2008, 13:21
Сообщение #27


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

Группа: Модераторы
Сообщений: 1 951
Регистрация: 27-08-04
Из: Санкт-Петербург
Пользователь №: 555



Цитата(GetSmart @ Feb 21 2008, 15:02) *
Ну уже писали же, что нужно предопределять типы, удобные для процессора на котором компилится проект. Их исправить-то несколько секунд надо. И больше не шаманить.

если переопределить типы тогда это отразится на требуемом размере памяти (для арм). Не зря в стандарте С99 есть все эти типы.
Go to the top of the page
 
+Quote Post
Alechek
сообщение Feb 21 2008, 18:27
Сообщение #28


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

Группа: Свой
Сообщений: 1 241
Регистрация: 15-11-05
Из: Челябинск
Пользователь №: 10 882



Цитата(GetSmart @ Feb 21 2008, 16:42) *
Тестировал LPC2132 (без внешней шины) на предмет помехоустойчивости. С помощью искроподжигателя газа (применяющегося в котельных) так и не смог подвесить проц. Даже когда искра (мощная) происходила в 3 см от процессора. Плата простая двухсторонняя.

Тестировал свое устройство на помехоустойчивость.. Электрошокером в 2-3 см искру пускал. Все работало отлично. Проц 2142
Go to the top of the page
 
+Quote Post

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

 


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


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