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

 
 
> К знатокам, Локальные переменные.
SasaVitebsk
сообщение Sep 6 2007, 00:58
Сообщение #1


Гуру
******

Группа: Свой
Сообщений: 2 712
Регистрация: 28-11-05
Из: Беларусь, Витебск, Строителей 18-4-220
Пользователь №: 11 521



Пишу достаточно простую прогу. Пытаюсь оптимизировать.

Столкнулся с одной бедой. Попробую описать.

Построено на прерываниях. Между прерываниями разные промежутки. Есть короткие, есть длинные. Как назло именно короткое прерывание сильно загружено. Дабы разгрузить его я пытаюсь часть вычислений вынести в предыдущее не загруженное прерывание. Уже полностью перешёл на указатели, но всё равно шляпа получается.

Проблема в том, что я не могу ввести локальные переменные на два прерывания. Таким образом я ввожу статик. Но тогда во втором прерывании компилятор пытается сохранить значения. А мне это не надо ни капельки. Чтобы этого избежать я ввёл локальные переменные и во втором прерывании выполнил присваивание локальным статик. Код получился значительно компактнее, но всё равно выполняется никому не нужное присваивание. А это 6 указателей!

Теперь сам вопрос.
Могу ли я указать компилятору что можно разрушать переменные в данном прерывании. То есть что не надо их хранить. Или как это сделать. Надо типа переобъявить статические переменные локальными. Не знаю как выразится. Надеюсь поняли.
Go to the top of the page
 
+Quote Post
9 страниц V  « < 6 7 8 9 >  
Start new topic
Ответов (105 - 119)
Rst7
сообщение Sep 25 2007, 05:41
Сообщение #106


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

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



Цитата
Почитайте что-нибудь типа "Искусства программирования" (к стыду своему забыл автора).Там на эту тему очень подробно написано.


Вот че-то я не помню, что бы Кнут что-то писал про ООП. Во времена первого издания и ООП не было smile.gif

Кнута, правда, читал 15 лет назад. Новое издание пробежал по диагонали (грешен), вроде особо отличий не нашел...

Цитата
За счет прямого использования железно-зависимых вещей ваш код работает максимально быстро и не требует дополнительных переменных.


Да одна же функция ходит к железу, ну две. Не сто, не двести. У вас пара методов. Так что не аргумент.

Цитата
возможно на мои пристрастия и взгляды (а возможно и на взгляды Rst7) влияет то с чем мы работаем


