Jump to content
Sign in to follow this  
rmatveev

Идентификация прошивок

Recommended Posts

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

Когда-то давно, когда я еще кодил для МК51 и PIC я использовал несколько ячеек в начале памяти программ, куда автоматом записывал закодированную дату. Но это я делал с помощью своей утилиты - при компиляции я запускал свой батник, который во-первых формировал небольшой ассемблерный файлик с кодом даты, он уже линковался к основному коду и получалось у меня что-то типа такого:

            ORG          0000h
            goto         Begin

            include      'date.src'

            retw         __day
            retw         __month
            retw         __year

            ORG          0004h
            goto         INTERRUPT

Файл date.src формировался моим батником, там присваивались значения макросам __day, __month и __year.

Это ассемблер для PicMicro. Я использовал тот факт, что у него между началом пользовательского кода и единственным вектором прерывания было 4 байта, в первый байт я вставлял команду перехода на начало, а в три оставшихся байта - дату. Она была хорошо видна при считывании кода из чипа. Было очень удобно потом идентифицировать прошивку, т.к. исходники я тоже сохранял по датам. В общем, такая была доморощенная система контроля версий. Было это году в 2000-м.

Сейчас я пользуюсь Atollic TrueStudio и MBED и тоже задумался о том, как мне помечать прошивки. Может быть есть какие-то штатные способы? Или может по старинке найти в коде место, куда зашивать дату что бы ее легко было видно при считывании прошивки в ST Link Utility?

Спасибо заранее за любые мысли.

Share this post


Link to post
Share on other sites

Сразу после KEEP(*(.isr_vector)). 

. = ALIGN(0x200);
    KEEP(*(.text.METAINFO))
    . = ALIGN(4);

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

Share this post


Link to post
Share on other sites
23 минуты назад, AVI-crak Home сказал:

Сразу после KEEP(*(.isr_vector)). 

. = ALIGN(0x200);
    KEEP(*(.text.METAINFO))
    . = ALIGN(4);

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

А это в каком файле? Что-то пока ума не приложу где это. Вы не приложите скрин?

Share this post


Link to post
Share on other sites

Финальные результаты тестирования литиевых батареек FANSO при нормальных условиях

Перед разработчиком устройства, в котором предполагается использование батарейки, всегда стоит задача выбора того или иного бренда. Конечно, наиболее объективный результат по качеству можно получить при реальном тестировании в режиме работы самого устройства. Для того чтобы у разработчиков была некоторая информация о реальных значениях основных параметров ЛХИТ, инженеры компании КОМПЭЛ решили провести серию из трех тестов. Первый тест на постоянный разряд в нормальных климатических условиях, начатый в апреле 2019 г., мы завершили.

Узнать финальный результат тестирования

Posted (edited)

Это скрипт линкера *.ld, вот только это запись секции, для записи файла нужно еще в этой секции прикрепить нужный файл (на асме в стартапе). Типа такого:

  .section  .Bootloader,"a",%progbits
  .type  Bootloader_os, %object

Bootloader_os:
  .incbin "123.bin"

  .size  Bootloader_os, .-Bootloader_os

И теперь уже сохранить секцию .Bootloader

    . = ALIGN(4);
    KEEP (*(.isr_vector))   /* сохранили таблицу векторов */

    . = ALIGN(4);
    _myID_Adr = .;
    KEEP (*(.Bootloader))     

_myID_Adr это адрес наших данных, можно обращаться через структуру для удобства к этому файлу.

Все под Atollic

Edited by MasterElectric

Share this post


Link to post
Share on other sites
Posted (edited)

Можно еще использовать стандартные макросы типа: __DATE__ __TIME__ примерно так:

__attribute__ ((section (".Bootloader"))) uint8_t aDate[] = __DATE__;
__attribute__ ((section (".Bootloader"))) uint8_t aTime[] = __TIME__;

На выходе имеем:

080001ac <aTime>:
 80001ac:	31 33 3a 34 36 3a 35 33 00 00 00 00                 13:46:53....

080001b8 <aDate>:
 80001b8:	4d 61 72 20 32 38 20 32 30 31 39 00                 Mar 28 2019.

 

Edited by MasterElectric

Share this post


Link to post
Share on other sites
                     

Видеокурс Работаем с микроконтроллерами STM32G0. Впервые на русском языке.

