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

Если ваш вопрос не влез ни в одну из вышеперечисленных тем, вам сюда.
Ответить
Собутыльник Кота
Аватара пользователя
Сообщения: 2562
Зарегистрирован: Вт май 01, 2018 19:44:47

Сообщение VladislavS »

[uquote="Эйлер Леонард",url="/forum/viewtopic.php?p=4164409#p4164409"]на нормальный C++(14).[/uquote]На календарь то посмотрите. Нормальный сейчас С++20. Накрайняк С++17, если компилятор не поддерживает выше.

[uquote="Эйлер Леонард",url="/forum/viewtopic.php?p=4164409#p4164409"]пирожок только что из печки - прошу откушать[/uquote]Какие преимущества мы получим? Код уменьшится раза в два как в примере с MIN? :)

Настрогать классов вместо функций это ещё не С++. Вот с чем надо бороться в первую очередь.
Спойлер

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

#define GPIO_ATOMIC(expr)					\
  do {								\
    if (PIN < GPIO_ATOMIC_MAX) {				\
      expr;							\
    }								\
    else {							\
      uint8_t sreg = SREG;					\
      __asm__ __volatile__("cli" ::: "memory");			\
      expr;							\
      SREG = sreg;						\
      __asm__ __volatile__("" ::: "memory");			\
    }								\
  } while (0)
Откуда в этот макрос просочился PIN? Это надо как-то так делать. AVR не пользуюсь, поэтому кое-что просто заменил на аналоги.

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

// Для пародии на AVR
constexpr auto PIN = 30;
constexpr auto GPIO_ATOMIC_MAX = 20;
volatile uint8_t SREG;

template<auto pin>
void GPIO_ATOMIC(auto expr)
{
  if constexpr(pin<GPIO_ATOMIC_MAX) 
    expr();
  else 
  {
    uint8_t sreg = SREG;
    __disable_irq();  	
    expr(); 	  	
    SREG = sreg;   
  }
}

GPIO_ATOMIC<PIN>([]{ __NOP(); });
Реклама
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18678
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

для AVR есть готовые макросы для атомных операций - util/atomic.h (не ++)
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Реклама
Прорезались зубы
Аватара пользователя
Сообщения: 232
Зарегистрирован: Вт фев 05, 2019 17:20:08
Откуда: Днепр, Украина

Сообщение Roman Solovey »

ARV, По вашим советам скачал последнюю микрочип студию и обнаружил что в ней не работает мой отладчик/программатор. Главное в авр студио 7 работает а в новой нет.
Подскажите как можно обновить компилятор в 7 студии чтоб работал __flash. Может инструкция какая есть?
Еще читал что в IAR есть с коробки, но переходить на новую программу пока не охота
Одержать сто побед в ста битвах — это не вершина воинского искусства. Повергнуть врага без сражения — вот вершина.
Контактная информация:
Друг Кота
Аватара пользователя
Сообщения: 7360
Зарегистрирован: Пт авг 28, 2009 21:34:30
Откуда: 845-й км.

Сообщение uldemir »

[uquote="ARV",url="/forum/viewtopic.php?p=4164462#p4164462"]так?[/uquote]А обязательно "выравнивать" длины union-ов? У меня int - 4 байта (это я в примере лоханулся сгоряча). Хотя, компилятор молча проглотил. Когда я пытался, не додумался поле whereami "вынести" из юниона "за скобки". Хорошо, теперь будем переделывать журнал, чтобы всё теперь записывалось в одну память, а не писалось в два разных места.
Реклама
Эиком - электронные компоненты и радиодетали
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18678
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

uldemir писал(а):А обязательно "выравнивать" длины union-ов?
ну так если не хотите, чтобы у вас в одном режиме тупо несколько байтов всегда пустовало, надо выравнивать. потому как память выделяется под наибольший размер элемента юниона.

если у вас int32_t, так и писали бы, ведь int16_t у вас есть... имхо, int в Си - такой же подлый тип, как и char
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Реклама
Друг Кота
Аватара пользователя
Сообщения: 7360
Зарегистрирован: Пт авг 28, 2009 21:34:30
Откуда: 845-й км.

Сообщение uldemir »

Ой, я ленивый. как пересел на ARM так сразу распустился. всюду пользуюсь 32 битной арифметикой. И пользовался только char и int. Всякие int16_t пришлось привыкать чуть позже, когда нужно память (внешнюю) экономить. Внутренней хватает. Да и тексаксовский Code Compose Studio в своём ULP advisor ноет:
#2624-D (ULP 5.4) Detected an assignment to a type with size less than int. To avoid unnecessary sign extension, use int-sized types for local varaibles and convert to smaller types for static storage. commandline.c /Robotic Maze line 178
Но мне там реально нужна 16 битная арифметика, так как там из потока я собираю координаты, которые и передаются в усеченном виде.
Да и не появляются эти uint8/16/32_t что-то автоматом - приходится #include "stdint.h" добавлять, если ни один из предыдущих инклюдов его не подцепил.

