Вопросы по С/С++ (СИ)

Если ваш вопрос не влез ни в одну из вышеперечисленных тем, вам сюда.
Ответить
Открыл глаза
Сообщения: 51
Зарегистрирован: Сб янв 24, 2015 12:17:27
Откуда: Чувашская Республика - Чувашия

Сообщение radik91 »

Доброго вечера, есть плата и проект и старая программа-отладчик. Хотелось бы получать нужные дзначения для другой проги.. Проект TMS 2810
Реклама
Друг Кота
Аватара пользователя
Сообщения: 20124
Зарегистрирован: Чт сен 18, 2008 12:27:21
Откуда: Столица Мира Санкт-Петербург

Сообщение Gudd-Head »

Можно ли как-то в Кейле компилятору сказать, чтобы отзеркаливал константные байты? Например, вместо 0xA8 получить в коде 0x15?
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
Реклама
Собутыльник Кота
Аватара пользователя
Сообщения: 2567
Зарегистрирован: Вт май 01, 2018 19:44:47

Сообщение VladislavS »

[uquote="Gudd-Head",url="/forum/viewtopic.php?p=3815141#p3815141"]Например, вместо 0xA8 получить в коде 0x15?[/uquote]Можно макрос написать или constexpr функцию. На iar можно rbit использовать, а вот на gcc нет. Можно ли на keil не знаю. Так что, луше стандартными средствами языка.
Друг Кота
Сообщения: 6457
Зарегистрирован: Пт сен 13, 2013 13:11:31

Сообщение a5021 »

[uquote="VladislavS",url="/forum/viewtopic.php?p=3815154#p3815154"]На iar можно rbit использовать, а вот на gcc нет.[/uquote]
На всех можно. А еще можно в асм завернуть, если набор команд камня имеет этот самый rbit.
Реклама
Эиком - электронные компоненты и радиодетали
Собутыльник Кота
Аватара пользователя
Сообщения: 2567
Зарегистрирован: Вт май 01, 2018 19:44:47

Сообщение VladislavS »

[uquote="a5021",url="/forum/viewtopic.php?p=3815196#p3815196"]На всех можно.[/uquote]gcc не умеет rbit в компайлтайме выполнять.
[uquote="a5021",url="/forum/viewtopic.php?p=3815196#p3815196"]А еще можно в асм завернуть, если набор команд камня имеет этот самый rbit.[/uquote]Речь не о рантайме.
Реклама
Собутыльник Кота
Аватара пользователя
Сообщения: 2567
Зарегистрирован: Вт май 01, 2018 19:44:47

Сообщение VladislavS »

Код: Выделить всё

constexpr uint8_t rbit8(uint8_t x)
{
  return (x & 0x01 ? 0x80 : 0) |
         (x & 0x02 ? 0x40 : 0) |
         (x & 0x04 ? 0x20 : 0) |
         (x & 0x08 ? 0x10 : 0) |
         (x & 0x10 ? 0x08 : 0) |
         (x & 0x20 ? 0x04 : 0) |
         (x & 0x40 ? 0x02 : 0) |
         (x & 0x80 ? 0x01 : 0);
}

const uint8_t tmp = rbit8(0xA8);

int main()
{  
  GPIOA->IDR = tmp; 
}

Код: Выделить всё

//GPIOA->IDR = tmp;
        LDR.N    R1,??main_0      ;; 0x48000010
        MOVS     R0,#+21
        STR      R0,[R1, #+0]
Последний раз редактировалось VladislavS Пт мар 20, 2020 10:29:23, всего редактировалось 1 раз.
Реклама
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18793
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

насколько я понимаю, и макросом это можно задефайнить с тем же эффектом
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Друг Кота
Аватара пользователя
Сообщения: 20124
Зарегистрирован: Чт сен 18, 2008 12:27:21
Откуда: Столица Мира Санкт-Петербург

Сообщение Gudd-Head »

[uquote="ARV",url="/forum/viewtopic.php?p=3815358#p3815358"]насколько я понимаю, и макросом это можно задефайнить с тем же эффектом[/uquote]
Почти 256 значений (за вычетом симметричных)? :))) :shock: :o

Идея в том, чтобы писать в коде что-то осмысленное вида

Код: Выделить всё

tmp = (3<<A)|(4<<B)|(5<<C)
и потом выплёвывать в последовательный передатчик, но проблема в том, что выдавать надо старшим битом вперёд, а передатчик умеет только младшим.
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
Собутыльник Кота
Аватара пользователя
Сообщения: 2567
Зарегистрирован: Вт май 01, 2018 19:44:47

Сообщение VladislavS »

Gudd-Head, Определись, тебе нужно константы этапа компиляции или на рантайме вычислять? Первое я написал как. Макросом будет точно так же, но хужее.

Если у тебя кортекс, судя по IDE Кеил, то у него есть команда RBIT. На рантайме всё очень просто будет

Код: Выделить всё

uint8_t tmp = _RBIT(/*любое_выражение*/)>>24;
В принципе, Keil и IAR это и в компайлтайме могут вычислить.
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18793
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