В цикле видеокурсов по работе с STM32G0 от компании STMicroelectronics показаны архитектура, периферия (особенности процессорного ядра, режимов пониженного питания, векторов прерываний, DMA и мультиплексора DMA, схемы тактирования и сброса, и.т.д.) и даны практические примеры. Материал дает наглядное понимание того, как начать работу на новых микроконтроллерах STM32G0

Подробнее

Guest rmatveev
4 часа назад, MasterElectric сказал:

Можно еще использовать стандартные макросы типа: __DATE__ __TIME__ примерно так:


__attribute__ ((section (".Bootloader"))) uint8_t aDate[] = __DATE__;
__attribute__ ((section (".Bootloader"))) uint8_t aTime[] = __TIME__;

 

Круто!

А куда этот код нужно встраивать?

Share this post


Link to post
Share on other sites

Join the conversation

You are posting as a guest. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...
Sign in to follow this  

  • Similar Content

    • By Tokes
      Здравствуйте.
      CUBEMX + CUBEIDE + PUTTY + STLINK V2
      Есть blue pill. Создал новый проект в CUBEMX. Включил там USB как COM порт. Завёл приём сообщений (модифицировал static CDC_Receive_FS функцию). Всё хорошо работает ровно до тех пор, пока в CUBEIDE не нажимаю F11 (build + flash + debug). После этого необходимо руками вытаскивать и засовывать кабель, чтобы можно было продолжать пользоваться терминалом. В то же время достаточно коснуться контакта "USB-" - и происходит тот самый желанный реконнект, после которого достаточно нажать restart session в терминале и всё продолжает работать нормально. 
      Вопрос - как сделать программно, чтобы при старте устройство ("com port" или "usb com emulator") само себя "переподключало"?
    • By Стальной
      Здравствуйте!
      Интересует мнение коллег по правильному питанию мощных МК. Имеется STM32F722VCT6. Делаю для себя новый отладочный стенд. На нем будут обкатываться различные задачи, поставлю плюсом к МК всякую периферию, обязательно i2c память (из серии AT24Cxx), MAX3485, возможно какой-то дисплей, SD-карту, может быть SIM900 и NAND. Первичный источник - думаю, USB хватит.
      Вопрос - как организовать питание МК? Имеет ли смысл цифровую часть (а мб и часть периферийного зоопарка) питать импульсной системой, а аналоговую часть кренкой? Или всё кренкой запитать? Какие идеи?
      Спасибо)
      ЗЫ Сейчас использую стенд на STM32F407VET6, сделанный на коленках, все кренкой питается. Но там периферия изготавливается по мере необходимости и надевается отдельно на гребенки.
    • By befrikpa
      Добрый день товарищи!
      У меня такая проблема:
      Я хочу сделать штуку которая будет замыкать реле через определённое время(после подачи питания на него), реле времени так сказать. В принципе устройство работает, но у меня не получается сделать так, что бы светодиод (HL_4) мигал каждые пол секунды пока не включено реле, а после включения соответственно  светодиод горел постоянно.
      Сейчас у меня условие находится в бесконечном цикле, и при включении устройства, светодиод просто горит постоянно и всё.
      Скажу честно, я в программировании пока что зелёный, так что не судите строго за код))
      Прикрепил код:

       
    • By Alextiger62
      Отладочный набор на базе микроконтроллера STM32F746IGT6. Модульная конструкция и открытый дизайн делают плату идеальным решением для начала быстрой разработки устройств. В комплект поставки входят все необходимые модули расширения, для оценки всех возможностей микроконтроллера. 

      Комплектация: 
      1 х Материнская плата (Open746I-C development board); 
      1 х Процессорный модуль (Core746I); 
      1 х Кабель (USB type A plug to micro B plug cable);   - отсутствует
      1 х Кабель (USB type A receptacle to micro B plug cable);   - отсутствует
      1 х Соединительные провода (4-pin 2-pin wires pack);   - отсутствует 
      1 х Блок питания (Power adapter US standard 5V/1A);   - отсутствует
      1 х Дисплей (7inch Capacitive Touch LCD (F)); 
      1 х Плата (DP83848 Ethernet Board); 
      1 х Плата (USB3300 USB HS Board); 
      1 х Плата (UDA1380 Board); 
      1 х Плата (Micro SD Storage Board); 
      1 х Плата (OV2640 Camera Board); 
      1 х Плата (W25QXX DataFlash Board); 
      1 х Плата (10 DOF IMU Sensor (B)); 
      2 х Плата (SN65HVD230 CAN Board); 
      1 х Плата (Analog Test Board); 
      1 х Кабель (USB type A plug to mini-B plug cable);  - отсутствует
      1 х Кабель (USB type A receptacle to mini-B plug cable);   - отсутствует
      1 х Кабель (Ethernet Cable); 
      1 х Шлейф (40-pin FFC);  - отсутствует
      1 х Крепеж (7inch LCD screws pack).
    • By Денис216
      Не могу опросить магнитометр по I2C. На линиях какие-то сигналы проскакивают, но никакого результата не могу достичь. Кто-то что-то знает по этому поводу? Как заставить работать его.


       
      #include "stm32f30x.h"              int a1=0, j=0; int main(void) { RCC->AHBENR|=RCC_AHBENR_GPIOBEN;// тактирование портa B включено RCC->AHBENR|=RCC_AHBENR_GPIOEEN;//21 тактирование портa Е включено RCC->APB1ENR|=RCC_APB1ENR_I2C1EN;// тактирование I2C1 включено GPIOB->MODER|=0x0000A000; // альтернативная функция линий PB7,PB6 GPIOB->OTYPER|=(1<<6);  //настройка линии PB7 на выход открытый сток GPIOB->OTYPER|=(1<<7);  //настройка линии PB6 на выход открытый сток GPIOB->OSPEEDR=0xFFFFFFFF; GPIOB->AFR[0] |= 0x44000000;  //настройка линий PB7,PB6 на функцию AF4 GPIOE->MODER=0x55555555; //настройка порта Е на выход EXTI->EMR=1<<23; EXTI->IMR=1<<23; NVIC_EnableIRQ(I2C1_EV_IRQn); //инициализация I2C мастер I2C1->CR1=(0<<0); //PE=0 I2C1->TIMINGR=(0x4<<28);//PRESC[3:0]: Timing prescaler I2C1->TIMINGR=(0x8<<20);//SCLDEL[3:0]: Data setup time I2C1->TIMINGR=(0x8<<16);//SDADEL[3:0]: Data hold time I2C1->TIMINGR=(0xC3<<8);//SCLH[7:0]: SCL high period (master mode) I2C1->TIMINGR=(0xC7<<0);//SCLL[7:0]: SCL low period (master mode) I2C1->CR1=(0<<17);//для мастера = 0 NOSTRETCH: Clock stretching disable I2C1->CR1=(1<<6);//TCIE: Transfer Complete interrupt enable I2C1->CR1=(1<<2);//RXIE: RX Interrupt enable(RXNE) I2C1->CR1=(1<<1);//TXIE: TX Interrupt enable(TXIS) I2C1->CR2=(0<<11);//ADD10=0 -7 bits I2C1->CR2=(0<<10);//RD_WRN=0 передача I2C1->CR2=(1<<25);//AUTOEND I2C1->CR1|=(1<<0); //PE=1 I2C1->CR2 = 0x03<<1;//adress  I2C1->CR2|=1<<13;//start ?????? a1=I2C1->RXDR;     while (1){     //    I2C1->CR2|=1<<13;//start         if((a1&0x1)>0)    GPIOE->ODR =1<<9;         else            GPIOE->ODR =(0<<9);         if((a1 & 0x2)>0)    GPIOE->ODR |=1<<10;         else            GPIOE->ODR &= ~(1<<10);         if((a1 & 0x4)>0)    GPIOE->ODR |=1<<11;         else            GPIOE->ODR &= ~(1<<11);         if((a1 & 0x8)>0)    GPIOE->ODR |=1<<12;         else            GPIOE->ODR &= ~(1<<12);         if((a1 & 0x10)>0)    GPIOE->ODR |=1<<13;         else            GPIOE->ODR &= ~(1<<13);         if((a1 & 0x20)>0)    GPIOE->ODR |=1<<14;         else            GPIOE->ODR &= ~(1<<14);         if((a1 & 0x40)>0)    GPIOE->ODR |=1<<15;         else            GPIOE->ODR &= ~(1<<15);         if((a1 & 0x80)>0)    GPIOE->ODR |=1<<8;         else            GPIOE->ODR &= ~(1<<8); }} void I2C1_EV_EXTI23_IRQHandler () {a1=2;}  
×
×
  • Create New...