Да я не только с AVR работаю. Вот могу привести пример из другой области. Областью этой я занимаюсь исключительно как хобби, для развлечения. Есть платформа на ARM926EJS 104МГц (можно и 208). Внутри есть RTOS (Nucleos), куча всякой периферии, GUI, сокеты и прочее. Приведу пример, где заканчиваются ресурсы системы. При количестве чанков кучи больше 4500 (примерно), начинает заметно тормозить система (из-за часто используемого malloc'a и mfree). В результате простое использование какого-нибудь STL (уж ооп в полный рост. Или нет?) для разбора более-менее приличных размеров XML (или странички ОперыМини) мгновенно приводит к дикой фрагментации памяти. Приходится все делать ручками, с минимизацией фрагментации. Вот и смысл этой портабельности, если я ее применить не могу?
А сам внутренний софт платформы, кстати, писан без всяких плюсов. И самое смешное, отлично был в свое время спортирован с C166 на ARM smile.gif
Хотя конечно, все фунции гуев имеют первым параметром указатель на структуру (типа this), но это не плюсы.
Есть и другие платформы подобного плана. И во всех плюсами и не пахнет. Кстати, одну из этих платформ портировали с AVR на ARM... До сих пор можно увидеть куски кода явно AVRовского происхождения smile.gif Ниче, пашет...


--------------------
"Практика выше (теоретического) познания, ибо она имеет не только достоинство всеобщности, но и непосредственной действительности." - В.И. Ленин
Go to the top of the page
 
+Quote Post
Непомнящий Евген...
сообщение Sep 25 2007, 08:23
Сообщение #107


Знающий
****

Группа: Свой
Сообщений: 771
Регистрация: 16-07-07
Из: Волгодонск
Пользователь №: 29 153



Цитата(Rst7 @ Sep 25 2007, 09:41) *
При количестве чанков кучи больше 4500 (примерно), начинает заметно тормозить система (из-за часто используемого malloc'a и mfree). В результате простое использование какого-нибудь STL (уж ооп в полный рост. Или нет?) для разбора более-менее приличных размеров XML (или странички ОперыМини) мгновенно приводит к дикой фрагментации памяти.


Ну так там же аллокатор настраивается. По умолчанию используется стандартный. Если у вас дикая фрагментация на нем получается, надо написать свой собственный, заточенный под конкретный размер блоков, к примеру. Он кстати получится и более быстрым smile.gif. Зато вы сможете продолжать использовать stl, и вам не придется заново писать собственные контейнеры.

Цитата
А сам внутренний софт платформы, кстати, писан без всяких плюсов. И самое смешное, отлично был в свое время спортирован с C166 на ARM smile.gif
Хотя конечно, все фунции гуев имеют первым параметром указатель на структуру (типа this), но это не плюсы.

Это тоже самый ОП (или даже ООП - если там еще какие-никакие указатели на функции появляются), только средствами С... Почему не писали на С++ - это вопрос к авторам. Может не было тогда компилятора С++ под их платформу, может еще какие резоны.

Насчет "искусства программирования" - извиняюсь, имел в виду "Совершенный код" Макконнелла
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Sep 25 2007, 10:57
Сообщение #108


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(Непомнящий Евгений @ Sep 25 2007, 07:43) *
2. В каждом проекте я использую один и тот же код без изменений. Все мои проекты опираются на общую библиотеку (каркас) объектов. А это существенно сокращает время написания проекта.
Евгений, а можно глянуть на этот ваш TCanal? Мне близок ваш подход, но попытки создать такой класс пока не увенчались успехом.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
SasaVitebsk
сообщение Sep 25 2007, 13:45
Сообщение #109


Гуру
******

Группа: Свой
Сообщений: 2 712
Регистрация: 28-11-05
Из: Беларусь, Витебск, Строителей 18-4-220
Пользователь №: 11 521



Цитата(Сергей Борщ @ Sep 25 2007, 13:57) *
Евгений, а можно глянуть на этот ваш TCanal? Мне близок ваш подход, но попытки создать такой класс пока не увенчались успехом.

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

smile.gif
Go to the top of the page
 
+Quote Post
Непомнящий Евген...
сообщение Sep 26 2007, 04:15
Сообщение #110


Знающий
****

Группа: Свой
Сообщений: 771
Регистрация: 16-07-07
Из: Волгодонск
Пользователь №: 29 153



Цитата(Сергей Борщ @ Sep 25 2007, 14:57) *
Евгений, а можно глянуть на этот ваш TCanal? Мне близок ваш подход, но попытки создать такой класс пока не увенчались успехом.


Буду на работе - выложу. Наверное, сегодня ближе к вечеру.
Go to the top of the page
 
+Quote Post
Dog Pawlowa
сообщение Sep 26 2007, 11:37
Сообщение #111


Гуру
******

Группа: Свой
Сообщений: 2 702
Регистрация: 14-07-06
Пользователь №: 18 823



Абстрагируясь от спора по поводу С++ и ООП, замечу одну деталь - сам я отказался от универсальных исходников и библиотек, и теперь включаю все исходники в один проект, в том числе и повторяющиеся многократно. Причина - желание замедлить увеличение энтропии в версиях проектов. Нужно иметь возможность откатить любой проект. И повторить однозначно результат компиляции любой версии. Отсюда редкое обновление среды, и тайная страсть к запуску компилятора из командной строки smile.gif


--------------------
Уходя, оставьте свет...
Go to the top of the page
 
+Quote Post
alexander55
сообщение Sep 26 2007, 12:14
Сообщение #112


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

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



Цитата(Dog Pawlowa @ Sep 26 2007, 15:37) *
желание замедлить увеличение энтропии

Браво !!!
Go to the top of the page
 
+Quote Post
HARMHARM
сообщение Sep 26 2007, 14:18
Сообщение #113


читатель даташитов
****

Группа: Свой
Сообщений: 853
Регистрация: 5-11-06
Из: Днепропетровск
Пользователь №: 21 999



Цитата(Dog Pawlowa @ Sep 26 2007, 14:37) *
Отсюда редкое обновление среды, и тайная страсть к запуску компилятора из командной строки smile.gif

А что мешает запускать компилятор (IAR, как я понимаю) из командной строки? wink.gif
Впрочем, я вас понимаю. Неделю писал makefile и еще неделю искал как заставить работать свои функции вместо оных из DLIB. Оказалось - порядок задания линкеру объектных файлов smile.gif
Go to the top of the page
 
+Quote Post
Непомнящий Евген...
сообщение Sep 27 2007, 09:41
Сообщение #114


Знающий
****

Группа: Свой
Сообщений: 771
Регистрация: 16-07-07
Из: Волгодонск
Пользователь №: 29 153



выкладываю свой канал ...

Цитата(Dog Pawlowa @ Sep 26 2007, 15:37) *
Нужно иметь возможность откатить любой проект. И повторить однозначно результат компиляции любой версии.

А чем не нравится система контроля версий?
Если после каждого выпуска прошивки делать коммит всего, создавать таг и включать его название\номер в прошивку, то можно совершенно однозначно повторить результат... Некоторые товарищи рекомендуют включать в систему контроля версий и используемые инструменты - компилятор и т.д.

Сообщение отредактировал Непомнящий Евгений - Sep 27 2007, 09:43
Прикрепленные файлы
Прикрепленный файл  temp.ZIP ( 4.16 килобайт ) Кол-во скачиваний: 45
 
Go to the top of the page
 
+Quote Post
Dog Pawlowa
сообщение Sep 27 2007, 14:10
Сообщение #115


Гуру
******

Группа: Свой
Сообщений: 2 702
Регистрация: 14-07-06
Пользователь №: 18 823



Цитата(Непомнящий Евгений @ Sep 27 2007, 12:41) *
А чем не нравится система контроля версий?

Да нравится, использую.
Речь идет об общих исходниках. Допустим, я поменял общие исходники (например программный UART AVR) сегодня, 27 сентября. Но один проект будет производиться без изменений еще год, а второй требует доработки у заказчика. То есть общий исходник должен быть включен в индивидуальный проект, и он перестает быть общим.


--------------------
Уходя, оставьте свет...
Go to the top of the page
 
+Quote Post
singlskv
сообщение Sep 27 2007, 18:40
Сообщение #116


дятел
*****

Группа: Свой
Сообщений: 1 681
Регистрация: 13-05-06
Из: Питер
Пользователь №: 17 065



Цитата(dxp @ Sep 24 2007, 07:38) *
Нет, хак - это рассовывание переменных уровня С в РОН процессора с использованием нестандартных, непереносимых средств компилятора, имеющее последствиями как минимум ухудшение качества оптимизации со стоторы компилятора - за этим кодом нужно постоянно следить, дает ли он дейтсвительно выигрыш, и как меняется ситуация при изменении кода - не пришла ли, скажем, пора освободить пару регистров уже для компилятора, а то он что-то медленный код стал генерить - регистров ему не хватат. Т.е. хак в данном случае - это ручная низкоуровенвая оптимизация распределения ресурсов, оптимизация на уровне асма в программе на С.
хорошо, допустим я соглашусь с Вами что все это был просто хак,
тогда давайте сравнивим с Вашим такой код:
Код
volatile BYTE ADCL_;
volatile BYTE ADCH_;
volatile BYTE ADMUX_;
volatile BYTE ADCSRA_;
volatile BYTE SYSTICKSTART_;
volatile BYTE PINB_;
volatile BYTE PINC_;
volatile BYTE PIND_;

//-------------------------------------------------------------------
// Прерывание системного таймера
//-------------------------------------------------------------------


void TIMER2_COMP_vect(void) __attribute__((signal));
void TIMER2_COMP_vect()
{
  ADCL_  = ADCL;       // читаем результат последнего преобразования
  ADCH_  = ADCH;
  ADMUX  = ADMUX_;     // новый канал
  ADCSRA = ADCSRA_;    // запускаем новое преобразование
                       // информируем о начале нового цикла
  SYSTICKSTART_= ADCSRA_;     // записью значения ADCSRA в SYSTICKSTART_
                              // сбрасывается в 0 в основном цикле
  PINB_  = PINB;       // читаем порты
  PINC_  = PINC;
  PIND_  = PIND;
}

Это уже чистый C ???

Как насчет реализации на С++ ?
Go to the top of the page
 
+Quote Post
Maddy
сообщение Sep 27 2007, 19:56
Сообщение #117


Участник
*

Группа: Validating
Сообщений: 56
Регистрация: 15-10-06
Пользователь №: 21 335



Цитата(Dog Pawlowa @ Sep 27 2007, 18:10) *
Да нравится, использую.
Речь идет об общих исходниках. Допустим, я поменял общие исходники (например программный UART AVR) сегодня, 27 сентября. Но один проект будет производиться без изменений еще год, а второй требует доработки у заказчика. То есть общий исходник должен быть включен в индивидуальный проект, и он перестает быть общим.

Хм ... ну таки кто мешает ветку в СКВ сделать ? Но собственно грабли возможны в другом - если поменялся компилятор - возможны варианты sad.gif IMHO в СКВ к проекту надо добавлять файлик с описанием используемых средств ....
Go to the top of the page
 
+Quote Post
dxp
сообщение Sep 28 2007, 04:31
Сообщение #118


Adept
******

Группа: Свой
Сообщений: 3 469
Регистрация: 6-12-04
Из: Novosibirsk
Пользователь №: 1 343



Цитата(singlskv @ Sep 28 2007, 01:40) *
хорошо, допустим я соглашусь с Вами что все это был просто хак,
тогда давайте сравнивим с Вашим такой код:
Это уже чистый C ???

Да, это уже почти чистый С - с небольшими необходимыми расширениями, без которых не обойтись.

Цитата(singlskv @ Sep 28 2007, 01:40) *
Как насчет реализации на С++ ?

Ну, собсно, тут на плюсах особенно не развернуться, чтобы показаться во всей красе smile.gif, но и этот фрагмент я бы написал не так. Плюсатый вариант:

Код
#include <iom16.h>

#define INLINE _Pragma("inline=forced")

typedef unsigned char byte;

//---------------------------------------------------------
class TADC
{
public:
    INLINE void handle()
    {
        adcl        = ADCL;      // читаем результат последнего преобразования
        adch        = ADCH;
        ADMUX       = admux;     // новый канал
        ADCSRA      = adcsra;    // запускаем новое преобразование
        systickstart= adcsra;
    }

private:
    byte adcl;
    byte adch;
    byte admux;
    byte adcsra;
    byte systickstart;
}
adc;
//---------------------------------------------------------
class TPorts
{
public:
    INLINE void read()
    {
       pinb  = PINB;       // читаем порты
       pinc  = PINC;
       pind  = PIND;
    }

private:
    byte pinb;
    byte pinc;
    byte pind;
}
ports;

//-------------------------------------------------------------------
// Прерывание системного таймера
//-------------------------------------------------------------------
#pragma vector=TIMER2_COMP_vect
__interrupt void Comp_ISR()
{
    adc.handle();
    ports.read();
}

Комментарий. Собственно, объекта Системного Таймера тут по сути нет. От него есть только прерывание, но собственного представления нет, поэтому я не стал его выделять в класс. Конечно, можно было бы включить в него объекты adc и ports, но мне тут не понятна их связь. Возможно, она есть и вы ее знаете - скажем оба этих объекта функционально по замыслу являются неотъемлемой частью системного таймера. Но из самого предложенного фрамента мне так не показалось. Поэтому я не стал заводить лишнуюю сущность. Вообще, это уже вопросы проектирования, область близкая, но все же не та, которую мы тут сейчас рассматриваем.

В целом код на мой взгляд даже в этом мелком случае выглядит стройнее и понятнее - он подчеркивает наличие разнокачественных объектов - АЦП и портов, акцентирует внимание на функциональность кода: сначала - в обработчике прерывания - подчеркнуто, что делается, потом - как это реализуется. Такое разделение улучшает читабельность и понимбельность кода, особенно другими людьми. На С в принципе можно было бы похоже написать, если задействовать inline функции, которые появились в С99. Но С++ прямо тяготеет к такому стилю. А главное, мы тут не показываем представление и к потрохам наших объектов никто просто так не доберется. Классы, конечно, не полные, в них нет функций, которые делали бы что-то полезное с теми же значениями, считанными в обработчике прерываний. Но это просто выходит за рамки данного примера. Там тоже никаких проблем ни в реализации, ни в эффективности нет.

Возможно, вы хотели как раз посмотреть реализацию прерывания внутри объекта класса. Отвечу: никакой принципиальной разницы нет - просто сама функция-обработчик прерывания была при этом объявлена внутри класса и снабжена при этом квалификатором static, только и всего. Качество кодогенерации от этого никак не зависит.

Кстати, о кодогенерации. Вот, что получилось:

Код
                    In segment CODE, align 2, keep-with-next    
__interrupt void Comp_ISR()                                      
        ??Comp_ISR:                                              
{                                                                
93FA               ST      -Y, R31                              
93EA               ST      -Y, R30                              
930A               ST      -Y, R16                              
    adc.handle();                                                
....               LDI     R30, LOW(`adc`)                      
....               LDI     R31, (`adc`) >> 8                    
B104               IN      R16, 0x04                            
8300               ST      Z, R16                              
B105               IN      R16, 0x05                            
8301               STD     Z+1, R16                            
8102               LDD     R16, Z+2                            
B907               OUT     0x07, R16                            
8103               LDD     R16, Z+3                            
B906               OUT     0x06, R16                            
8103               LDD     R16, Z+3                            
8304               STD     Z+4, R16                            
    ports.read();                                                
B306               IN      R16, 0x16                            
8305               STD     Z+5, R16                            
B303               IN      R16, 0x13                            
8306               STD     Z+6, R16                            
B300               IN      R16, 0x10                            
8307               STD     Z+7, R16                            
}                                                                
9109               LD      R16, Y+                              
91E9               LD      R30, Y+                              
91F9               LD      R31, Y+                              
9518               RETI                                        
                                                                
                    In segment INTVEC, offset 0xc, root          
        `??Comp_ISR??INTVEC 12`:                                
........           JMP     ??Comp_ISR

По-моему, тут и руками лучше не напишешь. smile.gif


--------------------
«Отыщи всему начало, и ты многое поймёшь» К. Прутков
Go to the top of the page
 
+Quote Post
alexander55
сообщение Sep 28 2007, 04:53
Сообщение #119


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

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



Цитата(dxp @ Sep 28 2007, 08:31) *
По-моему, тут и руками лучше не напишешь. smile.gif

Согласен. Но добавлю.
Конструкторы позволяют всю инициализацию убрать в классы.
При этом получается следующие плюсы C++:
-отсутствие бесчисленной инициализации в main;
-в классах все видно (в одном флаконе): инициализация, реализация, все несущественное не торчит.
Go to the top of the page
 
+Quote Post
dxp
сообщение Sep 28 2007, 05:47
Сообщение #120


Adept
******

Группа: Свой
Сообщений: 3 469
Регистрация: 6-12-04
Из: Novosibirsk
Пользователь №: 1 343



Цитата(alexander55 @ Sep 28 2007, 11:53) *
Согласен. Но добавлю.
Конструкторы позволяют всю инициализацию убрать в классы.
При этом получается следующие плюсы C++:
-отсутствие бесчисленной инициализации в main;
-в классах все видно (в одном флаконе): инициализация, реализация, все несущественное не торчит.

Все так. Конструкторы я тут не стал определять, т.к. мне не ясно, что они должны делать. Как и функции, которые дальше делают что-то с полученными данными. Поэтому классы и не полные.


--------------------
«Отыщи всему начало, и ты многое поймёшь» К. Прутков
Go to the top of the page
 
+Quote Post

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

 


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


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