Вопросы по С/С++ (СИ)
- Сообщения: 535
- Зарегистрирован: Вт авг 28, 2012 22:21:33
Что за самоцель такая? Хочешь защитить её? Ну так уже защитил, сделав статической и предоставив метод для доступа. Зачем обязательно делать её inline?
- Реклама
Накладные расходы на вызов функции и возврат значения. Хочу избежать CALLF.
Наверное, много хочу
Наверное, много хочу
- Сообщения: 535
- Зарегистрирован: Вт авг 28, 2012 22:21:33
Я уже тут на форуме сто раз говорил. Ненужно заниматься предварительной оптимизацией! Тем более, если экономятся какие-то крохи! Сам раньше много раз попадался в эту ловушку, теперь, слава богу, отучился.
Понимаешь, если ты провел исследования, и выяснил, что узкое место - это действительно вызов функции, то может быть два варианта:
1. Выбранная тобой архитектура всего приложения - дерьмо.
2. Твоя задача действительно требует большой вычислительной мощности. При этом тебе или нужно оставить красивости вроде инкапсуляции в покое и писать всё на ассемблере оптимизируя каждый такт, или нужно взять более мощное железо.
Если никакие исследования не проводились, и это - оптимизация ради оптимизации - прошу тебя, ЗАБУДЬ!. Не херь архитектуру ради нескольких сэкономленных тактов, которые тебе никогда не пригодятся!
Понимаешь, если ты провел исследования, и выяснил, что узкое место - это действительно вызов функции, то может быть два варианта:
1. Выбранная тобой архитектура всего приложения - дерьмо.
2. Твоя задача действительно требует большой вычислительной мощности. При этом тебе или нужно оставить красивости вроде инкапсуляции в покое и писать всё на ассемблере оптимизируя каждый такт, или нужно взять более мощное железо.
Если никакие исследования не проводились, и это - оптимизация ради оптимизации - прошу тебя, ЗАБУДЬ!. Не херь архитектуру ради нескольких сэкономленных тактов, которые тебе никогда не пригодятся!
После гугления и экспериментов всё получилось.
В файле "timer.h" объявил переменную sys_time как внешнюю. Также именно в нём объявил и определил инлайн функцию с модификатором static.
Вот так:
Тогда в мэйне #include "timers.h"
и вызовы функции преобразовываются в простое чтение переменной:
Сохранена безопасность переменной, быстрота обращения и удобство написания программы.
В файле "timer.h" объявил переменную sys_time как внешнюю. Также именно в нём объявил и определил инлайн функцию с модификатором static.
Вот так:
Код: Выделить всё
extern volatile uint16_t sys_time;
inline uint16_t time (void);
static inline uint16_t time (void)
{
return sys_time;
}
и вызовы функции преобразовываются в простое чтение переменной:
Код: Выделить всё
213 LED_start_time = time ();
\ 00003D CE .... LDW X, L:sys_time
\ 000040 CF .... LDW L:LED_start_time, X- Сообщения: 535
- Зарегистрирован: Вт авг 28, 2012 22:21:33
- Реклама
да что тут можно сказать... человек хотел выстрелить себе в ногу и успешно этого добился...
безопасность-то соблюдена, а атомарность доступа - нет. геморрой еще впереди...
безопасность-то соблюдена, а атомарность доступа - нет. геморрой еще впереди...
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
- Сообщения: 535
- Зарегистрирован: Вт авг 28, 2012 22:21:33
Вот! Именно это я и хотел сказать, только слова забыл.человек хотел выстрелить себе в ногу и успешно этого добился...
По даташиту на STM8 команда "LDW X longmem" занимает три байта и выполняется за два такта процессора. Атомарность соблюдена. Это не атмел.
то есть вы хотите сказать, что 8-битный МК работает с памятью 16-битными словами, и в процессе обмена байтами прерывания не могут произойти? я верно понимаю архитектуру STM8?
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
Пересылка 16-ти битного слова в STM8 выполняется одной командой за два такта. Если прерывания могут произойти при выполнении половины процессорной команды, то я ничего не понимаю 
In case of simultaneous accesses to the same memory area both in execution stage (write)ARV писал(а):то есть вы хотите сказать, что 8-битный МК работает с памятью 16-битными словами, и в процессе обмена байтами прерывания не могут произойти? я верно понимаю архитектуру STM8?
and decoding stage (read), the decode stage is stalled till the execution stage releases the
resource.
PM0044
Programming manual
"Я не даю готовых решений, я заставляю думать!"(С)
Нифига не понял: где здесь о "неразрывности" тактов многотактовой инструкции говорится?
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
Only DIV and DIVW instructions are interruptable.
"Я не даю готовых решений, я заставляю думать!"(С)
Ну это другой разговор
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
- Сообщения: 791
- Зарегистрирован: Вт июн 17, 2014 00:34:26
Добрый день, есть 24 битное АЦП которое выдаёт один бит по каждому возростающему фронту.
Подскажите как сохранить эти данные.
Подскажите как сохранить эти данные.
А покажите, как Вы это делаете, чтобы все поняли, что конкретно у Вас не получается.
Вопрос сформулирован абсолютно неконкретно. Если имеется в виду, что выход у АЦП последовательный, и весь результат за 24 такта (фронта) выдаёт - то в чём проблема записывать очередной бит в некую переменную на 0-ю позицию и сдвигать эту переменную влево?
Вопрос сформулирован абсолютно неконкретно. Если имеется в виду, что выход у АЦП последовательный, и весь результат за 24 такта (фронта) выдаёт - то в чём проблема записывать очередной бит в некую переменную на 0-ю позицию и сдвигать эту переменную влево?
- Сообщения: 791
- Зарегистрирован: Вт июн 17, 2014 00:34:26
Не писал что не получается, спрашивал как сделать.
Да у АЦП последовательный выход и по фронту выдаются данные.
Да у АЦП последовательный выход и по фронту выдаются данные.
Ну так и делать — по фронту забирать данные.baghear писал(а):как сделать.
по фронту выдаются данные.
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
Дак напишите. Почему всё вытягивать нужно из людейbaghear писал(а):Не писал что не получается
Вопрос какой-то странный. Что значит "как сохранить данные" ? Можно на диск записать, или на флешку - долго будут храниться...
Ваш вопрос звучит примерно так :
Вот теперь попробуйте ответить мне на мой вопрос.У меня есть в огороде яблоня. По каждому стуку по ней, яблоки падают по одному.
Подскажите, как сохранить эти яблоки ?
А вот Ваш пост :
Не находите ничего общего с моим ?Добрый день, есть 24 битное АЦП которое выдаёт один бит по каждому возростающему фронту.
Подскажите как сохранить эти данные.
- Сообщения: 791
- Зарегистрирован: Вт июн 17, 2014 00:34:26
Хотел бы просто сохранить в переменую.
Приведите пожалуйста пример кода на си.
Приведите пожалуйста пример кода на си.


