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

 
 
12 страниц V  « < 6 7 8 9 10 > »   
Reply to this topicStart new topic
> Как ПРАВИЛЬНО программировать на С++, Вопросы по программированию на С++ для микроконтроллеров.
neiver
сообщение Sep 17 2010, 13:39
Сообщение #106


Местный
***

Группа: Участник
Сообщений: 214
Регистрация: 22-03-10
Из: Саратов
Пользователь №: 56 123



Цитата(Sergey_B @ Sep 17 2010, 17:36) *
Я заменил их макроопределениями типа USE_PORTA, которые объявляю в файле подобном avr/io.h для нужных мне контроллеров.


Да, ручками-то конечно можно определения писать, но не хочется.
Go to the top of the page
 
+Quote Post
neiver
сообщение Sep 17 2010, 19:21
Сообщение #107


Местный
***

Группа: Участник
Сообщений: 214
Регистрация: 22-03-10
Из: Саратов
Пользователь №: 56 123



Sergey_B, я пожалуй воспользуюсь вашей идеей с USE_PORTA. Для avr-gcc их можно определить автоматом, а для IAR - вручную
Go to the top of the page
 
+Quote Post
neiver
сообщение Sep 20 2010, 11:37
Сообщение #108


Местный
***

Группа: Участник
Сообщений: 214
Регистрация: 22-03-10
Из: Саратов
Пользователь №: 56 123



Добавил поддержку компилятора от IAR в свои списки линий. В общем работает.
Обновления в Git репозитории:
http://github.com/KonstantinChizhov/AvrPro.../master/avrcpp/

ЗЫ.
Что-то меня не впечатлил этот хвалёный компилятор от IAR Systems для AVR.
Я нашел тоько два вида оптимизации которые он делает лучше чем GCC:
- Common subexpression elimination,
- умеет работать с однобайтовыми указателями.
А в остальном как-то не впечатляет.
Go to the top of the page
 
+Quote Post
MrYuran
сообщение Sep 20 2010, 11:53
Сообщение #109


Беспросветный оптимист
******

Группа: Свой
Сообщений: 4 640
Регистрация: 26-12-07
Из: Н.Новгород
Пользователь №: 33 646



Цитата(neiver @ Sep 20 2010, 15:37) *
ЗЫ.
Что-то меня не впечатлил этот хвалёный компилятор от IAR Systems для AVR.
Я нашел тоько два вида оптимизации которые он делает лучше чем GCC:
- Common subexpression elimination,
- умеет работать с однобайтовыми указателями.
А в остальном как-то не впечатляет.

Не совсем в тему, но всё-таки местами он (ИАР) гораздо лучше работает.
В mspgcc при всех моих потугах мне так и не удалось достичь иаровского размера бинарника.
Разница как минимум 20%.
Существенно, когда балансируешь на грани невпихуемости.
Хотя, глючки иногда подкидывает специфические и трудноуловимые. Например, коллега целый день бился, пока не поменял bool на char. И это при нулевой оптимизации.
Преимущество ИАРа в том, что его лучше затачивают под конкретную платформу (под каждую из).
Недостаток - при этом он код теряет переносимость, вследствие специфических приёмов.


--------------------
Программирование делится на системное и бессистемное. ©Моё :)
— а для кого-то БГ — это Bill Gilbert =)
Go to the top of the page
 
+Quote Post
Quasy
сообщение Sep 23 2010, 06:43
Сообщение #110


Участник
*

Группа: Участник
Сообщений: 17
Регистрация: 23-09-10
Пользователь №: 59 665



Вопрос автору этого инструмента: как будет выглядеть после трансляции асм-код для ATmega128 при записи в группу из 4-х бит число 0x0A. Группа такая (начиная с младшего в группе): PA.0, PB.0, PD.3, PD.4? Хотелось бы посмотреть именно "боевой", (не учебный) код, который будет сгенерирован в этом случае. Спасибо.
Go to the top of the page
 
+Quote Post
neiver
сообщение Sep 25 2010, 09:56
Сообщение #111


Местный
***

Группа: Участник
Сообщений: 214
Регистрация: 22-03-10
Из: Саратов
Пользователь №: 56 123



to Quasy.
Исходный код:
Код
#include <avr/io.h>
#include "iopins.h"
#include "pinlist.h"
#include "util.h"

using namespace IO;