А мне и надо, чтобы память "пустовала". Чтобы всегда писалось по 23 байта. Сейчас нет с собой платы с FRAM, чтобы проверить, что там пишется. Но это я обязательно проверю. Потому как тут я байты экономлю - у FRAM ёмкость всего 256к и этого хватает только на пол-минуты при таком объёме данных.
Реклама
Собутыльник Кота
Аватара пользователя
Сообщения: 2723
Зарегистрирован: Пт сен 07, 2018 20:20:02
Откуда: деревня в Тульской губернии

Сообщение ПростоНуб »

uldemir, а сжимать не пробовали на лету? Я просто не знаю ни особенностей изменения этих координат (дельта-кодирование?), ни их распределения (Хаффман?), не требуемой точности при хранении (интерполяция?) ни множества потоков (МДКП?). Но, обычно, такие данные неплохо сжимаются.
Друг Кота
Аватара пользователя
Сообщения: 7360
Зарегистрирован: Пт авг 28, 2009 21:34:30
Откуда: 845-й км.

Сообщение uldemir »

Вот если бы мне нечем было бы заняться, то может этим и заморочился бы. Или был бы в МК такой аппаратный модуль. Но модуля нет. И журналирование не самоцель, а инструмент для исследования проблем, возникающих при создании устройства. И потому хочется, чтобы было всё прозрачно. С другой стороны пыжиться, чтобы уместить в два раза больше? У меня полигончик маленький и время прохода (медленное) 25-28 секунд, а быстрый проход 4-5 секунд. Пока этой памяти хватает. И тратить процессорное время на компрессию? Его (времени), возможно, и так не хватает. Хотя, пока что, исследуя данные, не зафиксировал потери времени - все записи идут строго с 2.5мс интервалом без выпадений. С другой стороны выбранный набор данных может поменяться: если я посчитаю, что соответствующий модуль отлажен - какие-то данные могу перестать журналировать, а если начнутся непонятные глюки - придётся добавить "подозреваемых".

И характер данных, из-за проблем, непредсказуем. Вот журналирование выявило, внезапно, что у меня скорость одного мотора почему-то меняет знак на 2-4 отсчета. И пока не могу выяснить, аппаратная проблема, или программная, или журналирования (ведь я скорость вычисляю как 32 битное число, а в журнале пишу обрезанное до 16 бит).

Уфф, что только не придумаешь, лишь бы не делать!
Собутыльник Кота
Аватара пользователя
Сообщения: 2723
Зарегистрирован: Пт сен 07, 2018 20:20:02
Откуда: деревня в Тульской губернии

Сообщение ПростоНуб »

uldemir, Ваше дело, но заморачиваться тут особо нечего, так как все применимые тут алгоритмы сжатия написаны уже до нас и найти их исходники на C или C++ проблем не представляет. А степень сжатия в таких случаях, обычно, не в два раза, а на порядок. Судя по Вашим словам, дельта-кодирование в купе с Хаффманом тут сразу десятикратное сжатие дадут. Ну не может физический объект резко менять свой импульс.
Собутыльник Кота
Аватара пользователя
Сообщения: 2562
Зарегистрирован: Вт май 01, 2018 19:44:47

Сообщение VladislavS »

[uquote="Эйлер Леонард",url="/forum/viewtopic.php?p=4163733#p4163733"]Говорил в миру один - "макросы зло!"[/uquote]Есть ещё одно зло - велосипедостроение! Сразу не бросилось в глаза, но ведь есть std::min. Дяди старались, в стандарт вносили - пользуйтесь.
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18678
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

а вот просветите меня на счет шаблонов в С++: можно ли в шаблоне задавать не тип, а константу? ну то есть есть набор классов, отличающихся только тем, что инициализируются они разными значениями констант. нужно, чтобы классы имели разный тип, но по сути они одинаковы...

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

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

type 
  Tclass1 = class(Tclass)
    constructor Create(V : string);
  end;

  Tclass2 = class(Tclass)
    constructor Create(V : string);
  end;
описывается 2 разных класса, конструктор каждого выглядит так:

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

constructor TClassN.ClassX(V : string); // N 1 или 2
begin
  inherited Create(V, ConstN);
  // some code
end;
то есть конструкторы отличаются только значениями передаваемой в унаследованный конструктор константы