[uquote="VladislavS",url="/forum/viewtopic.php?p=3815966#p3815966"]Макросом будет точно так же, но хужее.[/uquote]
Почему? Или чем хужее?
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Друг Кота
Сообщения: 3092
Зарегистрирован: Пн апр 06, 2015 11:01:53
Откуда: москва, уфа

Сообщение arkhnchul »

constexpr-ы обычно лаконичнее и понятнее развесистых макросов
Друг Кота
Аватара пользователя
Сообщения: 20124
Зарегистрирован: Чт сен 18, 2008 12:27:21
Откуда: Столица Мира Санкт-Петербург

Сообщение Gudd-Head »

[uquote="VladislavS",url="/forum/viewtopic.php?p=3815966#p3815966"]Определись, тебе нужно константы этапа компиляции или на рантайме вычислять?[/uquote]
При компиляции. И там далеко не кортекс.
Значит, использовать constexpr?
Спойлер

Код: Выделить всё

constexpr uint8_t rbit8(uint8_t x)
{
  return (x & 0x01 ? 0x80 : 0) |
         (x & 0x02 ? 0x40 : 0) |
         (x & 0x04 ? 0x20 : 0) |
         (x & 0x08 ? 0x10 : 0) |
         (x & 0x10 ? 0x08 : 0) |
         (x & 0x20 ? 0x04 : 0) |
         (x & 0x40 ? 0x02 : 0) |
         (x & 0x80 ? 0x01 : 0);}
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18793
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

arkhnchul писал(а):constexpr-ы обычно лаконичнее и понятнее развесистых макросов

Код: Выделить всё

#define bitrev(x) (((x) & 0x01 ? 0x80 : 0) | \
         ((x) & 0x02 ? 0x40 : 0) | \
         ((x) & 0x04 ? 0x20 : 0) | \
         ((x) & 0x08 ? 0x10 : 0) | \
         ((x) & 0x10 ? 0x08 : 0) | \
         ((x) & 0x20 ? 0x04 : 0) | \
         ((x) & 0x40 ? 0x02 : 0) | \
         ((x) & 0x80 ? 0x01 : 0))
по-моему, и лаконичность, и понятность не пострадала в данном случае
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Друг Кота
Аватара пользователя
Сообщения: 20124
Зарегистрирован: Чт сен 18, 2008 12:27:21
Откуда: Столица Мира Санкт-Петербург

Сообщение Gudd-Head »

В коде писать

Код: Выделить всё

tmp = bitrev((3<<A)|(4<<B)|(5<<C))
?
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
Собутыльник Кота
Аватара пользователя
Сообщения: 2567
Зарегистрирован: Вт май 01, 2018 19:44:47

Сообщение VladislavS »

[uquote="ARV",url="/forum/viewtopic.php?p=3816167#p3816167"]по-моему, и лаконичность, и понятность не пострадала в данном случае[/uquote]Да причём тут лаконичность? Мне на неё положить - один раз написал и забыл. Подумай, какой код даст твой макрос на вот таком простом коде

Код: Выделить всё

*(volatile uint8_t *)&SPI1->DR = bitrev(SPI1->DR);
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18793
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

А че тут думать, если вы приводите пример run-time, а речь шла о вычислениях compile-time? То есть выражение-параметр макроса у вас не константа?
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Собутыльник Кота
Аватара пользователя
Сообщения: 2567
Зарегистрирован: Вт май 01, 2018 19:44:47

Сообщение VladislavS »

Функция, в отличии от макроса, работает и в компайлтайме, и в рантайме.
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18793
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

А кто-то этого не знал? Речь шла о том, как реверсировать константы, для этого функция не обязательна. Тем более что увеличивает объём кода.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Собутыльник Кота
Аватара пользователя
Сообщения: 2567
Зарегистрирован: Вт май 01, 2018 19:44:47

Сообщение VladislavS »

[uquote="ARV",url="/forum/viewtopic.php?p=3816542#p3816542"]А кто-то этого не знал?[/uquote]Получается, что нет. Иначе зачем спрашивать было?
[uquote="ARV",url="/forum/viewtopic.php?p=3815975#p3815975"]Почему? Или чем хужее?[/uquote]

[uquote="ARV",url="/forum/viewtopic.php?p=3816542#p3816542"]Речь шла о том, как реверсировать константы, для этого функция не обязательна.[/uquote]Я это в первом же ответе написал. Что можно макросом или функцией.
[uquote="ARV",url="/forum/viewtopic.php?p=3815975#p3815975"]Тем более что увеличивает объём кода.[/uquote]Функция как раз таки уменьшает размер кода.

PS: Это, кстати, было не единственное слабое место макроса.
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18793
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

VladislavS писал(а):Это, кстати, было не единственное слабое место макроса
так я и спрашиваю о слабостях.


в контексте вопроса о константных вычислениях функция проигрывает полностью по размеру кода, т.к. макрос вообще не порождает код, а функция - порождает.
а в чем еще слабость макроса в упомянутом контектсе?
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Ответить

Вернуться в «Разные вопросы по МК»