typedef PinList<Pa0, Pb0, Pd3, Pd4>  Pins;

int main()
{
    Pins::Write(0x0A);
}


Асм листинг для атмега128:

Код
000000be <main>:
    
  be:    d8 98           cbi    0x1b, 0; 27

  c0:    c0 98           cbi    0x18, 0; 24

  c2:    82 b3           in    r24, 0x12; 18
  c4:    87 7e           andi    r24, 0xE7; 231
  c6:    80 61           ori    r24, 0x10; 16
  c8:    82 bb           out    0x12, r24; 18


  ca:    80 e0           ldi    r24, 0x00; 0
  cc:    90 e0           ldi    r25, 0x00; 0
  ce:    08 95           ret


Как-то так. Писать в виртуальные порты константы не интересно - запись любого набора бит в один порт будет соптимизирована не более чем до:
Код
in    r24, PORTx
andi    r24, Mask;
ori    r24, Value
out    PORTx, r24

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

ЗЫ.
Интересно, что вам мешает взять исходный код и поэкспериментировать самостоятельно.
Go to the top of the page
 
+Quote Post
Quasy
сообщение Sep 27 2010, 06:15
Сообщение #112


Участник
*

Группа: Участник
Сообщений: 17
Регистрация: 23-09-10
Пользователь №: 59 665



Как, это уже и есть боевой код? Но согласитесь, в таком виде его применять просто нельзя. Где в вашем варианте элементарные мероприятия по защите от неатомарности портовой операции "чтение-модификация-запись"?
Go to the top of the page
 
+Quote Post
neiver
сообщение Sep 27 2010, 06:41
Сообщение #113


Местный
***

Группа: Участник
Сообщений: 214
Регистрация: 22-03-10
Из: Саратов
Пользователь №: 56 123



Атомарность доступа далеко не всегда нужна. Обеспечивать ее всегда слишком расточительно. Если она всё-таки необходима используйте ATOMIC_BLOCK и иже сним, например:

ATOMIC_RESTORESTATE
{
Pins::Write(0x0A);
}

В чём проблема-то?
Go to the top of the page
 
+Quote Post
Quasy
сообщение Sep 27 2010, 06:57
Сообщение #114


Участник
*

Группа: Участник
Сообщений: 17
Регистрация: 23-09-10
Пользователь №: 59 665



А проблема в том, что, в предлагаемом виде генерируемый код фигурально выражаясь, подпадает под статью "Вредительство". По крайней мере в стране эмбедеров smile.gif) Применять его пока нельзя. И мне очень бы хотелось посмотреть генерируемый вашим инструментом вариант боевого код с учетом неатомарности. Или вы предлагаете программисту, применяющему ваш код, надеяться что не будет прерываний? Или вы предлагаете самому программисту позаботиться об атомарности? Очень хочется посмотреть вариант Безопасного кода записи в группу. Спасибо.

Дилемма. Без организации критической секции код применять нельзя. С организацией критической секции ваш код займет 11 тактов, что недопустимо. А все потому, что ваш код не научился делать четыре операции SBI/CBI.
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Sep 27 2010, 07:33
Сообщение #115


Гуру
******

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



Цитата(Quasy @ Sep 27 2010, 09:57) *
Или вы предлагаете программисту,
Ключевое слово "программисту". Которому голова дана не только чтобы в нее есть.
Цитата(Quasy @ Sep 27 2010, 09:57) *
Или вы предлагаете программисту, применяющему ваш код, надеяться что не будет прерываний?
У меня нет махания ногами в прерываниях. Нафига мне лишний оверхед с вашей атомарностью?
Цитата(Quasy @ Sep 27 2010, 09:57) *
А все потому, что ваш код не научился делать четыре операции SBI/CBI.
Зал притих - покажите, на примере порта E.


--------------------
На любой вопрос даю любой ответ
"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
neiver
сообщение Sep 27 2010, 07:34
Сообщение #116


Местный
***

Группа: Участник
Сообщений: 214
Регистрация: 22-03-10
Из: Саратов
Пользователь №: 56 123