ну, теоретически, и другие методы могут меняться, но пока речь об описании кучи таких вот "почти одинаковых" классов... можно это реализовать шаблоном в С++, чтобы не писать море одного и того же? на паскале, похоже, так нельзя... там шаблоны могут иметь в качестве параметров только типы...
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

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

Сообщение VladislavS »

ARV, конечно можно! Шаблон в С++ может быть инстанциирован как типом, так и константой. Сейчас пример нарисую.

Compiler Exploer

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

#include <iostream>

template <uint32_t X, typename T>
auto foo(T val)
{
  return T(val*X);
}

auto main() -> int
{
  std::cout << foo<10>(20)  << std::endl;
  std::cout << foo<20>(11.22f) << std::endl;
}
Тут простой пример для функции. Для класса всё то же самое, просто написано будет больше.

Вот ещё неплохой пример с константой.

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

template<unsigned N, auto f, auto... args>
inline void Repeat()
{
  if constexpr (N > 0)
  {
    f(args...);
    Repeat<N-1, f, args...>();
  }
}
Функция f с произвольным количеством аргументов args выполняется N раз.

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

Repeat<5, []{ PA1::set(); PA1::clear(); }> ();
  movs r3, #160	; 0xa0 
  movs r2, #2 
  lsls r3, r3, #23 
  str r2, [r3, #24]      ; PA1=1
  strh r2, [r3, #26]     ; PA1=0
  str r2, [r3, #24]      ; PA1=1
  strh r2, [r3, #26]     ; PA1=0
  str r2, [r3, #24]      ; PA1=1
  strh r2, [r3, #26]     ; PA1=0
  str r2, [r3, #24]      ; PA1=1
  strh r2, [r3, #26]     ; PA1=0
  str r2, [r3, #24]      ; PA1=1
  strh r2, [r3, #26]     ; PA1=0
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18678
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

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

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

Сообщение VladislavS »

И не говори! :)
OKF
Это не хвост, это антенна
Сообщения: 1407
Зарегистрирован: Вт июн 07, 2011 08:03:18

Сообщение OKF »

[uquote="ARV",url="/forum/viewtopic.php?p=4167644#p4167644"]хорошо вам, плюсистам...[/uquote]
Нужно проще смотреть на жизнь. И даже без плюсов.
А то понтов много, а толку...
Собутыльник Кота
Аватара пользователя
Сообщения: 2723
Зарегистрирован: Пт сен 07, 2018 20:20:02
Откуда: деревня в Тульской губернии

Сообщение ПростоНуб »

[uquote="ARV",url="/forum/viewtopic.php?p=4167644#p4167644"]хорошо вам, плюсистам...[/uquote]
Где-то хорошо, а где-то плохо. Лично для меня писать на C++ без exceptions - удовольствие ниже среднего.
Собутыльник Кота
Аватара пользователя
Сообщения: 2562
Зарегистрирован: Вт май 01, 2018 19:44:47

Сообщение VladislavS »

OKF, Виноград то кислый, правда? :)
Поставщик валерьянки для Кота
Сообщения: 2089
Зарегистрирован: Вс июн 19, 2016 09:32:03

Сообщение Reflector »

[uquote="ПростоНуб",url="/forum/viewtopic.php?p=4167718#p4167718"]Лично для меня писать на C++ без exceptions - удовольствие ниже среднего.[/uquote]
Кто не дает писать с exceptions, раз уж так сильно хочется? Или на чем тогда писать, на С без exceptions и еще кучи всего?
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18678
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

смотря что писать. я для Windows на паскале пишу - и exceptions, и какого только хрена нет. с шаблонами вот засада вышла... но тоже не без выгоды - после мозгового штурма выяснил, что изначальная мысль не нужна, прекрасно обошелся вообще без дублирования кода с разными константами :))) лучшее решение - когда результат есть, а действий по его достижению - нет.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Собутыльник Кота
Аватара пользователя
Сообщения: 2723
Зарегистрирован: Пт сен 07, 2018 20:20:02
Откуда: деревня в Тульской губернии

Сообщение ПростоНуб »

[uquote="Reflector",url="/forum/viewtopic.php?p=4167745#p4167745"]Кто не дает писать с exceptions, раз уж так сильно хочется?[/uquote]
А какие компиляторы C++ для того же AVR поддерживают исключения? Впрочем и на STM32 с исключениями все не сладко.

[uquote="Reflector",url="/forum/viewtopic.php?p=4167745#p4167745"]Или на чем тогда писать, на С без exceptions и еще кучи всего?[/uquote]
Если вызов метода не может возвращать объект, так как должен возвращать код ошибки, то преимущества C++ теряются, а недостатки - остаются.
Ответить

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