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

Waso

Свой
  • Постов

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

  • Посещение

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


  1. demiurg_spb, неа, не канает.

     

    Xenia, Dog Pawlowa, я фшоке! Это действительно работает!! У меня сорвало крышу! Господа и дамы! Прошу! Объясните мне ради Бога! С какого рожна

    Правая часть приводится к типу int.
    Это что, происходит всегда, когда я произвожу над операндом какую-либо операцию прямо в условии??? Где прописано что это так делается? Я понимаю, если бы один из операндов был int или я например прибавлял к нему число голое.. Но туут.. %[]
  2. Немного не в тему, потому как речь о версии ИАР 4.3. Но опера та-же. Не понимаю, почему ИАР считает заранее известным условие с volatile переменными:

    volatile union {       // для доступа к одной ячейке памяти разными способами 
            unsigned long all;          // для доступа ко всем 4-м байтам
            unsigned char byte[4];      // для побайтного доступа
        } recbuf; 
    
    #pragma vector=INT0_vect
    __interrupt void ext_int0_isr(void)
    {
    ...
              recbuf.all>>=1; // сдвиг буфера на 1 бит
          if(bit)recbuf.byte[3]|=0x80;  // добавили единичку, если это она
    ...
    }
    
    void  main(void)
    {
    __enable_interrupt();
    while (1)
      {
    
      if((recbuf.byte[0] ==~recbuf.byte[1])    // это условие даже не проверяется
      &&(recbuf.byte[2]==~recbuf.byte[3]))   // правда ругается на неопределенный порядок доступа
            {
                //  чтото делаем  - этот код компилятор выкидывает даже на низких уровнях оптимизации
             }
      }
    }

    Если то условие заменить таким - то все работает:

        tmp = ~recbuf.byte[1];
        if(recbuf.byte[0] == tmp)
         { 
            tmp = ~recbuf.byte[3];
            if(recbuf.byte[2] == tmp)

    Присоединяю файл проекта если у кого не развита телепатия ;)

    testout.zip

  3. Лично Вы это можете сделать? Нет? Так откуда уверенность, что уровень спеца который это сможет сделать будет ниже Вашего? А если так, то как думаете - кто меньше потребует ;) ?
    В сети есть несколько сообщений о том что достаточно на короткое время сделать переполюсовку и фьюзы слетают. Для этого спецом достаточно быть ващще никаким. Ну а с подрезкой фузов лазером или напильником - это конечно редкостное извращение. ))) Это меня не беспокоит.

     

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

     

    Результат биений двух таймеров с разными источниками тактирования. Например таймер от основного RC плюс прерывание от WDT...

    Спасибо! Все советы полезные!

     

    Мне показалось, что нужно число случайное от кристалла к кристаллу, но постоянное у каждого конкретного кристалла — чтобы сделать привязку. Спутал с какой-то параллельной темой.
    Не спутали! Серийник AVR-кам тоже бы очень пригодился! Но поскольку его нет, я думаю придется самому генерить его и прошивать вместе с бутлодером.

     

  4. Здесь Боб - это программатор, Алиса - ваш девайс с прошитым загрузчиком и случайно сгенерированным сеансовым ключом.
    Спасибо. На примере стало понятно. Тоесть для решения проблемы №2 с голым бутлодером используем ассиметричный алгоритм для получения сеансового ключа, а потом этот ключ используем в симметричном AES. Тогда программатор должен будет каждый раз перепаковывать бинарник с новым ключем перед передачей. Ну ладно. Надо будет посмотреть сколько это у него времени займет.

     

  5. Здравствуйте! Возникла необходимость собрать похожий девайс, но со своей спецификой. Допустим, имеется

    заказчик (или несколько), который собирает железо, а программировать его некому. Программист (я) находится

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

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

    собрать автономный программатор со счетчиком числа прошивок и защищенной передачей на целевой кристалл,

    чтобы нельзя было скопировать прошивку. Должна быть возможность "пополнения" числа прошивок

    или вообще работы с другими прошивками после соответствующей оплаты.

     

    По этой теме есть следующие соображения:

     

     

    1. Загружаем с компа и храним зашифрованную прошивку на борту в отдельной флеш-микросхеме.

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

     

    ДЫРА: 2. Для того чтобы расшифровать прошивку, бутлодер должен знать ключ. Бутлодер должен

    зашиваться незашифрованным в чистый контроллер. Его можно перехватить по SPI во время программирования.

    Как тогда сохранить в секрете ключ?

     

    Временное решение. Сделать бутлодер трудно-поддающимся дизассемблированию (КАК?) и прошивать

    в чистый микроконтроллер незащищенным. Но никому об этом не сказать. )))

     

    3. В прошивке должны быть идентификатор(ID прошивки) и число допустимых программирований

    этой прошивки - все это зашифровано. ID прошивки нужен для того, чтобы вести список прошивок и какую

    сколько раз зашивали.

     

    4. Список и счетчики прошивок храним внутри контроллера-программатора.

     

    ДЫРА: Если у программатора

    снесет крышу и придется его перепрограммировать - потеряется таблица прошивок, тогда можно будет повторно

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

     

    РЕШЕНИЕ: Программа-обновлялка для ПК, которая загружает новую прошивку на борт программатора - работает только

    при наличии связи через сеть интернет. Сначала отсылает программисту (мне) таблицу прошивок из контроллера.

    А потом только передает программатору новую прошивку. Тогда при новых компиляциях программы загрузчика

    можно сразу туда включать эту таблицу.

     

    5. В клиентских программах, также как и в программаторе, выставляем фьюзы на запрет чтения и записи

    и внутри программы периодически их проверяем!

    Хацкеры обычно разными способами сбивают эти фьюзы и читают прошивку. Если прога будет

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

     

    ДЫРА: Если сбить

    фьюзы и сразу войти в режим программирования (подтянут ресет), т.е. не дать проге запуститься - то она не

    успеет сама себя удалить и может быть считана!

     

    НЕ РЕШЕНА! Остается надеяться, что в последних версиях контроллеров фьюзы нормально переносят фокусы

    с питанием, а также надежно спрятаны от лазеров/ножыков во внутренних слоях кристалла.

     

    ДЫРА: 6. Можно прошивать одновременно несколько контроллеров, включив их параллельно!

     

    РЕШЕНИЕ: Можно перед прошивкой проверять серийный номер контроллера (а у AVR он есть?) Бутлодеры, у которых

    серийник не совпал - просто перестанут принимать данные. Если серийника нет - по тихому загружать его в составе

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

     

    :1111493779: Какие еще тут есть дыры (уязвимости, а не технологические отверстия) и способы их решения?

  6. Попробовал TDR. Если я правильно понимаю, чтобы получить разрешение по длине 1мм, нужно прогнать свип по частоте от 0 до 300ГГц. 0_о Ладно. Прогнал. На графике TDRZ получается какая-то чушь. Вобщем еще не научился настраивать...

     

    В Вашей модели перехода микрополосок-коаксиал на КСВН на нижних частотах (вплоть до длин волн, сравнимых с длиной перехода) роль играть будет только импеданс микрополоска и коаксиала -- если они одинаковы, то модель должна выдавать потери на согласование не хуже 40дБ.
    Это в теории. На практике же даже маленький забытый виас (переходное отверстие) возле полоска испортил всю картину. Хотя работаю с 10ГГц - длина волны 3 см. Ну пусть 1.6см в материале платы. Не понимаю, почему волна должна огибать неоднородости меньше своей длины, если ей просто некуда больше деваться?

     

  7. Подскажите пожалуйста, как можно найти место в модели, которое мне портит КСВ? Модель - переход с микрополоска на коаксиал через разъем. Собственно нарисовал разъем и полосок. Нужно подобрать размеры посадочного места так чтобы минимизировать КСВ. И вот вроде бы все хорошо, но не очень. Запарился тыкать пальцем в небо. Хочу построить график зависимости волнового сопротивления от расстояния от порта, чтобы увидеть где оно (Z0) у меня скачет. Чисто внешне и по анимации все гладко, да и КСВ уже 22дБ, но надо еще лучше. Пока на ум приходит только мысль рассекать модель поперечной плоскостью на разном расстоянии от порта и рассчитывать Z0 для порта в этой плоскости. Кривовато как-то.

  8. На днях опять пришлось иметь дело с проектом, где с разными ножками контроллера поочередно выполняются одинаковые действия. Снова вернулся к проблеме обращения к ногам через ссылки в массиве. И хотя главную проблему так и не решил (неоправданное разрастание кода при использовании виртуальных функций в шаблонных классах), однако получилось написать класс, который понимает Аскольдовские объявления ножек, а также имеется возможность создать порты на разные контроллеры. В данном случае выкладываю порт на ADuc702x, который можно переделать например под AVR переписав небольшой класс BaseIO, или еще лучше добавить условную компиляцию...

    #define Req1      1, 0, L
    #define Req2      1, 1, L
    //...
    #define ChipSel1  1, 7, L
    #define ChipSel2  0, 5, L
    //...
    #include "ascold.h"
    #include "pin.hpp"
    Pin<ChipSel1> CS1;
    Pin<ChipSel2> CS2;
    
    Pin<Req1> RQ1;
    Pin<Req2,OUTPUT_OK> RQ2;
    
    int main()
    {
    on(ChipSel1);  // макрос Аскольда Волкова
    CS1.On();       // гибрид на С++
    }

    pin.zip

  9. #define _ioc(x,y,z)  x,y, TOCHAR(z)

    - нет, всеравно ругается Error[Pe529]: this operator is not allowed in a template argument expression - ему не нравится решетка из макроса TOCHAR внутри шаблона, но как она туда попадает - непонятно, потомучто еще уровень вложенности добавил специально...

     

    Но я уже решил проблему иначе! УРА!

    Меня осенило использовать перечислимый тип в объявлении шаблона вместо char:

    typedef enum { L, H }  GPIO_mode_t;
    typedef enum { A, B, C, D, E, F }  Portname;
    template<Portname port, PORT_TYPE mask, GPIO_mode_t activestate>
    class Pins
    {...}

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

     

    Однако тем не менее выражаю благодарность halfdoom и Палыч за отзывчивость!

  10. Примеры есть у меня, есть и свой подход к программированию для систем с сильно ограниченными ресурсами на С++(на примере AVR).

    Будет свободное время - напишу статейку по этой теме (если будут желающие её читать :) ).

    А так вкратце могу сказать, что программы на С++ получаются компактнее, быстрее и легче читаются аналогичных программ на Си.

    Может, напишем сообща?

    :rolleyes:

    Я уже название придумал.

    "С++ в микроконтроллерах. Почему бы и нет?"

    Желающие читать такие статьи есть! Вот по крайней мере я, например! Так-что жду с нетерпением.

    А как наберете с десяток статей - соедините их в книгу и будете барыши получать. ;)

  11. Тогда получается так: (оставил преобразование только последнего символа)

    #define TOCHAR(C)  #C[0]
    #define ioc(x)  _ioc(x,y,z)
    #define _ioc(x,y,z) _ioc2(x,y,z) 
    #define _ioc2(x,y,z)  x,y, TOCHAR(')##z##TOCHAR(') // Error[Pe529]: this operator is not allowed in a template argument expression

    !Ругается теперь иначе! Добавил еще один уровень дефайнов - не помогло. Еще так:

    #define _ioc2(x,y,z)  x,y, #'[0]##z#'[0]// таже ошибка

  12. Добрый день!

    Подскажите пожалуйста, как в дефайне к символу присоединить апострофы по бокам?

    #define ioc(x)  _ioc(x,y,z)
    #define _ioc(x,y,z) '##x##',y, '##z##'  
    
    #define ChipSel1  А, 7, L
    #include "ascold.h"
    
    Pin<ioc(ChipSel1)> CS1; // Error[Pe026]: too many characters in character constant

    Нужно это все чтобы скрестить известный набор макросов для дрыгания ногами ascold.h с шаблоном С++, предназначенным для той-же цели.

    template<char port, char bit, char activestate>
    class Pin
    {...}

    Проблема в том, что макросы Аскольда подставляют голые символы в нужное место, а шаблоны Си++ используют типизированные константы, и мне хотелось бы с помощью макроса преобразовать Аскольдовское объявление пина в совместимое с шаблоном, поставив по краям к буковкам апострофы. Но компилятор ругается...

    А вообще все это нужно чтобы я мог один раз объявив расположение ног в отдельном заголовочнике, затем использовать их и в сишных и в С++-ных частях программы, не заморачиваясь. Да и вообще для совместимости новых версий со старыми. ;)

  13. Разобрался. Проблема была в мастере. Я щелкал SlaveSelect после каждого байта, а когда стоит флаг SPI_CONTINUOUS_TX, этого делать не надо. Кроме того, не было предусмотрено механизма синхронизации между мастером и слейвом, и если терялся хоть один байт, то вся посылка сдвигалась. А терялись они именно в режиме отладки, когда я JTAG-ом просматривал регистры после приема каждого байта. При непрерывной работе таких потерь небыло, но я все-же ввел синхронизацию - если слейв не передал еще все данные, но видит что мастер убрал чипселект, то он сбрасывает свой буфер и готовится к новой передаче. И еще были проблемы в основной программе (в рассчетах), из-за которых также проскакивали левые числа.

     

    Вот так вот. Бьешься неделю головой о стену, а потом напишешь на форум и тут-же тебе самому решение в голову придет. =) Так и телепатом стать не долго.

  14. День добрый!

    Подниму тему ибо уже неделю бьюсь и не могу победить. Тоже ADuc7021, тоже проблема с SPI. Причем уже передавать пытаюсь банальный алфавит, но на приемной стороне его нет, а только нули, нули... Это проверено осциллографом. Вот код:

      // SPISTA (p.70)
    #define SPIRX_OVF   (SPISTA & (1<<5))
    #define SPIRX_IRQ   (SPISTA & (1<<4))
    #define SPIRX_FULL  (SPISTA & (1<<3))
    #define SPITX_UDF   (SPISTA & (1<<2))
    #define SPITX_IRQ   (SPISTA & (1<<1))
    #define SPITX_EMPTY (!(SPISTA & (1)))
    
    // SPICON  (p.70)
    #define SPI_CONTINUOUS_TX   (1UL << 12)
    #define SPI_LOOPBACK        (1UL << 11)
    #define SPI_SO_EN           (1UL << 10)
    #define SPI_SLAVE_SELECT_EN (1UL << 9)
    #define SPI_RXOVF_OVERWRITE (1UL << 8)
    #define SPI_TXUDF_SENDZERO  (1UL << 7)
    #define SPI_TXWRITE_TRANS   (1UL << 6)
    #define SPI_LSB_FIRST       (1UL << 5)
    #define SPI_CLK_IDLEHIGH    (1UL << 3)
    #define SPI_PHASE           (1UL << 2)
    #define SPI_MASTER_MODE     (1UL << 1)
    #define SPI_ENABLE          (1UL << 0)
    
    #define SPI_BITRATE     1000000LL
    #define SPI_MODE  (SPI_TXWRITE_TRANS | SPI_SO_EN | SPI_ENABLE \
                       | SPI_TXUDF_SENDZERO | SPI_CONTINUOUS_TX)
    
    #ifndef SPI_BITRATE
    #define SPI_BITRATE  100000LL
    #endif
    
    #define SPI_DIVISOR (((41779200LL/2)/SPI_BITRATE)-1)
    
    #if (SPI_DIVISOR >= 0xFE)
    #error "Bad SPI_BITRATE value! Look p.69 datasheet."
    #endif
    
    #ifndef SPI_MODE
    #error "SPI_MODE not defined!"
    #endif
    
    uint8_t spidata[SPI_N];     // буфер выходных данных SPI
    
    void SPI_Init(void)
    {
      SPICON = SPI_MODE;
      SPIDIV = SPI_DIVISOR;
    #if (SPI_MODE&SPI_MASTER_MODE)
      dir_out(SPI_SCK);
      dir_out(SPI_MOSI);
      dir_in(SPI_MISO);
      GP1CON &= ~(0x0FFF0000); GP1CON |= 0x02220000; // выбрали функцию GPIO как SPI
    #else // (SPI_MODE&SPI_MASTER_MODE)
      dir_in(SPI_SCK);
      dir_in(SPI_MOSI);
      dir_out(SPI_MISO);
      dir_in(SPI_CS);  
      GP1CON &= ~(0xFFFF0000); GP1CON |= 0x22220000; // выбрали функцию GPIO как SPI
    #endif //(SPI_MODE&SPI_MASTER_MODE)
    }
    
    __inline void SPI_StartIRQTX(void)
    {
      spitxcount = 0;
      SPITX = spidata[spitxcount++];
      IRQEN = SPI_SLAVE_BIT;
      on(Req);      // сигнал что данные готовы - когда мастер его видит - он выставляет SlaveSelect и читает данные.
    }
    
    void SPI_Ready_ISR(void)
    {
      SPITX = spidata[spitxcount++];
      if(spitxcount>=SPI_N)
      {
        IRQCLR = SPI_SLAVE_BIT; 
        off(Req);
        if(AdcBufRdy_flag) ADC_Start();
      }
    }
    
    void main(void){
    ...
    SPI_Init();
    ...
    while(1)    // вечный цикл
      {
          while(spitxcount < SPI_N);  // Ждем окончания передачи предыдущих байт..
    
    spidata[0] = 'A'; spidata[1] = 'B'; spidata[2] = 'C'; spidata[3] = 'D'; 
    spidata[4] = 'E'; spidata[5] = 'F'; spidata[6] = 'G'; spidata[7] = 'H'; 
    
          SPI_StartIRQTX();   // запускаем передачу данных на фоне
      }
    }

    Если убрать из режима SPI_TXUDF_SENDZERO (передача нуля если передающий регистр не готов), то шлет не нули а всякую чушь. Тоесть на лицо Underflow (передающий регистр не готов). А почему оно так - непойму.

  15. Добрый день, уважаемые форумчане!

    У меня вопрос немного офтопик, но проблема та-же. Когда объявляю функцию __arm __ramfunc ворчит: (IAR 440, ADuc7020)

    Warning[Ta021]: Library call (??ldr32h_a) from within a __ramfunc function

    Если убрать директиву __arm то компилится нормально, но я так понимаю, что в режиме арм из ОЗУ работало бы еще быстрее.

    Вот код:

     
    typedef struct
    {
            int16_t Re;
            int16_t Im;
    } cplx;
    
    __ramfunc __arm
    void Foo(cplx *x)
    {
    cplx T;
    ....
    T  = x[j];    // на эту и подобные строчки ругается
    /*-----------*/
    T.Re  = x[j].Re;
    T.Im  = x[j].Im; // такая запись компилится в арме, но смотрится криво
    ...
    }

    Что делать? На асме писать не хотелось бы...

    Заранее благодарен!

  16. Да. Точно. За основу то взял пример стандартный... Когда не знаешь, да еще и забудешь.. таких делов можно наворотить. =P

    И все-таки после брейкпоинта прерывания иногда умирают. Хотя флаги в AIC_IPR и AIC_IMR стоят. CPSR_I=0. Ну ладно, это не критично - отлажусь на осциллографе и консоли.

  17. Нет. Не делаю. Первый раз такой способ вижу. Но мне идея понравилась. Написал такое:

       for(char i=8; i--;  )
       {
         tim = AT91C_BASE_AIC->AIC_IVR;
         AT91C_BASE_AIC->AIC_EOICR = tim;
       }
      tim = AT91C_BASE_AIC->AIC_FVR;
      AT91C_BASE_AIC->AIC_EOICR = tim;

    Заработало. Правда работает и если оставлять лишь последнюю строку. Но к сожалению это все работает в простой тестовой проге, а в нужной мне - грабли остались. Теперь вылетает в dabt или pabt. Буду искать дальше. Спасибо!

    =====================================UPDATED================================

    В основной проге убрал модификаторы __irq __arm от объявления процедуры прерывания - и заработало!! ))

    Что я делаю не так? (с)

  18. JTAG отключить не пробовали?

    Здравствуйте! Какраз столкнулся с такой проблемой - когда прошиваю программу через J-Link, и запускаю в С-SPY, то почему-то отказываются работать прерывания. Зато если тут-же нажать Reset на плате - все начинает работать как надо. IAR 4.40, отладочная плата AT91SAM7X-ЕК. С чем это может быть связано? Программу гружу во флеш. В mac файле никакой работы с прерываниями не обнаружил...

  19. Добрый день, уважаемые коллеги!

     

    Есть задача добывать кристаллы микросхем и транзисторов из обычных пластиковых корпусов SOIC, TQFP и SOT. Да еще и так, чтобы они потом работали! )) Я занимаюсь проектированием различных микромодулей на основе низкотемпературной керамики. В основном применяем готовые безкорпусные микросхемы, но бывают и случаи когда безкорпусного аналога нет или возникают какие-либо трудности с поставкой голых кристаллов. В этом случае мы травим корпусированные микросхемы в плавиковой, азотной и др. кислотах (я сам не химик - точно не знаю) Процесс ненадежный. Выход годных кристаллов маленький. Много перетравов/недотравов, вредных пассиваций происходит. Химики говорят, что если бы знали точный химический состав материала, из которого делают корпуса, то этих всех проблем можно было бы избежать.

     

    Так вот, подскажите пожалуйста химический состав обычных пластиковых корпусов, если знаете! Или где пошукать. Гугль всякую фигню выдает. А по английски я незнаю как грамотно вопрос ему написать... IC housing materials - лажу выдает. =|

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