Заботиться об атомарности всё равно прийдётся программисту. Даже операция вида int c = a + b; И всегда есть шанс, что прерывание случится в момент когда первый байт в переменную "с" уже записан, а второй нет. И если в этом перерывании используется эта переменная "с"...
Вы предлагаете использовать везде операции SBI/CBI и выводить значение побитно? А что, если мы будем записывать значение неизвестное во время компиляции побитно? Попробуйте сами написать, хоть на Си, хоть на ассемблере. Покажите как должно быть правильно.
Go to the top of the page
 
+Quote Post
Quasy
сообщение Sep 27 2010, 07:52
Сообщение #117


Участник
*

Группа: Участник
Сообщений: 17
Регистрация: 23-09-10
Пользователь №: 59 665



Цитата(Сергей Борщ @ Sep 27 2010, 11:33) *
Ключевое слово "программисту". Которому голова дана не только чтобы в нее есть.
У меня нет махания ногами в прерываниях. Нафига мне лишний оверхед с вашей атомарностью?
Зал притих - покажите, на примере порта E.

Залу не надо притихать! Он и так 8 страниц переливал из пустого в порожнее и не обсуждал самое главное - безопасность применения. Про PORTE? Ну, вам-то я скажу по секрету: у Atmega 128 (про который речь) его адрес 03 smile.gif SBI & CBI. У меги128 90% портов в битовом пространстве.



Цитата(neiver @ Sep 27 2010, 11:34) *
Вы предлагаете использовать везде операции SBI/CBI и выводить значение побитно? А что, если мы будем записывать значение неизвестное во время компиляции побитно? Попробуйте сами написать, хоть на Си, хоть на ассемблере. Покажите как должно быть правильно.

Мы пока говорим про константы. Если настало время - я скажу и про переменные. Там для предложенной группы нет альтернативы варианту с побитовым анализом переменной и операциям SBI/CBI.
Go to the top of the page
 
+Quote Post
Dima_G
сообщение Sep 27 2010, 08:02
Сообщение #118


Местный
***

Группа: Свой
Сообщений: 279
Регистрация: 2-07-08
Из: Новосибирск
Пользователь №: 38 699



Цитата(Quasy @ Sep 27 2010, 13:15) *
Как, это уже и есть боевой код? Но согласитесь, в таком виде его применять просто нельзя. Где в вашем варианте элементарные мероприятия по защите от неатомарности портовой операции "чтение-модификация-запись"?

А вы все операции с портами ввода-вывода оборачиваете в критические секции? Даже те, которые абсолютно не зависят от прерываний? Надеюсь, что нет.
Тогда какой смысл оборачивать в критические секции операции в "библиотечном" классе? Разумно это отдавать на откуп пользователю

у меня это например реализовано так:
Код
template <class ELEMENT, class SYNC_OBJ>
class TClQueue;
Go to the top of the page
 
+Quote Post
Quasy
сообщение Sep 27 2010, 08:06
Сообщение #119


Участник
*

Группа: Участник
Сообщений: 17
Регистрация: 23-09-10
Пользователь №: 59 665



Цитата(Dima_G @ Sep 27 2010, 12:02) *
А вы все операции с портами ввода-вывода оборачиваете в критические секции? Даже те, которые абсолютно не зависят от прерываний? Надеюсь, что нет.
Тогда какой смысл оборачивать в критические секции операции в "библиотечном" классе? Разумно это отдавать на откуп пользователю

у меня это например реализовано так:
Код
template <class ELEMENT, class SYNC_OBJ>
class TClQueue;

Кто сказал про "класс"? Я просил результирующий асм-код и критикую его. Где будет решаться проблема неатомарности - это я и хотел понять. Причем критика не понедельничного злого бодуна, а вполне конструктивная: я предлагаю путь.
Go to the top of the page
 
+Quote Post
MrYuran
сообщение Sep 27 2010, 08:06
Сообщение #120


Беспросветный оптимист
******

Группа: Свой
Сообщений: 4 640
Регистрация: 26-12-07
Из: Н.Новгород
Пользователь №: 33 646



Тут пришёл поручик Ржевский и всё опошлил.

Скажите, Quasy, а нафига козе боян зачем вообще нужна ваша атомарность?
Я пока не вижу особых критических моментов.
Выставили байт - подали отдельно строб.
Тем более что при вашем битовом анализе всё равно вручную всё обеспечивать.


--------------------
Программирование делится на системное и бессистемное. ©Моё :)
— а для кого-то БГ — это Bill Gilbert =)
Go to the top of the page
 
+Quote Post

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

 


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


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