Перейти к содержанию
    

WHILE

Свой
  • Постов

    936
  • Зарегистрирован

  • Посещение

Сообщения, опубликованные WHILE


  1. Управлять можно коммутацией контактов разъема, описание Б5-хх

     

    У вас спина белая ссылка битая. И с БП серии Б5 не советую связываться - большие забросы напряжения при переключении пределов.

  2. Есть мнение, что "ключик" можно заменить на пачку передергиваний SCL, пока SDA стабильно не придет в "лог. 1".

    [/quote

    И это есть в стандарте I2C?

    И существуют микроконтроллеры, имеющие на борту команду для I2C-мастера "Оживить зависший слэйв"?

     

  3. Частности не отменяют общностей. А суть в том, что на физическом уровне для I2C нет никаких требований котрые обеспечивали ту же помехоустойчивость, нет требований по поведению автомата при нештатных воздействиях, нет таймаутов... То есть ни физически ни протокольно I2C не предназначен для чего-нибудь серьезно удаленного. Да, можно использовав логику протокола усовершенствовать физический уровень, да, при использовании микроконтроллеров в качесве слейвов I2C можно усовершенствовать и обработку ошибок и нештатных ситуаций, но это уже будет не I2C в его понимании. А если навешать на 10 метров кабеля несколько стандартных пассивных I2C чипов, то ничего хорошего в обшем случае ожидать не придется :(.

    Ну, без тайм-аутов при работе с I2C жизни нет - с этим не поспоришь.

    Вешал я и стандартные чипы гирляндой. Например,5 штук термодатчиков Максимовских на тех-же 10 метрах.

    Да, там все гораздо печальнее и раз в 1-2 часа я получал зависон на шине.

    Но тайм-ауты и ключик по питанию слэйвов спасали ситуацию.

     

  4. Использовать I2C для промышленного применения в качестве ВНЕШНЕГО интерфейса неполиткорректно,

    так как это "внутриприборная" шина.

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

    Тогда уж лучше SPI, хотя это тоже "не то".

     

    Насчет "неполиткорректности" I2C в качестве внешнего интефейса это вы сами так решили или ссылку на

    документ приведете?

     

    З.Ы. У меня пару лет без сбоев работают 36 балансиров свинцовых акков.Связь с верхним уровнем именно по

    I2C. Все модули на разьемах при суммарной длине кабеля метров 10.

    И за это время "ни одного разрыва (с)".

    Бонусы квадратной шины - не нужны кварцы,бо синхронный интерфейс и автоматом получаемая адресация слэйвов.

  5. Ардуина работает и с 1.8 В, только частоту нужно уменьшить, например, переключить ее на внутренний генератор

    Только UART при работе от внутреннего RC вы потеряете, т.к погрешность его у Мег мама не горюй

     

  6. Ежу ясно, что это всего лишь демонстрация ошибки, а не реальная функция.

    а смысл в цикле do-while, если из него гарантированно вылетаете на первом проходе?

    И неициализированный res, по которому идет сравнение доставляет.

    Странный код...

  7. Похоже, остался старый баг в порте для IAR AVR - сообщение N227

    При выборе режима передаче управления через системное прерывание (#define scmRTOS_CONTEXT_SWITCH_SCHEME 1) и

    отключении пользовательского хука при переключении контекста (#define scmRTOS_CONTEXT_SWITCH_USER_HOOK_ENABLE 0)

    постоянно висит и не сбрасывается системное прерывание SPM_READY, программа тормозит, а прерывания, имеющеи вектор

    ниже SPM_READY_vect не вызываются никогда.

    При выборе прямой передаче управления (#define scmRTOS_CONTEXT_SWITCH_SCHEME 1) или при передаче управления через прерывание SPM_READY (#define scmRTOS_CONTEXT_SWITCH_SCHEME 1) ,

    но включении (#define scmRTOS_CONTEXT_SWITCH_USER_HOOK_ENABLE 1) все работает правильно.

    Причем Real вроде-бы это дело фиксил, но точно не помню.

    Прикладываю тестовый проект.

    Test.zip

  8. Проект собрался но вылетает

    Warning[Pa050]: non-native end of line sequence detected (this diagnostic is only issued once)

    и так на 14 файлов. причем знак ворнинга я вижу на самой первой строчке в каждом файле. что за беда такая?

     

    http://electronix.ru/forum/index.php?showt...131985&st=0

     

  9. а) MSVC имеет дофига своих особенностей и то, что он что-то съедает, ни разу не показатель.

    б) вы создаете временный объект на стеке и берете его адрес. Объект будет уничтожен в конце выражения ( pBase =&Derv1(); ), указатель будет указывать на какой-то мусор в стеке

    в) чтобы взять у объекта адрес, он должен быть lvalue (т.е. его можно написать слева от знака присваивания). В вашем случае это очевидно не так

     

    Cпасибо, это я уже понял, переделал и вроде работает.

    Последний вопрос,чтобы закрыть тему:

     

    Base* pBase =&Derv1();

     

    и Derv1 dv1;

    Base* pBase =&dv1;

     

     

    Это ведь по сути одно и тоже и должно когмпилироваться в одинаковый ассемблерный код?

  10. Да ладно? У вас создвется временный объект и временный указатель. Указатель уничтожается после выхода из конструктора. Объект в работающем варианте тоже уничтожается при выходе из конструктора, в неработающем - еще до присваивания адреса указателю.

    ОК,спасибо,я понял свою ошибку.

    Тогда почему так не работает?

    class Base
     {
        public:
     Base(){}
     };
    
     class Derv1:public Base
     {
         public:
      Derv1():Base(){}
     };
    
     class TInterface
     {
        public:
    TInterface()
    {
     pBase   =&Derv1();   //не работает - Error[Pe158]: expression must be an lvalue or a function designator
    
    
    }
     private:
         Base*  pBase;
    };
    
    int main()
    {   
      TInterface Interface; 
        while(1);	
    }

     

    Сейчас-то указатель не подвешеный?

     

    Все,понял.

    Объект временный и в этом все дело.

    Создавать их надо не в конструкторе,а глобально.

    З.Ы new - это на ББ.

  11. В C++ не силен, но я не вижу где создаются объекты Derv1, также и a. Они, вообще, создаются?

    Я тоже не гуру, но как я понимаю выражение Base* pBase =&Derv1(); - это

    1. создание объекта типа Derv1.

    2. создание указателя pBase на объекты типа Base.

    3.Взятие адреса объекта Derv1 и присвание его pBase.

     

    Как-то так. :05: Хочу полиморфмно обращаться к объектам типа Base и их наследникам.

     

     

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

    У меня указатель создается в конструкторе глобального объекта TInterface и уничтожаться он не должен.

     

  12. gcc тоже ругается:

    class a
    {
    };
    
    void test()
    {
        a * Tmp = &a();
    }
    
    test.cpp:20:18: error: taking address of temporary [-fpermissive]
         a * Tmp = &a();
                      ^

    Ну у вас возможно правильная ругань,т.к. действительно создается временный

    объект(а он уничтожится по выходу из функции test() ) и делается попытка взять его адрес.

    Интересно скомпилировать мой пример в gcc.

     

  13. IAR выдает ошибку на такой код(упрощено до минимума)

    class Base
     {
        public:
     Base(){}
     };
    
     class Derv1:public Base
     {
         public:
      Derv1():Base(){}
     };
    
     class TInterface
     {
        public:
    TInterface()
    {
    Base*  pBase   =&Derv1();   /*не работает - Error[Pe158]: expression must be an lvalue or a function designator  // */
    }
     };
    
    int main()
    {   
      TInterface Interface; 
        while(1);	
    }

    Не понимаю смысла ругани в данном случае. MSVC 2008 ест такой код без проблем

    А вот так работает

    class Base
     {
        public:
     Base(){}
     };
    
     class Derv1:public Base
     {
         public:
      Derv1():Base(){}
     };
    
     class TInterface
     {
        public:
    TInterface()
    {
    
     Derv1 dv1;              
     Base* pBase =&dv1;   
    }
     };
    //-----------------------------------------------------------------------------/
    int main()
    {   
      TInterface Interface; 
        while(1);	
    }

     

    Какого &*% ему надо?

  14. Если это - последняя строка файла, может, поэтому ругается? Достаточно добавить перевод строки.

    Нет, эти строки находятся и в начале и в конце файлов и компилятор даёт на них варнинги независимо от места.

     

  15. очень много варнингов в в иаровском порте под avr и arm, причем они тянутся еще с версий 3.5x.

    Это вызвано тем,что на закладке С/C++ compiler->Diagnostics в примере не стоит галка "Enable remarks".

    Например,на такое украшательство

    //******************************************************************************

    дает Warning[Pa050]: non-native end of line sequence detected

    исправляется достаточно просто,например черточкой в конце.

    OS_PROCESS static void exec(); //Remark[Pe082]: storage class is not first

    исправляется static OS_PROCESS void exec();

    многочисленные варнинги Remark[Pa137]: use of C-style cast

    на типа return (TPriority)pr; лечится return static_cast <TPriority> (pr);

    многочисленные варнинги Remark[Pa109]: the unary minus operator is applied to an unsigned expression

    (with possibly unexpected results)

    на выражения типа return map & -map;

     

    Это конечно мелочи. Но они тянутся уже давно и может в связи с выходом новой версии

    это можно один раз поправить?!

     

    А в общем все равно большое спасибо за отличную бесплатную ось. :beer:

     

     

  16.  

    В связи с выходом новой версии scmRTOS 5.0 пришлось обновить и IAR c 6.50 до 6.70, т.к в старой версии

    примеры новой scmRTOS не компилировались.

    В качестве программатора уже лет н..цать использую Сhipblasteravr + железо Protossа.

    Компилирую пример-все хорошо.Запускаю Сhipblaster и пытаюсь скормить ему полученный hex файл - invalid data.

    rom файл - то-же самое.

    Запускаю программатор AVRStudio - съел тот-же самый hex файл не поморщившись и прошивка работает(порты дергаются в правильном порядке).

    Никто не нарывался на подобное?

  17. Раз уж пошел такой разговор, а когда по Вашему мнению, отладчик именно необходим? Ну и как отладчик Вам помогает, когда надо вылавливать РЕАЛЬНЫЕ ошибки возникающие а РЕАЛЬНЫХ условиях эксплуатации в реальном окружении?

    Имхо, отладчик незаменим при старте на новой платформе.

     

  18. Более удивителен вариант, что СЧИТАЕТ. Для Си компилятора сие совершенно удивительно. Для С++ там уже немного своя жизнь с закидонами.

     

    Спасибо, вы ответили на мой вопрос.Я сейчас только сообразил что для AVR и ARM проекты действительно были на плюсах. ОК,сделал через define, все работает.

    Но для окончательного просветления сознания - в чем разница const C и С++. Насколько я знаю, константность в плюсах можно отменить, а в С это навсегда.И я считал .что строки

    #define variable (value)

    и FLASH const variable = value;

    должны компилироваться компилятором что в режиме С, что в режиме С++ в одинаковый код и трактоваться

    в обоих случаях как константы.Почему не так?

     

     

    Конструкция с объявлением массива, у которого в качестве размера указана переменная или выражение в С допустима, но в общем случае такой массив будет создан во время выполнения, посредством выделения памяти из кучи.

    IAR для 8051 даже позволяет такое делать если в настройках выбрать С99 и поставить галку Allow VLA, но только для локальных массивов, объявленных внутри функции.

     

    В любом случае для 8051 подобные излишества скорее вредны чем полезны.

     

    А чего-это он будет выделен динамически, если это глобальный массив и никаких malloc и близко нет.

    Галки С99 и Allow VLA стоят изначально и не помогают.

    О,нашел

    CLIB does not support any C99 functionality. For example, complex numbers and

    variable length arrays are not supported.

  19. Остался только вопрос, а на кой вообще иметь эту 'uart_buffersize' константу в памяти.

    Поскольку ответить, полагаю, не сможете, то тогда так:

    #define UART_BUFFERSIZE (8)
    unsigned char UART1_RX_Buffer[UART_BUFFERSIZE];

     

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

    диться без макросов и препроцессор не обеспечивает проверку типов.

    И все-таки почему такие-же объявления работают в IAR for AVR и IAR for ARM и не проходят

    в IAR for 8051. Почему компилятор не считает константой переменную объявленную как const и

    лежащую во флэши?

     

     

  20. Не понимаю, что от меня хочет компилятор.

     #ifndef FLASH
      #define FLASH _Pragma("location=\"FLASH\"")
       #endif
    FLASH  const unsigned char UART_BUFFERSIZE = 8;
      unsigned char UART1_RX_Buffer[UART_BUFFERSIZE];

    Error[Pe028]: expression must have a constant value D:\PROGEKTS\microcontrollers\C8051\Silabs\No_RTOS\TEST\SRC\main.c 10

    на строке с объявлением буффера UART1_RX_Buffer.

    На IAR-е для AVR и для ARM все нормально.

    Как объяснить компилятору, что UART_BUFFERSIZE таки является константой?

     

     

  21. О, спасиб.. что-то я "притормозил".

    Глянул по заголовкам тем и не нашел.

    Для СС2540, не хочу ковыряться в индокоде, быстрее самому написать.

    Мне не понятен смысл вашего поста.

    Мне кажется,что вам повезло-человек выложил порт под ваш SOC.

    Вы за 5 минут уже поняли.что это индокод?

     

×
×
  • Создать...