чтение лок битов внутри программы

Тема в разделе "Микроконтроллеры AVR", создана пользователем yotamedoed, 9 июл 2019.

  1. yotamedoed

    yotamedoed Нуб

    Добрый день, перед выполнением основного когда программы мы можем считать регистры МК, и успешно использовать полученную информацию для дальнейшего выполнения скетча. Это все реализовано если мы пишем не через Arduino IDE, а на чистом си (в атмел студио например) Вот ссылка на источник http://chipenable.ru/index.php/programming-avr/178-kak-prochitat-fuse-bity-avr-iz-programmy.html
    вот конкретный пример реализации чтения
    Код (C++):
    #include <ioavr.h>
    #include <intrinsics.h>
    #include <stdint.h>

    /* макросы для чтения fuse битов */
    #define _SPM_GET_LOW_FUSEBITS() __AddrToZByteToSPMCR_LPM((void __flash*)0x0000U, 0x09U)
    #define _SPM_GET_HIGH_FUSEBITS() __AddrToZByteToSPMCR_LPM((void __flash*)0x0003U, 0x09U)
    #define _SPM_GET_EXTENDED_FUSEBITS() __AddrToZByteToSPMCR_LPM((void __flash*)0x0002U, 0x09U)

    /* структрура для сохранения fuse битов */
    typedef struct{
       uint8_t fuseLow;
       uint8_t fuseHigh;
       uint8_t fuseExtended;
       uint8_t lockbits;
    } fuseSettings_t;

    volatile fuseSettings_t value;

    void FUSE_Read(void)
    {
       value.fuseLow = _SPM_GET_LOW_FUSEBITS();
       value.fuseHigh = _SPM_GET_HIGH_FUSEBITS();
       value.fuseExtended = _SPM_GET_EXTENDED_FUSEBITS();
       value.lockbits = _SPM_GET_LOCKBITS();
    }


    int main( void )
    {
       /*считываем fuse биты*/
       FUSE_Read();


       /*проверяем fuse биты*/
       if (value != ...){

          /*если биты не соответствуют эталону, сигнализируем пользователю*/
            ...
       }

       while(1);
       return 0;


    }
    Суть в том что программа в которую необходимо применить чтение лок битов, вся писалась средствами ардуино ИДЕ, не много не мало около 6 т. строк, и переписывать ее на чистый СИ будет то еще удовольствие...
    Может быть есть какой то вариант по средством ардуино Иде прочитать лок биты во время выполнения программы?
     
  2. Airbus

    Airbus Радиохулиган Модератор

    А программатором фьюзы прочесть не?И зачем их читать именно во время выполнения программы?
     
  3. yotamedoed

    yotamedoed Нуб

    если в двух словах защита от копирования.
    После первой загрузки прошивки в МК, после его включения опрашивается состояние лок битов. Если МК залочен, выполняется шаг проверки ввода пин кода, если область флеш, не содержит нужной инфы ввыводится 20значный рандомно сгенерированный код, этот код сообщается сервиснику, он назвает код активации. Если код активации корректен во флеш записывается соответственная информация.
    При дальнейшем запуске программы она работает в штатном режиме. Hex с акитивацией скачать уже не получится, для клонирования на других устройствах. И если вышло новое обновление, то не нужно посылать новое устройство с залоченым МК, а достаточно прислать Hex, сервиснику который зашьет в МК прошивку и активирует ее... думаю смысл понятен
     
  4. parovoZZ

    parovoZZ Гуру

    А в ардуино IDE грязный СИ? В ней же GNU С компилятор, а он понимает только чистый СИ.
    Поэтому не понимаю, в чем проблема прочитать регистры локбитов?
     
  5. yotamedoed

    yotamedoed Нуб

    не подскажешь как? и какими средствами?
     
  6. parovoZZ

    parovoZZ Гуру

    так по ссылке дан рецепт.
    адреса также перечислены
    Кто тут с асмом дружит? Помогите чуваку.
     
  7. yotamedoed

    yotamedoed Нуб

    вот в привычном виде мигание диодом
    Код (C++):
    #include <avr/io.h>
    #define F_CPU 16000000UL //16MHz
    #include <util/delay.h>
    int main(void) {
        DDRB  |= 1<<5;
        PORTB &= ~1<<5;
        while(1) {
            PORTB |= 1<<5;
            _delay_ms(100);
            PORTB &= ~1<<5;
            _delay_ms(100);
        }
    }
    а вот на валерийском
    Код (C++):
    // the setup function runs once when you press reset or power the board
    void setup() {
      // initialize digital pin LED_BUILTIN as an output.
      pinMode(LED_BUILTIN, OUTPUT);
    }

    // the loop function runs over and over again forever
    void loop() {
      digitalWrite(LED_BUILTIN, HIGH);   // turn the LED on (HIGH is the voltage level)
      delay(1000);                       // wait for a second
      digitalWrite(LED_BUILTIN, LOW);    // turn the LED off by making the voltage LOW
      delay(1000);                       // wait for a second
    }
    догадаешься в чем между ними разница?
     
  8. yotamedoed

    yotamedoed Нуб

    Думаю справедливо будет перенести тему в закажу проект
     
  9. parovoZZ

    parovoZZ Гуру

    Ни в чем. И там и там язык Си.
     
  10. DetSimen

    DetSimen Guest

    в первом случае, видимо, Си кристально чистый, как слеза ребёнка. Да еще и чесный.
     
    Airbus нравится это.
  11. Asper Daffy

    Asper Daffy Иксперд

    Зачем дружит с асмом, если в авр-студии (и в ардуино тоже) есть готовые макросы для доступа к фьюзам? Пользуй - не хочу.
     
    SergeiL и DetSimen нравится это.
  12. DetSimen

    DetSimen Guest

    Вот и я про то же.
     
  13. parovoZZ

    parovoZZ Гуру

    Там в закажу проект уже заказ висит. Можно капусту шинкануть.
     
  14. Asper Daffy

    Asper Daffy Иксперд

    Вперёд и с песнЯми!
     
  15. Asper Daffy

    Asper Daffy Иксперд

    Делов-то, блин. Асм ещё какой-то.

    Код (C++):
    //
    //    Печать фьюзов и лок-битов для ATMega328P
    //
    #include <avr/lock.h>
    #include <avr/fuse.h>

    FUSES;
    LOCKBITS;

    void setup(void) {
        Serial.begin(57600);
        //
        //    Печать фьюзов
        //
        Serial.print("Fuse High:\t0x"); Serial.println(__fuse.high, HEX);
        Serial.print("Fuse Low:\t0x"); Serial.println(__fuse.low, HEX);
        Serial.print("Fuse Extended:\t0x"); Serial.println(__fuse.extended, HEX);
        //
        //    Печать lock-битов
        //
        Serial.print("Lock bits:\t0x"); Serial.println(__lock, HEX);
    }

    void loop(void) {
    }
    Да, кстати, если надо, то символьные имена битов (фьюзов и лок-битов) есть в используемых <avr/lock.h> и <avr/fuse.h> (вернее в соответветсвующих конкретному контроллеру io.h), можно посмотреть и пользовать.
     
    Последнее редактирование: 9 июл 2019
    Andrey12, SergeiL, KindMan и 2 другим нравится это.
  16. parovoZZ

    parovoZZ Гуру

    дизасмить и выкинуть нафиг всё, что связано с разлочкой.
     
    yotamedoed нравится это.
  17. parovoZZ

    parovoZZ Гуру

    так это ж всё равно обертка над асмом, 100 пудофф. Компилятор ещё вызовов натолкает на ровном месте.
     
  18. Asper Daffy

    Asper Daffy Иксперд

    «Лучше молчать, рискуя показаться невеждой, чем заговорить и сразу развеять все сомнения» (Марк Твен)
     
    DetSimen нравится это.
  19. SergeiL

    SergeiL Оракул Модератор

    А есть еще такой вариант ;):
    Код (C++):
    #include <avr/boot.h>;

    void setup()
    {
        Serial.begin(115200);

        Serial.print("Low:  0x");
        Serial.println(boot_lock_fuse_bits_get(GET_LOW_FUSE_BITS), HEX);
        Serial.print("High: 0x");
        Serial.println(boot_lock_fuse_bits_get(GET_HIGH_FUSE_BITS), HEX);
        Serial.print("Ext:  0x");
        Serial.println(boot_lock_fuse_bits_get(GET_EXTENDED_FUSE_BITS), HEX);
        Serial.print("Lock: 0x");
        Serial.println(boot_lock_fuse_bits_get(GET_LOCK_BITS), HEX);
    }

    void loop()
    {
    }
     
    Asper Daffy, DetSimen и yotamedoed нравится это.
  20. Asper Daffy

    Asper Daffy Иксперд

    Есть и такой.